diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java new file mode 100755 index 000000000..fa180c008 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java @@ -0,0 +1,268 @@ +/* + * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +package com.arsdigita.cms.ui.folder; + +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.Tree; +import com.arsdigita.bebop.tree.TreeModel; +import com.arsdigita.bebop.tree.TreeModelBuilder; +import com.arsdigita.bebop.tree.TreeNode; +import com.arsdigita.cms.CMS; +import org.librecms.contentsection.ContentSection; +import com.arsdigita.util.LockableImpl; +import java.util.Collections; +import java.util.Iterator; +import org.apache.log4j.Logger; +import org.libreccm.categorization.Category; + +/** + * A {@link com.arsdigita.bebop.tree.TreeModelBuilder} that produces trees + * containing the folder structure underneath a root folder. The root folder can + * be changed by overriding {@link #getRoot getRoot}. + * + * @author Jens Pelzetter + * @author Tri Tran + * @author David Lutterkort + * + * @version $Id: FolderTreeModelBuilder.java 2183 2011-06-20 00:57:18Z pboy $ + */ +public class FolderTreeModelBuilder extends LockableImpl + implements TreeModelBuilder { + + private static final Logger s_log = Logger.getLogger( + FolderTreeModelBuilder.class); + + /** + * Make a tree model that lists the hierarchy of folders underneath the + * folder returned by {@link #getRoot getRoot}. + * + * @param tree the tree in which the model is used + * @param state represents the current request + * @return a tree model that lists the hierarchy of folders underneath the + * folder returnedby {@link #getRoot getRoot}. + */ + @Override + public TreeModel makeModel(final Tree tree, final PageState state) { + return new TreeModel() { + + @Override + public TreeNode getRoot(final PageState state) { + return new FolderTreeNode(getRootFolder(state)); + } + + @Override + public boolean hasChildren(final TreeNode node, + final PageState state) { + return !((Category) node.getElement()).getSubCategories(). + isEmpty(); + } + + @Override + public Iterator getChildren(final TreeNode node, + final PageState state) { + final String nodeKey = node.getKey().toString(); + + // Always expand root node + if (nodeKey.equals(getRoot(state).getKey().toString()) + && tree.isCollapsed(nodeKey, state)) { + tree.expand(nodeKey, state); + } + + if (tree.isCollapsed(nodeKey, state)) { + return Collections.EMPTY_LIST.iterator(); + } + + return ((Category) node.getElement()).getSubCategories(). + iterator(); + } + }; + + /*return new DataQueryTreeModel(getRoot(state).getID(), + "com.arsdigita.cms.getRootFolder", + "com.arsdigita.cms.getSubFolders") { + + @Override + public Iterator getChildren(TreeNode node, PageState data) { + String nodeKey = node.getKey().toString(); + + // Always expand root node + if (nodeKey.equals(getRoot(data).getKey().toString()) && tree. + isCollapsed(nodeKey, data)) { + tree.expand(nodeKey, data); + } + + if (tree.isCollapsed(nodeKey, data)) { + return Collections.EMPTY_LIST.iterator(); + } + Party party = Kernel.getContext().getParty(); + OID partyOID = null; + if (party == null) { + partyOID = new OID(User.BASE_DATA_OBJECT_TYPE, + PermissionManager.VIRTUAL_PUBLIC_ID); + } else { + partyOID = party.getOID(); + } + UniversalPermissionDescriptor universalPermission + = new UniversalPermissionDescriptor( + SecurityManager.CMS_PREVIEW_ITEM_DESCRIPTOR, + partyOID); + if (PermissionService.checkPermission(universalPermission)) { + // the person is an admin so we just pass in the + // standard, non filtered query + return getDataQueryTreeIterator( + (DataQueryTreeNode) node, + "com.arsdigita.cms.getSubFolders"); + } else { + // now we need to set the parameters + return new NewFolderBrowserIterator( + (DataQueryTreeNode) node, + partyOID); + } + } + };*/ + } + + /** + * Retrn the root folder for the tree model in the current request. + * + * @param state represents the current request + * @return the root folder for the tree + * @post return != null + */ + protected Category getRootFolder(final PageState state) + throws IllegalStateException { + ContentSection sec = CMS.getContext().getContentSection(); + return sec.getRootDocumentsFolder(); + } + + private class FolderTreeNode implements TreeNode { + + private Category folder; + + public FolderTreeNode(final Category folder) { + this.folder = folder; + } + + @Override + public Object getKey() { + return folder.getObjectId(); + } + + @Override + public Object getElement() { + return folder; + } + + } + + /*private class NewFolderBrowserIterator implements Iterator { + + private DataQuery m_nodes; + + public NewFolderBrowserIterator(DataQueryTreeNode node, OID partyOID) { + + BigDecimal userID = (BigDecimal) partyOID.get("id"); + + String sql = "" + + "\n select f.folder_id as id," + + "\n f.label as name," + + "\n count(sub.item_id) as nchild" + + "\n from cms_folders f," + + "\n cms_items i" + + "\n left join" + + "\n (select i2.item_id, f2.label as name, i2.parent_id" + + "\n from cms_folders f2," + + "\n cms_items i2" + + "\n where f2.folder_id = i2.item_id) sub" + + "\n on (sub.parent_id = i.item_id" + + "\n and" + + "\n exists (select 1" + + "\n from dnm_object_1_granted_context dogc," + + "\n dnm_granted_context dgc," + + "\n dnm_permissions dp," + + "\n dnm_group_membership dgm" + + "\n where dogc.pd_object_id = sub.item_id" + + "\n and dogc.pd_context_id = dgc.pd_object_id" + + "\n and dgc.pd_context_id = dp.pd_object_id" + + "\n and dp.pd_grantee_id = dgm.pd_group_id" + + "\n and dgm.pd_member_id in (-200," + + userID + ",-202)" + + "\n and dp." + + TREE_DESCRIPTOR.getColumnName() + " = '1'" + + "\n ) )" + + "\n where i.parent_id = " + node.getID() + + "\n and f.folder_id = i.item_id" + + "\n and exists (" + + "\n select 1 as permission_p" + + "\n from dnm_object_1_granted_context dogc," + + "\n dnm_granted_context dgc," + + "\n dnm_permissions dp," + + "\n dnm_group_membership dgm" + + "\n where dogc.pd_context_id = dgc.pd_object_id" + + "\n and dgc.pd_context_id = dp.pd_object_id" + + "\n and dgm.pd_member_id in (-200," + + userID + ",-202)" + + "\n and dp.pd_grantee_id = dgm.pd_group_id" + + "\n and dogc.pd_object_id = f.folder_id" + + "\n and dp." + TREE_DESCRIPTOR. + getColumnName() + " = '1' )" + + "\n group by f.label, f.folder_id" + + "\n order by lower(f.label)"; + + if (s_log.isDebugEnabled()) { + s_log.debug("Custom SQL: \n" + sql); + } + + m_nodes = new GenericDataQuery( + SessionManager.getSession(), + sql, + new String[]{"id", "name", "nchild"}); + } + + @Override + public Object next() { + BigDecimal id = new BigDecimal(0); + try { + // this appears to be the only portable way to dig numbers out + // of the result set + id = new BigDecimal(m_nodes.get("id").toString()); + } catch (NumberFormatException nfe) { + } + String name = m_nodes.get("name").toString(); + BigDecimal count = new BigDecimal(0); + try { + count = new BigDecimal(m_nodes.get("nchild").toString()); + } catch (NumberFormatException nfe) { + } + + return new DataQueryTreeNode(id, name, count.intValue() > 0); + } + + @Override + public void remove() { + throw new UnsupportedOperationException( + "cannot remove nodes via iterator"); + } + + @Override + public boolean hasNext() { + return m_nodes.next(); + } + }*/ +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java.off deleted file mode 100755 index f0d777d39..000000000 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java.off +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ -package com.arsdigita.cms.ui.folder; - -import com.arsdigita.bebop.PageState; -import com.arsdigita.bebop.Tree; -import com.arsdigita.bebop.tree.TreeModelBuilder; -import com.arsdigita.bebop.tree.TreeNode; -import com.arsdigita.cms.CMS; -import org.librecms.contentsection.ContentSection; -import com.arsdigita.util.LockableImpl; -import java.math.BigDecimal; -import java.util.Collections; -import java.util.Iterator; -import org.apache.log4j.Logger; - -/** - * A {@link com.arsdigita.bebop.tree.TreeModelBuilder} that produces trees - * containing the folder structure underneath a root folder. The root - * folder can be changed by overriding {@link #getRoot getRoot}. - * - * @author Tri Tran - * @author David Lutterkort - * - * @version $Id: FolderTreeModelBuilder.java 2183 2011-06-20 00:57:18Z pboy $ - */ -public class FolderTreeModelBuilder extends LockableImpl - implements TreeModelBuilder { - - private static final Logger s_log = Logger.getLogger(FolderTreeModelBuilder.class); - - /** - * Make a tree model that lists the hierarchy of folders underneath the - * folder returned by {@link #getRoot getRoot}. - * - * @param t the tree in which the model is used - * @param s represents the current request - * @return a tree model that lists the hierarchy of folders underneath the - * folder returnedby {@link #getRoot getRoot}. - */ - @Override - public com.arsdigita.bebop.tree.TreeModel makeModel(final Tree t, - PageState s) { - return new DataQueryTreeModel(getRoot(s).getID(), - "com.arsdigita.cms.getRootFolder", - "com.arsdigita.cms.getSubFolders") { - - @Override - public Iterator getChildren(TreeNode node, PageState data) { - String nodeKey = node.getKey().toString(); - - // Always expand root node - if (nodeKey.equals(getRoot(data).getKey().toString()) && t.isCollapsed(nodeKey, data)) { - t.expand(nodeKey, data); - } - - if (t.isCollapsed(nodeKey, data)) { - return Collections.EMPTY_LIST.iterator(); - } - Party party = Kernel.getContext().getParty(); - OID partyOID = null; - if (party == null) { - partyOID = new OID(User.BASE_DATA_OBJECT_TYPE, - PermissionManager.VIRTUAL_PUBLIC_ID); - } else { - partyOID = party.getOID(); - } - UniversalPermissionDescriptor universalPermission = - new UniversalPermissionDescriptor(SecurityManager.CMS_PREVIEW_ITEM_DESCRIPTOR, partyOID); - if (PermissionService.checkPermission(universalPermission)) { - // the person is an admin so we just pass in the - // standard, non filtered query - return getDataQueryTreeIterator( - (DataQueryTreeNode) node, - "com.arsdigita.cms.getSubFolders"); - } else { - // now we need to set the parameters - return new NewFolderBrowserIterator( - (DataQueryTreeNode) node, - partyOID); - } - } - }; - } - - /** - * Retrn the root folder for the tree model in the current - * request. - * @param s represents the current request - * @return the root folder for the tree - * @post return != null - */ - protected Folder getRoot(PageState s) - throws IllegalStateException { - ContentSection sec = CMS.getContext().getContentSection(); - return sec.getRootFolder(); - } - - private class NewFolderBrowserIterator implements Iterator { - - private DataQuery m_nodes; - - public NewFolderBrowserIterator(DataQueryTreeNode node, OID partyOID) { - - BigDecimal userID = (BigDecimal) partyOID.get("id"); - - String sql = "" - + "\n select f.folder_id as id," - + "\n f.label as name," - + "\n count(sub.item_id) as nchild" - + "\n from cms_folders f," - + "\n cms_items i" - + "\n left join" - + "\n (select i2.item_id, f2.label as name, i2.parent_id" - + "\n from cms_folders f2," - + "\n cms_items i2" - + "\n where f2.folder_id = i2.item_id) sub" - + "\n on (sub.parent_id = i.item_id" - + "\n and" - + "\n exists (select 1" - + "\n from dnm_object_1_granted_context dogc," - + "\n dnm_granted_context dgc," - + "\n dnm_permissions dp," - + "\n dnm_group_membership dgm" - + "\n where dogc.pd_object_id = sub.item_id" - + "\n and dogc.pd_context_id = dgc.pd_object_id" - + "\n and dgc.pd_context_id = dp.pd_object_id" - + "\n and dp.pd_grantee_id = dgm.pd_group_id" - + "\n and dgm.pd_member_id in (-200," + userID + ",-202)" - + "\n and dp." + TREE_DESCRIPTOR.getColumnName() + " = '1'" - + "\n ) )" - + "\n where i.parent_id = " + node.getID() - + "\n and f.folder_id = i.item_id" - + "\n and exists (" - + "\n select 1 as permission_p" - + "\n from dnm_object_1_granted_context dogc," - + "\n dnm_granted_context dgc," - + "\n dnm_permissions dp," - + "\n dnm_group_membership dgm" - + "\n where dogc.pd_context_id = dgc.pd_object_id" - + "\n and dgc.pd_context_id = dp.pd_object_id" - + "\n and dgm.pd_member_id in (-200," + userID + ",-202)" - + "\n and dp.pd_grantee_id = dgm.pd_group_id" - + "\n and dogc.pd_object_id = f.folder_id" - + "\n and dp." + TREE_DESCRIPTOR.getColumnName() + " = '1' )" - + "\n group by f.label, f.folder_id" - + "\n order by lower(f.label)"; - - if (s_log.isDebugEnabled()) { - s_log.debug("Custom SQL: \n" + sql); - } - - m_nodes = new GenericDataQuery( - SessionManager.getSession(), - sql, - new String[]{"id", "name", "nchild"}); - } - - @Override - public Object next() { - BigDecimal id = new BigDecimal(0); - try { - // this appears to be the only portable way to dig numbers out - // of the result set - id = new BigDecimal(m_nodes.get("id").toString()); - } catch (NumberFormatException nfe) { - } - String name = m_nodes.get("name").toString(); - BigDecimal count = new BigDecimal(0); - try { - count = new BigDecimal(m_nodes.get("nchild").toString()); - } catch (NumberFormatException nfe) { - } - - return new DataQueryTreeNode(id, name, count.intValue() > 0); - } - - @Override - public void remove() { - throw new UnsupportedOperationException("cannot remove nodes via iterator"); - } - - @Override - public boolean hasNext() { - return m_nodes.next(); - } - } -}