You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2004/03/17 21:53:58 UTC
cvs commit: cocoon-2.2/tools/src/anttasks XConfToolTask.java
cziegeler 2004/03/17 12:53:58
Modified: src/webapp/samples sitemap.xmap
src/java/org/apache/cocoon/components/cprocessor
TreeProcessor.java
tools/src/anttasks XConfToolTask.java
Added: src/webapp/samples/stylesheets sort-samples.xsl
Log:
Disabling new internal redirect handling
Sync XConfTask
Add sorting stylesheet for block samples
Revision Changes Path
1.1 cocoon-2.2/src/webapp/samples/stylesheets/sort-samples.xsl
Index: sort-samples.xsl
===================================================================
<?xml version="1.0"?>
<!--
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.
-->
<!--+
| Sort groups in alphabetical order.
|
| CVS $Id: sort-samples.xsl,v 1.1 2004/03/17 20:53:58 cziegeler Exp $
+-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="samples">
<samples>
<xsl:apply-templates select="group[@name='Back']"/>
<xsl:for-each select="group[not(@name='Back')]">
<xsl:sort select="@name"/>
<xsl:apply-templates select="."/>
</xsl:for-each>
</samples>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
1.21 +2 -1 cocoon-2.2/src/webapp/samples/sitemap.xmap
Index: sitemap.xmap
===================================================================
RCS file: /home/cvs/cocoon-2.2/src/webapp/samples/sitemap.xmap,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- sitemap.xmap 10 Mar 2004 16:26:19 -0000 1.20
+++ sitemap.xmap 17 Mar 2004 20:53:58 -0000 1.21
@@ -95,6 +95,7 @@
<map:match pattern="blocks">
<map:generate src="block-samples.xml"/>
+ <map:transform src="stylesheets/sort-samples.xsl"/>
<map:transform src="context://samples/common/style/xsl/html/simple-samples2html.xsl">
<map:parameter name="contextPath" value="{request:contextPath}"/>
</map:transform>
1.25 +1 -1 cocoon-2.2/src/java/org/apache/cocoon/components/cprocessor/TreeProcessor.java
Index: TreeProcessor.java
===================================================================
RCS file: /home/cvs/cocoon-2.2/src/java/org/apache/cocoon/components/cprocessor/TreeProcessor.java,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- TreeProcessor.java 17 Mar 2004 12:33:34 -0000 1.24
+++ TreeProcessor.java 17 Mar 2004 20:53:58 -0000 1.25
@@ -391,7 +391,7 @@
}
Environment newEnv = new ForwardEnvironmentWrapper(environment, m_manager, uri, getLogger());
- ((ForwardEnvironmentWrapper)newEnv).setExternal(true);
+ //((ForwardEnvironmentWrapper)newEnv).setExternal(true);
if (facade != null) {
// Change the facade delegate
1.12 +94 -34 cocoon-2.2/tools/src/anttasks/XConfToolTask.java
Index: XConfToolTask.java
===================================================================
RCS file: /home/cvs/cocoon-2.2/tools/src/anttasks/XConfToolTask.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- XConfToolTask.java 10 Mar 2004 09:08:25 -0000 1.11
+++ XConfToolTask.java 17 Mar 2004 20:53:58 -0000 1.12
@@ -41,6 +41,10 @@
import java.io.File;
import java.io.IOException;
import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
/**
* Ant task to patch xmlfiles.
@@ -68,12 +72,18 @@
private static final String NL=System.getProperty("line.separator");
private static final String FSEP=System.getProperty("file.separator");
+
+ /** Cache the read configuration files (Documents) */
+ private static Map fileCache = new HashMap();
+
private File file;
//private File directory;
private File srcdir;
private boolean addComments;
/** for resolving entities such as dtds */
private XMLCatalog xmlCatalog = new XMLCatalog();
+ private DocumentBuilder builder;
+ private Transformer transformer;
/**
* Set file, which should be patched.
@@ -115,7 +125,22 @@
*/
public void init() throws BuildException {
super.init();
- xmlCatalog.setProject(project);
+ try {
+ xmlCatalog.setProject(project);
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+ builderFactory.setValidating(false);
+ builderFactory.setExpandEntityReferences(false);
+ builderFactory.setNamespaceAware(false);
+ builderFactory.setAttribute(
+ "http://apache.org/xml/features/nonvalidating/load-external-dtd",
+ Boolean.FALSE);
+ builder = builderFactory.newDocumentBuilder();
+ transformer = TransformerFactory.newInstance().newTransformer();
+ } catch (TransformerException e) {
+ throw new BuildException("TransformerException: "+e);
+ } catch (ParserConfigurationException e) {
+ throw new BuildException("ParserConfigurationException: "+e);
+ }
}
/**
@@ -126,19 +151,17 @@
throw new BuildException("file attribute is required", location);
}
try {
- final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
- builderFactory.setValidating(false);
- builderFactory.setExpandEntityReferences(false);
- builderFactory.setNamespaceAware(false);
- builderFactory.setAttribute(
- "http://apache.org/xml/features/nonvalidating/load-external-dtd",
- Boolean.FALSE);
- final DocumentBuilder builder = builderFactory.newDocumentBuilder();
- final Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ final String fileName = this.file.toURL().toExternalForm();
+ Document document = (Document)this.fileCache.get(fileName);
+ if ( document != null ) {
+ log("Using file from cache: " + this.file, Project.MSG_DEBUG);
+ this.fileCache.remove(fileName);
+ } else {
// load xml
log("Reading: " + this.file, Project.MSG_DEBUG);
- final Document document = builder.parse(this.file.toURL().toExternalForm());
+ document = builder.parse(fileName);
+ }
if (this.srcdir == null) {
this.srcdir = project.resolveFile(".");
@@ -146,22 +169,58 @@
DirectoryScanner scanner = getDirectoryScanner(this.srcdir);
String[] list = scanner.getIncludedFiles();
- boolean hasChanged = false;
+ boolean modified = false;
// process recursive
File patchfile;
+ ArrayList suspended = new ArrayList();
+ boolean hasChanged = false;
for (int i = 0; i < list.length; i++) {
patchfile = new File(this.srcdir, list[i]);
try {
// Adds configuration snippet from the file to the configuration
- hasChanged |= patch(document,
- builder.parse(patchfile.toURL().toExternalForm()),
- patchfile.toString());
+ boolean changed = patch(document, patchfile);
+ hasChanged |= changed;
+ if (!changed) {
+ suspended.add(patchfile);
+ }
} catch (SAXException e) {
log("Ignoring: "+patchfile+"\n(not a valid XML)");
}
}
+ modified = hasChanged;
+
+ if (hasChanged && !suspended.isEmpty()) {
+ log("Try to apply suspended patch files", Project.MSG_DEBUG);
+ }
+
+ ArrayList newSuspended = new ArrayList();
+ while (hasChanged && !suspended.isEmpty()) {
+ hasChanged = false;
+ for(Iterator i=suspended.iterator(); i.hasNext();) {
+ patchfile = (File)i.next();
+ try {
+ // Adds configuration snippet from the file to the configuration
+ boolean changed = patch(document, patchfile);
+ hasChanged |= changed;
+ if (!changed) {
+ newSuspended.add(patchfile);
+ }
+ } catch (SAXException e) {
+ log("Ignoring: "+patchfile+"\n(not a valid XML)");
+ }
+ }
+ suspended = newSuspended;
+ newSuspended = new ArrayList();
+ }
+
+ if (!suspended.isEmpty()) {
+ for(Iterator i=suspended.iterator(); i.hasNext();) {
+ patchfile = (File)i.next();
+ log("Dismiss: "+patchfile.toString(), Project.MSG_DEBUG);
+ }
+ }
- if (hasChanged) {
+ if (modified) {
log("Writing: " + this.file);
// Set the DOCTYPE output option on the transformer
// if we have any DOCTYPE declaration in the input xml document
@@ -175,14 +234,13 @@
} else {
log("No Changes: " + this.file, Project.MSG_DEBUG);
}
+ this.fileCache.put(fileName, document);
} catch (TransformerException e) {
throw new BuildException("TransformerException: "+e);
} catch (SAXException e) {
throw new BuildException("SAXException: "+e);
} catch (DOMException e) {
throw new BuildException("DOMException:" +e);
- } catch (ParserConfigurationException e) {
- throw new BuildException("ParserConfigurationException: "+e);
} catch (UnknownHostException e) {
throw new BuildException("UnknownHostException. Probable cause: The parser is " +
"trying to resolve a dtd from the internet and no connection exists.\n" +
@@ -203,17 +261,20 @@
* @return True, if the document was successfully patched
*/
private boolean patch(final Document configuration,
- final Document component,
- String file)
- throws TransformerException, IOException, DOMException {
+ final File file)
+ throws TransformerException, IOException, DOMException, SAXException {
+
+ Document component = builder.parse(file.toURL().toExternalForm());
+ String filename = file.toString();
+
// Check to see if Document is an xconf-tool document
Element elem = component.getDocumentElement();
- String extension = file.lastIndexOf(".")>0?file.substring(file.lastIndexOf(".")+1):"";
- String basename = basename(file);
+ String extension = filename.lastIndexOf(".")>0?filename.substring(filename.lastIndexOf(".")+1):"";
+ String basename = basename(filename);
if (!elem.getTagName().equals(extension)) {
- log("Skipping non xconf-tool file: "+file);
+ log("Skipping non xconf-tool file: "+filename);
return false;
}
@@ -227,11 +288,10 @@
NodeList nodes = XPathAPI.selectNodeList(configuration, xpath);
+ // Suspend, because the xpath returned not one node
if (nodes.getLength() !=1 ) {
- log("Error in: "+file);
- throw new IOException("XPath (" + xpath +
- ") returned not one node, but "+
- nodes.getLength() + " nodes");
+ log("Suspending: "+filename, Project.MSG_DEBUG);
+ return false;
}
Node root = nodes.item(0);
@@ -249,11 +309,11 @@
}
if (ifProp != null && ifProp.length() > 0 && !ifValue ) {
- log("Skipping: " + file, Project.MSG_DEBUG);
+ log("Skipping: " + filename, Project.MSG_DEBUG);
return false;
} else if (testPath != null && testPath.length() > 0 &&
XPathAPI.selectNodeList(root, testPath).getLength() != 0) {
- log("Skipping: " + file, Project.MSG_DEBUG);
+ log("Skipping: " + filename, Project.MSG_DEBUG);
return false;
} else {
// Test if component wants us to remove a list of nodes first
@@ -292,7 +352,7 @@
if (xpath != null && xpath.length() > 0) {
nodes = XPathAPI.selectNodeList(root, xpath);
if (nodes.getLength() == 0) {
- log("Error in: "+file);
+ log("Error in: "+filename);
throw new IOException("XPath ("+xpath+") returned zero nodes");
}
before = nodes.item(0);
@@ -301,7 +361,7 @@
if (xpath != null && xpath.length() > 0) {
nodes = XPathAPI.selectNodeList(root, xpath);
if (nodes.getLength() == 0) {
- log("Error in: "+file);
+ log("Error in: "+filename);
throw new IOException("XPath ("+xpath+") zero nodes.");
}
before = nodes.item(nodes.getLength()-1).getNextSibling();
@@ -309,7 +369,7 @@
}
// Add 'component' data into 'root' node
- log("Processing: "+file);
+ log("Processing: "+filename);
NodeList componentNodes = component.getDocumentElement().getChildNodes();
if (this.addComments) {