You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lenya.apache.org by an...@apache.org on 2009/01/17 11:52:11 UTC

svn commit: r735268 - in /lenya/trunk/src/pubs/default: config/cocoon-xconf/instantiator.xconf java/src/org/apache/lenya/defaultpub/cms/publication/templating/Instantiator.java

Author: andreas
Date: Sat Jan 17 02:52:11 2009
New Revision: 735268

URL: http://svn.apache.org/viewvc?rev=735268&view=rev
Log:
Add option to instantiator to share / not share the accreditables with the template publication. See bug 43340. Thanks to Rudolf Korhummel for the patch.

Modified:
    lenya/trunk/src/pubs/default/config/cocoon-xconf/instantiator.xconf
    lenya/trunk/src/pubs/default/java/src/org/apache/lenya/defaultpub/cms/publication/templating/Instantiator.java

Modified: lenya/trunk/src/pubs/default/config/cocoon-xconf/instantiator.xconf
URL: http://svn.apache.org/viewvc/lenya/trunk/src/pubs/default/config/cocoon-xconf/instantiator.xconf?rev=735268&r1=735267&r2=735268&view=diff
==============================================================================
--- lenya/trunk/src/pubs/default/config/cocoon-xconf/instantiator.xconf (original)
+++ lenya/trunk/src/pubs/default/config/cocoon-xconf/instantiator.xconf Sat Jan 17 02:52:11 2009
@@ -15,8 +15,6 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 -->
-
-<!-- $Id: usecase.xmap 158794 2005-03-23 16:21:15Z andreas $ -->
 <!--
     This file defines the publication specific template instantiator
 -->
@@ -25,6 +23,9 @@
 
     <component-instance name="default"
                         logger="lenya.publication.templating"
-                        class="org.apache.lenya.defaultpub.cms.publication.templating.Instantiator"/>
+                        class="org.apache.lenya.defaultpub.cms.publication.templating.Instantiator">
+      <!-- if the new publication should use the same accreditables as the template. -->
+      <parameter name="shareAccreditables" value="false"/>
+    </component-instance>
 
   </xconf>

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=735268&r1=735267&r2=735268&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 Sat Jan 17 02:52:11 2009
@@ -21,8 +21,11 @@
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.List;
 
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.TransformerConfigurationException;
@@ -35,18 +38,21 @@
 import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
 import org.apache.avalon.framework.configuration.DefaultConfigurationSerializer;
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.parameters.ParameterException;
+import org.apache.avalon.framework.parameters.Parameterizable;
+import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.service.Serviceable;
 import org.apache.cocoon.components.search.components.IndexManager;
+import org.apache.cocoon.components.search.components.impl.IndexManagerImpl;
 import org.apache.excalibur.source.ModifiableSource;
 import org.apache.excalibur.source.Source;
 import org.apache.excalibur.source.SourceNotFoundException;
 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.cms.publication.PublicationManager; // import org.apache.lenya.cms.publication.PublicationConfiguration;
 import org.apache.lenya.util.Assert;
 import org.apache.lenya.xml.DocumentHelper;
 import org.apache.lenya.xml.NamespaceHelper;
@@ -56,20 +62,16 @@
 
 /**
  * Instantiate the publication.
- * 
- * @version $Id$
  */
 public class Instantiator extends AbstractLogEnabled implements
-        org.apache.lenya.cms.publication.templating.Instantiator, Serviceable {
+        org.apache.lenya.cms.publication.templating.Instantiator, Serviceable, Parameterizable {
 
-    protected static final String[] sourcesToCopy = {
-            "config/publication.xml",
-            "config/access-control/access-control.xml",
-            "config/access-control/policies/",
-            "config/access-control/usecase-policies.xml",
-            "config/workflow/workflow.xml",
-            "config/"
-                    + org.apache.cocoon.components.search.components.impl.IndexManagerImpl.INDEX_CONF_FILE };
+    protected static final String[] sourcesToCopy = { "config/publication.xml",
+            "config/access-control/access-control.xml", "config/access-control/policies/",
+            "config/access-control/usecase-policies.xml", "config/workflow/workflow.xml",
+            "config/" + IndexManagerImpl.INDEX_CONF_FILE };
+
+    protected static final String ACCREDITABLES_DIRECTORY = "config/access-control/passwd/";
 
     // the following stuff should actually come from PublicationConfiguration,
     // but there's currently no way to get at it.
@@ -81,6 +83,7 @@
     // hack.
     private static final String CONFIGURATION_FILE = "config/publication.xml";
     private static final String CONFIGURATION_NAMESPACE = "http://apache.org/cocoon/lenya/publication/1.1";
+    private static final String ACCESS_CONTROL_FILE = "config/access-control/access-control.xml";
     private static final String ELEMENT_NAME = "name";
     private static final String ELEMENT_TEMPLATE = "template";
     private static final String ATTRIBUTE_ID = "id";
@@ -89,17 +92,20 @@
     private static final String ELEMENT_MODULES = "modules";// *
     private static final String ELEMENT_MODULE = "module";// *
 
+    private ServiceManager manager;
+    private boolean shareAccreditables;
+
     /**
      * @see org.apache.lenya.cms.publication.templating.Instantiator#instantiate(org.apache.lenya.cms.publication.Publication,
      *      java.lang.String, java.lang.String)
      */
     public void instantiate(Publication template, String newPublicationId, String name)
             throws Exception {
-        
+
         Assert.notNull("template", template);
         Assert.notNull("publication ID", newPublicationId);
         Assert.notNull("name", name);
-        
+
         if (name.equals("")) {
             name = newPublicationId;
         }
@@ -114,22 +120,30 @@
                     + Publication.PUBLICATION_PREFIX_URI);
             String publicationsUri = publicationsSource.getURI();
 
-            for (int i = 0; i < sourcesToCopy.length; i++) {
+            List sources = new ArrayList(Arrays.asList(sourcesToCopy));
+
+            if (!this.shareAccreditables) {
+                sources.add(ACCREDITABLES_DIRECTORY);
+            }
+
+            for (Iterator i = sources.iterator(); i.hasNext();) {
 
-                String source = sourcesToCopy[i];
+                String source = (String) i.next();
                 if (source.endsWith("/")) {
                     copyDirSource(template, newPublicationId, resolver, publicationsUri, source);
                 } else {
                     copySource(template, newPublicationId, resolver, publicationsUri, source);
                 }
             }
-            
+
             updateMetaData(resolver, newPublicationId, name, publicationsUri);
 
             configureSearchIndex(resolver, template, newPublicationId, publicationsUri);
 
             updateConfiguration(resolver, template, newPublicationId, publicationsUri);
-            
+
+            updateAccessControl(resolver, template, newPublicationId, publicationsUri);
+
             pubManager = (PublicationManager) this.manager.lookup(PublicationManager.ROLE);
             pubManager.addPublication(newPublicationId);
 
@@ -264,7 +278,7 @@
 
             // Second, configure the index and add it to the IndexManager
 
-            indexManager = (IndexManager) manager.lookup(IndexManager.ROLE);
+            indexManager = (IndexManager) this.manager.lookup(IndexManager.ROLE);
 
             indexManager.addIndexes(indexSource);
 
@@ -324,6 +338,59 @@
         }
     }
 
+    protected void updateAccessControl(SourceResolver resolver, Publication template,
+            String newPublicationId, String publicationsUri) throws MalformedURLException,
+            IOException, SAXException, ConfigurationException, SourceNotFoundException {
+        ModifiableSource configSource = null;
+        try {
+
+            configSource = (ModifiableSource) resolver.resolveURI(publicationsUri + "/"
+                    + newPublicationId + "/" + ACCESS_CONTROL_FILE);
+
+            final boolean enableXmlNamespaces = true;
+            DefaultConfiguration config = (DefaultConfiguration) new DefaultConfigurationBuilder(
+                    enableXmlNamespaces).build(configSource.getInputStream());
+            DefaultConfiguration acreditableDirectory = (DefaultConfiguration) config.getChild(
+                    "accreditable-manager", false).getChild("parameter", false);
+
+            if (!this.shareAccreditables) {
+                acreditableDirectory.setAttribute("value", "context:///lenya/pubs/"
+                        + newPublicationId + "/config/access-control/passwd");
+            }
+
+            DefaultConfiguration policyDirectory = (DefaultConfiguration) config.getChild(
+                    "policy-manager", false).getChild("policy-manager", false).getChild(
+                    "parameter", false);
+            policyDirectory.setAttribute("value", "context:///lenya/pubs/" + newPublicationId
+                    + "/config/access-control/policies");
+
+            saveConfiguration(config, configSource);
+        } finally {
+            if (resolver != null) {
+                if (configSource != null) {
+                    resolver.release(configSource);
+                }
+            }
+        }
+    }
+
+    protected void saveConfiguration(DefaultConfiguration config, ModifiableSource source)
+            throws IOException, SAXException, ConfigurationException {
+        OutputStream oStream = source.getOutputStream();
+        new DefaultConfigurationSerializer().serialize(oStream, config);
+        if (oStream != null) {
+            oStream.flush();
+            try {
+                oStream.close();
+            } catch (Throwable t) {
+                if (getLogger().isDebugEnabled()) {
+                    getLogger().debug("Exception closing output stream: ", t);
+                }
+                throw new RuntimeException("Could not write document: ", t);
+            }
+        }
+    }
+
     protected void save(Document metaDoc, ModifiableSource metaSource) throws IOException,
             TransformerConfigurationException, TransformerException {
         OutputStream oStream = metaSource.getOutputStream();
@@ -341,8 +408,6 @@
         }
     }
 
-    private ServiceManager manager;
-
     /**
      * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
      */
@@ -350,4 +415,8 @@
         this.manager = manager;
     }
 
+    public void parameterize(Parameters params) throws ParameterException {
+        this.shareAccreditables = params.getParameterAsBoolean("shareAccreditables", true);
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@lenya.apache.org
For additional commands, e-mail: commits-help@lenya.apache.org