You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by si...@apache.org on 2007/07/16 18:16:01 UTC
svn commit: r556661 - /cocoon/trunk/cocoon-2.2-r529448.patches
Author: simoneg
Date: Mon Jul 16 09:15:46 2007
New Revision: 556661
URL: http://svn.apache.org/viewvc?view=rev&rev=556661
Log:
Added cocoon patches
Added:
cocoon/trunk/cocoon-2.2-r529448.patches
Added: cocoon/trunk/cocoon-2.2-r529448.patches
URL: http://svn.apache.org/viewvc/cocoon/trunk/cocoon-2.2-r529448.patches?view=auto&rev=556661
==============================================================================
--- cocoon/trunk/cocoon-2.2-r529448.patches (added)
+++ cocoon/trunk/cocoon-2.2-r529448.patches Mon Jul 16 09:15:46 2007
@@ -0,0 +1,547 @@
+Index: core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/MountNode.java
+===================================================================
+--- core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/MountNode.java (revision 529448)
++++ core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/sitemap/MountNode.java (working copy)
+@@ -136,12 +136,12 @@
+ private synchronized TreeProcessor getProcessor(String source, String prefix)
+ throws Exception {
+
+- TreeProcessor processor = (TreeProcessor) processors.get(source);
++ TreeProcessor processor = (TreeProcessor) processors.get(source + "||" + prefix);
+ if (processor == null) {
+ processor = this.parentProcessor.createChildProcessor(source, this.checkReload, prefix);
+
+ // Associate to the original source
+- processors.put(source, processor);
++ processors.put(source + "||" + prefix, processor);
+ }
+
+ return processor;
+Index: core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java
+===================================================================
+--- core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java (revision 529448)
++++ core/cocoon-sitemap/cocoon-sitemap-impl/src/main/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java (working copy)
+@@ -302,7 +302,7 @@
+
+ // Get the processor that should process this request
+ ConcreteTreeProcessor processor;
+- if (newEnv.getURIPrefix().equals("")) {
++ if (info.processFromRoot) {
+ processor = ((TreeProcessor)getRootProcessor()).concreteProcessor;
+ } else {
+ processor = this;
+Index: blocks/cocoon-forms/cocoon-forms-impl/src/main/resources/META-INF/cocoon/avalon/cocoon-forms.xconf
+===================================================================
+--- blocks/cocoon-forms/cocoon-forms-impl/src/main/resources/META-INF/cocoon/avalon/cocoon-forms.xconf (revision 529448)
++++ blocks/cocoon-forms/cocoon-forms-impl/src/main/resources/META-INF/cocoon/avalon/cocoon-forms.xconf (working copy)
+@@ -191,6 +191,7 @@
+ <selection-list name="flow-jxpath" class="org.apache.cocoon.forms.datatype.FlowJXPathSelectionListBuilder"/>
+ <selection-list name="enum" class="org.apache.cocoon.forms.datatype.EnumSelectionListBuilder"/>
+ <selection-list name="java" class="org.apache.cocoon.forms.datatype.JavaSelectionListBuilder"/>
++ <selection-list name="javascript" class="org.apache.cocoon.forms.datatype.JavaScriptSelectionListBuilder"/>
+ </forms-selection-lists>
+
+ <!--+
+Index: blocks/cocoon-forms/cocoon-forms-impl/pom.xml
+===================================================================
+--- blocks/cocoon-forms/cocoon-forms-impl/pom.xml (revision 529448)
++++ blocks/cocoon-forms/cocoon-forms-impl/pom.xml (working copy)
+@@ -89,6 +89,7 @@
+ <artifactId>cocoon-core</artifactId>
+ <version>2.2.0-RC1-SNAPSHOT</version>
+ </dependency>
++
+ <dependency>
+ <groupId>org.apache.cocoon</groupId>
+ <artifactId>cocoon-core</artifactId>
+@@ -148,11 +149,13 @@
+ <version>0.8</version>
+ <scope>test</scope>
+ </dependency>
++ <!--
+ <dependency>
+ <groupId>org.apache.excalibur.components</groupId>
+ <artifactId>excalibur-sourceresolve</artifactId>
+ <version>2.2.1</version>
+ </dependency>
++ -->
+ </dependencies>
+
+ <distributionManagement>
+Index: blocks/cocoon-jcr/cocoon-jcr-impl/status.xml
+===================================================================
+--- blocks/cocoon-jcr/cocoon-jcr-impl/status.xml (revision 529448)
++++ blocks/cocoon-jcr/cocoon-jcr-impl/status.xml (working copy)
+@@ -66,6 +66,9 @@
+ <!-- The following list contains the changes since the latest 2.1.x version. -->
+ <changes>
+ <release version="@version@" date="@date@">
++ <action dev="SG" type="add">
++ Added JCR query transformer to perform queries on JCR repositories.
++ </action>
+ </release>
+ </changes>
+
+Index: blocks/cocoon-jcr/cocoon-jcr-impl/src/main/java/org/apache/cocoon/jcr/transforming/JCRSelection.java
+===================================================================
+--- blocks/cocoon-jcr/cocoon-jcr-impl/src/main/java/org/apache/cocoon/jcr/transforming/JCRSelection.java (revision 0)
++++ blocks/cocoon-jcr/cocoon-jcr-impl/src/main/java/org/apache/cocoon/jcr/transforming/JCRSelection.java (revision 543970)
+@@ -0,0 +1,180 @@
++/*
++ * Licensed to the Apache Software Foundation (ASF) under one or more
++ * contributor license agreements. See the NOTICE file distributed with
++ * this work for additional information regarding copyright ownership.
++ * The ASF licenses this file to You 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.
++ */
++package org.apache.cocoon.jcr.transforming;
++
++import java.util.HashSet;
++import java.util.Iterator;
++import java.util.Set;
++
++import javax.jcr.Item;
++import javax.jcr.Node;
++import javax.jcr.NodeIterator;
++import javax.jcr.Property;
++import javax.jcr.PropertyIterator;
++import javax.jcr.RepositoryException;
++import javax.xml.namespace.QName;
++
++/**
++ * Represents a selection of a property or of a subnode and its properties.
++ *
++ * @version $Id$
++ */
++public class JCRSelection {
++
++ /**
++ * Name of the property or subnode.
++ */
++ private QName name;
++ /**
++ * In case it is a subnode, other subnodes or properties can be added.
++ */
++ private Set subnodes;
++ /**
++ *
++ */
++ private boolean all = false;
++
++ public JCRSelection() {}
++
++ /**
++ * @param namespaceURI Namespace URI of the property or subnode name
++ * @param localname Local name (excluding prefix) of the property or subnode.
++ */
++ public JCRSelection(String namespaceURI, String localname) {
++ this.setName(namespaceURI, localname);
++ }
++
++ public JCRSelection(Item item) throws RepositoryException {
++ String acname = item.getName();
++ String namespaceURI = null;
++ int pos = -1;
++ if ((pos = acname.indexOf(':')) != -1) {
++ String prefix = acname.substring(0, pos);
++ acname = acname.substring(pos + 1);
++ namespaceURI = item.getSession().getNamespaceURI(prefix);
++ }
++ this.setName(namespaceURI, acname);
++ }
++
++ /**
++ * @return The name of the property of subnode.
++ */
++ public QName getName() {
++ return name;
++ }
++ public void setName(QName name) {
++ this.name = name;
++ }
++
++ public void setName(String namespaceURI, String localname) {
++ this.name = new QName(namespaceURI, localname);
++ }
++
++ /**
++ * @param node The current node, used only if this is an all selection.
++ * @return The set of properties and/or subnodes.
++ * @throws RepositoryException
++ */
++ public Set getSubnodes(Node node) throws RepositoryException {
++ if (!this.all) {
++ return subnodes;
++ } else {
++ JCRSelection allsel = null;
++ for (Iterator iter = this.subnodes.iterator(); iter.hasNext();) {
++ JCRSelection acsel = (JCRSelection) iter.next();
++ if (acsel.getName().getLocalPart().equals("allProps")) {
++ allsel = acsel;
++ break;
++ }
++ }
++ Set ret = new HashSet();
++ NodeIterator nodes = node.getNodes();
++ while (nodes.hasNext()) {
++ Node acnode = nodes.nextNode();
++ JCRSelection selection = new JCRSelection(acnode);
++ selection.setSubnodes(allsel.subnodes);
++ ret.add(selection);
++ }
++ PropertyIterator properties = node.getProperties();
++ while (properties.hasNext()) {
++ Property acnode = properties.nextProperty();
++ JCRSelection selection = new JCRSelection(acnode);
++ selection.setSubnodes(allsel.subnodes);
++ ret.add(selection);
++ }
++ return ret;
++ }
++ }
++ public void setSubnodes(Set subnodes) {
++ this.all = false;
++ this.subnodes = subnodes;
++ for (Iterator iter = subnodes.iterator(); iter.hasNext();) {
++ JCRSelection subnode = (JCRSelection) iter.next();
++ if (subnode.getName().getLocalPart().equals("allProps")) {
++ this.all = true;
++ }
++ }
++ }
++
++ /**
++ * Adds a subnode or property.
++ * @param subnode The subnode or poerty to add
++ */
++ public void addSubnode(JCRSelection subnode) {
++ if (this.subnodes == null) this.subnodes = new HashSet();
++ this.subnodes.add(subnode);
++ if (subnode.getName().getLocalPart().equals("allProps")) {
++ this.all = true;
++ }
++ }
++ public boolean hasSubnodes() {
++ return this.subnodes != null && this.subnodes.size() > 0;
++ }
++
++ /**
++ * @return A set of all namespaces URIs used in this node and its subnodes.
++ */
++ public Set getNamespaces() {
++ Set ret = new HashSet();
++ fillNamespaces(ret);
++ return ret;
++ }
++
++ private void fillNamespaces(Set ret) {
++ if (this.name != null) ret.add(this.name.getNamespaceURI());
++ if (this.subnodes != null) {
++ for (Iterator iter = this.subnodes.iterator(); iter.hasNext();) {
++ JCRSelection subnode = (JCRSelection) iter.next();
++ subnode.fillNamespaces(ret);
++ }
++ }
++ }
++
++ public boolean equals(Object other) {
++ if (!(other instanceof JCRSelection)) return false;
++ JCRSelection oth = (JCRSelection) other;
++ return oth.name == null ? this.name == null : this.name == null ? false : this.name.equals(oth.name);
++ }
++
++ public int hashCode() {
++ if (this.name == null) return 0;
++ return this.name.hashCode();
++ }
++
++
++
++}
+Index: blocks/cocoon-jcr/cocoon-jcr-impl/src/main/java/org/apache/cocoon/jcr/transforming/JCRQueryTransformer.java
+===================================================================
+--- blocks/cocoon-jcr/cocoon-jcr-impl/src/main/java/org/apache/cocoon/jcr/transforming/JCRQueryTransformer.java (revision 0)
++++ blocks/cocoon-jcr/cocoon-jcr-impl/src/main/java/org/apache/cocoon/jcr/transforming/JCRQueryTransformer.java (revision 543970)
+@@ -0,0 +1,217 @@
++/*
++ * Licensed to the Apache Software Foundation (ASF) under one or more
++ * contributor license agreements. See the NOTICE file distributed with
++ * this work for additional information regarding copyright ownership.
++ * The ASF licenses this file to You 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.
++ */
++package org.apache.cocoon.jcr.transforming;
++
++import java.util.Stack;
++
++import javax.jcr.LoginException;
++import javax.jcr.Node;
++import javax.jcr.NodeIterator;
++import javax.jcr.Repository;
++import javax.jcr.RepositoryException;
++import javax.jcr.Session;
++import javax.jcr.query.InvalidQueryException;
++import javax.jcr.query.Query;
++import javax.jcr.query.QueryManager;
++import javax.jcr.query.QueryResult;
++
++import org.apache.avalon.framework.CascadingRuntimeException;
++import org.apache.cocoon.jcr.utils.NodeStreaming;
++import org.apache.cocoon.transformation.AbstractSAXTransformer;
++import org.xml.sax.Attributes;
++import org.xml.sax.SAXException;
++import org.xml.sax.helpers.AttributesImpl;
++
++/**
++ * This transformer performs a query on a JCR server.
++ * <p>
++ * It expects a "query" element without namespace containing the
++ * query to execute, either in XPath or SQL, and eventually the properties to
++ * fetch (since JSR-170 does not define a standard for specifying them in xpath
++ * queries).
++ * </p>
++ * <p>
++ * It will then replace it with a "result" element containing the query results
++ * in elements named "node".
++ * </p>
++ * <h2>Sample invocation:</h2>
++ * <pre>
++ * <query language="xpath"
++ * xmlns:jcr="http://www.jcp.org/jcr/1.0"
++ * xmlns:cms="http://www.mycms.org">
++ * <jcr:encoding/>
++ * <jcr:isCheckedOut/>
++ * <cms:data>
++ * <cms:author/>
++ * <cms:workflow>
++ * <cms:lastStep/>
++ * </cms:workflow>
++ * </cms:data>
++ * jcr:root/site/articles/*
++ * </query>
++ * </pre>
++ * <h2>Sample output:</h2>
++ * <pre>
++ * <result xmlns:cms="http://www.mycms.org"
++ * xmlns:jcr="http://www.jcp.org/jcr/1.0">
++ * <node href="/site/articles/home.xml" name="home.xml" type="nt:folder" uuid="2359e49d-e84b-47aa-b27c-fb46b86abb19">
++ * <jcr:encoding type="String">UTF-8</jcr:encoding>
++ * <jcr:isCheckedOut type="Boolean">false</jcr:isCheckedOut>
++ * <cms:data href="/site/articles/home.xml/cms:data" name="cms:data" type="cms:dataRecord" uuid="72e36378-f26f-4548-993f-21b5c97306f0">
++ * <cms:author type="String">Simone</cms:author>
++ * <cms:workflow href="/site/articles/home.xml/cms:data/cms:workflow" name="cms:workflow" type="cms:workflowRecord" uuid="72e36378-f26f-4548-993f-31a6d9931e4">
++ * <cms:lastStep type="Integer">1</cms:lastStep>
++ * </cms:workflow>
++ * </cms:data>
++ * <jcr:primaryType type="Name">cms:article</jcr:primaryType>
++ * </node>
++ * </result>
++ * </pre>
++ *
++ * TODO: render bynary properties
++ *
++ * @version $Id$
++ */
++public class JCRQueryTransformer extends AbstractSAXTransformer {
++
++ /**
++ * Wether we are inside the query element or not
++ */
++ protected boolean recording = false;
++
++ /**
++ * Language of the query, as taken from query/@language
++ */
++ protected String language;
++
++ /**
++ * Query statement
++ */
++ protected String query = "";
++
++ /**
++ * Basic selection, this will hold all properties and subnodes fetching hierarchy.
++ */
++ protected JCRSelection selection;
++
++ /**
++ * Latest JCRSelection created, so that children can be properly assigned.
++ */
++ protected Stack currentSelection;
++
++ protected Repository repo;
++
++ public void startElement(String uri, String name, String raw,
++ Attributes attr) throws SAXException {
++ if (name.equals("query")) {
++ recording = true;
++ language = attr.getValue("language");
++ } else if (recording) {
++ JCRSelection eleselection = new JCRSelection(uri, name);
++ if (currentSelection.empty()) {
++ selection.addSubnode(eleselection);
++ } else {
++ JCRSelection parent = (JCRSelection) currentSelection.peek();
++ parent.addSubnode(eleselection);
++ }
++ currentSelection.push(eleselection);
++ } else {
++ super.startElement(uri, name, raw, attr);
++ }
++ }
++
++ public void endElement(String uri, String name, String raw) throws SAXException {
++ if (name.equals("query")) {
++ recording = false;
++ lazyInit();
++
++ Session session;
++ try {
++ // TODO: accept a different workspace?
++ session = repo.login();
++ } catch (LoginException e) {
++ throw new SAXException("Login to repository failed", e);
++ } catch (RepositoryException e) {
++ throw new SAXException("Cannot access repository", e);
++ }
++
++ try {
++ AttributesImpl emptyAttrs = new AttributesImpl();
++ this.contentHandler.startElement("", "result", "result", emptyAttrs);
++
++ QueryManager queryManager = session.getWorkspace().getQueryManager();
++ Query query2 = queryManager.createQuery(this.query, this.language);
++ QueryResult result = query2.execute();
++ String[] columnNames = result.getColumnNames();
++ for (int i = 0; i < columnNames.length; i++) {
++ int pos = -1;
++ if ((pos = columnNames[i].indexOf(':')) != -1) {
++ String prefix = columnNames[i].substring(0, pos);
++ String local = columnNames[i].substring(pos + 1);
++ String namespaceURI = session.getNamespaceURI(prefix);
++ selection.addSubnode(new JCRSelection(namespaceURI, local));
++ }
++ }
++
++ NodeIterator nodes = result.getNodes();
++
++ while (nodes.hasNext()) {
++ Node node = nodes.nextNode();
++ NodeStreaming.sendItem(this.contentHandler, node, this.selection, this.manager);
++ }
++
++ this.contentHandler.endElement("", "result", "result");
++ } catch (InvalidQueryException e) {
++ throw new SAXException("Invalid query " + this.query + " (" + this.language + ")", e);
++ } catch (Exception e) {
++ throw new SAXException(e);
++ }
++ } else if (!recording) {
++ super.endElement(uri, name, raw);
++ } else {
++ currentSelection.pop();
++ }
++ }
++
++ public void characters(char[] buff, int offset, int len) throws SAXException {
++ if (!recording) {
++ super.characters(buff, offset, len);
++ } else {
++ this.query += new String(buff, offset, len).trim();
++ }
++ }
++
++ protected void lazyInit() {
++ if (this.repo == null) {
++ try {
++ this.repo = (Repository)manager.lookup(Repository.class.getName());
++ } catch (Exception e) {
++ throw new CascadingRuntimeException("Cannot lookup repository", e);
++ }
++ }
++ }
++
++ public void recycle() {
++ selection = new JCRSelection();
++ currentSelection = new Stack();
++ query = "";
++ language = null;
++ recording = false;
++ }
++
++
++}
+Index: blocks/cocoon-jcr/cocoon-jcr-impl/src/main/java/org/apache/cocoon/jcr/source/JCRSourceFactory.java
+===================================================================
+--- blocks/cocoon-jcr/cocoon-jcr-impl/src/main/java/org/apache/cocoon/jcr/source/JCRSourceFactory.java (revision 529448)
++++ blocks/cocoon-jcr/cocoon-jcr-impl/src/main/java/org/apache/cocoon/jcr/source/JCRSourceFactory.java (working copy)
+@@ -242,7 +242,12 @@
+
+ // Compute the path
+ String path = SourceUtil.getSpecificPart(uri);
+- if (!path.startsWith("//")) {
++ boolean sendprops = false;
++ if (path.startsWith("properties://")) {
++ sendprops = true;
++ // strip properties:
++ path = path.substring(11);
++ } else if (!path.startsWith("//")) {
+ throw new MalformedURLException("Expecting " + this.scheme + "://path and got " + uri);
+ }
+ // Remove first '/'
+@@ -255,7 +260,11 @@
+ }
+ }
+
+- return createSource(session, path);
++ if (sendprops) {
++ return createPropertiesSource(session, path);
++ } else {
++ return createSource(session, path);
++ }
+ }
+
+ /*
+@@ -358,6 +367,11 @@
+ return new JCRNodeSource(this, session, path);
+ }
+
++
++ public JCRNodeSource createPropertiesSource(Session session, String path) throws SourceException {
++ return new JCRNodePropertiesSource(this, session, path);
++ }
++
+ /**
+ * Create a child file node in a folder node.
+ *
+Index: blocks/cocoon-jcr/cocoon-jcr-impl/pom.xml
+===================================================================
+--- blocks/cocoon-jcr/cocoon-jcr-impl/pom.xml (revision 529448)
++++ blocks/cocoon-jcr/cocoon-jcr-impl/pom.xml (working copy)
+@@ -48,7 +48,7 @@
+ <dependency>
+ <groupId>javax.jcr</groupId>
+ <artifactId>jcr</artifactId>
+- <version>1.0.1</version>
++ <version>1.0</version>
+ </dependency>
+ <dependency>
+ <groupId>slide</groupId>