Author: bpapez
Date: Mon Oct 1 21:23:35 2007
New Revision: 18720
URL: https://svndev.jahia.net/websvn/listing.php?sc=3D1&rev=3D18720&repname=
=3Djahia
Log:
http://www.jahia.net/jira/browse/JAHIA-2382: AJAXed Sitemaps do not reflect=
the current ctnlist ranking
- refactored the Comparator to be thread-safe
- consider the automatic container sorter if property is set for the contai=
ner list
- cache sorted container IDs per list to not get into performance troubles
Modified:
branches/JAHIA-5-0-SP-BRANCH/core/src/java/org/jahia/ajax/sitemap/GetCh=
ildPages.java
Modified: branches/JAHIA-5-0-SP-BRANCH/core/src/java/org/jahia/ajax/sitemap=
/GetChildPages.java
URL: https://svndev.jahia.net/websvn/diff.php?path=3D/branches/JAHIA-5-0-SP=
-BRANCH/core/src/java/org/jahia/ajax/sitemap/GetChildPages.java&rev=3D18720=
&repname=3Djahia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- branches/JAHIA-5-0-SP-BRANCH/core/src/java/org/jahia/ajax/sitemap/GetCh=
ildPages.java (original)
+++ branches/JAHIA-5-0-SP-BRANCH/core/src/java/org/jahia/ajax/sitemap/GetCh=
ildPages.java Mon Oct 1 21:23:35 2007
@@ -23,7 +23,9 @@
import org.jahia.content.ContentObject;
import org.jahia.exceptions.JahiaException;
import org.jahia.params.ProcessingContext;
+import org.jahia.services.containers.ContainerFactory;
import org.jahia.services.containers.ContentContainer;
+import org.jahia.services.containers.ContentContainerList;
import org.jahia.services.pages.ContentPage;
import org.jahia.services.usermanager.JahiaUser;
import org.jahia.services.version.EntryLoadRequest;
@@ -37,44 +39,48 @@
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Comparator;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.TreeSet;
=
/**
- * Struts AJAX based Action that collects all the direct child pages from =
a given parent page. This action would
- * typically be used for a basic and simple sitemap
- *
+ * Struts AJAX based Action that collects all the direct child pages from =
a given parent page. This action would typically be used for a
+ * basic and simple sitemap
+ * =
* @author Xavier Lawrence
*/
-public class GetChildPages extends SiteMapAbstractAction implements Compar=
ator {
+public class GetChildPages extends SiteMapAbstractAction {
=
- private static final org.apache.log4j.Logger logger =3D
- org.apache.log4j.Logger.getLogger(GetChildPages.class);
-
- private ProcessingContext jParams;
+ private static final org.apache.log4j.Logger logger =3D org.apache.log=
4j.Logger
+ .getLogger(GetChildPages.class);
=
public ActionForward execute(final ActionMapping mapping,
- final ActionForm form,
- final HttpServletRequest request,
- final HttpServletResponse response) throw=
s IOException, ServletException {
+ final ActionForm form, final HttpServletRequest request,
+ final HttpServletResponse response) throws IOException,
+ ServletException {
try {
// Contains params that will have to given to the ParamBean Co=
nstructor for correct
// initialization of the latter
final String params =3D getParameter(request, response, PARAMS=
);
- jParams =3D pcf.getContext(request, response,
- super.getServlet().getServletContext(), params);
+ ProcessingContext jParams =3D pcf.getContext(request, response=
, super
+ .getServlet().getServletContext(), params);
=
final JahiaUser currentUser =3D jParams.getUser();
=
final String key =3D getXmlNodeValue(request, response, KEY);
- final String isVersionning =3D getParameter(request, DISPLAY_P=
ARAM, "");
- final int mode =3D (isVersionning.indexOf("versionning") > -1 =
? VERSIONNING : NORMAL);
+ final String isVersionning =3D getParameter(request, DISPLAY_P=
ARAM,
+ "");
+ final int mode =3D (isVersionning.indexOf("versionning") > -1 =
? VERSIONNING
+ : NORMAL);
final ContentPage currentObject =3D (ContentPage) getContentOb=
jectFromString(key);
if (currentObject =3D=3D null) {
- logger.warn("Unable to Get Child Pages ! Object '" + key +=
"' doesn't exist");
+ logger.warn("Unable to Get Child Pages ! Object '" + key
+ + "' doesn't exist");
response.sendError(HttpServletResponse.SC_NOT_FOUND,
- "Unable to Get Child Pages ! Msg: Page '" + key + =
"' doesn't exist");
+ "Unable to Get Child Pages ! Msg: Page '" + key
+ + "' doesn't exist");
return null;
}
=
@@ -86,20 +92,28 @@
=
final int loadFlags;
if (mode =3D=3D VERSIONNING) {
- loadFlags =3D ContentPage.ACTIVE_PAGE_INFOS | ContentPage.=
STAGING_PAGE_INFOS |
- ContentPage.ARCHIVED_PAGE_INFOS;
- } else if (! jParams.getOperationMode().equals(ProcessingConte=
xt.NORMAL)) {
- loadFlags =3D ContentPage.ACTIVE_PAGE_INFOS | ContentPage.=
STAGING_PAGE_INFOS;
+ loadFlags =3D ContentPage.ACTIVE_PAGE_INFOS
+ | ContentPage.STAGING_PAGE_INFOS
+ | ContentPage.ARCHIVED_PAGE_INFOS;
+ } else if (!jParams.getOperationMode().equals(
+ ProcessingContext.NORMAL)) {
+ loadFlags =3D ContentPage.ACTIVE_PAGE_INFOS
+ | ContentPage.STAGING_PAGE_INFOS;
} else {
loadFlags =3D ContentPage.ACTIVE_PAGE_INFOS;
}
=
- final Iterator children =3D currentObject.getContentPageChilds=
(currentUser, loadFlags, null, true);
- final TreeSet orderedPage =3D new TreeSet(this);
+ final Iterator children =3D currentObject.getContentPageChilds(
+ currentUser, loadFlags, null, true);
+ final TreeSet orderedPage =3D new TreeSet(new PageSorter(jPara=
ms,
+ new HashMap()));
while (children.hasNext()) {
final ContentPage child =3D (ContentPage) children.next();
- if (getParameter(request, "noPickers", "false").equalsIgno=
reCase("false") || child.getPickedObject() =3D=3D null) {
- if (child.checkReadAccess(currentUser)) orderedPage.ad=
d(child);
+ if (getParameter(request, "noPickers", "false")
+ .equalsIgnoreCase("false")
+ || child.getPickedObject() =3D=3D null) {
+ if (child.checkReadAccess(currentUser))
+ orderedPage.add(child);
}
}
=
@@ -107,60 +121,111 @@
final HttpSession session =3D request.getSession();
while (ite.hasNext()) {
final ContentPage child =3D (ContentPage) ite.next();
- processPage(child, jParams, session, currentUser, locales,=
resp, root, loadFlags,
- currentObject.getID(), mode);
+ processPage(child, jParams, session, currentUser, locales,
+ resp, root, loadFlags, currentObject.getID(), mode=
);
}
=
resp.appendChild(root);
sendResponse(resp, response);
} catch (Exception e) {
logger.error("Unable to process the request !", e);
- if (! response.isCommitted()) {
- response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_=
ERROR,
+ if (!response.isCommitted()) {
+ response.sendError(
+ HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"Unable to Get Child Pages ! Msg: " + e.getMessage=
());
}
}
return null;
}
=
- /**
- * Simple comparator that Compares 2 pages and returns the correct val=
ue regarding their corresponding
- * ranking.
- */
- public int compare(final Object o1, final Object o2) {
- final ContentPage p1 =3D (ContentPage) o1;
- final ContentPage p2 =3D (ContentPage) o2;
- final EntryLoadRequest elr =3D jParams.getEntryLoadRequest();
+ final class PageSorter implements Comparator {
+ private ProcessingContext jParams;
+ private Map cachedContainerLists;
+
+ public PageSorter(ProcessingContext jParams, Map cachedContainerLi=
sts) {
+ this.jParams =3D jParams;
+ this.cachedContainerLists =3D cachedContainerLists;
+ }
=
- try {
- final ContentObject pageField1 =3D p1.getParent(elr);
- if (pageField1 =3D=3D null) return 1;
- final ContentContainer cont1 =3D (ContentContainer) pageField1=
.getParent(elr);
- final JahiaContainer jahiaContainer1 =3D cont1.getJahiaContain=
er(jParams, elr);
- if(jahiaContainer1=3D=3Dnull) return 1;
- final int rank1 =3D jahiaContainer1.getRank();
-
- final ContentObject pageField2 =3D p2.getParent(elr);
- if (pageField2 =3D=3D null) return -1;
- final ContentContainer cont2 =3D (ContentContainer) pageField2=
.getParent(elr);
- final JahiaContainer jahiaContainer2 =3D cont2.getJahiaContain=
er(jParams, elr);
- if(jahiaContainer2=3D=3Dnull) return -1;
- final int rank2 =3D jahiaContainer2.getRank();
-
- if (rank1 > rank2) {
- return 1;
- } else if (rank1 <=3D rank2) {
+ /**
+ * Simple comparator that Compares 2 pages and returns the correct=
value regarding their corresponding ranking.
+ */
+ public int compare(final Object o1, final Object o2) {
+ final ContentPage p1 =3D (ContentPage) o1;
+ final ContentPage p2 =3D (ContentPage) o2;
+ final EntryLoadRequest elr =3D jParams.getEntryLoadRequest();
+
+ try {
+ final ContentObject pageField1 =3D p1.getParent(elr);
+ if (pageField1 =3D=3D null)
+ return 1;
+ final ContentContainer cont1 =3D (ContentContainer) pageFi=
eld1
+ .getParent(elr);
+ final ContentContainerList cList1 =3D (ContentContainerLis=
t) cont1
+ .getParent(elr);
+ final String property =3D cList1
+ .getProperty("automatic_sort_handler");
+ if (property !=3D null && property.trim().length() > 0) {
+ final ContentObject pageField2 =3D p2.getParent(elr);
+ if (pageField2 =3D=3D null)
+ return -1;
+ final ContentContainer cont2 =3D (ContentContainer) pa=
geField2
+ .getParent(elr);
+ final ContentContainerList cList2 =3D (ContentContaine=
rList) cont2
+ .getParent(elr);
+ if (cList1.getID() !=3D cList2.getID())
+ return -1;
+ else {
+ Integer cListID =3D new Integer(cList1.getID());
+ List ctnIds =3D (List) cachedContainerLists.get(cL=
istID);
+ if (ctnIds =3D=3D null) {
+ ctnIds =3D ContainerFactory.getInstance()
+ .getSorteredAndFilteredCtnIds(
+ jParams,
+ elr,
+ cList1.getJahiaContainerList(
+ jParams, elr), null);
+ cachedContainerLists.put(cListID, ctnIds);
+ }
+
+ return new Integer(ctnIds.indexOf(new Integer(cont1
+ .getID()))).compareTo(new Integer(ctnIds
+ .indexOf(new Integer(cont2.getID()))));
+ }
+ } else {
+ final JahiaContainer jahiaContainer1 =3D cont1
+ .getJahiaContainer(jParams, elr);
+ if (jahiaContainer1 =3D=3D null)
+ return 1;
+ final int rank1 =3D jahiaContainer1.getRank();
+
+ final ContentObject pageField2 =3D p2.getParent(elr);
+ if (pageField2 =3D=3D null)
+ return -1;
+ final ContentContainer cont2 =3D (ContentContainer) pa=
geField2
+ .getParent(elr);
+ final JahiaContainer jahiaContainer2 =3D cont2
+ .getJahiaContainer(jParams, elr);
+ if (jahiaContainer2 =3D=3D null)
+ return -1;
+ final int rank2 =3D jahiaContainer2.getRank();
+
+ if (rank1 > rank2) {
+ return 1;
+ } else if (rank1 <=3D rank2) {
+ return -1;
+ } else {
+ return new Integer(jahiaContainer1.getID())
+ .compareTo(new Integer(jahiaContainer2.get=
ID()));
+ }
+ }
+ } catch (ClassCastException ce) {
+ logger.debug("ClassCastException: " + ce);
+ return -1;
+ } catch (JahiaException je) {
+ logger.error("Error in Comparator", je);
return -1;
- } else {
- return new Integer(jahiaContainer1.getID()).compareTo(new =
Integer(jahiaContainer2.getID()));
}
-
- } catch (ClassCastException ce) {
- logger.debug("ClassCastException: " + ce);
- return -1;
- } catch (JahiaException je) {
- logger.error("Error in Comparator", je);
- return -1;
}
}
}
_______________________________________________
cvs_list mailing list
[email protected]
http://lists.jahia.org/cgi-bin/mailman/listinfo/cvs_list