Author: raintang Date: 2009-08-20 08:29:56 +0200 (Thu, 20 Aug 2009) New Revision: 38056
Modified: CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/ContentElementUtil.java CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/ContentAction.java CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/ContentSearchAction.java CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/SearchAction.java CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/SearchInitAction.java Log: CMSC-1476 3 Based on the FD, implement simple editor overview page including: head/body/foot page. refact the code Modified: CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/ContentElementUtil.java =================================================================== --- CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/ContentElementUtil.java 2009-08-20 06:28:50 UTC (rev 38055) +++ CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/ContentElementUtil.java 2009-08-20 06:29:56 UTC (rev 38056) @@ -1,22 +1,41 @@ /* - -This software is OSI Certified Open Source Software. -OSI Certified is a certification mark of the Open Source Initiative. - -The license (Mozilla version 1.0) can be read at the MMBase site. -See http://www.MMBase.org/license - + * + * This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source + * Initiative. + * + * The license (Mozilla version 1.0) can be read at the MMBase site. See http://www.MMBase.org/license */ package com.finalist.cmsc.repository; -import java.util.*; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.TreeSet; import net.sf.mmapps.modules.cloudprovider.CloudProviderFactory; import org.apache.commons.lang.StringUtils; -import org.mmbase.bridge.*; +import org.apache.struts.util.LabelValueBean; +import org.mmbase.bridge.Cloud; +import org.mmbase.bridge.Field; +import org.mmbase.bridge.Node; +import org.mmbase.bridge.NodeIterator; +import org.mmbase.bridge.NodeList; +import org.mmbase.bridge.NodeManager; +import org.mmbase.bridge.NodeManagerList; +import org.mmbase.bridge.NodeQuery; +import org.mmbase.bridge.NotFoundException; +import org.mmbase.bridge.Relation; +import org.mmbase.bridge.RelationIterator; +import org.mmbase.bridge.RelationManager; import org.mmbase.bridge.util.SearchUtil; -import org.mmbase.storage.search.*; +import org.mmbase.storage.search.CompositeConstraint; +import org.mmbase.storage.search.Constraint; +import org.mmbase.storage.search.FieldCompareConstraint; import com.finalist.cmsc.mmbase.PropertiesUtil; import com.finalist.cmsc.mmbase.TypeUtil; @@ -51,12 +70,10 @@ // utility } - public static NodeManager getNodeManager(Cloud cloud) { return cloud.getNodeManager(CONTENTELEMENT); } - public static List<NodeManager> getContentTypes(Cloud cloud) { List<NodeManager> result = new ArrayList<NodeManager>(); NodeManagerList nml = cloud.getNodeManagers(); @@ -76,32 +93,28 @@ return result; } - public static boolean isContentElementField(Field field) { - Cloud cloud = field.getNodeManager().getCloud(); - ; + Cloud cloud = field.getNodeManager().getCloud();; return cloud.getNodeManager(CONTENTELEMENT).hasField(field.getName()); } - /** * Is element from one of the content types - * + * * @param element * node to check * @return is content type */ public static boolean isContentElement(Node element) { if (element == null) return false; - + NodeManager nm = element.getNodeManager(); return isContentType(nm); } - /** * Is ModeManager of the content types - * + * * @param nm * NodeManager to check * @return is content type @@ -117,17 +130,15 @@ nmTemp = nmTemp.getParent(); } return true; - } - catch (NotFoundException nfe) { + } catch (NotFoundException nfe) { // Ran out of NodeManager parents } return false; } - /** * Is type of content type - * + * * @param type * to check * @return is content type @@ -137,7 +148,6 @@ return isContentType(nm); } - public static void removeContentBlock(Node node) { List<Node> nodes = findContentBlockNodes(node); for (Node removeNode : nodes) { @@ -145,21 +155,18 @@ } } - public static List<Node> findContentBlockNodes(Node node) { List<Node> nodes = new ArrayList<Node>(); findContentBlockNodes(node, nodes, false, false); return nodes; } - public static List<Node> findContentBlockNodesWithRelations(Node node) { List<Node> nodes = new ArrayList<Node>(); findContentBlockNodes(node, nodes, true, false); return nodes; } - public static void findContentBlockNodes(Node node, List<Node> nodes, boolean withRelation, boolean remove) { if (!remove) { if (!nodes.contains(node)) { @@ -174,15 +181,13 @@ if (!RepositoryUtil.hasContentChannel(childNode)) { findContentBlockNodes(childNode, nodes, withRelation, remove); } - } - else { + } else { if (!RepositoryUtil.isContentChannel(childNode)) { if (remove) { if (childNode.countRelatedNodes(null, null, SOURCE) <= 1) { findContentBlockNodes(childNode, nodes, withRelation, remove); } - } - else { + } else { if (!TypeUtil.isSystemType(childNode.getNodeManager().getName())) { findContentBlockNodes(childNode, nodes, withRelation, remove); } @@ -207,7 +212,6 @@ } } - public static Node createContentElement(Cloud cloud, String manager, String creationPath, boolean linkToChannel) { Node creationChannel = RepositoryUtil.getChannelFromPath(cloud, creationPath); if (creationChannel == null) { @@ -217,7 +221,6 @@ return createContentElement(cloud, manager, creationChannel, title, linkToChannel); } - public static Node createContentElement(Cloud cloud, String manager, String creationPath, String title, boolean linkToChannel) { Node creationChannel = RepositoryUtil.getChannelFromPath(cloud, creationPath); @@ -227,13 +230,11 @@ return createContentElement(cloud, manager, creationChannel, title, linkToChannel); } - public static Node createContentElement(Cloud cloud, String manager, Node creationChannel, boolean linkToChannel) { String title = creationChannel.getStringValue(RepositoryUtil.TITLE_FIELD); return createContentElement(cloud, manager, creationChannel, title, linkToChannel); } - public static Node createContentElement(Cloud cloud, String manager, Node creationChannel, String title, boolean linkToChannel) { NodeManager contentManager = cloud.getNodeManager(manager); @@ -246,19 +247,17 @@ addOwner(content); if (linkToChannel) { RepositoryUtil.addContentToChannel(content, creationChannel); - } - else { + } else { RepositoryUtil.addCreationChannel(content, creationChannel); } return content; } - /** * Add owner - * - * @param content - - * content + * + * @param content + * - content */ public static void addOwner(Node content) { Cloud cloud = content.getCloud(); @@ -268,12 +267,11 @@ ownerrel.commit(); } - /** * Check if a contentnode has an owner - * - * @param content - - * Content Node + * + * @param content + * - Content Node * @return true if the node has a related workflowitem */ public static boolean hasOwner(Node content) { @@ -281,12 +279,11 @@ return count > 0; } - /** * Get author of the content element - * - * @param content - - * Content Node + * + * @param content + * - Content Node * @return Author node */ public static Node getAuthor(Node content) { @@ -294,12 +291,11 @@ return SecurityUtil.getUserNode(content.getCloud(), creator); } - /** * Get owner of the content element - * - * @param content - - * Content Node + * + * @param content + * - Content Node * @return Owner node */ public static Node getOwner(Node content) { @@ -310,7 +306,6 @@ return null; } - public static void addNotExpiredConstraint(Node channel, NodeQuery query, long date) { NodeManager contentManager = channel.getCloud().getNodeManager(CONTENTELEMENT); @@ -321,7 +316,6 @@ SearchUtil.addConstraint(query, composite); } - public static void addLifeCycleConstraint(NodeQuery query, long date) { NodeManager contentManager = query.getCloud().getNodeManager(CONTENTELEMENT); @@ -335,7 +329,6 @@ SearchUtil.addConstraint(query, composite); } - public static void addLifeCycleInverseConstraint(NodeQuery query, long date) { NodeManager contentManager = query.getCloud().getNodeManager(CONTENTELEMENT); @@ -349,7 +342,6 @@ SearchUtil.addConstraint(query, composite); } - public static Constraint getUseExpireConstraint(NodeQuery query, NodeManager contentManager, Boolean value) { Field useExpireField = contentManager.getField(USE_EXPIRY_FIELD); Constraint useExpire = query.createConstraint(query.getStepField(useExpireField), FieldCompareConstraint.EQUAL, @@ -357,7 +349,6 @@ return useExpire; } - public static Constraint getExpireConstraint(NodeQuery query, long date, NodeManager contentManager, boolean greater) { int operator = (greater ? FieldCompareConstraint.GREATER_EQUAL : FieldCompareConstraint.LESS_EQUAL); @@ -367,7 +358,6 @@ return expirydate; } - public static Constraint getPublishConstraint(NodeQuery query, long date, NodeManager contentManager, boolean greater) { int operator = (greater ? FieldCompareConstraint.GREATER_EQUAL : FieldCompareConstraint.LESS_EQUAL); @@ -377,7 +367,6 @@ return publishdate; } - public static void addArchiveConstraint(Node channel, NodeQuery query, Long date, String archive) { if (StringUtils.isEmpty(archive) || "all".equalsIgnoreCase(archive)) { return; @@ -391,8 +380,7 @@ if ("old".equalsIgnoreCase(archive)) { archivedate = query.createConstraint(query.getStepField(archiveDateField), FieldCompareConstraint.LESS_EQUAL, archiveDateObj); - } - else { + } else { // "new".equalsIgnoreCase(archive) archivedate = query.createConstraint(query.getStepField(archiveDateField), FieldCompareConstraint.GREATER_EQUAL, archiveDateObj); @@ -400,15 +388,17 @@ SearchUtil.addConstraint(query, archivedate); } - - /** - * judge if the content's archive date is in the archive time scope - * @param content the node to be match - * @param archive spcifiy how to calculate the archive time scrop.accept "all" "old" or other String as parameter, - * @return <li>true if archive is "all" or content is empty. - * <li>true if archive is "old" and content's archive time is before current time - * <li>true if archive is others and content's archive time is after or equels to current time - */ + /** + * judge if the content's archive date is in the archive time scope + * + * @param content + * the node to be match + * @param archive + * spcifiy how to calculate the archive time scrop.accept "all" "old" or other String as parameter, + * @return <li>true if archive is "all" or content is empty. <li>true if archive is "old" and content's archive time + * is before current time <li>true if archive is others and content's archive time is after or equels to + * current time + */ public static boolean matchArchive(Node content, String archive) { if (StringUtils.isEmpty(archive) || "all".equalsIgnoreCase(archive)) { return true; @@ -422,15 +412,14 @@ Date archiveDate = content.getDateValue(ARCHIVEDATE_FIELD); if ("old".equalsIgnoreCase(archive)) { return archiveDate.getTime() < date; - } - else { + } else { return archiveDate.getTime() >= date; } } /** * Helper method to get all hidden types - * + * * @return List of hidden types */ public static List<String> getHiddenTypes() { @@ -447,4 +436,42 @@ return list; } + /** + * Return a valid type list, not including those belong to hidden types + * + * @param cloud + * @param request + * @param types + */ + public static List<LabelValueBean> getValidTypesList(Cloud cloud, List<NodeManager> types) { + List<LabelValueBean> typesList = new ArrayList<LabelValueBean>(); + List<String> hiddenTypes = getHiddenTypes(); + for (NodeManager manager : types) { + String name = manager.getName(); + if (!hiddenTypes.contains(name)) { + LabelValueBean bean = new LabelValueBean(manager.getGUIName(), name); + typesList.add(bean); + } + } + return typesList; + } + + /** + * + * @param cloud + * @param types + * @return + */ + public static TreeSet<Integer> getValidTypes(Cloud cloud, List<NodeManager> types) { + List<String> hiddenTypes = getHiddenTypes(); + TreeSet<Integer> validTypes = null; + for (NodeManager manager : types) { + String name = manager.getName(); + if (!hiddenTypes.contains(name)) { + validTypes.add(manager.getNumber()); + } + } + return validTypes; + } + } Modified: CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/ContentAction.java =================================================================== --- CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/ContentAction.java 2009-08-20 06:28:50 UTC (rev 38055) +++ CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/ContentAction.java 2009-08-20 06:29:56 UTC (rev 38056) @@ -1,24 +1,30 @@ /* - -This software is OSI Certified Open Source Software. -OSI Certified is a certification mark of the Open Source Initiative. - -The license (Mozilla version 1.0) can be read at the MMBase site. -See http://www.MMBase.org/license - + * + * This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source + * Initiative. + * + * The license (Mozilla version 1.0) can be read at the MMBase site. See http://www.MMBase.org/license */ package com.finalist.cmsc.repository.forms; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; - -import org.apache.struts.action.*; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; import org.apache.struts.util.LabelValueBean; -import org.mmbase.bridge.*; +import org.mmbase.bridge.Cloud; +import org.mmbase.bridge.Node; +import org.mmbase.bridge.NodeList; +import org.mmbase.bridge.NodeManager; import com.finalist.cmsc.mmbase.PropertiesUtil; import com.finalist.cmsc.repository.ContentElementUtil; @@ -26,28 +32,21 @@ import com.finalist.cmsc.struts.MMBaseAction; public class ContentAction extends MMBaseAction { - + private final static String MOVECONTENTTOCHANNEL = "moveContentToChannel"; + @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, Cloud cloud) throws Exception { String action = request.getParameter("action"); - if(StringUtils.isNotEmpty(action) && action.equals(MOVECONTENTTOCHANNEL)) { + if (StringUtils.isNotEmpty(action) && action.equals(MOVECONTENTTOCHANNEL)) { return mapping.findForward(MOVECONTENTTOCHANNEL); } List<LabelValueBean> typesList = new ArrayList<LabelValueBean>(); List<NodeManager> types = ContentElementUtil.getContentTypes(cloud); - List<String> hiddenTypes = ContentElementUtil.getHiddenTypes(); - for (NodeManager manager : types) { - String name = manager.getName(); - if (!hiddenTypes.contains(name)) { - LabelValueBean bean = new LabelValueBean(manager.getGUIName(), name); - typesList.add(bean); - } - } - addToRequest(request, "typesList", typesList); + addToRequest(request, "typesList", ContentElementUtil.getValidTypesList(cloud, types)); String parentchannel = request.getParameter("parentchannel"); String orderby = request.getParameter("orderby"); @@ -56,27 +55,28 @@ orderby = null; } if (StringUtils.isEmpty(direction)) { - direction = null; + direction = null; } // Set the offset (used for paging). String offsetString = request.getParameter("offset"); int offset = 0; if (offsetString != null && offsetString.matches("\\d+")) { - offset = Integer.parseInt(offsetString); + offset = Integer.parseInt(offsetString); } - + // Set the maximum result size. String resultsPerPage = PropertiesUtil.getProperty(SearchAction.REPOSITORY_SEARCH_RESULTS_PER_PAGE); int maxNumber = 25; if (resultsPerPage != null && resultsPerPage.matches("\\d+")) { - maxNumber = Integer.parseInt(resultsPerPage); + maxNumber = Integer.parseInt(resultsPerPage); } addToRequest(request, "resultsPerPage", Integer.toString(maxNumber)); - + if (StringUtils.isNotEmpty(parentchannel)) { Node channel = cloud.getNode(parentchannel); - NodeList elements = RepositoryUtil.getLinkedElements(channel, null, orderby, direction, false, offset*maxNumber, maxNumber, -1, -1, -1); + NodeList elements = RepositoryUtil.getLinkedElements(channel, null, orderby, direction, false, offset + * maxNumber, maxNumber, -1, -1, -1); int elementCount = RepositoryUtil.countLinkedContent(channel); addToRequest(request, "direction", direction); addToRequest(request, "orderby", orderby); @@ -87,7 +87,7 @@ addToRequest(request, "message", (String) request.getSession().getAttribute("message")); request.getSession().removeAttribute("message"); } - + NodeList created = RepositoryUtil.getCreatedElements(channel); Map<String, Node> createdNumbers = new HashMap<String, Node>(); for (Iterator<Node> iter = created.iterator(); iter.hasNext();) { @@ -95,17 +95,17 @@ createdNumbers.put(String.valueOf(createdElement.getNumber()), createdElement); } addToRequest(request, "createdNumbers", createdNumbers); - //cmsc-1205 don't refresh channel tree when not necessary + // cmsc-1205 don't refresh channel tree when not necessary String type = request.getParameter("type"); - //cmsc-144 make reorder icon show up - if(elementCount==2&& type != null){ - request.setAttribute("refresh", true); + // cmsc-144 make reorder icon show up + if (elementCount == 2 && type != null) { + request.setAttribute("refresh", true); } - //reset the show mode of assets in the session when enter another channel - if(type==null){ + // reset the show mode of assets in the session when enter another channel + if (type == null) { request.getSession().removeAttribute("show"); request.getSession().removeAttribute("imageOnly"); - } + } } return mapping.findForward(SUCCESS); } Modified: CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/ContentSearchAction.java =================================================================== --- CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/ContentSearchAction.java 2009-08-20 06:28:50 UTC (rev 38055) +++ CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/ContentSearchAction.java 2009-08-20 06:29:56 UTC (rev 38056) @@ -83,7 +83,7 @@ request.setAttribute(INDEX, index); request.setAttribute(TITLE, searchForm.getTitle()); request.setAttribute(ONLYTYPE, onlytype); - + if (StringUtils.isNotEmpty(deleteContentRequest)) { if (deleteContentRequest.startsWith("massDelete:")) { massDeleteContent(deleteContentRequest.substring(11), cloud); @@ -100,15 +100,7 @@ List<LabelValueBean> typesList = new ArrayList<LabelValueBean>(); List<NodeManager> types = ContentElementUtil.getContentTypes(cloud); - List<String> hiddenTypes = ContentElementUtil.getHiddenTypes(); - for (NodeManager manager : types) { - String name = manager.getName(); - if (!hiddenTypes.contains(name)) { - LabelValueBean bean = new LabelValueBean(manager.getGUIName(), name); - typesList.add(bean); - } - } - addToRequest(request, "typesList", typesList); + addToRequest(request, "typesList", ContentElementUtil.getValidTypesList(cloud, types)); // Switching tab, no searching. if ("false".equalsIgnoreCase(searchForm.getSearch())) { @@ -167,13 +159,17 @@ // Set some date constraints. queryStringComposer.addParameter(ContentElementUtil.CREATIONDATE_FIELD, "" + searchForm.getCreationdate()); - SearchUtil.addDayConstraint(query, nodeManager, ContentElementUtil.CREATIONDATE_FIELD, searchForm.getCreationdate()); + SearchUtil.addDayConstraint(query, nodeManager, ContentElementUtil.CREATIONDATE_FIELD, searchForm + .getCreationdate()); queryStringComposer.addParameter(ContentElementUtil.PUBLISHDATE_FIELD, "" + searchForm.getPublishdate()); - SearchUtil.addDayConstraint(query, nodeManager, ContentElementUtil.PUBLISHDATE_FIELD, searchForm.getPublishdate()); + SearchUtil + .addDayConstraint(query, nodeManager, ContentElementUtil.PUBLISHDATE_FIELD, searchForm.getPublishdate()); queryStringComposer.addParameter(ContentElementUtil.EXPIREDATE_FIELD, "" + searchForm.getExpiredate()); SearchUtil.addDayConstraint(query, nodeManager, ContentElementUtil.EXPIREDATE_FIELD, searchForm.getExpiredate()); - queryStringComposer.addParameter(ContentElementUtil.LASTMODIFIEDDATE_FIELD, "" + searchForm.getLastmodifieddate()); - SearchUtil.addDayConstraint(query, nodeManager, ContentElementUtil.LASTMODIFIEDDATE_FIELD, searchForm.getLastmodifieddate()); + queryStringComposer + .addParameter(ContentElementUtil.LASTMODIFIEDDATE_FIELD, "" + searchForm.getLastmodifieddate()); + SearchUtil.addDayConstraint(query, nodeManager, ContentElementUtil.LASTMODIFIEDDATE_FIELD, searchForm + .getLastmodifieddate()); // Perhaps we have some more constraints if the nodetype was specified (=> not contentelement). if (!ContentElementUtil.CONTENTELEMENT.equalsIgnoreCase(nodeManager.getName())) { @@ -200,11 +196,11 @@ SearchUtil.addConstraint(query, titleConstraint); } - //if in simple search mode, add input to the keyword search too - //And add ordinary keywords + // if in simple search mode, add input to the keyword search too + // And add ordinary keywords List<String> keywords = searchKeywords(request.getParameter(MODE), searchForm); addKeyConstraint(searchForm, nodeManager, queryStringComposer, query, keywords); - + // Set the objectid constraint if (StringUtils.isNotEmpty(searchForm.getObjectid())) { String stringObjectId = searchForm.getObjectid(); @@ -299,7 +295,8 @@ return keywords; } - private void addKeyConstraint(SearchForm searchForm, NodeManager nodeManager, QueryStringComposer queryStringComposer, NodeQuery query, List<String> keywords) { + private void addKeyConstraint(SearchForm searchForm, NodeManager nodeManager, + QueryStringComposer queryStringComposer, NodeQuery query, List<String> keywords) { if (keywords == null) return; queryStringComposer.addParameter(ContentElementUtil.KEYWORD_FIELD, searchForm.getKeywords()); Modified: CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/SearchAction.java =================================================================== --- CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/SearchAction.java 2009-08-20 06:28:50 UTC (rev 38055) +++ CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/SearchAction.java 2009-08-20 06:29:56 UTC (rev 38056) @@ -1,6 +1,7 @@ package com.finalist.cmsc.repository.forms; -import java.util.*; +import java.util.List; +import java.util.StringTokenizer; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -9,9 +10,17 @@ import net.sf.mmapps.modules.cloudprovider.CloudProviderFactory; import org.apache.commons.lang.StringUtils; -import org.apache.struts.action.*; -import org.apache.struts.util.LabelValueBean; -import org.mmbase.bridge.*; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.mmbase.bridge.Cloud; +import org.mmbase.bridge.Field; +import org.mmbase.bridge.FieldIterator; +import org.mmbase.bridge.FieldList; +import org.mmbase.bridge.Node; +import org.mmbase.bridge.NodeList; +import org.mmbase.bridge.NodeManager; +import org.mmbase.bridge.NodeQuery; import org.mmbase.bridge.util.Queries; import org.mmbase.bridge.util.SearchUtil; import org.mmbase.storage.search.Constraint; @@ -30,277 +39,262 @@ public class SearchAction extends PagerAction { - public static final String GETURL = "geturl"; + public static final String GETURL = "geturl"; - public static final String PERSONAL = "personal"; - public static final String MODE = "mode"; - public static final String AUTHOR = "author"; - public static final String OBJECTID = "objectid"; - public static final String PARENTCHANNEL = "parentchannel"; - public static final String CONTENTTYPES = "contenttypes"; + public static final String PERSONAL = "personal"; + public static final String MODE = "mode"; + public static final String AUTHOR = "author"; + public static final String OBJECTID = "objectid"; + public static final String PARENTCHANNEL = "parentchannel"; + public static final String CONTENTTYPES = "contenttypes"; - public static final String REPOSITORY_SEARCH_RESULTS_PER_PAGE = "repository.search.results.per.page"; + public static final String REPOSITORY_SEARCH_RESULTS_PER_PAGE = "repository.search.results.per.page"; - /** - * MMbase logging system - */ - private static final Logger log = Logging.getLoggerInstance(SearchAction.class.getName()); + /** + * MMbase logging system + */ + private static final Logger log = Logging.getLoggerInstance(SearchAction.class.getName()); + @Override + public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response, Cloud cloud) throws Exception { - @Override - public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, Cloud cloud) throws Exception { + log.debug("Starting the search:"); - log.debug("Starting the search:"); + // Initialize + SearchForm searchForm = (SearchForm) form; - // Initialize - SearchForm searchForm = (SearchForm) form; + String deleteContentRequest = request.getParameter("deleteContentRequest"); - String deleteContentRequest = request.getParameter("deleteContentRequest"); - - if (StringUtils.isNotEmpty(deleteContentRequest)) { - if(deleteContentRequest.startsWith("massDelete:")) { - massDeleteContent(deleteContentRequest.substring(11)); - } - else { + if (StringUtils.isNotEmpty(deleteContentRequest)) { + if (deleteContentRequest.startsWith("massDelete:")) { + massDeleteContent(deleteContentRequest.substring(11)); + } else { deleteContent(deleteContentRequest); - } + } - // add a flag to let search result page refresh the channels frame, - // so that the number of item in recyclebin can update - request.setAttribute("refreshChannels", "refreshChannels"); - } + // add a flag to let search result page refresh the channels frame, + // so that the number of item in recyclebin can update + request.setAttribute("refreshChannels", "refreshChannels"); + } - // First prepare the typeList, we'll need this one anyway: - List<LabelValueBean> typesList = new ArrayList<LabelValueBean>(); + // First prepare the typeList, we'll need this one anyway: + List<NodeManager> types = ContentElementUtil.getContentTypes(cloud); + addToRequest(request, "typesList", ContentElementUtil.getValidTypesList(cloud, types)); - List<NodeManager> types = ContentElementUtil.getContentTypes(cloud); - List<String> hiddenTypes = ContentElementUtil.getHiddenTypes(); - for (NodeManager manager : types) { - String name = manager.getName(); - if (!hiddenTypes.contains(name)) { - LabelValueBean bean = new LabelValueBean(manager.getGUIName(), name); - typesList.add(bean); - } - } - addToRequest(request, "typesList", typesList); + // Switching tab, no searching. + if ("false".equalsIgnoreCase(searchForm.getSearch())) { + return mapping.getInputForward(); + } - // Switching tab, no searching. - if ("false".equalsIgnoreCase(searchForm.getSearch())) { - return mapping.getInputForward(); - } + NodeManager nodeManager = cloud.getNodeManager(searchForm.getContenttypes()); + QueryStringComposer queryStringComposer = new QueryStringComposer(); + if (StringUtils.isNotEmpty(request.getParameter(MODE))) { + queryStringComposer.addParameter(MODE, request.getParameter(MODE)); + } + NodeQuery query = cloud.createNodeQuery(); - NodeManager nodeManager = cloud.getNodeManager(searchForm.getContenttypes()); - QueryStringComposer queryStringComposer = new QueryStringComposer(); - if(StringUtils.isNotEmpty(request.getParameter(MODE))) { - queryStringComposer.addParameter(MODE, request.getParameter(MODE)); - } - NodeQuery query = cloud.createNodeQuery(); + // First we add the contenttype parameter + queryStringComposer.addParameter(CONTENTTYPES, searchForm.getContenttypes()); - // First we add the contenttype parameter - queryStringComposer.addParameter(CONTENTTYPES, searchForm.getContenttypes()); + // First add the proper step to the query. + Step theStep = null; + if (StringUtils.isNotEmpty(searchForm.getParentchannel())) { + Step step = query.addStep(cloud.getNodeManager(RepositoryUtil.CONTENTCHANNEL)); + query.addNode(step, cloud.getNode(searchForm.getParentchannel())); + theStep = query.addRelationStep(nodeManager, RepositoryUtil.CONTENTREL, "DESTINATION").getNext(); + query.setNodeStep(theStep); + queryStringComposer.addParameter(PARENTCHANNEL, searchForm.getParentchannel()); + } else { + theStep = query.addStep(nodeManager); + query.setNodeStep(theStep); + } - // First add the proper step to the query. - Step theStep = null; - if (StringUtils.isNotEmpty(searchForm.getParentchannel())) { - Step step = query.addStep(cloud.getNodeManager(RepositoryUtil.CONTENTCHANNEL)); - query.addNode(step, cloud.getNode(searchForm.getParentchannel())); - theStep = query.addRelationStep(nodeManager, RepositoryUtil.CONTENTREL, "DESTINATION").getNext(); - query.setNodeStep(theStep); - queryStringComposer.addParameter(PARENTCHANNEL, searchForm.getParentchannel()); - } - else { - theStep = query.addStep(nodeManager); - query.setNodeStep(theStep); - } + // Order the result by: + String order = searchForm.getOrder(); - // Order the result by: - String order = searchForm.getOrder(); + // set default order field + if (StringUtils.isEmpty(order)) { + if (nodeManager.hasField("title")) { + order = "title"; + } + if (nodeManager.hasField("name")) { + order = "name"; + } + } + if (StringUtils.isNotEmpty(order)) { + queryStringComposer.addParameter(ORDER, searchForm.getOrder()); + queryStringComposer.addParameter(DIRECTION, "" + searchForm.getDirection()); + query.addSortOrder(query.getStepField(nodeManager.getField(order)), searchForm.getDirection()); + } - // set default order field - if (StringUtils.isEmpty(order)) { - if (nodeManager.hasField("title")) { - order = "title"; - } - if (nodeManager.hasField("name")) { - order = "name"; - } - } - if (StringUtils.isNotEmpty(order)) { - queryStringComposer.addParameter(ORDER, searchForm.getOrder()); - queryStringComposer.addParameter(DIRECTION, "" + searchForm.getDirection()); - query.addSortOrder(query.getStepField(nodeManager.getField(order)), searchForm.getDirection()); - } + query.setDistinct(true); - query.setDistinct(true); + // Set some date constraints. + queryStringComposer.addParameter(ContentElementUtil.CREATIONDATE_FIELD, "" + searchForm.getCreationdate()); + SearchUtil.addDayConstraint(query, nodeManager, ContentElementUtil.CREATIONDATE_FIELD, searchForm + .getCreationdate()); + queryStringComposer.addParameter(ContentElementUtil.PUBLISHDATE_FIELD, "" + searchForm.getPublishdate()); + SearchUtil + .addDayConstraint(query, nodeManager, ContentElementUtil.PUBLISHDATE_FIELD, searchForm.getPublishdate()); + queryStringComposer.addParameter(ContentElementUtil.EXPIREDATE_FIELD, "" + searchForm.getExpiredate()); + SearchUtil.addDayConstraint(query, nodeManager, ContentElementUtil.EXPIREDATE_FIELD, searchForm.getExpiredate()); + queryStringComposer + .addParameter(ContentElementUtil.LASTMODIFIEDDATE_FIELD, "" + searchForm.getLastmodifieddate()); + SearchUtil.addDayConstraint(query, nodeManager, ContentElementUtil.LASTMODIFIEDDATE_FIELD, searchForm + .getLastmodifieddate()); - // Set some date constraints. - queryStringComposer.addParameter(ContentElementUtil.CREATIONDATE_FIELD, "" + searchForm.getCreationdate()); - SearchUtil.addDayConstraint(query, nodeManager, ContentElementUtil.CREATIONDATE_FIELD, searchForm - .getCreationdate()); - queryStringComposer.addParameter(ContentElementUtil.PUBLISHDATE_FIELD, "" + searchForm.getPublishdate()); - SearchUtil - .addDayConstraint(query, nodeManager, ContentElementUtil.PUBLISHDATE_FIELD, searchForm.getPublishdate()); - queryStringComposer.addParameter(ContentElementUtil.EXPIREDATE_FIELD, "" + searchForm.getExpiredate()); - SearchUtil.addDayConstraint(query, nodeManager, ContentElementUtil.EXPIREDATE_FIELD, searchForm.getExpiredate()); - queryStringComposer - .addParameter(ContentElementUtil.LASTMODIFIEDDATE_FIELD, "" + searchForm.getLastmodifieddate()); - SearchUtil.addDayConstraint(query, nodeManager, ContentElementUtil.LASTMODIFIEDDATE_FIELD, searchForm - .getLastmodifieddate()); + // Perhaps we have some more constraints if the nodetype was specified (=> + // not + // contentelement). + if (!ContentElementUtil.CONTENTELEMENT.equalsIgnoreCase(nodeManager.getName())) { + FieldList fields = nodeManager.getFields(); + FieldIterator fieldIterator = fields.fieldIterator(); - // Perhaps we have some more constraints if the nodetype was specified (=> - // not - // contentelement). - if (!ContentElementUtil.CONTENTELEMENT.equalsIgnoreCase(nodeManager.getName())) { - FieldList fields = nodeManager.getFields(); - FieldIterator fieldIterator = fields.fieldIterator(); - - while (fieldIterator.hasNext()) { - Field field = fieldIterator.nextField(); - String paramName = nodeManager.getName() + "." + field.getName(); - String paramValue = request.getParameter(paramName); - if (StringUtils.isNotEmpty(paramValue)) { - SearchUtil.addLikeConstraint(query, field, paramValue.trim()); - } - queryStringComposer.addParameter(paramName, paramValue); + while (fieldIterator.hasNext()) { + Field field = fieldIterator.nextField(); + String paramName = nodeManager.getName() + "." + field.getName(); + String paramValue = request.getParameter(paramName); + if (StringUtils.isNotEmpty(paramValue)) { + SearchUtil.addLikeConstraint(query, field, paramValue.trim()); } - } + queryStringComposer.addParameter(paramName, paramValue); + } + } - // Add the title constraint: - if (StringUtils.isNotEmpty(searchForm.getTitle())) { + // Add the title constraint: + if (StringUtils.isNotEmpty(searchForm.getTitle())) { - queryStringComposer.addParameter(ContentElementUtil.TITLE_FIELD, searchForm.getTitle().trim()); - Field field = nodeManager.getField(ContentElementUtil.TITLE_FIELD); - Constraint titleConstraint = SearchUtil.createLikeConstraint(query, field, searchForm.getTitle().trim()); - SearchUtil.addConstraint(query, titleConstraint); - } + queryStringComposer.addParameter(ContentElementUtil.TITLE_FIELD, searchForm.getTitle().trim()); + Field field = nodeManager.getField(ContentElementUtil.TITLE_FIELD); + Constraint titleConstraint = SearchUtil.createLikeConstraint(query, field, searchForm.getTitle().trim()); + SearchUtil.addConstraint(query, titleConstraint); + } - // And some keyword searching - if (StringUtils.isNotEmpty(searchForm.getKeywords())) { - queryStringComposer.addParameter(ContentElementUtil.KEYWORD_FIELD, searchForm.getKeywords()); - Field keywordField = nodeManager.getField(ContentElementUtil.KEYWORD_FIELD); - List<String> keywords = KeywordUtil.getKeywords(searchForm.getKeywords()); - for (String keyword : keywords) { - Constraint keywordConstraint = SearchUtil.createLikeConstraint(query, keywordField, keyword); - SearchUtil.addORConstraint(query, keywordConstraint); - } - } + // And some keyword searching + if (StringUtils.isNotEmpty(searchForm.getKeywords())) { + queryStringComposer.addParameter(ContentElementUtil.KEYWORD_FIELD, searchForm.getKeywords()); + Field keywordField = nodeManager.getField(ContentElementUtil.KEYWORD_FIELD); + List<String> keywords = KeywordUtil.getKeywords(searchForm.getKeywords()); + for (String keyword : keywords) { + Constraint keywordConstraint = SearchUtil.createLikeConstraint(query, keywordField, keyword); + SearchUtil.addORConstraint(query, keywordConstraint); + } + } - // Set the objectid constraint - if (StringUtils.isNotEmpty(searchForm.getObjectid())) { - String stringObjectId = searchForm.getObjectid().trim(); - Integer objectId = null; - if (stringObjectId.matches("^\\d+$")) { - objectId = Integer.valueOf(stringObjectId); + // Set the objectid constraint + if (StringUtils.isNotEmpty(searchForm.getObjectid())) { + String stringObjectId = searchForm.getObjectid().trim(); + Integer objectId = null; + if (stringObjectId.matches("^\\d+$")) { + objectId = Integer.valueOf(stringObjectId); + } else { + if (cloud.hasNode(stringObjectId)) { + objectId = Integer.valueOf(cloud.getNode(stringObjectId).getNumber()); + } else { + objectId = Integer.valueOf(-1); } - else { - if (cloud.hasNode(stringObjectId)) { - objectId = Integer.valueOf(cloud.getNode(stringObjectId).getNumber()); - } - else { - objectId = Integer.valueOf(-1); - } - } - SearchUtil.addEqualConstraint(query, nodeManager, ContentElementUtil.NUMBER_FIELD, objectId); - queryStringComposer.addParameter(OBJECTID, stringObjectId); - } + } + SearchUtil.addEqualConstraint(query, nodeManager, ContentElementUtil.NUMBER_FIELD, objectId); + queryStringComposer.addParameter(OBJECTID, stringObjectId); + } - // Add the user personal: - if (StringUtils.isNotEmpty(searchForm.getPersonal())) { + // Add the user personal: + if (StringUtils.isNotEmpty(searchForm.getPersonal())) { - String useraccount = cloud.getUser().getIdentifier(); - if (ContentElementUtil.LASTMODIFIER_FIELD.equals(searchForm.getPersonal())) { - SearchUtil.addEqualConstraint(query, nodeManager, ContentElementUtil.LASTMODIFIER_FIELD, useraccount); - } - if (AUTHOR.equals(searchForm.getPersonal())) { - SearchUtil.addEqualConstraint(query, nodeManager, ContentElementUtil.CREATOR_FIELD, useraccount); - } - queryStringComposer.addParameter(PERSONAL, searchForm.getPersonal()); - } - - // Add the user - if (StringUtils.isNotEmpty(searchForm.getUseraccount())) { - String useraccount = searchForm.getUseraccount(); + String useraccount = cloud.getUser().getIdentifier(); + if (ContentElementUtil.LASTMODIFIER_FIELD.equals(searchForm.getPersonal())) { SearchUtil.addEqualConstraint(query, nodeManager, ContentElementUtil.LASTMODIFIER_FIELD, useraccount); - } + } + if (AUTHOR.equals(searchForm.getPersonal())) { + SearchUtil.addEqualConstraint(query, nodeManager, ContentElementUtil.CREATOR_FIELD, useraccount); + } + queryStringComposer.addParameter(PERSONAL, searchForm.getPersonal()); + } - // Set the maximum result size. - String resultsPerPage = PropertiesUtil.getProperty(REPOSITORY_SEARCH_RESULTS_PER_PAGE); - if (resultsPerPage == null || !resultsPerPage.matches("\\d+")) { - query.setMaxNumber(25); - } - else { - query.setMaxNumber(Integer.parseInt(resultsPerPage)); - } + // Add the user + if (StringUtils.isNotEmpty(searchForm.getUseraccount())) { + String useraccount = searchForm.getUseraccount(); + SearchUtil.addEqualConstraint(query, nodeManager, ContentElementUtil.LASTMODIFIER_FIELD, useraccount); + } - // Set the offset (used for paging). - if (searchForm.getOffset() != null && searchForm.getOffset().matches("\\d+")) { - query.setOffset(query.getMaxNumber() * Integer.parseInt(searchForm.getOffset())); - queryStringComposer.addParameter(OFFSET, searchForm.getOffset()); - } + // Set the maximum result size. + String resultsPerPage = PropertiesUtil.getProperty(REPOSITORY_SEARCH_RESULTS_PER_PAGE); + if (resultsPerPage == null || !resultsPerPage.matches("\\d+")) { + query.setMaxNumber(25); + } else { + query.setMaxNumber(Integer.parseInt(resultsPerPage)); + } - log.debug("QUERY: " + query); + // Set the offset (used for paging). + if (searchForm.getOffset() != null && searchForm.getOffset().matches("\\d+")) { + query.setOffset(query.getMaxNumber() * Integer.parseInt(searchForm.getOffset())); + queryStringComposer.addParameter(OFFSET, searchForm.getOffset()); + } - int resultCount = Queries.count(query); - NodeList results = cloud.getList(query); + log.debug("QUERY: " + query); - // Set everything on the request. - searchForm.setResultCount(resultCount); - searchForm.setResults(results); - request.setAttribute(GETURL, queryStringComposer.getQueryString()); + int resultCount = Queries.count(query); + NodeList results = cloud.getList(query); - return super.execute(mapping, form, request, response, cloud); - } + // Set everything on the request. + searchForm.setResultCount(resultCount); + searchForm.setResults(results); + request.setAttribute(GETURL, queryStringComposer.getQueryString()); - private void massDeleteContent(String deleteContent) { - if(StringUtils.isNotBlank(deleteContent)){ - String[] deleteContents = deleteContent.split(","); - for(String content : deleteContents) { - deleteContent(content); - } - } - } + return super.execute(mapping, form, request, response, cloud); + } - private void deleteContent(String deleteContentRequest) { - StringTokenizer commandAndNumber = new StringTokenizer(deleteContentRequest, ":"); - String command = commandAndNumber.nextToken(); - String nunmber = commandAndNumber.nextToken(); + private void massDeleteContent(String deleteContent) { + if (StringUtils.isNotBlank(deleteContent)) { + String[] deleteContents = deleteContent.split(","); + for (String content : deleteContents) { + deleteContent(content); + } + } + } - if ("moveToRecyclebin".equals(command)) { - moveContentToRecyclebin(nunmber); - } + private void deleteContent(String deleteContentRequest) { + StringTokenizer commandAndNumber = new StringTokenizer(deleteContentRequest, ":"); + String command = commandAndNumber.nextToken(); + String nunmber = commandAndNumber.nextToken(); - if ("permanentDelete".equals(command)) { - deleteContentPermanent(nunmber); - } + if ("moveToRecyclebin".equals(command)) { + moveContentToRecyclebin(nunmber); + } - } + if ("permanentDelete".equals(command)) { + deleteContentPermanent(nunmber); + } - private void deleteContentPermanent(String objectnumber) { - CloudProvider provider = CloudProviderFactory.getCloudProvider(); - Cloud cloud = provider.getCloud(); + } - Node objectNode = cloud.getNode(objectnumber); - if (Workflow.hasWorkflow(objectNode)) { - // at this time complete is the same as remove - Workflow.complete(objectNode); - } - objectNode.delete(true); + private void deleteContentPermanent(String objectnumber) { + CloudProvider provider = CloudProviderFactory.getCloudProvider(); + Cloud cloud = provider.getCloud(); - } + Node objectNode = cloud.getNode(objectnumber); + if (Workflow.hasWorkflow(objectNode)) { + // at this time complete is the same as remove + Workflow.complete(objectNode); + } + objectNode.delete(true); - private void moveContentToRecyclebin(String nunmber) { - CloudProvider provider = CloudProviderFactory.getCloudProvider(); - Cloud cloud = provider.getCloud(); + } - Node objectNode = cloud.getNode(nunmber); - RepositoryUtil.removeCreationRelForContent(objectNode); - RepositoryUtil.removeContentFromAllChannels(objectNode); - RepositoryUtil.addContentToChannel(objectNode, RepositoryUtil.getTrash(cloud)); + private void moveContentToRecyclebin(String nunmber) { + CloudProvider provider = CloudProviderFactory.getCloudProvider(); + Cloud cloud = provider.getCloud(); - // unpublish and remove from workflow - Publish.remove(objectNode); - Workflow.remove(objectNode); - Publish.unpublish(objectNode); - } + Node objectNode = cloud.getNode(nunmber); + RepositoryUtil.removeCreationRelForContent(objectNode); + RepositoryUtil.removeContentFromAllChannels(objectNode); + RepositoryUtil.addContentToChannel(objectNode, RepositoryUtil.getTrash(cloud)); + // unpublish and remove from workflow + Publish.remove(objectNode); + Workflow.remove(objectNode); + Publish.unpublish(objectNode); + } + } Modified: CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/SearchInitAction.java =================================================================== --- CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/SearchInitAction.java 2009-08-20 06:28:50 UTC (rev 38055) +++ CMSContainer/branches/b1_6/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/SearchInitAction.java 2009-08-20 06:29:56 UTC (rev 38056) @@ -1,28 +1,28 @@ package com.finalist.cmsc.repository.forms; -import java.util.*; +import java.util.List; -import org.apache.commons.lang.StringUtils; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang.StringUtils; +import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; -import org.apache.struts.action.ActionForm; -import org.apache.struts.util.LabelValueBean; -import org.mmbase.bridge.*; +import org.mmbase.bridge.Cloud; +import org.mmbase.bridge.NodeManager; import org.mmbase.storage.search.SortOrder; import com.finalist.cmsc.repository.ContentElementUtil; import com.finalist.cmsc.struts.MMBaseAction; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - public class SearchInitAction extends MMBaseAction { private static final String TYPES_LIST = "typesList"; private static final String TITLE = "title"; private static final String ONLYTYPE = "onlytype"; private static final String POSITION = "position"; + @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, Cloud cloud) throws Exception { @@ -31,7 +31,7 @@ String position = request.getParameter(POSITION); String onlytype = request.getParameter(ONLYTYPE); - + if (StringUtils.isEmpty(searchForm.getExpiredate())) { searchForm.setExpiredate("0"); } @@ -51,18 +51,8 @@ if (searchForm.getDirection() != SortOrder.ORDER_DESCENDING) { searchForm.setDirection(SortOrder.ORDER_ASCENDING); } - List<LabelValueBean> typesList = new ArrayList<LabelValueBean>(); - List<NodeManager> types = ContentElementUtil.getContentTypes(cloud); - List<String> hiddenTypes = ContentElementUtil.getHiddenTypes(); - for (NodeManager manager : types) { - String name = manager.getName(); - if (!hiddenTypes.contains(name)) { - LabelValueBean bean = new LabelValueBean(manager.getGUIName(), name); - typesList.add(bean); - } - } - addToRequest(request, TYPES_LIST, typesList); + addToRequest(request, "typesList", ContentElementUtil.getValidTypesList(cloud, types)); addToRequest(request, POSITION, position); addToRequest(request, TITLE, searchForm.getTitle()); addToRequest(request, ONLYTYPE, onlytype); _______________________________________________ Cvs mailing list Cvs@lists.mmbase.org http://lists.mmbase.org/mailman/listinfo/cvs