svn commit: r567473 - in /lenya/trunk/src: impl/java/org/apache/lenya/cms/publication/ java/org/apache/lenya/cms/cocoon/components/modules/input/ java/org/apache/lenya/cms/cocoon/source/ java/org/apache/lenya/cms/publication/ modules-core/ac/java/src/o...
[email protected] Sun, 19 Aug 2007 21:12:38 -0000
Newsgroups
gmane.comp.cms.lenya.cvs
Message-ID
<[email protected] >
Author: andreas
Date: Sun Aug 19 14:12:37 2007
New Revision: 567473
URL: http://svn.apache.org/viewvc?rev=567473&view=rev
Log:
Made publication manager more efficient and correct (avoid invalid publication objects)
Modified:
lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java
lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/PublicationManagerImpl.java
lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java
lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java
lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java
lenya/trunk/src/java/org/apache/lenya/cms/publication/PublicationManager.java
lenya/trunk/src/modules-core/ac/java/src/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java
lenya/trunk/src/pubs/default/java/src/org/apache/lenya/defaultpub/cms/publication/templating/Instantiator.java
Modified: lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java (original)
+++ lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/DocumentFactoryImpl.java Sun Aug 19 14:12:37 2007
@@ -17,6 +17,7 @@
*/
package org.apache.lenya.cms.publication;
+import java.util.Arrays;
import java.util.StringTokenizer;
import org.apache.avalon.framework.container.ContainerUtil;
@@ -174,11 +175,13 @@
*/
public boolean isDocument(String webappUrl) throws DocumentBuildException {
+ PublicationManager pubMgr = getPubManager();
try {
- Publication publication = PublicationUtil.getPublicationFromUrl(this.manager, this,
- webappUrl);
- if (publication.exists()) {
- DocumentBuilder builder = publication.getDocumentBuilder();
+ URLInformation info = new URLInformation(webappUrl);
+ String pubId = info.getPublicationId();
+ if (pubId != null && Arrays.asList(pubMgr.getPublicationIds()).contains(pubId)) {
+ Publication pub = pubMgr.getPublication(this, pubId);
+ DocumentBuilder builder = pub.getDocumentBuilder();
return builder.isDocument(this, webappUrl);
} else {
return false;
@@ -307,35 +310,28 @@
}
public Publication getPublication(String id) throws PublicationException {
- PublicationManager pubManager = null;
- try {
- pubManager = (PublicationManager) manager.lookup(PublicationManager.ROLE);
- return pubManager.getPublication(this, id);
- } catch (ServiceException e) {
- throw new PublicationException(e);
- } finally {
- if (pubManager != null) {
- manager.release(pubManager);
- }
- }
+ return getPubManager().getPublication(this, id);
}
public Publication[] getPublications() {
- PublicationManager pubManager = null;
- try {
- pubManager = (PublicationManager) manager.lookup(PublicationManager.ROLE);
- return pubManager.getPublications(this);
- } catch (Exception e) {
- throw new RuntimeException(e);
- } finally {
- if (pubManager != null) {
- manager.release(pubManager);
- }
- }
+ return getPubManager().getPublications(this);
}
public boolean isSharable() {
return false;
+ }
+
+ private PublicationManager pubManager;
+
+ protected PublicationManager getPubManager() {
+ if (this.pubManager == null) {
+ try {
+ this.pubManager = (PublicationManager) this.manager.lookup(PublicationManager.ROLE);
+ } catch (ServiceException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return this.pubManager;
}
}
Modified: lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/PublicationManagerImpl.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/PublicationManagerImpl.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/PublicationManagerImpl.java (original)
+++ lenya/trunk/src/impl/java/org/apache/lenya/cms/publication/PublicationManagerImpl.java Sun Aug 19 14:12:37 2007
@@ -24,8 +24,10 @@
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.container.ContainerUtil;
@@ -52,31 +54,37 @@
public PublicationManagerImpl() {
}
- private static Map id2config = new HashMap();
+ private Map id2config;
- public synchronized Publication getPublication(DocumentFactory factory, String id)
- throws PublicationException {
-
- Assert.notNull("publication ID", id);
- if (id.indexOf("/") != -1) {
- throw new PublicationException("The publication ID [" + id
- + "] must not contain a slash!");
+ protected synchronized Map getId2config() throws PublicationException {
+ if (this.id2config == null) {
+ this.id2config = new HashMap();
+ File servletContext = new File(this.servletContextPath);
+ File publicationsDirectory = new File(servletContext, Publication.PUBLICATION_PREFIX);
+ File[] publicationDirectories = publicationsDirectory.listFiles(new FileFilter() {
+ public boolean accept(File file) {
+ File configFile = new File(file, PublicationConfiguration.CONFIGURATION_FILE);
+ return configFile.exists();
+ }
+ });
+ for (int i = 0; i < publicationDirectories.length; i++) {
+ String id = publicationDirectories[i].getName();
+ addPublication(id);
+ }
}
+ return this.id2config;
+ }
- PublicationConfiguration config = null;
+ public Publication getPublication(DocumentFactory factory, String id)
+ throws PublicationException {
- if (id2config.containsKey(id)) {
- config = (PublicationConfiguration) id2config.get(id);
- } else {
- config = new PublicationConfiguration(id, servletContextPath);
- ContainerUtil.enableLogging(config, getLogger());
- id2config.put(id, config);
+ Assert.notNull("publication ID", id);
+ Map id2config = getId2config();
+ if (!id2config.containsKey(id)) {
+ throw new PublicationException("The publication [" + id + "] does not exist.");
}
- if (config == null) {
- throw new PublicationException("The publication for ID [" + id
- + "] could not be created.");
- }
+ PublicationConfiguration config = (PublicationConfiguration) id2config.get(id);
PublicationFactory pubFactory = new PublicationFactory(this.manager, config);
try {
return (Publication) factory.getSession().getRepositoryItem(pubFactory, id);
@@ -85,31 +93,35 @@
}
}
- public Publication[] getPublications(DocumentFactory factory) throws PublicationException {
+ public Publication[] getPublications(DocumentFactory factory) {
List publications = new ArrayList();
try {
- File servletContext = new File(this.servletContextPath);
- File publicationsDirectory = new File(servletContext, Publication.PUBLICATION_PREFIX);
- File[] publicationDirectories = publicationsDirectory.listFiles(new FileFilter() {
- public boolean accept(File file) {
- return file.isDirectory();
- }
- });
-
- for (int i = 0; i < publicationDirectories.length; i++) {
- String publicationId = publicationDirectories[i].getName();
+ Map id2config = getId2config();
+ for (Iterator i = id2config.keySet().iterator(); i.hasNext();) {
+ String publicationId = (String) i.next();
Publication publication = getPublication(factory, publicationId);
publications.add(publication);
}
-
+ } catch (RuntimeException e) {
+ throw e;
} catch (Exception e) {
- throw new PublicationException(e);
+ throw new RuntimeException(e);
}
return (Publication[]) publications.toArray(new Publication[publications.size()]);
}
+ public String[] getPublicationIds() {
+ Set ids;
+ try {
+ ids = getId2config().keySet();
+ } catch (PublicationException e) {
+ throw new RuntimeException(e);
+ }
+ return (String[]) ids.toArray(new String[ids.size()]);
+ }
+
private String servletContextPath;
private ServiceManager manager;
@@ -135,4 +147,18 @@
}
}
-}
\ No newline at end of file
+ public void addPublication(String pubId) throws PublicationException {
+ if (this.id2config.containsKey(pubId)) {
+ throw new PublicationException("The publication [" + pubId + "] already exists.");
+ }
+ PublicationConfiguration config = new PublicationConfiguration(pubId,
+ this.servletContextPath);
+ ContainerUtil.enableLogging(config, getLogger());
+ this.id2config.put(pubId, config);
+ }
+
+ protected String getServletContextPath() {
+ return this.servletContextPath;
+ }
+
+}
Modified: lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/cocoon/components/modules/input/AbstractPageEnvelopeModule.java Sun Aug 19 14:12:37 2007
@@ -21,6 +21,7 @@
package org.apache.lenya.cms.cocoon.components.modules.input;
import java.io.File;
+import java.util.Arrays;
import java.util.Map;
import org.apache.avalon.framework.configuration.ConfigurationException;
@@ -31,7 +32,8 @@
import org.apache.lenya.cms.publication.PageEnvelope;
import org.apache.lenya.cms.publication.PageEnvelopeFactory;
import org.apache.lenya.cms.publication.Publication;
-import org.apache.lenya.cms.publication.PublicationUtil;
+import org.apache.lenya.cms.publication.PublicationManager;
+import org.apache.lenya.cms.publication.URLInformation;
import org.apache.lenya.util.ServletHelper;
/**
@@ -71,9 +73,15 @@
Context context = ObjectModelHelper.getContext(objectModel);
String servletContextPath = context.getRealPath("");
+ PublicationManager pubMgr = null;
try {
DocumentFactory factory = getDocumentFactory();
- Publication pub = PublicationUtil.getPublicationFromUrl(this.manager, factory, webappUrl);
+ Publication pub = null;
+ pubMgr = (PublicationManager) this.manager.lookup(PublicationManager.ROLE);
+ String pubId = new URLInformation(webappUrl).getPublicationId();
+ if (pubId != null && Arrays.asList(pubMgr.getPublicationIds()).contains(pubId)) {
+ pub = pubMgr.getPublication(factory, pubId);
+ }
envelope = PageEnvelopeFactory.getInstance().getPageEnvelope(
factory,
contextPath,
@@ -82,6 +90,10 @@
pub);
} catch (Exception e) {
throw new ConfigurationException("Resolving page envelope failed: ", e);
+ } finally {
+ if (pubMgr != null) {
+ this.manager.release(pubMgr);
+ }
}
request.setAttribute(PageEnvelope.class.getName(), envelope);
}
Modified: lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/AggregatingFallbackSourceFactory.java Sun Aug 19 14:12:37 2007
@@ -102,11 +102,11 @@
pubMgr = (PublicationManager) this.manager.lookup(PublicationManager.ROLE);
DocumentFactory factory = DocumentUtil.getDocumentFactory(this.manager, request);
- Publication pub = pubMgr.getPublication(factory, publicationId);
String[] uris;
- if (pub.exists()) {
+ if (Arrays.asList(pubMgr.getPublicationIds()).contains(publicationId)) {
+ Publication pub = pubMgr.getPublication(factory, publicationId);
AllExistingSourceResolver resolver = new AllExistingSourceResolver();
templateManager.visit(pub, path, resolver);
uris = resolver.getUris();
Modified: lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/cocoon/source/FallbackSourceFactory.java Sun Aug 19 14:12:37 2007
@@ -20,6 +20,7 @@
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
+import java.util.Arrays;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Map;
@@ -119,8 +120,8 @@
pubMgr = (PublicationManager) this.manager.lookup(PublicationManager.ROLE);
DocumentFactory factory = DocumentUtil.getDocumentFactory(this.manager, request);
- Publication pub = pubMgr.getPublication(factory, publicationId);
- if (pub.exists()) {
+ if (Arrays.asList(pubMgr.getPublicationIds()).contains(publicationId)) {
+ Publication pub = pubMgr.getPublication(factory, publicationId);
VisitingSourceResolver resolver = getSourceVisitor();
templateManager.visit(pub, path, resolver);
source = resolver.getSource();
Modified: lenya/trunk/src/java/org/apache/lenya/cms/publication/PublicationManager.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/java/org/apache/lenya/cms/publication/PublicationManager.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/publication/PublicationManager.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/publication/PublicationManager.java Sun Aug 19 14:12:37 2007
@@ -30,16 +30,27 @@
/**
* @param factory The factory.
* @return All publications.
- * @throws PublicationException if an error occurrs.
*/
- Publication[] getPublications(DocumentFactory factory) throws PublicationException;
+ Publication[] getPublications(DocumentFactory factory);
/**
* @param factory The factory.
* @param id The publication ID.
* @return A publication.
- * @throws PublicationException if an error occurs.
+ * @throws PublicationException if the publication does not exist.
*/
Publication getPublication(DocumentFactory factory, String id) throws PublicationException;
+
+ /**
+ * @return The IDs of all available publications.
+ */
+ String[] getPublicationIds();
+
+ /**
+ * Adds a publication.
+ * @param id The publication ID.
+ * @throws PublicationException if the publication already exists.
+ */
+ void addPublication(String id) throws PublicationException;
}
Modified: lenya/trunk/src/modules-core/ac/java/src/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/modules-core/ac/java/src/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/modules-core/ac/java/src/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java (original)
+++ lenya/trunk/src/modules-core/ac/java/src/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java Sun Aug 19 14:12:37 2007
@@ -21,6 +21,7 @@
package org.apache.lenya.cms.ac;
import java.io.File;
+import java.util.Arrays;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.configuration.Configurable;
@@ -37,7 +38,7 @@
import org.apache.lenya.cms.publication.DocumentFactory;
import org.apache.lenya.cms.publication.DocumentUtil;
import org.apache.lenya.cms.publication.Publication;
-import org.apache.lenya.cms.publication.PublicationUtil;
+import org.apache.lenya.cms.publication.PublicationManager;
import org.apache.lenya.cms.publication.URLInformation;
/**
@@ -104,28 +105,30 @@
if (url.length() > 0) {
URLInformation info = new URLInformation(webappUrl);
- String publicationId = info.getPublicationId();
+ String pubId = info.getPublicationId();
+ PublicationManager pubMgr = null;
ContextUtility util = null;
try {
util = (ContextUtility) this.manager.lookup(ContextUtility.ROLE);
+ pubMgr = (PublicationManager) this.manager.lookup(PublicationManager.ROLE);
Request request = util.getRequest();
DocumentFactory factory = DocumentUtil.getDocumentFactory(manager, request);
- publication = PublicationUtil.getPublicationFromUrl(this.manager,
- factory,
- webappUrl);
+ if (pubId != null && Arrays.asList(pubMgr.getPublicationIds()).contains(pubId)) {
+ publication = pubMgr.getPublication(factory, pubId);
+ }
} catch (Exception e) {
throw new AccessControlException(e);
} finally {
if (util != null) {
this.manager.release(util);
}
+ if (pubMgr != null) {
+ this.manager.release(pubMgr);
+ }
}
- if (publication.exists()) {
- getLogger().debug("Publication [" + publicationId + "] exists.");
- } else {
- getLogger().debug("Publication [" + publicationId + "] does not exist.");
- publication = null;
+ if (publication != null) {
+ getLogger().debug("Publication [" + pubId + "] exists.");
}
}
return publication;
Modified: lenya/trunk/src/pubs/default/java/src/org/apache/lenya/defaultpub/cms/publication/templating/Instantiator.java
URL: http://svn.apache.org/viewvc/lenya/trunk/src/pubs/default/java/src/org/apache/lenya/defaultpub/cms/publication/templating/Instantiator.java?rev=567473&r1=567472&r2=567473&view=diff
==============================================================================
--- lenya/trunk/src/pubs/default/java/src/org/apache/lenya/defaultpub/cms/publication/templating/Instantiator.java (original)
+++ lenya/trunk/src/pubs/default/java/src/org/apache/lenya/defaultpub/cms/publication/templating/Instantiator.java Sun Aug 19 14:12:37 2007
@@ -45,6 +45,7 @@
import org.apache.excalibur.source.SourceResolver;
import org.apache.excalibur.source.impl.FileSource;
import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.PublicationManager;
// import org.apache.lenya.cms.publication.PublicationConfiguration;
import org.apache.lenya.xml.DocumentHelper;
import org.apache.lenya.xml.NamespaceHelper;
@@ -96,6 +97,7 @@
SourceResolver resolver = null;
Source publicationsSource = null;
+ PublicationManager pubManager = null;
try {
resolver = (SourceResolver) this.manager.lookup(SourceResolver.ROLE);
@@ -118,6 +120,9 @@
configureSearchIndex(resolver, template, newPublicationId, publicationsUri);
updateConfiguration(resolver, template, newPublicationId, publicationsUri);
+
+ pubManager = (PublicationManager) this.manager.lookup(PublicationManager.ROLE);
+ pubManager.addPublication(newPublicationId);
} finally {
if (resolver != null) {
@@ -125,6 +130,9 @@
if (publicationsSource != null) {
resolver.release(publicationsSource);
}
+ }
+ if (pubManager != null) {
+ this.manager.release(pubManager);
}
}