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