taylor 2004/10/18 21:42:01
Modified: components/page-manager/src/test/org/apache/jetspeed/page
TestCastorXmlPageManager.java
components/page-manager/src/java/org/apache/jetspeed/page/impl
CastorXmlPageManager.java
components/page-manager/src/java/org/apache/jetspeed/om/folder/impl
FolderImpl.java
Log:
patch from Randy Watler
- Better default page determination while profiling.
- File/folder refresh and evict hooks to clear page manager cached profiled page
context objects.
- Bug fixes for accidental rejection of links with duplicate urls.
- Removal of link filtering based on folder meta data document order, (document sets
should be used if overridden links are a required part of the site).
Revision Changes Path
1.15 +3 -3
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.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- TestCastorXmlPageManager.java 15 Oct 2004 06:58:14 -0000 1.14
+++ TestCastorXmlPageManager.java 19 Oct 2004 04:42:01 -0000 1.15
@@ -93,7 +93,7 @@
FolderHandler folderHandler = new
FileSystemFolderHandler("target/testdata/pages", handlerFactory, cache);
- pageManager = new CastorXmlPageManager(idGen, handlerFactory,
folderHandler, -1, false);
+ pageManager = new CastorXmlPageManager(idGen, handlerFactory,
folderHandler, cache, -1, false);
}
@@ -340,12 +340,12 @@
Iterator childItr = folder1.getFolders().iterator();
// Test that the folders are naturally orderd
Folder folder2 = (Folder) childItr.next();
- assertEquals("default-page.psml", folder2.getDefaultPage());
+ assertEquals("default-page.psml", folder2.getDefaultPage(true));
assertEquals("folder1/folder2", folder2.getPath());
assertEquals("folder2", folder2.getName());
Folder folder3 = (Folder) childItr.next();
assertEquals("folder1/folder3", folder3.getPath());
- assertEquals("test001.psml", folder3.getDefaultPage());
+ assertEquals("test001.psml", folder3.getDefaultPage(true));
assertEquals(1, folder2.getPages().size());
assertEquals(2, folder3.getPages().size());
1.17 +291 -149
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.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- CastorXmlPageManager.java 15 Oct 2004 22:58:43 -0000 1.16
+++ CastorXmlPageManager.java 19 Oct 2004 04:42:01 -0000 1.17
@@ -26,20 +26,24 @@
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import org.apache.commons.collections.map.LRUMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.jetspeed.cache.file.FileCache;
+import org.apache.jetspeed.cache.file.FileCacheEntry;
+import org.apache.jetspeed.cache.file.FileCacheEventListener;
import org.apache.jetspeed.exception.JetspeedException;
import org.apache.jetspeed.idgenerator.IdGenerator;
import org.apache.jetspeed.om.folder.DocumentSet;
import org.apache.jetspeed.om.folder.DocumentSetPath;
import org.apache.jetspeed.om.folder.Folder;
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.folder.impl.FolderImpl;
import org.apache.jetspeed.om.page.Link;
import org.apache.jetspeed.om.page.Page;
import org.apache.jetspeed.page.PageManager;
@@ -54,9 +58,9 @@
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;
+import org.apache.jetspeed.profiler.ProfiledPageContext;
/**
* This service is responsible for loading and saving PSML pages serialized to
@@ -66,7 +70,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Scott T Weaver </a>
* @version $Id$
*/
-public class CastorXmlPageManager extends AbstractPageManager implements PageManager
+public class CastorXmlPageManager extends AbstractPageManager implements
PageManager, FileCacheEventListener
{
private final static Log log = LogFactory.getLog(CastorXmlPageManager.class);
@@ -82,51 +86,41 @@
private Map perl5PathRegexpCache;
+ private FileCache fileCache;
+
// default configuration values
public CastorXmlPageManager( IdGenerator generator, DocumentHandlerFactory
hanlderFactory,
- FolderHandler folderHandler, int cacheSize,
+ FolderHandler folderHandler, FileCache fileCache,
int cacheSize,
boolean profilingEnabled ) throws
FileNotFoundException
{
super(generator);
this.handlerFactory = hanlderFactory;
this.folderHandler = folderHandler;
+ this.fileCache = fileCache;
+ this.fileCache.addListener(this);
this.profilingEnabled = profilingEnabled;
initCaches(cacheSize);
}
public CastorXmlPageManager( IdGenerator generator, DocumentHandlerFactory
hanlderFactory,
- FolderHandler folderHandler, int cacheSize,
+ FolderHandler folderHandler, FileCache fileCache,
int cacheSize,
boolean profilingEnabled, List modelClasses )
throws FileNotFoundException
{
super(generator, modelClasses);
this.handlerFactory = hanlderFactory;
this.folderHandler = folderHandler;
+ this.fileCache = fileCache;
+ this.fileCache.addListener(this);
this.profilingEnabled = profilingEnabled;
initCaches(cacheSize);
}
- private void initCaches( int cacheSize )
- {
- if (cacheSize > 0)
- {
- // use LRU maps to limit cache size
- this.pageContextCache = new LRUMap(cacheSize);
- this.perl5PathRegexpCache = new LRUMap(cacheSize*2);
- }
- else
- {
- // use unlimited cache size
- this.pageContextCache = new HashMap();
- this.perl5PathRegexpCache = new HashMap();
- }
- }
-
/**
* <p>
* Compute profiled page context elements based on named profile
* locators associated with a session/principal in supplied
- * context instance.
+ * context instance.
* </p>
*
* @see
org.apache.jetspeed.page.PageManager#getProfiledPageContext(org.apache.jetspeed.page.ProfiledPageContext)
@@ -141,16 +135,11 @@
// construct key and test for page context cache hit
String pageContextCacheKey = pageContextCacheKey(pageContext);
log.debug("computeProfiledPageContext() invoked, cache key = " +
pageContextCacheKey + ", (profilingEnabled = " + profilingEnabled + ")");
- ProfiledPageContext cachedPageContext = null;
- synchronized ( pageContextCache )
- {
- cachedPageContext = (ProfiledPageContext)
pageContextCache.get(pageContextCacheKey);
- }
+ ProfiledPageContext cachedPageContext =
lookupProfiledPageContext(pageContextCacheKey);
if (cachedPageContext != null)
{
// copy profiled page context from cached page context and return
copyProfiledPageContext(cachedPageContext, pageContext);
- log.debug("computeProfiledPageContext() cache hit, cache key = " +
pageContextCacheKey);
return ;
}
@@ -319,10 +308,8 @@
}
}
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
+ // profile root links using profiled document order
rootLinks = new NodeSetImpl(null, linkDocumentComparator);
foldersIter = profiledFolders.iterator();
while (foldersIter.hasNext())
@@ -334,11 +321,7 @@
Iterator aggregateLinksIter = aggregateLinks.iterator();
while (aggregateLinksIter.hasNext())
{
- Node rootLink = (Node) aggregateLinksIter.next();
- if (! linkDocumentFilter.filter(rootLink))
- {
- rootLinks =
addUniqueOrDescribedUrlNode((NodeSetImpl) rootLinks, rootLink);
- }
+ rootLinks =
addUniqueOrDescribedUrlNode((NodeSetImpl) rootLinks, (Node) aggregateLinksIter.next());
}
}
}
@@ -380,7 +363,7 @@
String pagePath = requestPath;
if (! pagePath.endsWith(Page.DOCUMENT_TYPE))
{
- pagePath = folder.getDefaultPage();
+ pagePath = folder.getDefaultPage(true);
}
page = folder.getPage(pagePath);
}
@@ -394,7 +377,7 @@
try
{
folder = getFolder("/");
- String pagePath = folder.getDefaultPage();
+ String pagePath = folder.getDefaultPage(true);
page = folder.getPage(pagePath);
}
catch (NodeException ne)
@@ -471,48 +454,9 @@
populateProfiledPageContext(pageContext, folder, page, siblingPages,
parentFolder, siblingFolders, rootLinks, documentSets, documentSetNodeSets);
// cache ProfiledPageContext instance
- synchronized ( pageContextCache )
- {
- pageContextCache.put(pageContextCacheKey, pageContext);
- }
- log.debug("computeProfiledPageContext() cached, cache key = " +
pageContextCacheKey);
+ cacheProfiledPageContext(pageContextCacheKey, pageContext);
}
- private String pageContextCacheKey(ProfiledPageContext pageContext)
- {
- // compute key from sorted profile locator strings
- StringBuffer cacheKeyBuffer = new StringBuffer();
- if (pageContext.getLocators() != null)
- {
- // get page context locators extent and sort by locator name
- List locators = new ArrayList(pageContext.getLocators().entrySet());
- Comparator locatorComparator = new Comparator()
- {
- public int compare(Object locator1, Object locator2)
- {
- // compare locator names
- return ((String) ((Map.Entry)
locator1).getKey()).compareTo((String) ((Map.Entry) locator1).getKey());
- }
- } ;
- Collections.sort(locators, locatorComparator);
-
- // construct key using locator names and locators
- Iterator locatorIter = locators.iterator();
- while (locatorIter.hasNext())
- {
- Map.Entry locator = (Map.Entry) locatorIter.next();
- if (cacheKeyBuffer.length() > 0)
- {
- cacheKeyBuffer.append(',');
- }
- cacheKeyBuffer.append(locator.getKey());
- cacheKeyBuffer.append(ProfileLocator.PATH_SEPARATOR);
- cacheKeyBuffer.append(locator.getValue());
- }
- }
- return cacheKeyBuffer.toString();
- }
-
private NodeSetImpl expandAndProfileDocumentSet(Map profileLocators,
DocumentSet documentSet, NodeSetImpl expandedNodes)
{
// expand and profile document set using document set or default
@@ -809,6 +753,9 @@
searchFolders.clear();
// iterate through search paths looking for page in page manager content
+ int numSearchFoldersFound = 0;
+ Folder lastSearchFolderFound = null;
+ String lastSearchFolderFoundPath = null;
Iterator pathsIter = pageSearchPaths.iterator();
while (pathsIter.hasNext())
{
@@ -822,6 +769,7 @@
Page searchPage = null;
try
{
+ // match folder
if (folderPath.endsWith(Page.DOCUMENT_TYPE) ||
folderPath.endsWith("/"))
{
int lastSlashIndex = folderPath.lastIndexOf('/');
@@ -835,12 +783,59 @@
}
}
searchFolder = getFolder(folderPath);
- String pagePath = searchRequestPath;
- if (! pagePath.endsWith(Page.DOCUMENT_TYPE))
+
+ // match page if not previously matched
+ if (page[0] == null)
{
- pagePath = searchFolder.getDefaultPage();
+ String pagePath = searchRequestPath;
+ if (! pagePath.endsWith(Page.DOCUMENT_TYPE))
+ {
+ // only allow aggressive default page defaulting if
+ // trying to find page as last resort in root directory;
+ // otherwise, return only fallback page or explicitly
+ // specified default page name
+ boolean allowDefaulting = folderPath.equals( "/" );
+ pagePath = searchFolder.getDefaultPage(allowDefaulting);
+
+ // if page path not fallback default page, profile again
+ // to make sure the default page is not overridden, note
+ // that the fallback page has already been profiled since
+ // it would have been matched previously and that no
+ // override is possible in first maching folder.
+ if ((pagePath != null) && !
pagePath.equals(FolderImpl.FALLBACK_DEFAULT_PAGE) && (numSearchFoldersFound > 0))
+ {
+ // append default page to search paths
+ ListIterator pageSearchPathsIter =
pageSearchPaths.listIterator();
+ while (pageSearchPathsIter.hasNext())
+ {
+ String pageSearchPath = (String)
pageSearchPathsIter.next();
+ if (pageSearchPath.endsWith( "/" ))
+ {
+ pageSearchPathsIter.set(pageSearchPath +
pagePath);
+ }
+ else
+ {
+ pageSearchPathsIter.set(pageSearchPath + "/" +
pagePath);
+ }
+ }
+
+ // profile default page
+ log.debug("findProfiledPageAndFolders(): invoking again
with default page: " + pagePath);
+ return findProfiledPageAndFolders(pageSearchPaths,
folder, page, folders, searchFolders);
+ }
+ }
+
+ // access matched page
+ if (pagePath != null)
+ {
+ searchPage = searchFolder.getPage(pagePath);
+ }
}
- searchPage = searchFolder.getPage(pagePath);
+
+ // track found search folders
+ numSearchFoldersFound++;
+ lastSearchFolderFound = searchFolder;
+ lastSearchFolderFoundPath = searchRequestPath;
}
catch (NodeException ne)
{
@@ -942,6 +937,37 @@
}
}
+ // if no page or folder found, attempt aggressive default
+ // page defaulting if only one search path found and no explict
+ // page requested: page selected cannot be ambiguous and using
+ // any non root folder default is valid and better than a root
+ // fallback default page.
+ if ((page[0] == null) && (numSearchFoldersFound == 1) && !
lastSearchFolderFound.getPath().equals( "/" ) &&
+ (! lastSearchFolderFoundPath.endsWith(Page.DOCUMENT_TYPE)))
+ {
+ // single search folder found: allow aggressive defaulting
+ String defaultPagePath = lastSearchFolderFound.getDefaultPage(true);
+
+ // use single search folder default page if found
+ Page lastSearchFolderFoundPage = null;
+ try
+ {
+ lastSearchFolderFoundPage =
lastSearchFolderFound.getPage(defaultPagePath);
+ }
+ catch (NodeException ne)
+ {
+ }
+ if (lastSearchFolderFoundPage != null)
+ {
+ page[0] = lastSearchFolderFoundPage;
+ folder[0] = lastSearchFolderFound;
+
+ log.debug("findProfiledPageAndFolders(), using matched default
searchFolder = " + lastSearchFolderFound);
+ log.debug("findProfiledPageAndFolders(), using matched default
searchPage = " + lastSearchFolderFoundPage);
+ }
+ }
+
+ // return true if profiled page and folder found
return ((page[0] != null) && (folder[0] != null));
}
@@ -949,13 +975,13 @@
{
// explicitly override profiled node urls to hide real ids and paths
// that are artifacts of profiled content in file system
- if (profiledNode instanceof AbstractNode)
+ if ((profiledNode instanceof AbstractNode) && ! (profiledNode instanceof
Link))
{
AbstractNode profiledAbstractNode = (AbstractNode) profiledNode;
if (! profiledAbstractNode.isUrlSet())
{
String url = stripProfiledPath(profiledAbstractNode.getUrl());
- if (url.startsWith("/") && (url.length() > 0))
+ if (url.startsWith("/"))
{
profiledAbstractNode.setUrl(url);
if
(profiledAbstractNode.getPath().equals(profiledAbstractNode.getTitle()))
@@ -999,40 +1025,45 @@
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
+ // add node to node set only if url set
if (node.getUrl() == null)
return set;
- Iterator setIter = set.iterator();
- while (setIter.hasNext())
+
+ // add node to node set if is a link, has a unique url,
+ // or has metadata and entry in set does not; returns
+ // new set if replace required
+ if (! (node instanceof Link))
{
- Node setNode = (Node) setIter.next();
- if (node.getUrl().equals(setNode.getUrl()))
+ Iterator setIter = set.iterator();
+ while (setIter.hasNext())
{
- // replace placeholder with described node
- if ((node.getMetadata() != null) && (setNode.getMetadata() == null))
+ Node setNode = (Node) setIter.next();
+ if (node.getUrl().equals(setNode.getUrl()))
{
- // 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())
+ // replace placeholder with described node
+ if ((node.getMetadata() != null) && (setNode.getMetadata() ==
null))
{
- Node copyNode = (Node) copyIter.next();
- if (copyNode != setNode)
+ // 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())
{
- newSet.add(copyNode);
- }
- else
- {
- newSet.add(node);
+ Node copyNode = (Node) copyIter.next();
+ if (copyNode != setNode)
+ {
+ newSet.add(copyNode);
+ }
+ else
+ {
+ newSet.add(node);
+ }
}
+ return newSet;
}
- return newSet;
+
+ // skip duplicate node
+ return set;
}
-
- // skip duplicate node
- return set;
}
}
@@ -1088,35 +1119,6 @@
}
}
- 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;
- }
- }
-
private NodeSetImpl expandDocumentSet(DocumentSet documentSet, NodeSetImpl
expandedNodes)
{
// ignore document sets with profiling locator specified
@@ -1176,21 +1178,18 @@
return path;
}
- private String pathToPerl5Regexp(String path)
+ private synchronized String pathToPerl5Regexp(String path)
{
// convert conventional path expressions to java/perl5 form and cache
- synchronized ( perl5PathRegexpCache )
+ String perl5Path = lookupPerl5Regexp(path);
+ if (perl5Path == null)
{
- String perl5Path = (String) perl5PathRegexpCache.get(path);
- if (perl5Path == null)
- {
- perl5Path = path.replaceAll("\\.", "\\\\.");
- perl5Path = perl5Path.replaceAll("\\?", ".");
- perl5Path = perl5Path.replaceAll("\\*", ".*");
- perl5PathRegexpCache.put(path, perl5Path);
- }
- return perl5Path;
+ perl5Path = path.replaceAll("\\.", "\\\\.");
+ perl5Path = perl5Path.replaceAll("\\?", ".");
+ perl5Path = perl5Path.replaceAll("\\*", ".*");
+ cachePerl5Regexp(path, perl5Path);
}
+ return perl5Path;
}
private NodeSet filterDocumentSet(NodeSet set)
@@ -1394,4 +1393,147 @@
{
return folderHandler.getNodes(path,regex,documentType);
}
+
+ /**
+ * <p>
+ * refresh file cache entry
+ * </p>
+ *
+ * @see
org.apache.jetspeed.cache.file.FileCacheEventListener#refresh(org.apache.jetspeed.cache.file.FileCacheEntry)
+ * @param entry
+ * @throws Exception
+ */
+ public void refresh( FileCacheEntry entry ) throws Exception
+ {
+ // file cache managed component refreshed: clear cached page
+ // contexts. TODO: manage cache by last accessed time and/or
+ // explicit dependencies: requires underlying FileCache to
+ // have last access times tracked.
+ evictAllPageContextCache();
+ }
+
+ /**
+ * <p>
+ * evict file cache entry
+ * </p>
+ *
+ * @see
org.apache.jetspeed.cache.file.FileCacheEventListener#evict(org.apache.jetspeed.cache.file.FileCacheEntry)
+ * @param entry
+ * @throws Exception
+ */
+ public void evict( FileCacheEntry entry ) throws Exception
+ {
+ // file cache managed component refreshed: clear cached page
+ // contexts. TODO: manage cache by last accessed time and/or
+ // explicit dependencies: requires underlying FileCache to
+ // have last access times tracked.
+ evictAllPageContextCache();
+ }
+
+ private void initCaches( int cacheSize )
+ {
+ if (cacheSize > 0)
+ {
+ // use LRU maps to limit cache size
+ this.pageContextCache = new LRUMap(cacheSize);
+ this.perl5PathRegexpCache = new LRUMap(cacheSize*2);
+ }
+ else
+ {
+ // use unlimited cache size
+ this.pageContextCache = new HashMap();
+ this.perl5PathRegexpCache = new HashMap();
+ }
+ }
+
+ private void cacheProfiledPageContext(String pageContextCacheKey,
ProfiledPageContext pageContext)
+ {
+ // lock and cache page context using entry object to track create timestamp
+ synchronized ( pageContextCache )
+ {
+ pageContextCache.put(pageContextCacheKey, pageContext);
+ }
+ log.debug("cacheProfiledPageContext() cached, cache key = " +
pageContextCacheKey);
+ }
+
+ private ProfiledPageContext lookupProfiledPageContext(String
pageContextCacheKey)
+ {
+ // lock and lookup entry object and return page context
+ ProfiledPageContext pageContext = null;
+ synchronized ( pageContextCache )
+ {
+ pageContext = (ProfiledPageContext)
pageContextCache.get(pageContextCacheKey);
+ }
+ if (pageContext != null)
+ {
+ log.debug("lookupProfiledPageContext() cache hit, cache key = " +
pageContextCacheKey);
+ }
+ return pageContext;
+ }
+
+ private void evictAllPageContextCache()
+ {
+ // evict all cached page contexts. TODO: manage cache by last
+ // accessed time and/or explicit dependencies: requires
+ // underlying FileCache to have last access times tracked.
+ synchronized ( pageContextCache )
+ {
+ pageContextCache.clear();
+ }
+ log.debug("evictAllProfiledPageContext() invoked, all page contexts evicted
from cache");
+ }
+
+ private void cachePerl5Regexp(String regexpKey, String regexp)
+ {
+ // lock and cache regexp
+ synchronized ( perl5PathRegexpCache )
+ {
+ perl5PathRegexpCache.put(regexpKey, regexp);
+ }
+ }
+
+ private String lookupPerl5Regexp(String regexpKey)
+ {
+ // lock and lookup regexp
+ synchronized ( perl5PathRegexpCache )
+ {
+ return (String) perl5PathRegexpCache.get(regexpKey);
+ }
+ }
+
+ private String pageContextCacheKey(ProfiledPageContext pageContext)
+ {
+ // compute key from sorted profile locator strings
+ StringBuffer cacheKeyBuffer = new StringBuffer();
+ if (pageContext.getLocators() != null)
+ {
+ // get page context locators extent and sort by locator name
+ List locators = new ArrayList(pageContext.getLocators().entrySet());
+ Comparator locatorComparator = new Comparator()
+ {
+ public int compare(Object locator1, Object locator2)
+ {
+ // compare locator names
+ return ((String) ((Map.Entry)
locator1).getKey()).compareTo((String) ((Map.Entry) locator1).getKey());
+ }
+ } ;
+ Collections.sort(locators, locatorComparator);
+
+ // construct key using locator names and locators
+ Iterator locatorIter = locators.iterator();
+ while (locatorIter.hasNext())
+ {
+ Map.Entry locator = (Map.Entry) locatorIter.next();
+ if (cacheKeyBuffer.length() > 0)
+ {
+ cacheKeyBuffer.append(',');
+ }
+ cacheKeyBuffer.append(locator.getKey());
+ cacheKeyBuffer.append(ProfileLocator.PATH_SEPARATOR);
+ cacheKeyBuffer.append(locator.getValue());
+ }
+ }
+ return cacheKeyBuffer.toString();
+ }
+
}
1.17 +20 -14
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.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- FolderImpl.java 15 Oct 2004 06:51:04 -0000 1.16
+++ FolderImpl.java 19 Oct 2004 04:42:01 -0000 1.17
@@ -88,9 +88,9 @@
/*
* (non-Javadoc)
*
- * @see org.apache.jetspeed.om.folder.Folder#getDefaultPage()
+ * @see org.apache.jetspeed.om.folder.Folder#getDefaultPage(boolean)
*/
- public String getDefaultPage()
+ public String getDefaultPage(boolean allowDefaulting)
{
try
{
@@ -99,25 +99,31 @@
{
defaultPage = FALLBACK_DEFAULT_PAGE;
}
- ;
return getPage(defaultPage).getName();
}
catch (NodeException e)
{
- try
+ if (allowDefaulting)
{
- Iterator pagesIter = getPages().iterator();
- if (pagesIter.hasNext())
- return ((Page) pagesIter.next()).getId();
- else
+ try
+ {
+ Iterator pagesIter = getPages().iterator();
+ if (pagesIter.hasNext())
+ {
+ return ((Page) pagesIter.next()).getName();
+ }
+ else
+ {
+ return PAGE_NOT_FOUND_PAGE;
+ }
+ }
+ catch (NodeException e1)
+ {
return PAGE_NOT_FOUND_PAGE;
- }
- catch (NodeException e1)
- {
- return PAGE_NOT_FOUND_PAGE;
+ }
}
}
-
+ return null;
}
/*
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]