You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by ta...@apache.org on 2004/09/17 22:01:04 UTC
cvs commit: jakarta-jetspeed-2/components/page-manager/src/test/org/apache/jetspeed/profiler TestProfiler.java
taylor 2004/09/17 13:01:04
Modified: components/page-manager/src/java/org/apache/jetspeed/page/impl
DatabasePageManager.java CastorXmlPageManager.java
components/page-manager project.xml
components/page-manager/src/java/org/apache/jetspeed/om/folder/impl
FolderImpl.java
components/page-manager/src/java/org/apache/jetspeed/om/page/psml
PageImpl.java LinkImpl.java
components/page-manager/src/test/org/apache/jetspeed/page
TestCastorXmlPageManager.java
components/page-manager/src/java/org/apache/jetspeed/page/document
NodeSetImpl.java AbstractNode.java
Removed: components/page-manager/src/java/org/apache/jetspeed/profiler/impl
JetspeedProfiler.java
ProfileLocatorPropertyImpl.java
JetspeedProfileLocator.java
ProfileFallbackIterator.java
ProfileLocatorControl.java
components/page-manager/src/java/org/apache/jetspeed/profiler/rules/impl
PathSessionResolver.java RoleCriterionResolver.java
PathResolver.java GroupCriterionResolver.java
PrincipalRuleImpl.java StandardProfilingRule.java
RoleFallbackProfilingRule.java
AbstractProfilingRule.java
MediatypeCriterionResolver.java
RuleCriterionImpl.java
CountryCriterionResolver.java
GroupRoleUserCriterionResolver.java
RequestSessionResolver.java HardCodedResolver.java
UserCriterionResolver.java StandardResolver.java
LanguageCriterionResolver.java
components/page-manager/src/test/org/apache/jetspeed/profiler
TestProfiler.java
Log:
decoupled profiler from page manager
implementationby Randy Watler
CVS: ----------------------------------------------------------------------
CVS: PR:
CVS: If this change addresses a PR in the problem report tracking
CVS: database, then enter the PR number(s) here.
CVS: Obtained from:
CVS: If this change has been taken from another system, such as NCSA,
CVS: then name the system in this line, otherwise delete it.
CVS: Submitted by:
CVS: If this code has been contributed to Apache by someone else; i.e.,
CVS: they sent us a patch or a new module, then include their name/email
CVS: address here. If this is your work then delete this line.
CVS: Reviewed by:
CVS: If we are doing pre-commit code reviews and someone else has
CVS: reviewed your changes, include their name(s) here.
CVS: If you have not had it reviewed then delete this line.
Revision Changes Path
1.7 +47 -5 jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/page/impl/DatabasePageManager.java
Index: DatabasePageManager.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/page/impl/DatabasePageManager.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- DatabasePageManager.java 3 Sep 2004 13:22:06 -0000 1.6
+++ DatabasePageManager.java 17 Sep 2004 20:01:03 -0000 1.7
@@ -32,7 +32,11 @@
import org.apache.jetspeed.page.PageNotFoundException;
import org.apache.jetspeed.page.PageNotRemovedException;
import org.apache.jetspeed.page.PageNotUpdatedException;
+import org.apache.jetspeed.page.document.DocumentException;
import org.apache.jetspeed.page.document.DocumentNotFoundException;
+import org.apache.jetspeed.page.document.NodeException;
+import org.apache.jetspeed.page.document.NodeSet;
+import org.apache.jetspeed.profiler.ProfiledPageContext;
import org.apache.jetspeed.profiler.ProfileLocator;
/**
@@ -72,11 +76,49 @@
/*
* (non-Javadoc)
*
- * @see org.apache.jetspeed.services.page.PageManagerService#getPage(org.apache.jetspeed.profiler.ProfileLocator)
+ * @see org.apache.jetspeed.services.page.PageManager#getProfiledPageContext(org.apache.jetspeed.profiler.ProfileLocator)
*/
- public Page getPage( ProfileLocator locator ) throws PageNotFoundException
+ public ProfiledPageContext getProfiledPageContext( ProfileLocator locator ) throws PageNotFoundException, DocumentException, NodeException
{
- return getPage(locator.getValue("page"));
+ // profiling not implemented, return raw managed page context
+ Page page = getPage(locator.getValue("page"));
+ Folder folder = (Folder) page.getParent();
+ NodeSet siblingPages = folder.getPages();
+ Folder parentFolder = (Folder) folder.getParent();
+ NodeSet siblingFolders = folder.getFolders();
+ Folder rootFolder = folder;
+ while (rootFolder.getParent() != null)
+ rootFolder = (Folder) rootFolder.getParent();
+ NodeSet rootLinks = rootFolder.getLinks();
+
+ // construct, initialize, and return new ProfiledPageContext instance
+ ProfiledPageContext pageContext = locator.createProfiledPageContext();
+ if (pageContext != null)
+ {
+ pageContext.setPage(page);
+ pageContext.setFolder(folder);
+ pageContext.setSiblingPages(siblingPages);
+ pageContext.setParentFolder(parentFolder);
+ pageContext.setSiblingFolders(siblingFolders);
+ pageContext.setRootLinks(rootLinks);
+ return pageContext;
+ }
+ else
+ log.error("getProfiledPageContext(): Failed to create profiled page context.");
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.jetspeed.services.page.PageManager#getPage(org.apache.jetspeed.profiler.ProfileLocator)
+ */
+ public Page getPage( ProfileLocator locator ) throws PageNotFoundException, DocumentException, NodeException
+ {
+ ProfiledPageContext pageContext = getProfiledPageContext(locator);
+ if (pageContext != null)
+ return pageContext.getPage();
+ return null;
}
/*
@@ -217,4 +259,4 @@
{
throw new UnsupportedOperationException("Not supported by DB impl yet");
}
-}
\ No newline at end of file
+}
1.12 +610 -10 jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/page/impl/CastorXmlPageManager.java
Index: CastorXmlPageManager.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/page/impl/CastorXmlPageManager.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- CastorXmlPageManager.java 3 Sep 2004 13:22:06 -0000 1.11
+++ CastorXmlPageManager.java 17 Sep 2004 20:01:03 -0000 1.12
@@ -19,27 +19,39 @@
//standard java stuff
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Iterator;
import java.util.List;
+import java.util.StringTokenizer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jetspeed.exception.JetspeedException;
import org.apache.jetspeed.idgenerator.IdGenerator;
import org.apache.jetspeed.om.folder.Folder;
+import org.apache.jetspeed.om.folder.FolderMetaData;
import org.apache.jetspeed.om.folder.FolderNotFoundException;
+import org.apache.jetspeed.om.folder.impl.FolderImpl;
import org.apache.jetspeed.om.folder.InvalidFolderException;
import org.apache.jetspeed.om.page.Link;
import org.apache.jetspeed.om.page.Page;
import org.apache.jetspeed.page.PageManager;
import org.apache.jetspeed.page.PageNotFoundException;
+import org.apache.jetspeed.page.document.AbstractNode;
+import org.apache.jetspeed.page.document.DocumentException;
import org.apache.jetspeed.page.document.DocumentHandlerFactory;
import org.apache.jetspeed.page.document.DocumentNotFoundException;
import org.apache.jetspeed.page.document.FailedToDeleteDocumentException;
import org.apache.jetspeed.page.document.FolderHandler;
import org.apache.jetspeed.page.document.Node;
import org.apache.jetspeed.page.document.NodeException;
+import org.apache.jetspeed.page.document.NodeSet;
+import org.apache.jetspeed.page.document.NodeSetImpl;
import org.apache.jetspeed.page.document.UnsupportedDocumentTypeException;
+import org.apache.jetspeed.profiler.ProfiledPageContext;
import org.apache.jetspeed.profiler.ProfileLocator;
+import org.apache.jetspeed.profiler.ProfileLocatorProperty;
/**
* This service is responsible for loading and saving PSML pages serialized to
@@ -53,31 +65,614 @@
{
private final static Log log = LogFactory.getLog(CastorXmlPageManager.class);
- protected final static String CONFIG_EXT = "ext";
+ protected final static String PROFILE_PROPERTY_FOLDER_PREFIX = "_";
private DocumentHandlerFactory handlerFactory;
private FolderHandler folderHandler;
+ private boolean profilingEnabled;
+
// default configuration values
public CastorXmlPageManager( IdGenerator generator, DocumentHandlerFactory hanlderFactory,
- FolderHandler folderHandler ) throws FileNotFoundException
+ FolderHandler folderHandler, boolean profilingEnabled ) throws FileNotFoundException
{
super(generator);
this.handlerFactory = hanlderFactory;
this.folderHandler = folderHandler;
-
+ this.profilingEnabled = profilingEnabled;
}
public CastorXmlPageManager( IdGenerator generator, DocumentHandlerFactory hanlderFactory,
- FolderHandler folderHandler, List modelClasses ) throws FileNotFoundException
+ FolderHandler folderHandler, boolean profilingEnabled, List modelClasses ) throws FileNotFoundException
{
super(generator, modelClasses);
this.handlerFactory = hanlderFactory;
this.folderHandler = folderHandler;
+ this.profilingEnabled = profilingEnabled;
+ }
+
+ /**
+ *
+ * <p>
+ * getProfiledPageContext
+ * </p>
+ *
+ * @see org.apache.jetspeed.page.PageManager#getProfiledPageContext(org.apache.jetspeed.profiler.ProfileLocator)
+ * @param locator
+ * @return profiled page context
+ * @throws PageNotFoundException
+ * @throws DocmentException
+ * @throws NodeException
+ */
+ public ProfiledPageContext getProfiledPageContext( ProfileLocator locator ) throws PageNotFoundException, DocumentException, NodeException
+ {
+ // determine profiled page context using profile locator.
+ // TODO: implement caching of profiled page contexts if practical.
+
+ log.debug("getProfiledPageContext() invoked, locator = " + locator + ", (profilingEnabled = " + profilingEnabled + ")");
+
+ // get request path
+ String requestPath = locator.getRequestPath();
+
+ // get profiled page context initialization parameters
+ Folder folder = null;
+ Page page = null;
+ NodeSet siblingPages = null;
+ Folder parentFolder = null;
+ NodeSet siblingFolders = null;
+ NodeSet rootLinks = null;
+ if (profilingEnabled)
+ {
+ // profile page request using profile locator
+
+ Folder [] profiledFolder = new Folder[1];
+ Page [] profiledPage = new Page[1];
+ List profiledFolders = new ArrayList();
+
+ // generate profile locator folder/page search paths
+ List searchPaths = generateProfilingPageSearchPaths(requestPath, locator, false);
+
+ // find page in page manager content using search paths
+ boolean profiled = findProfiledPageAndFolders(searchPaths, profiledFolder, profiledPage, profiledFolders);
+
+ // profile fallback to default root folder to locate folder/page
+ boolean rootPathProfiled = false;
+ if (rootPathProfiled = (! profiled && ! requestPath.equals("/")))
+ {
+ log.warn("getProfiledPageContext(): Falling back to profiled root default page for " + requestPath);
+ searchPaths = generateProfilingPageSearchPaths("/", locator, true);
+ profiled = findProfiledPageAndFolders(searchPaths, profiledFolder, profiledPage, profiledFolders);
+ }
+
+ // profiled folder and page
+ if (profiled)
+ {
+ folder = (Folder) setProfiledNodeUrl(profiledFolder[0]);
+ page = (Page) setProfiledNodeUrl(profiledPage[0]);
+ }
+
+ // profiled page context
+ if (page != null)
+ {
+ // profile general document/folder order
+ List documentOrder = null;
+ Iterator foldersIter = profiledFolders.iterator();
+ while ((documentOrder == null) && foldersIter.hasNext())
+ {
+ FolderImpl profiledPageFolder = (FolderImpl) setProfiledNodeUrl((Node) foldersIter.next());
+ if ((profiledPageFolder.getMetaData() != null) && (profiledPageFolder.getMetaData().getDocumentOrder() != null) &&
+ ! profiledPageFolder.getMetaData().getDocumentOrder().isEmpty())
+ {
+ documentOrder = profiledPageFolder.getMetaData().getDocumentOrder();
+ }
+ }
+ Comparator documentComparator = new DocumentOrderComparator(documentOrder);
+
+ // profile sibling pages by aggregating all siblings in profiled folders
+ // using profiled general document order, (do not filter unordered siblings)
+ siblingPages = new NodeSetImpl(null, documentComparator);
+ foldersIter = profiledFolders.iterator();
+ while (foldersIter.hasNext())
+ {
+ Folder aggregatePagesFolder = (Folder) foldersIter.next();
+ NodeSet aggregatePages = aggregatePagesFolder.getPages();
+ Iterator aggregatePagesIter = aggregatePages.iterator();
+ while (aggregatePagesIter.hasNext())
+ {
+ siblingPages = addUniqueOrDescribedUrlNode((NodeSetImpl) siblingPages, setProfiledNodeUrl((Node) aggregatePagesIter.next()));
+ }
+ }
+
+ // profile parent folder using profiled parent
+ if ((folder.getParent() != null) && ! folder.getUrl().equals("/"))
+ {
+ parentFolder = (Folder) setProfiledNodeUrl(folder.getParent());
+ }
+
+ // profile sibling folders by aggregating all siblings in profiled folders
+ // using profiled general document order, (do not filter unordered siblings)
+ siblingFolders = new NodeSetImpl(null, documentComparator);
+ foldersIter = profiledFolders.iterator();
+ while (foldersIter.hasNext())
+ {
+ Folder aggregateFoldersFolder = (Folder) foldersIter.next();
+ NodeSet aggregateFolders = aggregateFoldersFolder.getFolders().exclusiveSubset("^.*/" + PROFILE_PROPERTY_FOLDER_PREFIX + "[^/]*$");
+ Iterator aggregateFoldersIter = aggregateFolders.iterator();
+ while (aggregateFoldersIter.hasNext())
+ {
+ siblingFolders = addUniqueOrDescribedUrlNode((NodeSetImpl) siblingFolders, setProfiledNodeUrl((Node) aggregateFoldersIter.next()));
+ }
+ }
+
+ // profile root links by aggregating all links in profiled root folders
+ if (! rootPathProfiled)
+ {
+ searchPaths = generateProfilingPageSearchPaths("/", locator, true);
+ rootPathProfiled = findProfiledPageAndFolders(searchPaths, profiledFolder, profiledPage, profiledFolders);
+ }
+ if (rootPathProfiled)
+ {
+ // profile root link document order folder meta data
+ List linkDocumentOrder = null;
+ foldersIter = profiledFolders.iterator();
+ while ((linkDocumentOrder == null) && foldersIter.hasNext())
+ {
+ FolderImpl profiledRootFolder = (FolderImpl) setProfiledNodeUrl((Node) foldersIter.next());
+ if (profiledRootFolder.getUrl().equals("/") &&
+ (profiledRootFolder.getMetaData() != null) && (profiledRootFolder.getMetaData().getDocumentOrder() != null) &&
+ ! profiledRootFolder.getMetaData().getDocumentOrder().isEmpty())
+ {
+ linkDocumentOrder = profiledRootFolder.getMetaData().getDocumentOrder();
+ }
+ }
+ Comparator linkDocumentComparator = new DocumentOrderComparator(linkDocumentOrder);
+ DocumentOrderFilter linkDocumentFilter = new DocumentOrderFilter(linkDocumentOrder);
+
+ // profile root links using profiled document order, filtering
+ // links not explicitly ordered if ordering is specified
+ rootLinks = new NodeSetImpl(null, linkDocumentComparator);
+ foldersIter = profiledFolders.iterator();
+ while (foldersIter.hasNext())
+ {
+ Folder aggregateLinksFolder = (Folder) setProfiledNodeUrl((Node) foldersIter.next());
+ if (aggregateLinksFolder.getUrl().equals("/"))
+ {
+ NodeSet aggregateLinks = aggregateLinksFolder.getLinks();
+ Iterator aggregateLinksIter = aggregateLinks.iterator();
+ while (aggregateLinksIter.hasNext())
+ {
+ Node rootLink = (Node) aggregateLinksIter.next();
+ if (! linkDocumentFilter.filter(rootLink))
+ rootLinks = addUniqueOrDescribedUrlNode((NodeSetImpl) rootLinks, rootLink);
+ }
+ }
+ }
+ }
+ else
+ {
+ // return empty root links
+ rootLinks = new NodeSetImpl(null);
+ }
+ }
+ else
+ {
+ log.error("getProfiledPageContext(): Failed to find profiled page for " + requestPath + " at " + locator);
+ throw new PageNotFoundException(requestPath + " at " + locator);
+ }
+ }
+ else
+ {
+ // return request folder and page
+
+ // managed folder and page
+ try
+ {
+ // retrieve managed folder and page from request
+ String folderPath = requestPath;
+ if (folderPath.endsWith(Page.DOCUMENT_TYPE) || folderPath.endsWith("/"))
+ {
+ int lastSlashIndex = folderPath.lastIndexOf('/');
+ if (lastSlashIndex > 0)
+ folderPath = folderPath.substring(0, lastSlashIndex);
+ else
+ folderPath = "/";
+ }
+ folder = getFolder(folderPath);
+ String pagePath = requestPath;
+ if (! pagePath.endsWith(Page.DOCUMENT_TYPE))
+ pagePath = folder.getDefaultPage();
+ page = folder.getPage(pagePath);
+ }
+ catch (NodeException ne)
+ {
+ }
+ if (page == null)
+ {
+ // fallback to default page for root folder
+ log.warn("getProfiledPageContext(): Falling back to managed root default page for " + requestPath);
+ try
+ {
+ folder = getFolder("/");
+ String pagePath = folder.getDefaultPage();
+ page = folder.getPage(pagePath);
+ }
+ catch (NodeException ne)
+ {
+ }
+ }
+
+ // managed page context
+ if (page != null)
+ {
+ siblingPages = folder.getPages();
+ parentFolder = (Folder) folder.getParent();
+ siblingFolders = folder.getFolders();
+ try
+ {
+ Folder rootFolder = getFolder("/");
+ rootLinks = rootFolder.getLinks();
+ }
+ catch (NodeException ne)
+ {
+ }
+ }
+ else
+ {
+ log.error("getProfiledPageContext(): Failed to find managed page for " + requestPath);
+ throw new PageNotFoundException(requestPath);
+ }
+ }
+
+ // debug profiled page context initialization parameters
+ if (log.isDebugEnabled())
+ {
+ log.debug("getProfiledPageContext(), folder = " + folder + ", url = " + folder.getUrl());
+ log.debug("getProfiledPageContext(), page = " + page + ", url = " + page.getUrl());
+ if ((siblingPages != null) && (siblingPages.size() > 0))
+ {
+ Iterator debugIter = siblingPages.iterator();
+ while (debugIter.hasNext())
+ {
+ Page debug = (Page) debugIter.next();
+ log.debug("getProfiledPageContext(), siblingPage = " + debug + ", url = " + debug.getUrl());
+ }
+ }
+ else
+ log.debug("getProfiledPageContext(), siblingPages = null/empty");
+ log.debug("getProfiledPageContext(), parentFolder = " + parentFolder + ", url = " + ((parentFolder != null) ? parentFolder.getUrl() : "null"));
+ if ((siblingFolders != null) && (siblingFolders.size() > 0))
+ {
+ Iterator debugIter = siblingFolders.iterator();
+ while (debugIter.hasNext())
+ {
+ Folder debug = (Folder) debugIter.next();
+ log.debug("getProfiledPageContext(), siblingFolder = " + debug + ", url = " + debug.getUrl());
+ }
+ }
+ else
+ log.debug("getProfiledPageContext(), siblingFolders = null/empty");
+ if ((rootLinks != null) && (rootLinks.size() > 0))
+ {
+ Iterator debugIter = rootLinks.iterator();
+ while (debugIter.hasNext())
+ {
+ Link debug = (Link) debugIter.next();
+ log.debug("getProfiledPageContext(), rootLink = " + debug + ", url = " + debug.getUrl());
+ }
+ }
+ else
+ log.debug("getProfiledPageContext(), rootLinks = null/empty");
+ }
+
+ // construct, initialize, and return new ProfiledPageContext instance
+ ProfiledPageContext pageContext = locator.createProfiledPageContext();
+ if (pageContext != null)
+ {
+ pageContext.setPage(page);
+ pageContext.setFolder(folder);
+ pageContext.setSiblingPages(siblingPages);
+ pageContext.setParentFolder(parentFolder);
+ pageContext.setSiblingFolders(siblingFolders);
+ pageContext.setRootLinks(rootLinks);
+
+ log.debug("getProfiledPageContext() returning profiled page context");
+
+ return pageContext;
+ }
+ else
+ log.error("getProfiledPageContext(): Failed to create profiled page context.");
+ return null;
+ }
+
+ private List generateProfilingPageSearchPaths(String requestPath, ProfileLocator locator, boolean forceRequestPath)
+ {
+ // generate profile locator folder/page paths
+ List paths = new ArrayList();
+ String pagePath = requestPath;
+ Iterator locatorIter = locator.iterator();
+ while (locatorIter.hasNext())
+ {
+ // get fallback locator properties
+ ProfileLocatorProperty [] locatorProperties = (ProfileLocatorProperty []) locatorIter.next();
+ if (log.isDebugEnabled())
+ log.debug("generateProfilingPageSearchPaths(), locatorPath = " + locator.getLocatorPath(locatorProperties));
+
+ // get folder and page path elements
+ StringBuffer path = new StringBuffer("/");
+ for (int i = 0; (i < locatorProperties.length); i++)
+ {
+ if (locatorProperties[i].isControl())
+ {
+ // construct folder path with control properties
+ if (locatorProperties[i].getValue() != null)
+ {
+ path.append(PROFILE_PROPERTY_FOLDER_PREFIX);
+ path.append(locatorProperties[i].getName().toLowerCase());
+ path.append('/');
+ path.append(locatorProperties[i].getValue().toLowerCase());
+ path.append('/');
+ }
+ }
+ else if (! forceRequestPath)
+ {
+ // set page path with page/path properties, assumes
+ // page names and relative paths are relative to
+ // request path and that any page paths with no url
+ // separator should have the page extension appended;
+ // better rules might be applied with differentiation
+ // between control, page, and path properties
+ if (locatorProperties[i].getValue() != null)
+ {
+ pagePath = locatorProperties[i].getValue();
+ if ((pagePath.indexOf("/") == -1) && ! pagePath.endsWith(Page.DOCUMENT_TYPE))
+ pagePath = pagePath + Page.DOCUMENT_TYPE;
+ if (! pagePath.startsWith("/"))
+ {
+ int lastSlashIndex = requestPath.lastIndexOf('/');
+ if (lastSlashIndex > 0)
+ pagePath = requestPath.substring(0, lastSlashIndex) + "/" + pagePath;
+ else
+ pagePath = "/" + pagePath;
+ }
+ }
+ else
+ pagePath = requestPath;
+ }
+ }
+
+ // append page path to folder path and record
+ if (pagePath != null)
+ if (pagePath.startsWith("/"))
+ path.append(pagePath.substring(1));
+ else
+ path.append(pagePath);
+ paths.add(path.toString());
+ }
+
+ // append default page path with no locator path
+ if (pagePath != null)
+ if (! pagePath.startsWith("/"))
+ paths.add("/" + pagePath);
+ else
+ paths.add(pagePath);
+ return paths;
+ }
+
+ private boolean findProfiledPageAndFolders(List pageSearchPaths, Folder [] folder, Page [] page, List folders)
+ {
+ folder[0] = null;
+ page[0] = null;
+ folders.clear();
+
+ // iterate through search paths looking for page in page manager content
+ Iterator pathsIter = pageSearchPaths.iterator();
+ while (pathsIter.hasNext())
+ {
+ String searchRequestPath = (String) pathsIter.next();
+
+ log.debug("findProfiledPageAndFolders(), searchPath = " + searchRequestPath);
+
+ // search for matching folder and/or page in search path
+ Folder searchFolder = null;
+ Page searchPage = null;
+ try
+ {
+ String folderPath = searchRequestPath;
+ if (folderPath.endsWith(Page.DOCUMENT_TYPE) || folderPath.endsWith("/"))
+ {
+ int lastSlashIndex = folderPath.lastIndexOf('/');
+ if (lastSlashIndex > 0)
+ folderPath = folderPath.substring(0, lastSlashIndex);
+ else
+ folderPath = "/";
+ }
+ searchFolder = getFolder(folderPath);
+ String pagePath = searchRequestPath;
+ if (! pagePath.endsWith(Page.DOCUMENT_TYPE))
+ pagePath = searchFolder.getDefaultPage();
+ searchPage = searchFolder.getPage(pagePath);
+ }
+ catch (NodeException ne)
+ {
+ }
+ if (log.isDebugEnabled())
+ {
+ if (searchFolder != null)
+ log.debug("findProfiledPageAndFolders(), matched searchFolder = " + searchFolder);
+ if (searchPage != null)
+ log.debug("findProfiledPageAndFolders(), matched searchPage = " + searchPage);
+ }
+
+ // return matching page and related folders
+ if ((page[0] == null) && (searchPage != null))
+ {
+ folder[0] = searchFolder;
+ page[0] = searchPage;
+
+ log.debug("findProfiledPageAndFolders(), using matched searchFolder = " + searchFolder);
+ log.debug("findProfiledPageAndFolders(), using matched searchPage = " + searchPage);
+ }
+ if (searchFolder != null)
+ folders.add(searchFolder);
+ }
+
+ return ((page[0] != null) && (folder[0] != null));
+ }
+
+ private Node setProfiledNodeUrl(Node profiledNode)
+ {
+ // explicitly override profiled node urls to hide real ids and paths
+ // that are artifacts of profiled content in file system
+ if (profiledNode instanceof AbstractNode)
+ {
+ AbstractNode profiledAbstractNode = (AbstractNode) profiledNode;
+ if (! profiledAbstractNode.isUrlSet())
+ {
+ String url = stripProfiledPath(profiledAbstractNode.getUrl());
+ if (url.startsWith("/") && (url.length() > 0))
+ {
+ profiledAbstractNode.setUrl(url);
+ if (profiledAbstractNode.getPath().equals(profiledAbstractNode.getTitle()))
+ profiledAbstractNode.setTitle(url);
+ }
+ }
+ }
+ return profiledNode;
+ }
+
+ private String stripProfiledPath(String path)
+ {
+ // strip profiled property pairs folder path from profiled path
+ if (path != null)
+ {
+ // find last property pair folders in path
+ int contentPathIndex = path.lastIndexOf("/" + PROFILE_PROPERTY_FOLDER_PREFIX);
+ // advance past last property pair folders to base path
+ if (contentPathIndex != -1)
+ {
+ contentPathIndex = path.indexOf("/", contentPathIndex+1);
+ if (contentPathIndex != -1)
+ {
+ contentPathIndex = path.indexOf("/", contentPathIndex+1);
+ // strip property pairs from base path
+ if (contentPathIndex != -1)
+ path = path.substring(contentPathIndex);
+ else
+ path = "/";
+ }
+ }
+ }
+ return path;
+ }
+
+ private NodeSetImpl addUniqueOrDescribedUrlNode(NodeSetImpl set, Node node)
+ {
+ // add node to node set only if url set and unique
+ // or has metadata and entry in set does not; returns
+ // new set if replace required
+ if (node.getUrl() == null)
+ return set;
+ Iterator setIter = set.iterator();
+ while (setIter.hasNext())
+ {
+ Node setNode = (Node) setIter.next();
+ if (node.getUrl().equals(setNode.getUrl()))
+ {
+ // replace placeholder with described node
+ if ((node.getMetadata() != null) && (setNode.getMetadata() == null))
+ {
+ // cannot remove from NodeSet: copy to replace setNode and return new set
+ NodeSetImpl newSet = new NodeSetImpl(null, set.getComparator());
+ Iterator copyIter = set.iterator();
+ while (copyIter.hasNext())
+ {
+ Node copyNode = (Node) copyIter.next();
+ if (copyNode != setNode)
+ newSet.add(copyNode);
+ else
+ newSet.add(node);
+ }
+ return newSet;
+ }
+
+ // skip duplicate node
+ return set;
+ }
+ }
+
+ // add unique node
+ set.add(node);
+ return set;
+ }
+
+ private static class DocumentOrderComparator implements Comparator
+ {
+ private List order;
+
+ public DocumentOrderComparator(List documentOrderList)
+ {
+ this.order = documentOrderList;
+ }
+
+ public int compare(Object rootLink1, Object rootLink2)
+ {
+ // compare names of links against order or each other by default
+ String name1 = rootLink1.toString();
+ int nameIndex1 = name1.lastIndexOf('/');
+ if (nameIndex1 != -1)
+ name1 = name1.substring(nameIndex1 + 1);
+ String name2 = rootLink2.toString();
+ int nameIndex2 = name2.lastIndexOf('/');
+ if (nameIndex2 != -1)
+ name2 = name2.substring(nameIndex2 + 1);
+ if (order != null)
+ {
+ // compare names against order
+ int index1 = order.indexOf(name1);
+ int index2 = order.indexOf(name2);
+ if ((index1 != -1) || (index2 != -1))
+ {
+ if ((index1 == -1) && (index2 != -1))
+ return 1;
+ if ((index1 != -1) && (index2 == -1))
+ return -1;
+ return index1-index2;
+ }
+ }
+ // compare names against each other
+ return name1.compareTo(name2);
+ }
}
+ private static class DocumentOrderFilter
+ {
+ private List order;
+
+ public DocumentOrderFilter(List documentOrderList)
+ {
+ this.order = documentOrderList;
+ }
+
+ public boolean filter(Object rootLink)
+ {
+ if (order != null)
+ {
+ // filter names of links against order
+ String name = rootLink.toString();
+ int nameIndex = name.lastIndexOf('/');
+ if (nameIndex != -1)
+ name = name.substring(nameIndex + 1);
+ if (order.indexOf(name) == -1)
+ return true;
+ }
+ return false;
+ }
+ }
+
+
+
/**
*
* <p>
@@ -86,14 +681,19 @@
*
* @see org.apache.jetspeed.page.PageManager#getPage(org.apache.jetspeed.profiler.ProfileLocator)
* @param locator
- * @return @throws
- * PageNotFoundException
+ * @return located Page instance
* @throws PageNotFoundException
+ * @throws DocmentException
* @throws NodeException
*/
- public Page getPage( ProfileLocator locator ) throws PageNotFoundException, NodeException
+ public Page getPage( ProfileLocator locator ) throws PageNotFoundException, DocumentException, NodeException
{
- return getPage(locator.getValue("page"));
+ log.debug("getPage() invoked, locator = " + locator);
+
+ ProfiledPageContext pageContext = getProfiledPageContext(locator);
+ if (pageContext != null)
+ return pageContext.getPage();
+ return null;
}
/**
@@ -221,4 +821,4 @@
return childNode;
}
-}
\ No newline at end of file
+}
1.9 +8 -0 jakarta-jetspeed-2/components/page-manager/project.xml
Index: project.xml
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/components/page-manager/project.xml,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- project.xml 24 Aug 2004 14:08:29 -0000 1.8
+++ project.xml 17 Sep 2004 20:01:04 -0000 1.9
@@ -65,6 +65,14 @@
<id>jetspeed2:jetspeed-security</id>
<version>2.0-a1-dev</version>
</dependency>
+ <dependency>
+ <id>jetspeed2:jetspeed-locator</id>
+ <version>2.0-a1-dev</version>
+ </dependency>
+ <dependency>
+ <id>jetspeed2:jetspeed-profiler</id>
+ <version>2.0-a1-dev</version>
+ </dependency>
<!-- Testing only -->
<dependency>
<id>jetspeed2:jetspeed-rdbms</id>
1.14 +10 -4 jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/om/folder/impl/FolderImpl.java
Index: FolderImpl.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/om/folder/impl/FolderImpl.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- FolderImpl.java 9 Sep 2004 19:03:03 -0000 1.13
+++ FolderImpl.java 17 Sep 2004 20:01:04 -0000 1.14
@@ -16,6 +16,7 @@
package org.apache.jetspeed.om.folder.impl;
import java.io.File;
+import java.util.Iterator;
import java.util.Locale;
import org.apache.commons.logging.Log;
@@ -50,6 +51,7 @@
{
private static final String FALLBACK_DEFAULT_PAGE = "default-page.psml";
+ private static final String PAGE_NOT_FOUND_PAGE = "page_not_found.psml";
private String defaultTheme;
private NodeSet allNodes;
private File directory;
@@ -102,11 +104,15 @@
{
try
{
- return ((Page) getPages().iterator().next()).getId();
+ Iterator pagesIter = getPages().iterator();
+ if (pagesIter.hasNext())
+ return ((Page) pagesIter.next()).getId();
+ else
+ return PAGE_NOT_FOUND_PAGE;
}
catch (NodeException e1)
{
- return "page_not_found.psml";
+ return PAGE_NOT_FOUND_PAGE;
}
}
@@ -391,4 +397,4 @@
{
((AbstractNode)metadata).setHidden(hidden);
}
-}
\ No newline at end of file
+}
1.7 +4 -1 jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/PageImpl.java
Index: PageImpl.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/PageImpl.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- PageImpl.java 3 Sep 2004 13:22:05 -0000 1.6
+++ PageImpl.java 17 Sep 2004 20:01:04 -0000 1.7
@@ -189,12 +189,15 @@
* <p>
* getUrl
* </p>
+ * Same as invoking <code>AbstractBaseElement.getId()</code> unless url explicitly set.
*
* @see org.apache.jetspeed.om.page.Document#getUrl()
* @return
*/
public String getUrl()
{
+ if (isUrlSet())
+ return super.getUrl();
return getId();
}
}
1.2 +9 -21 jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/LinkImpl.java
Index: LinkImpl.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/om/page/psml/LinkImpl.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- LinkImpl.java 3 Sep 2004 13:22:05 -0000 1.1
+++ LinkImpl.java 17 Sep 2004 20:01:04 -0000 1.2
@@ -33,30 +33,10 @@
public class LinkImpl extends AbstractNode implements Link
{
- private String url;
-
private String target;
/**
* <p>
- * getUrl
- * </p>
- *
- * @see org.apache.jetspeed.om.page.Document#getUrl()
- * @return
- */
- public String getUrl()
- {
- return url;
- }
-
- public void setUrl(String url)
- {
- this.url = url;
- }
-
- /**
- * <p>
* getType
* </p>
*
@@ -82,5 +62,13 @@
public void setTarget( String target )
{
this.target = target;
+ }
+
+ /**
+ * @return Flag indicating whether url is set.
+ */
+ public boolean isUrlSet()
+ {
+ return true;
}
}
1.13 +2 -2 jakarta-jetspeed-2/components/page-manager/src/test/org/apache/jetspeed/page/TestCastorXmlPageManager.java
Index: TestCastorXmlPageManager.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/components/page-manager/src/test/org/apache/jetspeed/page/TestCastorXmlPageManager.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- TestCastorXmlPageManager.java 9 Sep 2004 19:04:02 -0000 1.12
+++ TestCastorXmlPageManager.java 17 Sep 2004 20:01:04 -0000 1.13
@@ -93,7 +93,7 @@
FolderHandler folderHandler = new FileSystemFolderHandler("target/testdata/pages", handlerFactory, cache);
- pageManager = new CastorXmlPageManager(idGen, handlerFactory, folderHandler );
+ pageManager = new CastorXmlPageManager(idGen, handlerFactory, folderHandler, false);
}
@@ -433,4 +433,4 @@
assertEquals("http://portals.apache.org", ((Document) folder.getLinks().iterator().next()).getUrl());
}
-}
\ No newline at end of file
+}
1.4 +15 -2 jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/page/document/NodeSetImpl.java
Index: NodeSetImpl.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/page/document/NodeSetImpl.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- NodeSetImpl.java 10 Sep 2004 21:39:02 -0000 1.3
+++ NodeSetImpl.java 17 Sep 2004 20:01:04 -0000 1.4
@@ -235,6 +235,19 @@
/**
*
* <p>
+ * getComparator
+ * </p>
+ *
+ * @return comparator used to order nodes
+ */
+ public Comparator getComparator()
+ {
+ return comparator;
+ }
+
+ /**
+ *
+ * <p>
* matches
* </p>
*
@@ -269,4 +282,4 @@
return pattern;
}
}
-}
\ No newline at end of file
+}
1.4 +20 -3 jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/page/document/AbstractNode.java
Index: AbstractNode.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/components/page-manager/src/java/org/apache/jetspeed/page/document/AbstractNode.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- AbstractNode.java 16 Sep 2004 21:27:10 -0000 1.3
+++ AbstractNode.java 17 Sep 2004 20:01:04 -0000 1.4
@@ -48,6 +48,7 @@
private Map localizedTitles;
private Node parent;
private String path;
+ private String url;
private boolean hidden=false;
public AbstractNode()
@@ -214,16 +215,32 @@
* <p>
* getUrl
* </p>
- * Same as invoking <code>Node.getPath()</code>
+ * Same as invoking <code>Node.getPath()</code> unless url explicitly set.
*
* @see org.apache.jetspeed.page.document.Node#getUrl()
* @return
*/
public String getUrl()
{
+ if (isUrlSet())
+ return url;
return getPath();
}
/**
+ * @param url The url to set.
+ */
+ public void setUrl(String url)
+ {
+ this.url = url;
+ }
+ /**
+ * @return Flag indicating whether url is set.
+ */
+ public boolean isUrlSet()
+ {
+ return (url != null);
+ }
+ /**
* <p>
* isHidden
* </p>
@@ -242,4 +259,4 @@
{
this.hidden = hidden;
}
-}
\ No newline at end of file
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jetspeed-dev-help@jakarta.apache.org