svn commit: r635107 [4/7] - in /lenya/branches/revolution/1.3.x: ./ src/cocoon/ src/java/org/apache/cocoon/components/source/ src/java/org/apache/lenya/ac/ src/java/org/apache/lenya/ac/cache/ src/java/org/apache/lenya/ac/file/ src/java/org/apache/lenya...

[email protected]
Newsgroups gmane.comp.cms.lenya.cvs
Message-ID <[email protected]>
Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/LinkRewritingTransformer.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/LinkRewritingTransformer.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/LinkRewritingTransformer.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/LinkRewritingTransformer.java Sat Mar  8 14:58:32 2008
@@ -15,11 +15,10 @@
  *
  */
 package org.apache.lenya.cms.cocoon.transformation;
-
 import java.io.IOException;
 import java.util.Map;
-import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.avalon.framework.service.ServiceSelector;
 import org.apache.cocoon.ProcessingException;
 import org.apache.cocoon.environment.ObjectModelHelper;
@@ -38,7 +37,6 @@
 import org.apache.lenya.cms.publication.Document;
 import org.apache.lenya.cms.publication.DocumentBuilder;
 import org.apache.lenya.cms.publication.PageEnvelope;
-import org.apache.lenya.cms.publication.PageEnvelopeFactory;
 import org.apache.lenya.cms.publication.Proxy;
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.publication.PublicationException;
@@ -46,15 +44,13 @@
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.AttributesImpl;
-
 /**
  * <p>
  * Link rewriting transformer.
  * </p>
  * 
  * <p>
- * This transformer is applied to an XHMTL document. It processes <code>&lt;xhtml:a href="..."&gt;</code>
- * attributes of the following form:
+ * This transformer is applied to an XHMTL document. It processes <code>&lt;xhtml:a href="..."&gt;</code> attributes of the following form:
  * </p>
  * <p>
  * <code>{context-prefix}/{publication-id}/{area}{document-url}</code>
@@ -71,326 +67,272 @@
  * $Id: LinkRewritingTransformer.java,v 1.7 2004/03/16 11:12:16 gregor
  */
 public class LinkRewritingTransformer extends AbstractSAXTransformer implements Disposable {
-
-    private boolean ignoreAElement = false;
-    private ServiceSelector serviceSelector;
-    private PolicyManager policyManager;
-    private AccessControllerResolver acResolver;
-    private AccreditableManager accreditableManager;
-
-    private Document currentDocument;
-
-    /**
-     * @see org.apache.cocoon.sitemap.SitemapModelComponent#setup(org.apache.cocoon.environment.SourceResolver,
-     *      java.util.Map, java.lang.String,
-     *      org.apache.avalon.framework.parameters.Parameters)
-     */
-    public void setup(SourceResolver resolver, Map objectModel, String source, Parameters parameters)
-            throws ProcessingException, SAXException, IOException {
-        super.setup(resolver, objectModel, source, parameters);
-
-        try {
-            PageEnvelope envelope = PageEnvelopeFactory.getInstance().getPageEnvelope(objectModel);
-            this.currentDocument = envelope.getDocument();
-
-        } catch (Exception e) {
-            throw new ProcessingException(e);
-        }
-
-        if (getLogger().isDebugEnabled()) {
-            getLogger().debug("Setting up transformer");
-            getLogger().debug("    Processed version:       [" + getCurrentDocument() + "]");
-        }
-
-        Request request = ObjectModelHelper.getRequest(objectModel);
-
-        this.serviceSelector = null;
-        this.acResolver = null;
-        this.policyManager = null;
-
-        try {
-            this.serviceSelector = (ServiceSelector) this.manager
-                    .lookup(AccessControllerResolver.ROLE + "Selector");
-            this.acResolver = (AccessControllerResolver) this.serviceSelector
-                    .select(AccessControllerResolver.DEFAULT_RESOLVER);
-
-            if (getLogger().isDebugEnabled()) {
-                getLogger().debug("    Resolved AC resolver [" + this.acResolver + "]");
-            }
-            String webappUrl = ServletHelper.getWebappURI(request);
-            AccessController accessController = this.acResolver.resolveAccessController(webappUrl);
-            if (accessController instanceof DefaultAccessController) {
-                DefaultAccessController defaultAccessController = (DefaultAccessController) accessController;
-                this.accreditableManager = defaultAccessController.getAccreditableManager();
-                Authorizer[] authorizers = defaultAccessController.getAuthorizers();
-                for (int i = 0; i < authorizers.length; i++) {
-                    if (authorizers[i] instanceof PolicyAuthorizer) {
-                        PolicyAuthorizer policyAuthorizer = (PolicyAuthorizer) authorizers[i];
-                        this.policyManager = policyAuthorizer.getPolicyManager();
-                    }
-                }
-            }
-            if (getLogger().isDebugEnabled()) {
-                getLogger().debug("    Using policy manager [" + this.policyManager + "]");
-            }
-        } catch (Exception e) {
-            throw new ProcessingException(e);
-        }
-    }
-
-    /**
-     * Returns the currently processed document.
-     * 
-     * @return A document.
-     */
-    protected Document getCurrentDocument() {
-        return this.currentDocument;
-    }
-
-    /**
-     * The local name of the HTML &lt;a&gt; href attribute.
-     */
-    public static final String ATTRIBUTE_HREF = "href";
-
-    private String indent = "";
-
-    /**
-     * (non-Javadoc)
-     * 
-     * @see org.xml.sax.ContentHandler#startElement(java.lang.String,
-     *      java.lang.String, java.lang.String, org.xml.sax.Attributes)
-     */
-    public void startElement(String uri, String name, String qname, Attributes attrs)
-            throws SAXException {
-
-        if (getLogger().isDebugEnabled()) {
-            getLogger().debug(this.indent + "<" + qname + "> (ignoreAElement = "
-                    + isIgnoreAElement() + ")");
-            this.indent += "  ";
-        }
-
-        AttributesImpl newAttrs = null;
-        if (lookingAtLinkElement(name)) {
-
-            setIgnoreAElement(false);
-
-            String href = attrs.getValue(ATTRIBUTE_HREF);
-            if (href != null) {
-
-                Publication publication = getCurrentDocument().getPublication();
-                DocumentBuilder builder = publication.getDocumentBuilder();
-
-                try {
-
-                    newAttrs = new AttributesImpl(attrs);
-
-                    if (getLogger().isDebugEnabled()) {
-                        getLogger().debug(this.indent + "href URL: [" + href + "]");
-                    }
-
-                    String context = this.request.getContextPath();
-
-                    if (href.startsWith(context + "/" + publication.getId())) {
-
-                        final String webappUrlWithQueryString = href.substring(context.length());
-                        String webappUrlWithAnchor;
-                        
-                        String queryString = null;
-                        int queryStringIndex = webappUrlWithQueryString.indexOf("?");
-                        if (queryStringIndex > -1) {
-                            webappUrlWithAnchor = webappUrlWithQueryString.substring(0, queryStringIndex);
-                            queryString = webappUrlWithQueryString.substring(queryStringIndex + 1);
-                        }
-                        else {
-                            webappUrlWithAnchor = webappUrlWithQueryString;
-                        }
-                        
-                        String anchor = null;
-                        String webappUrl = null;
-                        
-                        int anchorIndex = webappUrlWithAnchor.indexOf("#");
-                        if (anchorIndex > -1) {
-                            webappUrl = webappUrlWithAnchor.substring(0, anchorIndex);
-                            anchor = webappUrlWithAnchor.substring(anchorIndex + 1);
-                        }
-                        else {
-                            webappUrl = webappUrlWithAnchor;
-                        }
-                        
-                        if (getLogger().isDebugEnabled()) {
-                            getLogger().debug(this.indent + "webapp URL: [" + webappUrl + "]");
-                            getLogger().debug(this.indent + "anchor:     [" + anchor + "]");
-                        }
-                        if (builder.isDocument(publication, webappUrl)) {
-
-                            Document targetDocument = builder.buildDocument(publication, webappUrl);
-
-                            if (getLogger().isDebugEnabled()) {
-                                getLogger().debug(this.indent + "Resolved target document: ["
-                                        + targetDocument + "]");
-                            }
-
-                            String currentAreaUrl = builder.buildCanonicalUrl(publication,
-                                    getCurrentDocument().getArea(),
-                                    targetDocument.getId(),
-                                    targetDocument.getLanguage());
-                            targetDocument = builder.buildDocument(publication, currentAreaUrl);
-
-                            if (targetDocument.exists()) {
-                                rewriteLink(newAttrs, targetDocument, anchor, queryString);
-                            } else {
-                                setIgnoreAElement(true);
-                            }
-                        }
-                    }
-                } catch (Exception e) {
-                    getLogger().error("startElement failed: ", e);
-                    throw new SAXException(e);
-                }
-            }
-
-        }
-
-        if (getLogger().isDebugEnabled()) {
-            getLogger().debug(this.indent + "ignoreAElement: " + isIgnoreAElement());
-        }
-
-        if (!(lookingAtAElement(name) && isIgnoreAElement())) {
-            if (newAttrs != null) {
-                attrs = newAttrs;
-            }
-            super.startElement(uri, name, qname, attrs);
-            if (getLogger().isDebugEnabled()) {
-                getLogger().debug(this.indent + "<" + qname + "> sent");
-            }
-        }
-    }
-
-    /**
-     * Rewrites a link.
-     * 
-     * @param newAttrs The new attributes.
-     * @param targetDocument The target document.
-     * @param anchor The anchor (the string after the # character in the URL).
-     * @param queryString The query string without question mark.
-     * @throws AccessControlException when something went wrong.
-     * @throws PublicationException when something went wrong.
-     */
-    protected void rewriteLink(AttributesImpl newAttrs, Document targetDocument, String anchor, String queryString)
-            throws AccessControlException, PublicationException {
-        String webappUrl = targetDocument.getCompleteURL();
-        Policy policy = this.policyManager.getPolicy(this.accreditableManager, webappUrl);
-
-        Proxy proxy = targetDocument.getPublication().getProxy(targetDocument, policy.isSSLProtected());
-
-        String rewrittenURL;
-        if (proxy == null) {
-            rewrittenURL = this.request.getContextPath() + webappUrl;
-        } else {
-            rewrittenURL = proxy.getURL(targetDocument);
-        }
-        
-        if (anchor != null) {
-            rewrittenURL += "#" + anchor;
-        }
-
-        if (queryString != null) {
-            rewrittenURL += "?" + queryString;
-        }
-
-        if (getLogger().isDebugEnabled()) {
-            getLogger().debug(this.indent + "SSL protection: [" + policy.isSSLProtected() + "]");
-            getLogger().debug(this.indent + "Resolved proxy: [" + proxy + "]");
-            getLogger().debug(this.indent + "Rewriting URL to: [" + rewrittenURL + "]");
-        }
-
-        setHrefAttribute(newAttrs, rewrittenURL);
-    }
-
-    /**
-     * Sets the value of the href attribute.
-     * 
-     * @param attr The attributes.
-     * @param value The value.
-     * @throws IllegalArgumentException if the href attribute is not contained
-     *             in this attributes.
-     */
-    protected void setHrefAttribute(AttributesImpl attr, String value) {
-        int position = attr.getIndex(ATTRIBUTE_HREF);
-        if (position == -1) {
-            throw new IllegalArgumentException("The href attribute is not available!");
-        }
-        attr.setValue(position, value);
-    }
-
-    /**
-     * (non-Javadoc)
-     * 
-     * @see org.xml.sax.ContentHandler#endElement(java.lang.String,
-     *      java.lang.String, java.lang.String)
-     */
-    public void endElement(String uri, String name, String qname) throws SAXException {
-        if (getLogger().isDebugEnabled()) {
-            this.indent = this.indent.substring(2);
-            getLogger().debug(this.indent + "</" + qname + ">");
-        }
-        if (lookingAtAElement(name) && isIgnoreAElement()) {
-            setIgnoreAElement(false);
-        } else {
-            if (getLogger().isDebugEnabled()) {
-                getLogger().debug(this.indent + "</" + qname + "> sent");
+   private boolean ignoreAElement = false;
+   private ServiceSelector serviceSelector;
+   private PolicyManager policyManager;
+   private AccessControllerResolver acResolver;
+   private AccreditableManager accreditableManager;
+   private Document currentDocument;
+   /**
+    * @see org.apache.cocoon.sitemap.SitemapModelComponent#setup(org.apache.cocoon.environment.SourceResolver, java.util.Map, java.lang.String, org.apache.avalon.framework.parameters.Parameters)
+    */
+   public void setup(SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws ProcessingException, SAXException, IOException {
+      super.setup(resolver, objectModel, source, parameters);
+      try{
+         PageEnvelope envelope = PageEnvelope.getCurrent();
+         this.currentDocument = envelope.getDocument();
+      }catch(Exception e){
+         throw new ProcessingException(e);
+      }
+      if(getLogger().isDebugEnabled()){
+         getLogger().debug("Setting up transformer");
+         getLogger().debug("    Processed version:       [" + getCurrentDocument() + "]");
+      }
+      Request request = ObjectModelHelper.getRequest(objectModel);
+      this.serviceSelector = null;
+      this.acResolver = null;
+      this.policyManager = null;
+      try{
+         this.serviceSelector = (ServiceSelector) this.manager.lookup(AccessControllerResolver.ROLE + "Selector");
+         this.acResolver = (AccessControllerResolver) this.serviceSelector.select(AccessControllerResolver.DEFAULT_RESOLVER);
+         if(getLogger().isDebugEnabled()){
+            getLogger().debug("    Resolved AC resolver [" + this.acResolver + "]");
+         }
+         String webappUrl = ServletHelper.getWebappURI(request);
+         AccessController accessController = this.acResolver.resolveAccessController(webappUrl);
+         if(accessController instanceof DefaultAccessController){
+            DefaultAccessController defaultAccessController = (DefaultAccessController) accessController;
+            this.accreditableManager = defaultAccessController.getAccreditableManager();
+            Authorizer[] authorizers = defaultAccessController.getAuthorizers();
+            for(int i = 0; i < authorizers.length; i++){
+               if(authorizers[i] instanceof PolicyAuthorizer){
+                  PolicyAuthorizer policyAuthorizer = (PolicyAuthorizer) authorizers[i];
+                  this.policyManager = policyAuthorizer.getPolicyManager();
+               }
             }
-            super.endElement(uri, name, qname);
-        }
-    }
-
-    /**
-     * Check if we are looking at a link element
-     * 
-     * @param name name of the element
-     * 
-     * @return true if we are looking at a link element
-     */
-    protected boolean lookingAtLinkElement(String name) {
-        return lookingAtAElement(name);
-    }
-
-    protected boolean lookingAtAElement(String name) {
-        return name.equals("a");
-    }
-
-    /**
-     * @see org.apache.avalon.framework.activity.Disposable#dispose()
-     */
-    public void dispose() {
-        if (getLogger().isDebugEnabled()) {
-            getLogger().debug("Disposing transformer");
-        }
-        if (this.serviceSelector != null) {
-            if (this.acResolver != null) {
-                this.serviceSelector.release(this.acResolver);
+         }
+         if(getLogger().isDebugEnabled()){
+            getLogger().debug("    Using policy manager [" + this.policyManager + "]");
+         }
+      }catch(Exception e){
+         throw new ProcessingException(e);
+      }
+   }
+   /**
+    * Returns the currently processed document.
+    * 
+    * @return A document.
+    */
+   protected Document getCurrentDocument() {
+      return this.currentDocument;
+   }
+   /**
+    * The local name of the HTML &lt;a&gt; href attribute.
+    */
+   public static final String ATTRIBUTE_HREF = "href";
+   private String indent = "";
+   /**
+    * (non-Javadoc)
+    * 
+    * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+    */
+   public void startElement(String uri, String name, String qname, Attributes attrs) throws SAXException {
+      if(getLogger().isDebugEnabled()){
+         getLogger().debug(this.indent + "<" + qname + "> (ignoreAElement = " + isIgnoreAElement() + ")");
+         this.indent += "  ";
+      }
+      AttributesImpl newAttrs = null;
+      if(lookingAtLinkElement(name)){
+         setIgnoreAElement(false);
+         String href = attrs.getValue(ATTRIBUTE_HREF);
+         if(href != null){
+            Publication publication = getCurrentDocument().getPublication();
+            DocumentBuilder builder = publication.getDocumentBuilder();
+            try{
+               newAttrs = new AttributesImpl(attrs);
+               if(getLogger().isDebugEnabled()){
+                  getLogger().debug(this.indent + "href URL: [" + href + "]");
+               }
+               String context = this.request.getContextPath();
+               if(href.startsWith(context + "/" + publication.getId())){
+                  final String webappUrlWithQueryString = href.substring(context.length());
+                  String webappUrlWithAnchor;
+                  String queryString = null;
+                  int queryStringIndex = webappUrlWithQueryString.indexOf("?");
+                  if(queryStringIndex > -1){
+                     webappUrlWithAnchor = webappUrlWithQueryString.substring(0, queryStringIndex);
+                     queryString = webappUrlWithQueryString.substring(queryStringIndex + 1);
+                  }else{
+                     webappUrlWithAnchor = webappUrlWithQueryString;
+                  }
+                  String anchor = null;
+                  String webappUrl = null;
+                  int anchorIndex = webappUrlWithAnchor.indexOf("#");
+                  if(anchorIndex > -1){
+                     webappUrl = webappUrlWithAnchor.substring(0, anchorIndex);
+                     anchor = webappUrlWithAnchor.substring(anchorIndex + 1);
+                  }else{
+                     webappUrl = webappUrlWithAnchor;
+                  }
+                  if(getLogger().isDebugEnabled()){
+                     getLogger().debug(this.indent + "webapp URL: [" + webappUrl + "]");
+                     getLogger().debug(this.indent + "anchor:     [" + anchor + "]");
+                  }
+                  if(builder.isDocument(publication, webappUrl)){
+                     Document targetDocument = builder.buildDocument(publication, webappUrl);
+                     if(getLogger().isDebugEnabled()){
+                        getLogger().debug(this.indent + "Resolved target document: [" + targetDocument + "]");
+                     }
+                     String currentAreaUrl = builder.buildCanonicalUrl(publication, getCurrentDocument().getArea(), targetDocument.getId(), targetDocument.getLanguage());
+                     targetDocument = builder.buildDocument(publication, currentAreaUrl);
+                     if(targetDocument.exists()){
+                        rewriteLink(newAttrs, targetDocument, anchor, queryString);
+                     }else{
+                        setIgnoreAElement(true);
+                     }
+                  }
+               }
+            }catch(Exception e){
+               getLogger().error("startElement failed: ", e);
+               throw new SAXException(e);
             }
-            this.manager.release(this.serviceSelector);
-        }
-    }
-
-    /**
-     * (non-Javadoc)
-     * @see org.apache.avalon.excalibur.pool.Recyclable#recycle()
-     */
-    public void recycle() {
-        this.ignoreAElement = false;
-    }
-    /**
-     * @return Returns the ignoreAElement.
-     */
-    protected boolean isIgnoreAElement() {
-        return ignoreAElement;
-    }
-    /**
-     * @param ignoreAElement The ignoreAElement to set.
-     */
-    protected void setIgnoreAElement(boolean ignoreAElement) {
-        this.ignoreAElement = ignoreAElement;
-    }
+         }
+      }
+      if(getLogger().isDebugEnabled()){
+         getLogger().debug(this.indent + "ignoreAElement: " + isIgnoreAElement());
+      }
+      if(!(lookingAtAElement(name) && isIgnoreAElement())){
+         if(newAttrs != null){
+            attrs = newAttrs;
+         }
+         super.startElement(uri, name, qname, attrs);
+         if(getLogger().isDebugEnabled()){
+            getLogger().debug(this.indent + "<" + qname + "> sent");
+         }
+      }
+   }
+   /**
+    * Rewrites a link.
+    * 
+    * @param newAttrs
+    *           The new attributes.
+    * @param targetDocument
+    *           The target document.
+    * @param anchor
+    *           The anchor (the string after the # character in the URL).
+    * @param queryString
+    *           The query string without question mark.
+    * @throws AccessControlException
+    *            when something went wrong.
+    * @throws PublicationException
+    *            when something went wrong.
+    */
+   protected void rewriteLink(AttributesImpl newAttrs, Document targetDocument, String anchor, String queryString) throws AccessControlException, PublicationException {
+      String webappUrl = targetDocument.getCompleteURL();
+      Policy policy = this.policyManager.getPolicy(this.accreditableManager, webappUrl);
+      Proxy proxy = targetDocument.getPublication().getProxy(targetDocument, policy.isSSLProtected());
+      String rewrittenURL;
+      if(proxy == null){
+         rewrittenURL = this.request.getContextPath() + webappUrl;
+      }else{
+         rewrittenURL = proxy.getURL(targetDocument);
+      }
+      if(anchor != null){
+         rewrittenURL += "#" + anchor;
+      }
+      if(queryString != null){
+         rewrittenURL += "?" + queryString;
+      }
+      if(getLogger().isDebugEnabled()){
+         getLogger().debug(this.indent + "SSL protection: [" + policy.isSSLProtected() + "]");
+         getLogger().debug(this.indent + "Resolved proxy: [" + proxy + "]");
+         getLogger().debug(this.indent + "Rewriting URL to: [" + rewrittenURL + "]");
+      }
+      setHrefAttribute(newAttrs, rewrittenURL);
+   }
+   /**
+    * Sets the value of the href attribute.
+    * 
+    * @param attr
+    *           The attributes.
+    * @param value
+    *           The value.
+    * @throws IllegalArgumentException
+    *            if the href attribute is not contained in this attributes.
+    */
+   protected void setHrefAttribute(AttributesImpl attr, String value) {
+      int position = attr.getIndex(ATTRIBUTE_HREF);
+      if(position == -1){
+         throw new IllegalArgumentException("The href attribute is not available!");
+      }
+      attr.setValue(position, value);
+   }
+   /**
+    * (non-Javadoc)
+    * 
+    * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
+    */
+   public void endElement(String uri, String name, String qname) throws SAXException {
+      if(getLogger().isDebugEnabled()){
+         this.indent = this.indent.substring(2);
+         getLogger().debug(this.indent + "</" + qname + ">");
+      }
+      if(lookingAtAElement(name) && isIgnoreAElement()){
+         setIgnoreAElement(false);
+      }else{
+         if(getLogger().isDebugEnabled()){
+            getLogger().debug(this.indent + "</" + qname + "> sent");
+         }
+         super.endElement(uri, name, qname);
+      }
+   }
+   /**
+    * Check if we are looking at a link element
+    * 
+    * @param name
+    *           name of the element
+    * 
+    * @return true if we are looking at a link element
+    */
+   protected boolean lookingAtLinkElement(String name) {
+      return lookingAtAElement(name);
+   }
+   protected boolean lookingAtAElement(String name) {
+      return name.equals("a");
+   }
+   /**
+    * @see org.apache.avalon.framework.activity.Disposable#dispose()
+    */
+   public void dispose() {
+      if(getLogger().isDebugEnabled()){
+         getLogger().debug("Disposing transformer");
+      }
+      if(this.serviceSelector != null){
+         if(this.acResolver != null){
+            this.serviceSelector.release(this.acResolver);
+         }
+         this.manager.release(this.serviceSelector);
+      }
+   }
+   /**
+    * (non-Javadoc)
+    * 
+    * @see org.apache.avalon.excalibur.pool.Recyclable#recycle()
+    */
+   public void recycle() {
+      this.ignoreAElement = false;
+   }
+   /**
+    * @return Returns the ignoreAElement.
+    */
+   protected boolean isIgnoreAElement() {
+      return ignoreAElement;
+   }
+   /**
+    * @param ignoreAElement
+    *           The ignoreAElement to set.
+    */
+   protected void setIgnoreAElement(boolean ignoreAElement) {
+      this.ignoreAElement = ignoreAElement;
+   }
 }

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/SimpleLinkRewritingTransformer.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/SimpleLinkRewritingTransformer.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/SimpleLinkRewritingTransformer.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/SimpleLinkRewritingTransformer.java Sat Mar  8 14:58:32 2008
@@ -26,9 +26,8 @@
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-
-import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.avalon.framework.service.ServiceSelector;
 import org.apache.cocoon.ProcessingException;
 import org.apache.cocoon.environment.ObjectModelHelper;
@@ -52,10 +51,10 @@
 import org.apache.lenya.cms.publication.Publication;
 import org.apache.lenya.cms.publication.PublicationException;
 import org.apache.lenya.util.ServletHelper;
+import org.apache.log4j.Category;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.AttributesImpl;
-import org.apache.log4j.Category;
 
 
 /**

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/UsecaseMenuTransformer.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/UsecaseMenuTransformer.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/UsecaseMenuTransformer.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/UsecaseMenuTransformer.java Sat Mar  8 14:58:32 2008
@@ -21,7 +21,6 @@
 
 import java.io.IOException;
 import java.util.Map;
-
 import org.apache.avalon.framework.activity.Disposable;
 import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.avalon.framework.service.ServiceSelector;

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/WorkflowMenuTransformer.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/WorkflowMenuTransformer.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/WorkflowMenuTransformer.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/transformation/WorkflowMenuTransformer.java Sat Mar  8 14:58:32 2008
@@ -14,14 +14,10 @@
  *  limitations under the License.
  *
  */
-
 /* $Id$  */
-
 package org.apache.lenya.cms.cocoon.transformation;
-
 import java.io.IOException;
 import java.util.Map;
-
 import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.cocoon.ProcessingException;
 import org.apache.cocoon.environment.SourceResolver;
@@ -29,7 +25,6 @@
 import org.apache.lenya.cms.cocoon.workflow.WorkflowHelper;
 import org.apache.lenya.cms.publication.Document;
 import org.apache.lenya.cms.publication.PageEnvelope;
-import org.apache.lenya.cms.publication.PageEnvelopeFactory;
 import org.apache.lenya.cms.workflow.WorkflowFactory;
 import org.apache.lenya.workflow.Event;
 import org.apache.lenya.workflow.Situation;
@@ -39,162 +34,137 @@
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.AttributesImpl;
-
 /**
- * This transformer disables menu items (by removing the href attribute)
- * which are not allowed with respect to the current workflow state.
+ * This transformer disables menu items (by removing the href attribute) which are not allowed with respect to the current workflow state.
  */
 public class WorkflowMenuTransformer extends AbstractSAXTransformer {
-    public static final String MENU_ELEMENT = "menu";
-    public static final String ITEM_ELEMENT = "item";
-    public static final String EVENT_ATTRIBUTE = "event";
-
-    /** (non-Javadoc)
-     * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
-     */
-    public void startElement(String uri, String localName, String raw, Attributes attr)
-        throws SAXException {
-        boolean passed = true;
-
-        if (hasWorkflow() && localName.equals(ITEM_ELEMENT)) {
-            String event = attr.getValue(Workflow.NAMESPACE, EVENT_ATTRIBUTE);
-            if (getLogger().isDebugEnabled()) {
-                getLogger().debug("Event: [" + event + "]");
+   public static final String MENU_ELEMENT = "menu";
+   public static final String ITEM_ELEMENT = "item";
+   public static final String EVENT_ATTRIBUTE = "event";
+   /**
+    * (non-Javadoc)
+    * 
+    * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+    */
+   public void startElement(String uri, String localName, String raw, Attributes attr) throws SAXException {
+      boolean passed = true;
+      if(hasWorkflow() && localName.equals(ITEM_ELEMENT)){
+         String event = attr.getValue(Workflow.NAMESPACE, EVENT_ATTRIBUTE);
+         if(getLogger().isDebugEnabled()){
+            getLogger().debug("Event: [" + event + "]");
+         }
+         // filter item if command not allowed
+         if(event != null){
+            passed = false;
+            AttributesImpl attributes = new AttributesImpl(attr);
+            int hrefIndex = attributes.getIndex("href");
+            if(hrefIndex > -1){
+               if(!containsEvent(event)){
+                  if(getLogger().isDebugEnabled()){
+                     getLogger().debug("Removing href attribute");
+                  }
+                  attributes.removeAttribute(hrefIndex);
+               }else{
+                  if(getLogger().isDebugEnabled()){
+                     getLogger().debug("Adding event to href attribute");
+                  }
+                  String href = attributes.getValue("href");
+                  attributes.setValue(hrefIndex, href + "&lenya.event=" + event);
+               }
             }
-
-            // filter item if command not allowed 
-            if (event != null) {
-                passed = false;
-
-                AttributesImpl attributes = new AttributesImpl(attr);
-
-                int hrefIndex = attributes.getIndex("href");
-                if (hrefIndex > -1) {
-
-                    if (!containsEvent(event)) {
-                        if (getLogger().isDebugEnabled()) {
-                            getLogger().debug("Removing href attribute");
-                        }
-                        attributes.removeAttribute(hrefIndex);
-                    } else {
-                        if (getLogger().isDebugEnabled()) {
-                            getLogger().debug("Adding event to href attribute");
-                        }
-                        String href = attributes.getValue("href");
-                        attributes.setValue(hrefIndex, href + "&lenya.event=" + event);
-                    }
-
-                }
-
-                super.startElement(uri, localName, raw, attributes);
-            }
-        }
-
-        if (passed) {
-            super.startElement(uri, localName, raw, attr);
-        }
-
-    }
-
-    /**
-     * @see org.apache.cocoon.sitemap.SitemapModelComponent#setup(org.apache.cocoon.environment.SourceResolver, java.util.Map, java.lang.String, org.apache.avalon.framework.parameters.Parameters)
-     */
-    public void setup(SourceResolver resolver, Map objectModel, String src, Parameters parameters)
-        throws ProcessingException, SAXException, IOException {
-
-        super.setup(resolver, objectModel, src, parameters);
-        
-        PageEnvelope envelope = null;
-
-        try {
-            envelope = PageEnvelopeFactory.getInstance().getPageEnvelope(objectModel);
-        } catch (Exception e) {
+            super.startElement(uri, localName, raw, attributes);
+         }
+      }
+      if(passed){
+         super.startElement(uri, localName, raw, attr);
+      }
+   }
+   /**
+    * @see org.apache.cocoon.sitemap.SitemapModelComponent#setup(org.apache.cocoon.environment.SourceResolver, java.util.Map, java.lang.String, org.apache.avalon.framework.parameters.Parameters)
+    */
+   public void setup(SourceResolver resolver, Map objectModel, String src, Parameters parameters) throws ProcessingException, SAXException, IOException {
+      super.setup(resolver, objectModel, src, parameters);
+      PageEnvelope envelope = null;
+      try{
+         envelope = PageEnvelope.getCurrent();
+      }catch(Exception e){
+         throw new ProcessingException(e);
+      }
+      Document document = envelope.getDocument();
+      WorkflowFactory factory = WorkflowFactory.newInstance();
+      setHasWorkflow(factory.hasWorkflow(document));
+      if(hasWorkflow()){
+         Situation situation = null;
+         try{
+            setInstance(factory.buildSynchronizedInstance(document));
+            situation = WorkflowHelper.buildSituation(objectModel);
+         }catch(Exception e){
             throw new ProcessingException(e);
-        }
-
-        Document document = envelope.getDocument();
-        WorkflowFactory factory = WorkflowFactory.newInstance();
-
-        setHasWorkflow(factory.hasWorkflow(document));
-
-        if (hasWorkflow()) {
-            Situation situation = null;
-
-            try {
-                setInstance(factory.buildSynchronizedInstance(document));
-                situation = WorkflowHelper.buildSituation(objectModel);
-            } catch (Exception e) {
-                throw new ProcessingException(e);
-            }
-
-            try {
-                this.events = getInstance().getExecutableEvents(situation);
-
-                if (getLogger().isDebugEnabled()) {
-                    getLogger().debug("Executable events: ");
-                    for (int i = 0; i < events.length; i++) {
-                        getLogger().debug("    [" + events[i] + "]");
-                    }
-                }
-
-            } catch (WorkflowException e) {
-                throw new ProcessingException(e);
+         }
+         try{
+            this.events = getInstance().getExecutableEvents(situation);
+            if(getLogger().isDebugEnabled()){
+               getLogger().debug("Executable events: ");
+               for(int i = 0; i < events.length; i++){
+                  getLogger().debug("    [" + events[i] + "]");
+               }
             }
-        }
-    }
-
-    private boolean hasWorkflow;
-    private SynchronizedWorkflowInstances instance;
-
-    /**
-     * Get the workflow instance.
-     * 
-     * @return a <code>WorkflowInstance</code>
-     */
-    protected SynchronizedWorkflowInstances getInstance() {
-        return instance;
-    }
-
-    private Event[] events;
-
-    /**
-     * Returns if the events contain a specific event.
-     * @param eventName The name of the event to check for.
-     * @return A boolean value.
-     */
-    protected boolean containsEvent(String eventName) {
-        boolean result = false;
-
-        for (int i = 0; i < events.length; i++) {
-            if (events[i].getName().equals(eventName)) {
-                result = true;
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Returns if the current document has a workflow.
-     * @return A boolean value.
-     */
-    protected boolean hasWorkflow() {
-        return hasWorkflow;
-    }
-
-    /**
-     * Sets if the current document has a workflow.
-     * @param hasWorkflow A boolean value.
-     */
-    public void setHasWorkflow(boolean hasWorkflow) {
-        this.hasWorkflow = hasWorkflow;
-    }
-
-    /**
-     * Sets the workflow instance for the current request.
-     * @param instance A workflow instance.
-     */
-    public void setInstance(SynchronizedWorkflowInstances instance) {
-        this.instance = instance;
-    }
+         }catch(WorkflowException e){
+            throw new ProcessingException(e);
+         }
+      }
+   }
+   private boolean hasWorkflow;
+   private SynchronizedWorkflowInstances instance;
+   /**
+    * Get the workflow instance.
+    * 
+    * @return a <code>WorkflowInstance</code>
+    */
+   protected SynchronizedWorkflowInstances getInstance() {
+      return instance;
+   }
+   private Event[] events;
+   /**
+    * Returns if the events contain a specific event.
+    * 
+    * @param eventName
+    *           The name of the event to check for.
+    * @return A boolean value.
+    */
+   protected boolean containsEvent(String eventName) {
+      boolean result = false;
+      for(int i = 0; i < events.length; i++){
+         if(events[i].getName().equals(eventName)){
+            result = true;
+         }
+      }
+      return result;
+   }
+   /**
+    * Returns if the current document has a workflow.
+    * 
+    * @return A boolean value.
+    */
+   protected boolean hasWorkflow() {
+      return hasWorkflow;
+   }
+   /**
+    * Sets if the current document has a workflow.
+    * 
+    * @param hasWorkflow
+    *           A boolean value.
+    */
+   public void setHasWorkflow(boolean hasWorkflow) {
+      this.hasWorkflow = hasWorkflow;
+   }
+   /**
+    * Sets the workflow instance for the current request.
+    * 
+    * @param instance
+    *           A workflow instance.
+    */
+   public void setInstance(SynchronizedWorkflowInstances instance) {
+      this.instance = instance;
+   }
 }

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/uriparameterizer/URIParameterizer.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/uriparameterizer/URIParameterizer.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/uriparameterizer/URIParameterizer.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/uriparameterizer/URIParameterizer.java Sat Mar  8 14:58:32 2008
@@ -20,7 +20,6 @@
 package org.apache.lenya.cms.cocoon.uriparameterizer;
 
 import java.util.Map;
-
 import org.apache.avalon.framework.component.Component;
 import org.apache.avalon.framework.parameters.Parameters;
 

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/uriparameterizer/URIParameterizerImpl.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/uriparameterizer/URIParameterizerImpl.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/uriparameterizer/URIParameterizerImpl.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/uriparameterizer/URIParameterizerImpl.java Sat Mar  8 14:58:32 2008
@@ -21,7 +21,6 @@
 
 import java.util.HashMap;
 import java.util.Map;
-
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.avalon.framework.logger.Logger;
 import org.apache.avalon.framework.parameters.Parameters;

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/workflow/WorkflowHelper.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/workflow/WorkflowHelper.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/workflow/WorkflowHelper.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/cocoon/workflow/WorkflowHelper.java Sat Mar  8 14:58:32 2008
@@ -21,7 +21,6 @@
 package org.apache.lenya.cms.cocoon.workflow;
 
 import java.util.Map;
-
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.environment.Session;

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ContentInputModule.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ContentInputModule.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ContentInputModule.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ContentInputModule.java Sat Mar  8 14:58:32 2008
@@ -7,6 +7,7 @@
 import org.apache.avalon.framework.thread.ThreadSafe;
 import org.apache.lenya.cms.cocoon.components.modules.input.AbstractPageEnvelopeModule;
 import org.apache.lenya.cms.publication.PageEnvelope;
+import org.apache.lenya.cms.publication.PageEnvelopeException;
 import org.apache.lenya.cms.publication.Publication;
 /**
  * Retrieves Content Variables from the appropriate Resource
@@ -25,23 +26,39 @@
       if(getLogger().isDebugEnabled()){
          getLogger().debug("Resolving [" + name + "]");
       }
-      PageEnvelope pe = getEnvelope(objectModel);
+      PageEnvelope pe;
+      try{
+         pe = PageEnvelope.getCurrent();
+      }catch(PageEnvelopeException e){
+         throw new ConfigurationException("Resolving page envelope failed: ", e);
+      }
       Publication pub = pe.getPublication();
       // String publication = pub.getId();
       Content content = pub.getContent();
       String unid = "";
+      // System.out.println("ContentInputModule name=" + name);
       int pos = name.indexOf(":");
-      if(pos < 1)
+      if(pos > 0){
+         unid = name.substring(pos + 1);
+         name = name.substring(0, pos);
+      }else{
+         // unid = Globals.getUNID();
          return "error";
-      unid = name.substring(pos + 1);
-      name = name.substring(0, pos);
+      }
       Resource resource = content.getResource(unid);
-      if(name.equalsIgnoreCase("type"))
+      if(null == resource){
+         System.out.println("ContentInputModule: No Resource NAME=" + name + " UNID=" + unid);
+      }
+      if(name.equalsIgnoreCase("type")){
+         // System.out.println("ContentInputModule NAME=" + name + " UNID=" + unid + " TYPE=" + resource.getType());
          return resource.getType();
-      if(name.equalsIgnoreCase("doctype") || name.equalsIgnoreCase("documenttype"))
+      }
+      if(name.equalsIgnoreCase("doctype") || name.equalsIgnoreCase("documenttype")){
          return resource.getDocumentType();
-      if(name.equalsIgnoreCase("defaultlanguage"))
+      }
+      if(name.equalsIgnoreCase("defaultlanguage")){
          return resource.getDefaultLanguage();
+      }
       return "";
    }
    /**

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ContentSourceFactory.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ContentSourceFactory.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ContentSourceFactory.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ContentSourceFactory.java Sat Mar  8 14:58:32 2008
@@ -10,7 +10,6 @@
 import org.apache.avalon.framework.context.Contextualizable;
 import org.apache.avalon.framework.thread.ThreadSafe;
 import org.apache.cocoon.components.CocoonComponentManager;
-import org.apache.cocoon.components.ContextHelper;
 import org.apache.excalibur.source.Source;
 import org.apache.excalibur.source.SourceFactory;
 import org.apache.excalibur.source.SourceNotFoundException;
@@ -19,7 +18,6 @@
 import org.apache.excalibur.source.URIAbsolutizer;
 import org.apache.lenya.cms.cocoon.components.source.impl.StringSource;
 import org.apache.lenya.cms.publication.PageEnvelope;
-import org.apache.lenya.cms.publication.PageEnvelopeFactory;
 import org.apache.lenya.cms.publication.Publication;
 import org.w3c.dom.Document;
 /**
@@ -47,8 +45,8 @@
    public void contextualize(org.apache.avalon.framework.context.Context context) throws ContextException {
       this.context = context;
    }
-   public Source getSource(String plocation, Map parameters) throws IOException, MalformedURLException {
-      String location = plocation;
+   public Source getSource(String location, Map parameters) throws IOException, MalformedURLException {
+      String workLocation = location;
       int pos;
       // Map contextmap = ContextHelper.getObjectModel(context);
       // org.apache.cocoon.environment.http.HttpContext httpcontext = (org.apache.cocoon.environment.http.HttpContext) contextmap.get("context");
@@ -60,7 +58,7 @@
       }catch(org.apache.avalon.framework.component.ComponentException ce){
       }
       if(null == resolver){
-         throw new SourceNotFoundException("No Resolver: " + plocation);
+         throw new SourceNotFoundException("No Resolver: " + location);
       }
       String uri = resolver.resolveURI("").getURI();
       pos = uri.indexOf("/pubs/");
@@ -77,7 +75,7 @@
       Publication pub;
       Content content;
       try{
-         PageEnvelope envelope = PageEnvelopeFactory.getInstance().getPageEnvelope(ContextHelper.getObjectModel(context));
+         PageEnvelope envelope = PageEnvelope.getCurrent();
          pub = envelope.getPublication();
          // publication = pub.getId();
          content = pub.getContent();
@@ -85,28 +83,16 @@
       }catch(org.apache.lenya.cms.publication.PageEnvelopeException pee){
          throw new MalformedURLException("Could not get Publication ID.");
       }
-      // Revision
-      String revision = "live";
-      pos = location.lastIndexOf("!");
-      if(pos != -1){
-         revision = location.substring(pos + 1);
-         location = location.substring(0, pos);
-      }
-      // Language
-      String language = "";
-      pos = location.lastIndexOf("_");
-      if(pos != -1){
-         language = location.substring(pos + 1);
-         location = location.substring(0, pos);
-      }
-      // TODO: Set language to document or publication's default if not specified.
-      // System.out.println("LOC="+location);
+      // Parse Location
+      Location locationParser = new Location(workLocation);
+      // Removes everything after first period, underscore, or exclamation mark.
+      workLocation = locationParser.getUnid();
       // Decide Usage
-      StringTokenizer tokens = new StringTokenizer(location, "/:", true);
+      StringTokenizer tokens = new StringTokenizer(workLocation, "/:", true);
       if(!tokens.hasMoreTokens())
          throw new MalformedURLException("Nothing specified.");
       String token = tokens.nextToken();
-      if(location.indexOf(":") > 0)
+      if(workLocation.indexOf(":") > 0)
          token = tokens.nextToken(); // Remove protocol
       int colonCount = 0;
       while(token.equals(":")){
@@ -139,30 +125,6 @@
          }
          slashCount = (slashCount > slashCount2 ? slashCount : slashCount2);
       }
-      // System.out.println("SL=" + slashCount + "TOK=" + token);
-      // ## Decide UNID
-      // String structure = "";
-      // String unid = "";
-      // String fullid = "";
-      // if(slashCount == 1){
-      // if(tokens.hasMoreTokens()){
-      // slashCount = 0;
-      // }else unid = token;
-      // }
-      // if((slashCount == 0) || (slashCount == 2)){
-      // structure = token;
-      // }
-      // if((slashCount == 0) || (slashCount == 2) || (slashCount == 3)){
-      // StringBuffer buffer = new StringBuffer();
-      // while(tokens.hasMoreTokens())
-      // buffer.append(tokens.nextToken());
-      // fullid = buffer.toString();
-      // }
-      // // Convert fullid to unid
-      // if(unid.length() < 1){
-      // unid = content.getUNID(structure, fullid);
-      // }
-      // ## 20070927 solprovider: This rewrite did not work. Simpler is good. Test later.
       String structure = (2 < slashCount ? "" : token);
       String unid = token;
       StringBuffer buffer = new StringBuffer();
@@ -172,60 +134,66 @@
       if((1 < slashCount) || (0 < fullid.length()))
          unid = content.getUNID(structure, fullid);
       // ASSUME: UNID
-      // ## Defaults
-      if(language.length() < 1){
-         Resource resource = content.getResource(unid);
-         if(resource != null)
-            language = resource.getDefaultLanguage();
-      }
-      if(language.length() < 1)
-         language = pub.getDefaultLanguage();
       /** ******** Get Source (uses Content) ************ */
       Source source;
       if(REQUEST_INFO == requestType){
          // TODO: Catch errors
          Resource resource = content.getResource(unid);
-         if(resource == null)
-            System.out.println("NO RESOURCE");
+         if(resource == null){
+            throw new SourceNotFoundException("Source not found (no Resource): " + location);
+         }
          Document doc = resource.getInfoDocument();
-         if(doc == null)
-            System.out.println("NO DOC");
+         if(doc == null){
+            throw new SourceNotFoundException("Source not found (no Document): " + location);
+         }
          source = new StringSource(manager, doc);
-         if(source == null)
-            System.out.println("NO SOURCE");
+         if(source == null){
+            throw new SourceNotFoundException("Source not found (no Source): " + location);
+         }
          return source;
       }
+      // Revision
+      String revision = locationParser.getRevision();
+      if(0 == revision.length()){
+         revision = "live";
+      }
+      // Language
+      String language = locationParser.getLanguage();
+      if(language.length() < 1){
+         Resource resource = content.getResource(unid);
+         if(resource != null){
+            language = resource.getDefaultLanguage();
+         }
+      }
+      if(language.length() < 1){
+         language = pub.getDefaultLanguage();
+      }
       if(REQUEST_META == requestType){
          source = resolver.resolveURI(content.getMetaURI(unid, language, revision));
          if(source.exists()){
             if(resolver != null)
                manager.release((Component) resolver);
             return source;
+         }else{
+            throw new SourceNotFoundException("Source not found (no Meta Source): " + location);
          }
       }
-      // System.out.println("CSF UNID=" + unid + " LANG=" + language + " REV=" + revision);
       String curi = content.getURI(unid, language, revision);
-      // System.out.println("CSF CURI=" + curi);
+      // System.out.println("ContentSourceFactory.getSource UNID=" + unid + " LANG=" + language + " REV=" + revision + " CURI=" + curi);
+      if(curi.length() < 1){
+         throw new SourceNotFoundException("Source not found (no URI): " + location + " UNID=" + unid + " LANG=" + language + " REV=" + revision);
+      }
       source = resolver.resolveURI(curi);
+      if(resolver != null)
+         manager.release((Component) resolver);
       if(source.exists()){
-         if(resolver != null)
-            manager.release((Component) resolver);
          return source;
       }
-      if(resolver != null)
-         manager.release((Component) resolver);
-      throw new SourceNotFoundException("Not found: " + plocation + " (" + curi + ")");
+      throw new SourceNotFoundException("Source not found: " + location + " (" + curi + ")");
    }
    public void release(Source source1) {
    }
    public String absolutize(String baseURI, String location) {
       return SourceUtil.absolutize(baseURI, location, false, false);
    }
-   // private Publication getPublication(String publication) {
-   // try{
-   // return PublicationFactory.getPublication(publication, servletContextPath);
-   // }catch(org.apache.lenya.cms.publication.PublicationException pe){
-   // return (Publication) null;
-   // }
-   // }
 }

Added: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/Location.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/Location.java?rev=635107&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/Location.java (added)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/Location.java Sat Mar  8 14:58:32 2008
@@ -0,0 +1,79 @@
+package org.apache.lenya.cms.content;
+import java.util.StringTokenizer;
+/**
+ * Parses location from URL. Not aware of Content -- unid may be unid or id.
+ * 
+ * @author solprovider
+ * @since 1.3
+ */
+public class Location {
+   private String unid = "";
+   private String language = "";
+   private String revision = "";
+   private String extension = "";
+   /**
+    * Separate on periods, exclamation marks, and underscores <br>
+    * revision = part after last exclamation mark. <br>
+    * extension = part after last period. <br>
+    * language = first two-character part after an underscore and additional parts until period or exclamation mark. <br>
+    * unid = first part and underscore-separated parts until another part is found.
+    * 
+    * @param location
+    */
+   public Location(String location) {
+      StringTokenizer tokens = new StringTokenizer(location, "!_.", true);
+      if(tokens.hasMoreTokens()){
+         unid = tokens.nextToken();
+      }
+      boolean inLanguage = false;
+      boolean inUnid = true;
+      while(tokens.hasMoreTokens()){
+         String token = tokens.nextToken();
+         if("!".equals(token)){
+            inLanguage = false;
+            inUnid = false;
+            if(tokens.hasMoreTokens()){
+               revision = tokens.nextToken();
+            }
+         }else if("_".equals(token)){
+            if(tokens.hasMoreTokens()){
+               token = tokens.nextToken();
+               if(inLanguage){
+                  if(tokens.hasMoreTokens()){
+                     language = language + "_" + token;
+                  }
+               }else{
+                  if(2 == token.length()){
+                     language = token;
+                     inLanguage = true;
+                     inUnid = false;
+                  }else if(inUnid){
+                     unid = unid + "_" + token;
+                  }
+               }
+            }
+         }else if(".".equals(token)){
+            inLanguage = false;
+            inUnid = false;
+            if(tokens.hasMoreTokens()){
+               extension = tokens.nextToken();
+            }
+         }else{
+            inLanguage = false;
+            System.out.println("Location part not found in " + location);
+         }
+      }
+   }
+   public String getUnid() {
+      return unid;
+   }
+   public String getLanguage() {
+      return language;
+   }
+   public String getRevision() {
+      return revision;
+   }
+   public String getExtension() {
+      return extension;
+   }
+}

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/Resource.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/Resource.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/Resource.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/Resource.java Sat Mar  8 14:58:32 2008
@@ -12,6 +12,11 @@
    public String getUNID();
    public String getID();
    public String getType();
+   /**
+    * Used by Lenya-1.2 Publications.
+    * 
+    * @deprecated Use getType()
+    */
    public String getDocumentType();
    public String getLanguage();
    public String getDefaultLanguage();

Added: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ResourceException.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ResourceException.java?rev=635107&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ResourceException.java (added)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ResourceException.java Sat Mar  8 14:58:32 2008
@@ -0,0 +1,62 @@
+/*
+ * Copyright  1999-2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+/* $Id: PublicationException.java 617035 2008-01-31 07:44:03Z solprovider $  */
+package org.apache.lenya.cms.content;
+/**
+ * 
+ * @author solprovider
+ * @since 1.3
+ */
+public class ResourceException extends Exception {
+   private static final long serialVersionUID = 1L;
+   /**
+    * Creates a new ResourceException.
+    * 
+    */
+   public ResourceException() {
+      super();
+   }
+   /**
+    * Creates a new ResourceException.
+    * 
+    * @param message
+    *           the exception message
+    */
+   public ResourceException(String message) {
+      super(message);
+   }
+   /**
+    * Creates a new ResourceException.
+    * 
+    * @param message
+    *           the exception message
+    * @param cause
+    *           the cause of the exception
+    */
+   public ResourceException(String message, Throwable cause) {
+      super(message, cause);
+   }
+   /**
+    * Creates a new ResourceException.
+    * 
+    * @param cause
+    *           the cause of the exception
+    */
+   public ResourceException(Throwable cause) {
+      super(cause);
+   }
+}

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ResourceTransformer.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ResourceTransformer.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ResourceTransformer.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/ResourceTransformer.java Sat Mar  8 14:58:32 2008
@@ -3,6 +3,7 @@
 import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.transformation.AbstractDOMTransformer;
 import org.apache.lenya.cms.publication.PageEnvelope;
+import org.apache.lenya.cms.publication.PageEnvelopeException;
 import org.apache.lenya.cms.publication.Publication;
 /**
  * This transformer modifies the structural information of a Resource. It accepts a UNID as the src parameter. It can: - change the id and defaultlanguage of the Resource, - delete Translations and Revisions, - change the live and edit Revisions of Translations. <resource [id="newid"] [defaultlanguage="aa"]> <translation language="xx" [action="delete"] [live="1137958604000"] [edit="1137958604000"]> <revision revision="1137958604000" [action="delete"]/> </translation> </resource> action="delete" has top priority. Any settings not included will not be affected.
@@ -18,12 +19,16 @@
       return transformDocument(request, unid, doc);
    }
    static public org.w3c.dom.Document transformDocument(Request request, String unid, org.w3c.dom.Document doc) {
-      PageEnvelope envelope = (PageEnvelope) request.getAttribute(PageEnvelope.class.getName());
+      PageEnvelope envelope;
+      try{
+         envelope = PageEnvelope.getCurrent();
+      }catch(PageEnvelopeException e){
+         return null;
+      }
       Publication pub = envelope.getPublication();
       Content content = pub.getContent();
       Resource resource = content.getResource(unid);
       resource.update(doc);
-      // System.out.println("ResourceTransformer - RETURN");
       return doc;
    }
 }

Added: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/CreateResourceTransformer.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/CreateResourceTransformer.java?rev=635107&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/CreateResourceTransformer.java (added)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/CreateResourceTransformer.java Sat Mar  8 14:58:32 2008
@@ -0,0 +1,68 @@
+package org.apache.lenya.cms.content.flat;
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.transformation.AbstractDOMTransformer;
+import org.apache.lenya.cms.content.ResourceException;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+/**
+ * @cocoon.sitemap.component.documentation This transformer creates a new Resource.
+ * 
+ * @author solprovider
+ * @since 1.3
+ */
+// <?xml version="1.0" encoding="UTF-8"?>
+// <resource defaultlanguage="en" doctype="xhtml" id="doctypes" type="xml" unid="0002" xmlns=""/>
+public class CreateResourceTransformer extends AbstractDOMTransformer {
+   public static final String CONTENT_PREFIX = "content";
+   public static final String FILE_NAME_REGEXP = "[-a-zA-Z0-9_. ]+";
+   protected org.w3c.dom.Document transform(org.w3c.dom.Document doc) {
+      Request request = ObjectModelHelper.getRequest(super.objectModel);
+      createResource(request, doc);
+      return doc;
+   }
+   static public org.w3c.dom.Document transformDocument(Request request, org.w3c.dom.Document doc) throws ProcessingException {
+      createResource(request, doc);
+      return doc;
+   }
+   /**
+    * @param request
+    *           The request
+    * @param doc
+    *           The data to be inserted.
+    * @throws ProcessingException
+    * @throws ResourceException
+    */
+   static private void createResource(Request request, org.w3c.dom.Document doc) {
+      if(doc == null){
+         System.out.println("CreateResource: Document is required.");
+         // throw new ProcessingException("CreateResource: document is required.");
+         return;
+      }
+      Element root = doc.getDocumentElement();
+      NodeList nodes = root.getElementsByTagName("newresource");
+      int length = nodes.getLength();
+      for(int n = 0; n < length; n++){
+         Element element = (Element) nodes.item(n);
+         String unid = element.getAttribute("unid");
+         String type = element.getAttribute("type");
+         String id = element.getAttribute("id");
+         FlatResource resource;
+         try{
+            resource = FlatResource.create(unid, type, id);
+            unid = resource.getUNID();
+            // Attempts to make UNID accessible to XMAP.
+            // request.setAttribute("unid", unid);
+            // Globals.getRequest().setAttribute("unid", unid);
+            // ContextMap contextMap = ContextMap.getCurrentContext();
+            // contextMap.set("unid", unid);
+            element.setAttribute("unid", unid);
+            element.setAttribute("status", "SUCCESS");
+         }catch(ResourceException e){
+            element.setAttribute("status", "FAILURE");
+            element.setNodeValue(e.getLocalizedMessage());
+         }
+      }
+   }
+}

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/CreateRevisionTransformer.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/CreateRevisionTransformer.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/CreateRevisionTransformer.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/CreateRevisionTransformer.java Sat Mar  8 14:58:32 2008
@@ -7,14 +7,12 @@
 import java.util.Map;
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Request;
-import org.apache.cocoon.environment.Session;
 import org.apache.cocoon.servlet.multipart.Part;
 import org.apache.cocoon.transformation.AbstractDOMTransformer;
-import org.apache.lenya.ac.Identity;
-import org.apache.lenya.ac.User;
 import org.apache.lenya.cms.content.Content;
 import org.apache.lenya.cms.publication.PageEnvelope;
 import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.util.Globals;
 import org.apache.lenya.xml.DocumentHelper;
 import org.apache.lenya.xml.NamespaceHelper;
 import org.w3c.dom.Document;
@@ -111,18 +109,8 @@
       // ASSUME: Upload is saved.
       // Store creator, when, revision and extension.
       root.setAttribute("revision", revision);
-      String userid = "anonymous";
-      Session session = request.getSession();
-      if(session != null){
-         Identity identity = (Identity) session.getAttribute(Identity.class.getName());
-         if(identity != null){
-            User user = identity.getUser();
-            if(user != null)
-               userid = user.getId();
-         }
-      }
-      root.setAttribute("creator", userid);
-      root.setAttribute("when", getDateString());
+      root.setAttribute("creator", Globals.getUser());
+      root.setAttribute("when", Globals.getDateString());
       if(extension.length() > 0)
          root.setAttribute("extension", extension);
       try{
@@ -202,8 +190,5 @@
          // meta.appendChild(helper.createElement(tagName, tagValue));
          root.appendChild(helper.createElement(tagName, tagValue));
       }
-   }
-   static private String getDateString() {
-      return Long.toString(new java.util.Date().getTime());
    }
 }

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/FlatContent.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/FlatContent.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/FlatContent.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/FlatContent.java Sat Mar  8 14:58:32 2008
@@ -16,15 +16,15 @@
       languages = planguages;
       indexer = new FlatIndexer(new File(directory, "index"), this);
       // The next line starts indexing everything in the background when Lenya starts.
-      new Thread((Runnable) indexer).start();
+      updateIndexes();
    }
    /* Content API */
    public String getIndexFilename(String indexName, String language) {
       return indexer.getIndexFilename(indexName, language);
    }
-   public String getURI(String unid, String language, String revision) {
-      Resource resource = getResource(unid, language, revision);
-      return resource.getURI();
+   /* FlatContent API */
+   public String[] getLanguages() {
+      return languages;
    }
    public String getMetaURI(String unid, String language, String revision) {
       Resource resource = getResource(unid, language, revision);
@@ -34,24 +34,30 @@
       Resource resource = getResource(unid, language, "edit");
       return resource.getNewURI();
    }
-   public String getUNID(String structure, String id) {
-      FlatRelations relations = getRelations(structure);
-      return relations.getUNID(id);
+   public FlatRelations getRelations(String structure) {
+      return new FlatRelations(new File(directory, "relation" + File.separator + structure + ".xml"));
    }
    public Resource getResource(String unid) {
       return (Resource) new FlatResource(directory, unid);
    }
-   /* FlatContent API */
-   public String[] getLanguages() {
-      return languages;
+   public Resource getResource(String unid, String language, String revision) {
+      return (Resource) new FlatResource(directory, unid, language, revision);
    }
    public String[] getResources() {
       return (new File(directory, "resource")).list();
    }
-   public Resource getResource(String unid, String language, String revision) {
-      return (Resource) new FlatResource(directory, unid, language, revision);
+   public String getUNID(String structure, String id) {
+      FlatRelations relations = getRelations(structure);
+      return relations.getUNID(id);
    }
-   public FlatRelations getRelations(String structure) {
-      return new FlatRelations(new File(directory, "relation" + File.separator + structure + ".xml"));
+   public String getURI(String unid, String language, String revision) {
+      Resource resource = getResource(unid, language, revision);
+      return resource.getURI();
+   }
+   /**
+    * Updates Indexes in background.
+    */
+   void updateIndexes() {
+         new Thread((Runnable) indexer).start();
    }
 }

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/FlatIndex.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/FlatIndex.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/FlatIndex.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/FlatIndex.java Sat Mar  8 14:58:32 2008
@@ -13,73 +13,84 @@
  * @since 1.3
  */
 public class FlatIndex {
-   File configurationFile;
+   File configurationFile = null;
    File indexFile;
    FlatContent content;
    String indexName;
-   String language = "en";
+   String language = "";
    String structure = "";
    String revision = "live";
    Map filter = new HashMap();
    Map include = new HashMap();
-   public FlatIndex(FlatContent pcontent, File indexDirectory, String pindexName, String planguage) {
-      indexName = pindexName;
-      configurationFile = new File(indexDirectory, indexName + ".xconf");
-      indexFile = new File(indexDirectory, indexName + "_" + planguage + ".xml");
-      content = pcontent;
-      language = planguage;
-      // loadConfiguration();
+   public FlatIndex(FlatContent content, File indexDirectory, String indexName, String language) {
+      if(null == indexName){ // SitetreeGenerator called without src attribute.
+         this.indexName = "";
+      }else{
+         this.indexName = indexName;
+      }
+      this.content = content;
+      if(0 == this.indexName.length()){ // Special case: all Resources disregarding Translations
+         indexFile = new File(indexDirectory, "all.xml");
+      }else{
+         this.language = language;
+         configurationFile = new File(indexDirectory, indexName + ".xconf");
+         indexFile = new File(indexDirectory, indexName + "_" + language + ".xml");
+      }
    }
    private void loadConfiguration() {
-      Document document;
-      try{
-         document = DocumentHelper.readDocument(configurationFile);
-      }catch(javax.xml.parsers.ParserConfigurationException pce){
-         System.out.println("Indexer: could not parse " + configurationFile.getPath());
-         return;
-      }catch(org.xml.sax.SAXException saxe){
-         System.out.println("Indexer: " + configurationFile.getPath() + " is not valid.");
-         return;
-      }catch(java.io.IOException ioe){
-         System.out.println("Indexer: could not read " + configurationFile.getPath());
-         return;
+      if(null == configurationFile){ // Special case: all Resources disregarding Translations
+         include.put("unid", new FlatIndexPart("unid"));
+         include.put("type", new FlatIndexPart("type"));
+         include.put("doctype", new FlatIndexPart("doctype"));
+         include.put("id", new FlatIndexPart("id"));
+      }else{
+         Document document;
+         try{
+            document = DocumentHelper.readDocument(configurationFile);
+         }catch(javax.xml.parsers.ParserConfigurationException pce){
+            System.out.println("Indexer: could not parse " + configurationFile.getPath());
+            return;
+         }catch(org.xml.sax.SAXException saxe){
+            System.out.println("Indexer: " + configurationFile.getPath() + " is not valid.");
+            return;
+         }catch(java.io.IOException ioe){
+            System.out.println("Indexer: could not read " + configurationFile.getPath());
+            return;
+         }
+         Element root = document.getDocumentElement();
+         if(root.hasAttribute("structure")) structure = root.getAttribute("structure");
+         if(root.hasAttribute("revision")) revision = root.getAttribute("revision");
+         NodeList nl;
+         int length;
+         int i;
+         nl = root.getElementsByTagName("filter");
+         length = nl.getLength();
+         for(i = 0; i < length; i++){
+            FlatIndexPart part = new FlatIndexPart((Element) nl.item(i));
+            filter.put(part.getName(), part);
+         }
+         nl = root.getElementsByTagName("include");
+         length = nl.getLength();
+         for(i = 0; i < length; i++){
+            FlatIndexPart part = new FlatIndexPart((Element) nl.item(i));
+            include.put(part.getName(), part);
+         }
+         include.put("unid", new FlatIndexPart("unid"));
+         include.put("type", new FlatIndexPart("type"));
+         include.put("doctype", new FlatIndexPart("doctype"));
+         include.put("id", new FlatIndexPart("id"));
+         include.put("title", new FlatIndexPart("title"));
+         include.put("href", new FlatIndexPart("href"));
+         include.put("extension", new FlatIndexPart("extension"));
       }
-      Element root = document.getDocumentElement();
-      if(root.hasAttribute("structure"))
-         structure = root.getAttribute("structure");
-      if(root.hasAttribute("revision"))
-         revision = root.getAttribute("revision");
-      NodeList nl;
-      int length;
-      int i;
-      nl = root.getElementsByTagName("filter");
-      length = nl.getLength();
-      for(i = 0; i < length; i++){
-         FlatIndexPart part = new FlatIndexPart((Element) nl.item(i));
-         filter.put(part.getName(), part);
-      }
-      nl = root.getElementsByTagName("include");
-      length = nl.getLength();
-      for(i = 0; i < length; i++){
-         FlatIndexPart part = new FlatIndexPart((Element) nl.item(i));
-         include.put(part.getName(), part);
-      }
-      include.put("unid", new FlatIndexPart("unid"));
-      include.put("type", new FlatIndexPart("type"));
-      include.put("doctype", new FlatIndexPart("doctype"));
-      include.put("id", new FlatIndexPart("id"));
-      include.put("title", new FlatIndexPart("title"));
-      include.put("href", new FlatIndexPart("href"));
-      include.put("extension", new FlatIndexPart("extension"));
    }
    public String getIndexFilename() {
-      if(!indexFile.exists())
-         update();
+      if(!indexFile.exists()) update();
       return indexFile.getPath();
    }
    public void update() {
       // TODO: Add publication ID to the log.
-      System.out.println("Indexer updating " + indexName + "(" + language + ")");
+      // System.out.println("Indexer updating " + indexName + "(" + language + ")");
       loadConfiguration();
       // Init Document
       Document document;
@@ -96,8 +107,11 @@
       if(structure.length() > 0){
          include.put("fullid", new FlatIndexPart("fullid"));
          updateStructure(document, root);
-      }else
+      }else if(0 < this.indexName.length()){
          updateFlat(document, root);
+      }else{ // Special case: all Resources disregarding Translations
+         updateAll(document, root);
+      }
       // Write document
       try{
          org.apache.lenya.xml.DocumentHelper.writeDocument(document, indexFile);
@@ -116,13 +130,14 @@
       if(null == resourceElement){
          System.out.println("Error creating Index " + indexName + "_" + language + ".  Could not find Structure " + structure);
       }else{
-         addStructureResource(document, root, resourceElement, "", "");
+         addStructureResource(document, root, resourceElement, "");
       }
    }
    /**
     * Add child "resource" elements of resourceElement to root, and recurse for each. Must pass filters.
     */
-   private void addStructureResource(Document document, Element root, Element resourceElement, String parenttype, String parentdoctype) {
+   // private void addStructureResource(Document document, Element root, Element resourceElement, String parenttype, String parentdoctype) {
+   private void addStructureResource(Document document, Element root, Element resourceElement, String parenttype) {
       // NodeList children = resourceElement.getElementsByTagName("resource"); //getDescendants, need getChildren
       NodeList children = resourceElement.getChildNodes();
       int length = children.getLength();
@@ -134,7 +149,7 @@
             if(resource.hasRevision()){
                String fullid = resourceChild.getAttribute("full");
                String fulltype = parenttype + "/" + resource.getType();
-               String fulldoctype = parentdoctype + "/" + resource.getDocumentType();
+               // String fulldoctype = parentdoctype + "/" + resource.getDocumentType();
                FlatIndexPart part;
                // FILTER - BEGIN
                Iterator fi = filter.values().iterator();
@@ -142,8 +157,8 @@
                while(fi.hasNext() & useResource){
                   part = (FlatIndexPart) fi.next();
                   useResource = false;
-                  if(part.check(resource.get(part.getProperty(), fullid, fulltype, fulldoctype)))
-                     useResource = true;
+                  // if(part.check(resource.get(part.getProperty(), fullid, fulltype, fulldoctype)))
+                  if(part.check(resource.get(part.getProperty(), fullid, fulltype))) useResource = true;
                }
                // FILTER - END
                if(useResource){
@@ -154,11 +169,11 @@
                   while(ii.hasNext()){
                      part = (FlatIndexPart) ii.next();
                      String value = resource.get(part.getProperty(), fullid);
-                     if(value.length() > 0)
-                        element.setAttribute(part.getName(), value);
+                     if(value.length() > 0) element.setAttribute(part.getName(), value);
                   }
                   // INCLUDE - END
-                  addStructureResource(document, element, resourceChild, fulltype, fulldoctype);
+                  // addStructureResource(document, element, resourceChild, fulltype, fulldoctype);
+                  addStructureResource(document, element, resourceChild, fulltype);
                } // if useResource
             } // if resource not null
          } // if "resource"
@@ -178,8 +193,7 @@
             while(fi.hasNext() & useResource){
                part = (FlatIndexPart) fi.next();
                useResource = false;
-               if(part.check(resource.get(part.getProperty())))
-                  useResource = true;
+               if(part.check(resource.get(part.getProperty()))) useResource = true;
             }
             // FILTER - END
             if(useResource){
@@ -190,13 +204,34 @@
                while(ii.hasNext()){
                   part = (FlatIndexPart) ii.next();
                   String value = resource.get(part.getProperty());
-                  if(value.length() > 0)
-                     element.setAttribute(part.getName(), value);
+                  if(value.length() > 0) element.setAttribute(part.getName(), value);
                }
                // INCLUDE - END
             } // if useResource
          } // if resource not null
-      }
+      } // for
+   }
+   private void updateAll(Document document, Element root) {
+      // System.out.println("updateAll BEGIN");
+      root.setAttribute("description", "Special index containing all Resources ignoring existence of Translations: no filtering by language and no information from Translations and Revisions.");
+      // Build Index
+      String[] unids = content.getResources();
+      int unidsLength = unids.length;
+      for(int u = 0; u < unidsLength; u++){
+         String unid = unids[u];
+         FlatResource resource = (FlatResource) content.getResource(unid, language, revision);
+         FlatIndexPart part;
+         // INCLUDE - BEGIN
+         Element element = addElement(document, root, "resource");
+         element.setAttribute("unid", unid);
+         Iterator ii = include.values().iterator();
+         while(ii.hasNext()){
+            part = (FlatIndexPart) ii.next();
+            String value = resource.get(part.getProperty());
+            if(value.length() > 0) element.setAttribute(part.getName(), value);
+         }
+         // INCLUDE - END
+      } // for
    }
    private Element addElement(Document document, Element parent, String newElementName) {
       Element newElement = document.createElement(newElementName);

Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/FlatIndexer.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/FlatIndexer.java?rev=635107&r1=635106&r2=635107&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/FlatIndexer.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/content/flat/FlatIndexer.java Sat Mar  8 14:58:32 2008
@@ -1,31 +1,57 @@
 package org.apache.lenya.cms.content.flat;
 import java.io.File;
 /**
+ * FlatContent handles threading. This class could be nested in FlatContent.
  * 
  * @author solprovider
  * @since 1.3
  */
-public class FlatIndexer implements Runnable {
+class FlatIndexer implements Runnable {
+   // TODO: Build list of Index configurations from Modules. Move .xconf files to Modules. Change extension (to .icx, .xic, .index?)
    File indexDirectory;
    FlatContent content;
-   boolean isCurrent = false;
-   public FlatIndexer(File pindexDirectory, FlatContent pcontent) {
+   private volatile boolean isRunning = false;
+   private volatile boolean runAgain = false; //
+   private Object lock = new Object(); // for locking synchronization.
+   FlatIndexer(File pindexDirectory, FlatContent pcontent) {
       indexDirectory = pindexDirectory;
       content = pcontent;
    }
    public void run() {
-      updateAll();
-   }
-   public void updateAll() {
-      if(isCurrent)
+      // Only the first thread updates. Additional requests set flag so the first thread will repeat the update.
+      // runAgain cannot be false on later threads unless the Indexer is updating
+      // If already queued, do nothing.
+      if(runAgain){
          return;
-      if(!indexDirectory.exists())
+      }
+      runAgain = true;
+      // Set to run, but return if already running,
+      if(isRunning){
          return;
+      }
+      // synchronized so two threads do not conflict if both believe are first thread.
+      synchronized (lock){
+         isRunning = true;
+         // Run. Run again if another request was queued.
+         while(runAgain){
+            // runAgain is only set to false just before an update
+            runAgain = false;
+            update();
+         }
+         isRunning = false;
+      }
+   }
+   /**
+    * Updates all Indexes.
+    */
+   void update() {
+      System.out.println("Starting Indexer for " + indexDirectory.getAbsolutePath());
+      updateIndexAll();
+      if(!indexDirectory.exists()) return;
       // System.out.println("Starting Indexer UpdateAll");
       String[] files = indexDirectory.list();
-      // System.out.println("FI-uA: iD=" + indexDirectory.getPath());
-      if(null == files)
-         return;
+      // System.out.println("FlatIndexer.updateAll ID=" + indexDirectory.getPath());
+      if(null == files) return;
       int filesLength = files.length;
       for(int f = 0; f < filesLength; f++){
          String filename = files[f];
@@ -40,8 +66,38 @@
             }
          }
       }
-      isCurrent = true;
    }
+   /**
+    * Updates all Indexes for one language.
+    * 
+    * @param language
+    */
+   void update(String language) {
+      updateIndexAll();
+      if(!indexDirectory.exists()) return;
+      String[] files = indexDirectory.list();
+      if(null == files) return;
+      int filesLength = files.length;
+      for(int f = 0; f < filesLength; f++){
+         String filename = files[f];
+         if(filename.endsWith(".xconf")){
+            String indexName = filename.substring(0, filename.lastIndexOf(".xconf"));
+            FlatIndex index = new FlatIndex(content, indexDirectory, indexName, language);
+            index.update();
+         }
+      }
+   }
+   private void updateIndexAll() {
+      // Update the all Resources index (ignores Translations and Revisions).
+      FlatIndex index = new FlatIndex(content, indexDirectory, "", "");
+      index.update();
+   }
+   /**
+    * 
+    * @param indexName
+    * @param language
+    * @return filename of specified Index
+    */
    public String getIndexFilename(String indexName, String language) {
       return (new FlatIndex(content, indexDirectory, indexName, language)).getIndexFilename();
    }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.