ace-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ma...@apache.org
Subject svn commit: r1357570 [10/34] - in /ace/sandbox/marrs: cnf/ cnf/ext/ cnf/lib/ cnf/releaserepo/ cnf/repo/ cnf/repo/.obrcache/ cnf/repo/.obrcache/http%3A%2F%2Fbundles.bndtools.org.s3.amazonaws.com%2Fcom.jcraft.jsch/ cnf/repo/.obrcache/http%3A%2F%2Fbundles...
Date Thu, 05 Jul 2012 12:10:06 GMT
Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/.classpath
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/.classpath?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/.classpath (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/.classpath Thu Jul  5 12:09:30 2012
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" output="bin_test" path="test"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.testng.TESTNG_CONTAINER"/>
+	<classpathentry kind="con" path="aQute.bnd.classpath.container"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/.project
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/.project?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/.project (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/.project Thu Jul  5 12:09:30 2012
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.apache.ace.client.repository.helper.base</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>bndtools.core.bndbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>bndtools.core.bndnature</nature>
+	</natures>
+</projectDescription>

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/bnd.bnd
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/bnd.bnd?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/bnd.bnd (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/bnd.bnd Thu Jul  5 12:09:30 2012
@@ -0,0 +1,92 @@
+-buildpath: osgi.core,\
+	osgi.cmpn,\
+	org.apache.ace.client.repository.api;version=latest,\
+	org.apache.ace.deployment.provider.api;version=latest,\
+	org.apache.ace.log;version=latest,\
+	org.apache.ace.connectionfactory;version=latest,\
+	../cnf/lib/commons-lang-2.4.jar;version=file,\
+	../cnf/lib/commons-collections-3.2.1.jar;version=file,\
+	../cnf/lib/velocity-1.6.2.jar;version=file,\
+	../cnf/lib/xpp3-1.1.4c.jar;version=file
+Private-Package: org.apache.commons.lang,\
+	javax.xml.namespace,\
+	org.xmlpull.mxp1,\
+	org.xmlpull.mxp1_serializer,\
+	org.xmlpull.v1,\
+	org.xmlpull.v1.builder,\
+	org.xmlpull.v1.builder.adapter,\
+	org.xmlpull.v1.builder.impl,\
+	org.xmlpull.v1.dom2_builder,\
+	org.xmlpull.v1.parser_pool,\
+	org.xmlpull.v1.sax2,\
+	org.xmlpull.v1.util,\
+	org.xmlpull.v1.wrapper,\
+	org.xmlpull.v1.wrapper.classic,\
+	org.apache.velocity,\
+	org.apache.velocity.anakia,\
+	org.apache.velocity.app,\
+	org.apache.velocity.app.event,\
+	org.apache.velocity.app.event.implement,\
+	org.apache.velocity.app.tools,\
+	org.apache.velocity.context,\
+	org.apache.velocity.convert,\
+	org.apache.velocity.exception,\
+	org.apache.velocity.io,\
+	org.apache.velocity.runtime,\
+	org.apache.velocity.runtime.defaults,\
+	org.apache.velocity.runtime.directive,\
+	org.apache.velocity.runtime.log,\
+	org.apache.velocity.runtime.parser,\
+	org.apache.velocity.runtime.parser.node,\
+	org.apache.velocity.runtime.resource,\
+	org.apache.velocity.runtime.resource.loader,\
+	org.apache.velocity.runtime.resource.util,\
+	org.apache.velocity.runtime.visitor,\
+	org.apache.velocity.servlet,\
+	org.apache.velocity.texen,\
+	org.apache.velocity.texen.ant,\
+	org.apache.velocity.texen.defaults,\
+	org.apache.velocity.texen.util,\
+	org.apache.velocity.util,\
+	org.apache.velocity.util.introspection,\
+	org.apache.commons.lang.builder,\
+	org.apache.commons.lang.enums,\
+	org.apache.commons.lang.exception,\
+	org.apache.commons.lang.math,\
+	org.apache.commons.lang.mutable,\
+	org.apache.commons.lang.text,\
+	org.apache.commons.lang.time,\
+	org.apache.commons.collections,\
+	org.apache.commons.collections.bag,\
+	org.apache.commons.collections.bidimap,\
+	org.apache.commons.collections.buffer,\
+	org.apache.commons.collections.collection,\
+	org.apache.commons.collections.comparators,\
+	org.apache.commons.collections.functors,\
+	org.apache.commons.collections.iterators,\
+	org.apache.commons.collections.keyvalue,\
+	org.apache.commons.collections.list,\
+	org.apache.commons.collections.map,\
+	org.apache.commons.collections.set
+Export-Package: org.apache.ace.client.repository.helper.base
+Import-Package: !javax.servlet,\
+	!javax.servlet.http,\
+	!com.werken.xpath,\
+	!javax.naming,\
+	!javax.sql,\
+	!javax.xml.parsers,\
+	!org.apache.log,\
+	!org.apache.log.format,\
+	!org.apache.log.output.io,\
+	!org.apache.log4j,\
+	!org.apache.tools.ant,\
+	!org.apache.tools.ant.taskdefs,\
+	!org.jdom,\
+	!org.jdom.input,\
+	!org.jdom.output,\
+	!org.w3c.dom,\
+	!org.xml.sax,\
+	!org.xml.sax.helpers,\
+	!org.apache.commons.logging,\
+	!org.apache.oro.text.perl,\
+	*
\ No newline at end of file

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/build.xml
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/build.xml?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/build.xml (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/build.xml Thu Jul  5 12:09:30 2012
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="project" default="build"> 
+	<import file="../cnf/build.xml"/>
+</project>

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/old/main/appended-resources/META-INF/LICENSE.vm
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/old/main/appended-resources/META-INF/LICENSE.vm?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/old/main/appended-resources/META-INF/LICENSE.vm (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/old/main/appended-resources/META-INF/LICENSE.vm Thu Jul  5 12:09:30 2012
@@ -0,0 +1,66 @@
+##
+## 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.
+##
+
+XPP3 License
+------------
+* The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2000 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Apache" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/old/main/appended-resources/META-INF/NOTICE.vm
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/old/main/appended-resources/META-INF/NOTICE.vm?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/old/main/appended-resources/META-INF/NOTICE.vm (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/old/main/appended-resources/META-INF/NOTICE.vm Thu Jul  5 12:09:30 2012
@@ -0,0 +1,24 @@
+##
+## 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.
+##
+This product includes software developed at
+'Extreme! Lab, Indiana University' (http://www.extreme.indiana.edu/)
+Copyright (c) all rights reserved
+Licensed under Apache Software License, version 1.1  
+
+

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/pom.xml
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/pom.xml?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/pom.xml (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/pom.xml Thu Jul  5 12:09:30 2012
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.ace</groupId>
+        <artifactId>ace-pom</artifactId>
+        <version>0.8.1-SNAPSHOT</version>
+        <relativePath>../pom/pom.xml</relativePath>
+    </parent>
+
+    <version>0.8.1-SNAPSHOT</version>
+    <artifactId>org.apache.ace.client.repository.helper.base</artifactId>
+    <packaging>bundle</packaging>
+
+    <name>Apache ACE :: Client :: Repository :: Helper :: Base</name>
+    <description>Base implementation and Apache Velocity based artifact preprocessor that allows you to create artifacts that have placeholders in them that can be replaced with entity specific values.</description>
+
+    <scm>
+        <connection>scm:svn:http://svn.apache.org/repos/asf/ace/trunk/ace-client-repository-helper-base</connection>
+        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/ace/trunk/ace-client-repository-helper-base</developerConnection>
+        <url>http://svn.apache.org/repos/asf/ace/trunk/ace-client-repository-helper-base</url>
+    </scm>
+
+    <properties>
+        <export.package>
+            org.apache.ace.client.repository.helper.base;version=${project.version}
+        </export.package>
+        <import.package>
+            !org.apache.ace.client.repository.helper.base,
+	        !javax.security.auth,
+	        !javax.swing.plaf,
+	        !javax.xml.parsers,
+	        !javax.xml.stream,
+	        !javax.xml.transform.sax,
+	        !net.sf.cglib.proxy,
+	        !nu.xom,
+	        !org.codehaus.jettison.mapped,
+	        !org.dom4j,
+	        !org.dom4j.io,
+	        !org.dom4j.tree,
+	        !org.jdom,
+	        !org.jdom.input,
+	        !org.joda.time,
+	        !org.joda.time.format,
+	        !org.w3c.dom,
+	        !org.xml.sax,
+	        !org.xml.sax.helpers,
+	        !sun.misc,
+	        !sun.reflect,
+	        !com.werken.xpath,
+	        !javax.naming,
+	        !javax.servlet,
+	        !javax.servlet.http,
+	        !javax.sql,
+	        !org.apache.commons.collections,
+	        !org.apache.commons.collections.map,
+	        !org.apache.commons.lang,
+	        !org.apache.commons.lang.builder,
+	        !org.apache.commons.lang.text,
+	        !org.apache.commons.logging,
+	        !org.apache.log,
+	        !org.apache.log.format,
+	        !org.apache.log.output.io,
+	        !org.apache.log4j,
+	        !org.apache.oro.text.perl,
+	        !org.apache.tools.ant,
+	        !org.apache.tools.ant.taskdefs,
+	        !org.jdom.output,
+	        org.apache.ace.client.repository.helper;version=${project.version},
+	        org.apache.ace.connectionfactory;version=${project.version}
+        </import.package>
+        <embed.dependency>
+            velocity, xpp3, commons-collections, commons-lang
+        </embed.dependency>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.log</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.deployment.provider.api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.client.repository.api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.connectionfactory</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>xpp3</groupId>
+            <artifactId>xpp3</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/src/org/apache/ace/client/repository/helper/base/ArtifactPreprocessorBase.java
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/src/org/apache/ace/client/repository/helper/base/ArtifactPreprocessorBase.java?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/src/org/apache/ace/client/repository/helper/base/ArtifactPreprocessorBase.java (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/src/org/apache/ace/client/repository/helper/base/ArtifactPreprocessorBase.java Thu Jul  5 12:09:30 2012
@@ -0,0 +1,250 @@
+/*
+ * 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.ace.client.repository.helper.base;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLConnection;
+
+import org.apache.ace.client.repository.helper.ArtifactPreprocessor;
+import org.apache.ace.client.repository.helper.PropertyResolver;
+import org.apache.ace.connectionfactory.ConnectionFactory;
+
+/**
+ * This class can be used as a base class for artifact preprocessors. It comes with its
+ * own upload() method, which will be used by all artifact preprocessors anyway.
+ */
+public abstract class ArtifactPreprocessorBase implements ArtifactPreprocessor {
+
+    protected static final int BUFFER_SIZE = 4 * 1024;
+    
+    protected final ConnectionFactory m_connectionFactory;
+
+    /**
+     * @param connectionFactory
+     */
+    protected ArtifactPreprocessorBase(ConnectionFactory connectionFactory) {
+        m_connectionFactory = connectionFactory;
+    }
+
+    /**
+     * Uploads an artifact to an OBR.
+     * 
+     * @param input A inputstream from which the artifact can be read.
+     * @param name The name of the artifact. If the name is not unique, an IOException will be thrown.
+     * @param obrBase The base URL of the obr to which this artifact should be written.
+     * @return A URL to the uploaded artifact; this is identical to calling <code>determineNewUrl(name, obrBase)</code>
+     * @throws IOException If there was an error reading from <code>input</code>, or if there was a problem communicating
+     *         with the OBR.
+     */
+    protected URL upload(InputStream input, String name, URL obrBase) throws IOException {
+        if (obrBase == null) {
+            throw new IOException("There is no storage available for this artifact.");
+        }
+        if ((name == null) || (input == null)) {
+            throw new IllegalArgumentException("None of the parameters can be null.");
+        }
+
+        URL url = null;
+        try {
+            url = determineNewUrl(name, obrBase);
+
+            if ("file".equals(url.getProtocol())) {
+                uploadToFile(input, url);
+            }
+            else {
+                uploadToRemote(input, url);
+            }
+        }
+        catch (IOException ioe) {
+            throw new IOException("Error uploading " + name + ": " + ioe.getMessage());
+        }
+        finally {
+            silentlyClose(input);
+        }
+
+        return url;
+    }
+
+    /**
+     * Gets a stream to write an artifact to, which will be uploaded to the OBR.
+     * 
+     * @param name The name of the artifact.
+     * @param obrBase The base URL of the obr to which this artifact should be written.
+     * @return An outputstream, to which the artifact can be written.
+     * @throws IOException If there is a problem setting up the outputstream.
+     */
+    protected OutputStream upload(final String name, final URL obrBase) throws IOException {
+        /*
+         * This function works by starting a thread which reads from the outputstream which is passed out,
+         * and writing it to another stream, which is read by a thread that does the Upload.
+         */
+        final PipedOutputStream externalOutput = new PipedOutputStream();
+        final PipedInputStream externalInput = new PipedInputStream(externalOutput);
+
+        final PipedOutputStream internalOutput = new PipedOutputStream();
+        final PipedInputStream internalInput = new PipedInputStream(internalOutput);
+
+        new Thread(new Runnable() {
+            public void run() {
+                try {
+                    byte[] buffer = new byte[BUFFER_SIZE];
+                    for (int count = externalInput.read(buffer); count != -1; count = externalInput.read(buffer)) {
+                        internalOutput.write(buffer, 0, count);
+                    }
+                }
+                catch (IOException e) {
+                    // We cannot signal this to the user, but he will notice (in the original thread)
+                    // that the pipe has been broken.
+                    e.printStackTrace();
+                }
+                finally {
+                    silentlyClose(internalOutput);
+                    silentlyClose(externalInput);
+                }
+            }
+        }, "upload-Outputstream(" + name + ")").start();
+
+        new Thread(new Runnable() {
+            public void run() {
+                try {
+                    upload(internalInput, name, obrBase);
+                }
+                catch (IOException e) {
+                    // We cannot signal this to the user, but he will notice (in the original thread)
+                    // that the pipe has been broken.
+                    e.printStackTrace();
+                }
+                finally {
+                    silentlyClose(internalInput);
+                    silentlyClose(externalOutput);
+                }
+            }
+        }, "upload-Inputstream(" + name + ")").start();
+
+        return externalOutput;
+    }
+
+    protected URL determineNewUrl(String name, URL obrBase) throws MalformedURLException {
+        return new URL(obrBase, name);
+    }
+
+    public abstract String preprocess(String url, PropertyResolver props, String targetID, String version, URL obrBase) throws IOException;
+
+    public abstract boolean needsNewVersion(String url, PropertyResolver props, String targetID, String fromVersion);
+
+    /**
+     * @param closable
+     * @throws IOException
+     */
+    protected final void silentlyClose(Closeable closable) {
+        if (closable != null) {
+            try {
+                closable.close();
+            }
+            catch (IOException e) {
+                // Ignore; nothing we can/will do about here...
+            }
+        }
+    }
+
+    /**
+     * Uploads an artifact to a local file location.
+     * 
+     * @param input the input stream of the (local) artifact to upload.
+     * @param url the URL of the (file) artifact to upload to.
+     * @throws IOException in case of I/O problems.
+     */
+    private void uploadToFile(InputStream input, URL url) throws IOException {
+        File file;
+        try {
+            file = new File(url.toURI());
+        }
+        catch (URISyntaxException e) {
+            file = new File(url.getPath());
+        }
+
+        OutputStream output = null;
+
+        try {
+            output = new FileOutputStream(file);
+
+            byte[] buffer = new byte[BUFFER_SIZE];
+            for (int count = input.read(buffer); count != -1; count = input.read(buffer)) {
+                output.write(buffer, 0, count);
+            }
+        }
+        finally {
+            silentlyClose(output);
+        }
+    }
+
+    /**
+     * Uploads an artifact to a remote location.
+     * 
+     * @param input the input stream of the (local) artifact to upload.
+     * @param url the URL of the (remote) artifact to upload to.
+     * @throws IOException in case of I/O problems, or when the upload was refused by the remote.
+     */
+    private void uploadToRemote(InputStream input, URL url) throws IOException {
+        OutputStream output = null;
+
+        try {
+            URLConnection connection = m_connectionFactory.createConnection(url);
+
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            output = connection.getOutputStream();
+
+            byte[] buffer = new byte[BUFFER_SIZE];
+            for (int count = input.read(buffer); count != -1; count = input.read(buffer)) {
+                output.write(buffer, 0, count);
+            }
+            output.close();
+
+            if (connection instanceof HttpURLConnection) {
+                int responseCode = ((HttpURLConnection) connection).getResponseCode();
+                switch (responseCode) {
+                    case HttpURLConnection.HTTP_OK:
+                        break;
+                    case HttpURLConnection.HTTP_CONFLICT:
+                        throw new IOException("Artifact already exists in storage.");
+                    case HttpURLConnection.HTTP_INTERNAL_ERROR:
+                        throw new IOException("The storage server returned an internal server error.");
+                    default:
+                        throw new IOException("The storage server returned code " + responseCode + " writing to "
+                            + url.toString());
+                }
+            }
+        }
+        finally {
+            silentlyClose(output);
+        }
+    }
+}

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/src/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessor.java
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/src/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessor.java?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/src/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessor.java (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/src/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessor.java Thu Jul  5 12:09:30 2012
@@ -0,0 +1,321 @@
+/*
+ * 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.ace.client.repository.helper.base;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.ace.client.repository.helper.PropertyResolver;
+import org.apache.ace.connectionfactory.ConnectionFactory;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.Velocity;
+
+/**
+ * This class can be used as a 'default' artifact preprocessor, using the Velocity template engine to preprocess
+ * the artifact.
+ */
+public class VelocityArtifactPreprocessor extends ArtifactPreprocessorBase {
+
+    private static Object m_initLock = new Object();
+    private static boolean m_velocityInitialized = false;
+
+    private final Map<String, Reference<byte[]>> m_cachedArtifacts;
+    private final Map<String, Reference<String>> m_cachedHashes;
+    private final MessageDigest m_md5;
+
+    /**
+     * Creates a new {@link VelocityArtifactPreprocessor} instance.
+     * @param connectionFactory 
+     */
+    public VelocityArtifactPreprocessor(ConnectionFactory connectionFactory) {
+        super(connectionFactory);
+
+        try {
+            m_md5 = MessageDigest.getInstance("MD5");
+        }
+        catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("Failed to create VelocityArtifactPreprocessor instance!", e);
+        }
+
+        m_cachedArtifacts = new ConcurrentHashMap<String, Reference<byte[]>>();
+        m_cachedHashes = new ConcurrentHashMap<String, Reference<String>>();
+    }
+
+    @Override
+    public boolean needsNewVersion(String url, PropertyResolver props, String targetID, String fromVersion) {
+        // get the template
+        byte[] input = null;
+        byte[] result = null;
+        
+        try {
+            init();
+            
+            input = getArtifactAsBytes(url);
+            result = process(input, props);
+        }
+        catch (IOException ioe) {
+            // problem initializing velocity, or we cannot retrieve the 
+            // original artifact, or process it; we can't say anything now.
+            return true;
+        }
+
+        // process the template
+        // first check: did we need any processing at all?
+        if (Arrays.equals(result, input)) {
+            return false;
+        }
+
+        // hash the processed template
+        String newHash = hash(result);
+
+        // find the hash for the previous version
+        String oldHash = getHashForVersion(url, targetID, fromVersion);
+
+        // Note: we do not cache any previously created processed templates, since the call that asks us to approve a new version
+        // may cross a pending needsNewVersion call.
+        return !newHash.equals(oldHash);
+    }
+
+    @Override
+    public String preprocess(String url, PropertyResolver props, String targetID, String version, URL obrBase) throws IOException {
+        init();
+
+        // first, get the original data.
+        byte[] input = getArtifactAsBytes(url);
+        // process the template
+        byte[] result = process(input, props);
+
+        // first check: did we need any processing at all?
+        if (Arrays.equals(result, input)) {
+            // template isn't modified; use direct URL instead...
+            return url;
+        }
+        
+        setHashForVersion(url, targetID, version, hash(result));
+        
+        String name = getFilename(url, targetID, version);
+        
+        OutputStream output = upload(name, obrBase);
+        output.write(result);
+        output.close();
+
+        return determineNewUrl(name, obrBase).toString();
+    }
+
+    /**
+     * Initializes this preprocessor by making sure {@link Velocity#init()} is called.
+     * <p>This method may be called multiple times.</p>
+     * 
+     * @throws IOException in case of problems initializing Velocity.
+     */
+    private void init() throws IOException {
+        if (m_velocityInitialized) {
+            return;
+        }
+        else {
+            synchronized (m_initLock) {
+                if (!m_velocityInitialized) {
+                    try {
+                        Velocity.init();
+                        m_velocityInitialized = true;
+                    }
+                    catch (Exception e) {
+                        // Something went seriously bad initializing velocity.
+                        throw new IOException("Error initializing Velocity: " + e.getMessage());
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * @param url
+     * @param targetID
+     * @param version
+     * @return
+     * @throws MalformedURLException
+     */
+    private String getFilename(String url, String targetID, String version) throws MalformedURLException {
+        return new File(new URL(url).getFile()).getName() + "-" + targetID + "-" + version;
+    }
+
+    /**
+     * @param url
+     * @param targetID
+     * @param version
+     * @return
+     * @throws MalformedURLException
+     */
+    private String getFullUrl(String url, String targetID, String version) throws MalformedURLException {
+        return url + "-" + targetID + "-" + version;
+    }
+
+    /**
+     * @param url
+     * @param target
+     * @param version
+     * @return
+     */
+    private String getHashForVersion(String url, String target, String version) {
+        String key = createHashKey(url, target, version);
+
+        Reference<String> ref = m_cachedHashes.get(key);
+        String hash = (ref != null) ? ref.get() : null;
+        if (hash == null) {
+            try {
+                hash = hash(getBytesFromUrl(getFullUrl(url, target, version)));
+
+                m_cachedHashes.put(key, new WeakReference<String>(hash));
+            }
+            catch (IOException e) {
+                // we cannot retrieve the artifact, so we cannot say anything about it.
+            }
+        }
+
+        return hash;
+    }
+
+    /**
+     * @param url
+     * @param target
+     * @param version
+     * @param hash
+     */
+    private void setHashForVersion(String url, String target, String version, String hash) {
+        String key = createHashKey(url, target, version);
+
+        m_cachedHashes.put(key, new WeakReference<String>(hash));
+    }
+
+    /**
+     * Applies the template processor to the given byte array.
+     * 
+     * @param input the template (as byte array) to process;
+     * @param props the {@link PropertyResolver} to use.
+     * @return the processed template, never <code>null</code>.
+     * @throws IOException in case of I/O problems.
+     */
+    private byte[] process(byte[] input, PropertyResolver props) throws IOException {
+        VelocityContext context = new VelocityContext();
+        context.put("context", props);
+
+        try {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            Writer writer = new OutputStreamWriter(baos);
+            Velocity.evaluate(context, writer, "", new InputStreamReader(new ByteArrayInputStream(input)));
+            writer.flush();
+            return baos.toByteArray();
+        }
+        catch (IOException ioe) {
+            throw new IOException("Error processing the artifact: " + ioe.getMessage());
+        }
+    }
+
+    /**
+     * Reads all information from a given URL, and returns that as a byte array. The byte array is not to be changed, and could be potentially come from a cache.
+     * 
+     * @param url the URL to read the artifact from, cannot be <code>null</code>.
+     * @return the read (or cached) bytes, can be <code>null</code>.
+     * @throws IOException in case of I/O problems.
+     */
+    private byte[] getArtifactAsBytes(String url) throws IOException {
+        byte[] result = null;
+
+        Reference<byte[]> ref = m_cachedArtifacts.get(url);
+        if (ref == null || ((result = ref.get()) == null)) {
+            result = getBytesFromUrl(url);
+        }
+        return result;
+    }
+
+    /**
+     * Reads all bytes from the given URL and caches its result.
+     * 
+     * @param url the URL to read the bytes for, cannot be <code>null</code>.
+     * @return the read bytes from the given URL, can be <code>null</code> if the reading failed.
+     * @throws IOException in case of I/O problems.
+     */
+    private byte[] getBytesFromUrl(String url) throws IOException {
+        byte[] result = null;
+
+        // ACE-267
+        InputStream in = m_connectionFactory.createConnection(new URL(url)).getInputStream();
+        try {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+            byte[] buf = new byte[BUFFER_SIZE];
+            for (int count = in.read(buf); count != -1; count = in.read(buf)) {
+                baos.write(buf, 0, count);
+            }
+            
+            result = baos.toByteArray();
+            
+            m_cachedArtifacts.put(url, new WeakReference<byte[]>(result));
+        }
+        finally {
+            silentlyClose(in);
+        }
+
+        return result;
+    }
+
+    /**
+     * Creates a key for storing/retrieving a hash.
+     * 
+     * @param url
+     * @param target
+     * @param version
+     * @return a hash key, never <code>null</code>.
+     */
+    private String createHashKey(String url, String target, String version) {
+        return new StringBuilder().append('[')
+            .append(url)
+            .append("][")
+            .append(target)
+            .append("][")
+            .append(version)
+            .append(']').toString();
+    }
+
+    /**
+     * Computes a hash for a given byte array.
+     * 
+     * @param input the byte array to compute the hash for.
+     * @return a hash for the given byte array, never <code>null</code>.
+     */
+    private String hash(byte[] input) {
+        return new String(m_md5.digest(input));
+    }
+}

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/src/org/apache/ace/client/repository/helper/base/packageinfo
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/src/org/apache/ace/client/repository/helper/base/packageinfo?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/src/org/apache/ace/client/repository/helper/base/packageinfo (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/src/org/apache/ace/client/repository/helper/base/packageinfo Thu Jul  5 12:09:30 2012
@@ -0,0 +1 @@
+version 1.0
\ No newline at end of file

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/Default suite/Default test.html
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/Default%20suite/Default%20test.html?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/Default suite/Default test.html (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/Default suite/Default test.html Thu Jul  5 12:09:30 2012
@@ -0,0 +1,183 @@
+<html>
+<head>
+<title>TestNG:  Default test</title>
+<link href="../testng.css" rel="stylesheet" type="text/css" />
+<link href="../my-testng.css" rel="stylesheet" type="text/css" />
+
+<style type="text/css">
+.log { display: none;} 
+.stack-trace { display: none;} 
+</style>
+<script type="text/javascript">
+<!--
+function flip(e) {
+  current = e.style.display;
+  if (current == 'block') {
+    e.style.display = 'none';
+    return 0;
+  }
+  else {
+    e.style.display = 'block';
+    return 1;
+  }
+}
+
+function toggleBox(szDivId, elem, msg1, msg2)
+{
+  var res = -1;  if (document.getElementById) {
+    res = flip(document.getElementById(szDivId));
+  }
+  else if (document.all) {
+    // this is the way old msie versions work
+    res = flip(document.all[szDivId]);
+  }
+  if(elem) {
+    if(res == 0) elem.innerHTML = msg1; else elem.innerHTML = msg2;
+  }
+
+}
+
+function toggleAllBoxes() {
+  if (document.getElementsByTagName) {
+    d = document.getElementsByTagName('div');
+    for (i = 0; i < d.length; i++) {
+      if (d[i].className == 'log') {
+        flip(d[i]);
+      }
+    }
+  }
+}
+
+// -->
+</script>
+
+</head>
+<body>
+<h2 align='center'>Default test</h2><table border='1' align="center">
+<tr>
+<td>Tests passed/Failed/Skipped:</td><td>7/0/0</td>
+</tr><tr>
+<td>Started on:</td><td>Wed Jul 04 23:13:36 CEST 2012</td>
+</tr>
+<tr><td>Total time:</td><td>0 seconds (238 ms)</td>
+</tr><tr>
+<td>Included groups:</td><td></td>
+</tr><tr>
+<td>Excluded groups:</td><td></td>
+</tr>
+</table><p/>
+<small><i>(Hover the method name to see the test class name)</i></small><p/>
+<table width='100%' border='1' class='invocation-passed'>
+<tr><td colspan='4' align='center'><b>PASSED TESTS</b></td></tr>
+<tr><td><b>Test method</b></td>
+<td width="30%"><b>Exception</b></td>
+<td width="10%"><b>Time (seconds)</b></td>
+<td><b>Instance</b></td>
+</tr>
+<tr>
+<td title='org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest.testNeedsNewVersionChangedTemplateOk()'><b>testNeedsNewVersionChangedTemplateOk</b><br>Test class: org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest</td>
+<td></td>
+<td>0</td>
+<td>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest@64633e5e</td></tr>
+<tr>
+<td title='org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest.testNeedsNewVersionEmptyTemplateOk()'><b>testNeedsNewVersionEmptyTemplateOk</b><br>Test class: org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest</td>
+<td></td>
+<td>0</td>
+<td>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest@64633e5e</td></tr>
+<tr>
+<td title='org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest.testNeedsNewVersionNonExistingTemplateOk()'><b>testNeedsNewVersionNonExistingTemplateOk</b><br>Test class: org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest</td>
+<td></td>
+<td>0</td>
+<td>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest@64633e5e</td></tr>
+<tr>
+<td title='org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest.testNeedsNewVersionUnchangedTemplateOk()'><b>testNeedsNewVersionUnchangedTemplateOk</b><br>Test class: org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest</td>
+<td></td>
+<td>0</td>
+<td>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest@64633e5e</td></tr>
+<tr>
+<td title='org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest.testPreprocessExistingNoTemplateOk()'><b>testPreprocessExistingNoTemplateOk</b><br>Test class: org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest</td>
+<td></td>
+<td>0</td>
+<td>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest@64633e5e</td></tr>
+<tr>
+<td title='org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest.testPreprocessExistingRealTemplateOk()'><b>testPreprocessExistingRealTemplateOk</b><br>Test class: org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest</td>
+<td></td>
+<td>0</td>
+<td>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest@64633e5e</td></tr>
+<tr>
+<td title='org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest.testPreprocessNonExistingTemplateOk()'><b>testPreprocessNonExistingTemplateOk</b><br>Test class: org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest</td>
+<td><div><pre>java.io.FileNotFoundException: /path/to/nowhere-1341436417162 (No such file or directory)
+	at java.io.FileInputStream.open(Native Method)
+	at java.io.FileInputStream.&lt;init&gt;(FileInputStream.java:120)
+	at java.io.FileInputStream.&lt;init&gt;(FileInputStream.java:79)
+	at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70)
+	at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161)
+	at org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessor.getBytesFromUrl(VelocityArtifactPreprocessor.java:274)
+	at org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessor.getArtifactAsBytes(VelocityArtifactPreprocessor.java:258)
+	at org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessor.preprocess(VelocityArtifactPreprocessor.java:116)
+	at org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest.testPreprocessNonExistingTemplateOk(VelocityArtifactPreprocessorTest.java:164)
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+	at java.lang.reflect.Method.invoke(Method.java:597)
+	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
+	at org.testng.internal.Invoker.invokeMethod(Invoker.java:702)
+	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:894)
+	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1219)
+	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
+	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
+	at org.testng.TestRunner.privateRun(TestRunner.java:767)
+	at org.testng.TestRunner.run(TestRunner.java:617)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:240)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:87)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1192)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1117)
+	at org.testng.TestNG.run(TestNG.java:1025)
+	at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:109)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:202)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:173)
+</pre></div><a href='#' onClick='toggleBox("stack-trace426901684", this, "Click to show all stack frames", "Click to hide stack frames")'>Click to show all stack frames</a>
+<div class='stack-trace' id='stack-trace426901684'><pre>java.io.FileNotFoundException: /path/to/nowhere-1341436417162 (No such file or directory)
+	at java.io.FileInputStream.open(Native Method)
+	at java.io.FileInputStream.&lt;init&gt;(FileInputStream.java:120)
+	at java.io.FileInputStream.&lt;init&gt;(FileInputStream.java:79)
+	at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70)
+	at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161)
+	at org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessor.getBytesFromUrl(VelocityArtifactPreprocessor.java:274)
+	at org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessor.getArtifactAsBytes(VelocityArtifactPreprocessor.java:258)
+	at org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessor.preprocess(VelocityArtifactPreprocessor.java:116)
+	at org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest.testPreprocessNonExistingTemplateOk(VelocityArtifactPreprocessorTest.java:164)
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
+	at java.lang.reflect.Method.invoke(Method.java:597)
+	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
+	at org.testng.internal.Invoker.invokeMethod(Invoker.java:702)
+	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:894)
+	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1219)
+	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
+	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
+	at org.testng.TestRunner.privateRun(TestRunner.java:767)
+	at org.testng.TestRunner.run(TestRunner.java:617)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:240)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:87)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1192)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1117)
+	at org.testng.TestNG.run(TestNG.java:1025)
+	at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:109)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:202)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:173)
+</pre></div></td>
+<td>0</td>
+<td>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest@64633e5e</td></tr>
+</table><p>
+</body>
+</html>
\ No newline at end of file

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/Default suite/Default test.xml
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/Default%20suite/Default%20test.xml?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/Default suite/Default test.xml (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/Default suite/Default test.xml Thu Jul  5 12:09:30 2012
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitXMLReporter -->
+<testsuite hostname="Marcels-MacBook-Pro.local" name="Default test" tests="7" failures="0" timestamp="4 Jul 2012 21:13:37 GMT" time="0.238" errors="0">
+  <testcase name="testNeedsNewVersionChangedTemplateOk" time="0.202" classname="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest"/>
+  <testcase name="testNeedsNewVersionEmptyTemplateOk" time="0.0010" classname="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest"/>
+  <testcase name="testNeedsNewVersionNonExistingTemplateOk" time="0.0010" classname="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest"/>
+  <testcase name="testNeedsNewVersionUnchangedTemplateOk" time="0.0020" classname="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest"/>
+  <testcase name="testPreprocessExistingNoTemplateOk" time="0.0020" classname="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest"/>
+  <testcase name="testPreprocessExistingRealTemplateOk" time="0.0020" classname="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest"/>
+  <testcase name="testPreprocessNonExistingTemplateOk" time="0.0010" classname="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest"/>
+</testsuite> <!-- Default test -->

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/bullet_point.png
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/bullet_point.png?rev=1357570&view=auto
==============================================================================
Binary file - no diff available.

Propchange: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/bullet_point.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/collapseall.gif
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/collapseall.gif?rev=1357570&view=auto
==============================================================================
Binary file - no diff available.

Propchange: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/collapseall.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/emailable-report.html
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/emailable-report.html?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/emailable-report.html (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/emailable-report.html Thu Jul  5 12:09:30 2012
@@ -0,0 +1,68 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>TestNG:  Unit Test</title>
+<style type="text/css">
+table caption,table.info_table,table.param,table.passed,table.failed {margin-bottom:10px;border:1px solid #000099;border-collapse:collapse;empty-cells:show;}
+table.info_table td,table.info_table th,table.param td,table.param th,table.passed td,table.passed th,table.failed td,table.failed th {
+border:1px solid #000099;padding:.25em .5em .25em .5em
+}
+table.param th {vertical-align:bottom}
+td.numi,th.numi,td.numi_attn {
+text-align:right
+}
+tr.total td {font-weight:bold}
+table caption {
+text-align:center;font-weight:bold;
+}
+table.passed tr.stripe td,table tr.passedodd td {background-color: #00AA00;}
+table.passed td,table tr.passedeven td {background-color: #33FF33;}
+table.passed tr.stripe td,table tr.skippedodd td {background-color: #cccccc;}
+table.passed td,table tr.skippedodd td {background-color: #dddddd;}
+table.failed tr.stripe td,table tr.failedodd td,table.param td.numi_attn {background-color: #FF3333;}
+table.failed td,table tr.failedeven td,table.param tr.stripe td.numi_attn {background-color: #DD0000;}
+tr.stripe td,tr.stripe th {background-color: #E6EBF9;}
+p.totop {font-size:85%;text-align:center;border-bottom:2px black solid}
+div.shootout {padding:2em;border:3px #4854A8 solid}
+</style>
+</head>
+<body>
+<table cellspacing=0 cellpadding=0 class="param">
+<tr><th>Test</th><th class="numi">Methods<br/>Passed</th><th class="numi">Scenarios<br/>Passed</th><th class="numi"># skipped</th><th class="numi"># failed</th><th class="numi">Total<br/>Time</th><th class="numi">Included<br/>Groups</th><th class="numi">Excluded<br/>Groups</th></tr>
+<tr><td style="text-align:left;padding-right:2em">Default test</td><td class="numi">7</td><td class="numi">7</td><td class="numi">0</td><td class="numi">0</td><td class="numi">0.2 seconds</td><td class="numi"></td><td class="numi"></td></tr>
+</table>
+<a id="summary"></a>
+<table cellspacing=0 cellpadding=0 class="passed">
+<tr><th>Class</th><th>Method</th><th># of<br/>Scenarios</th><th>Start</th><th>Time<br/>(ms)</th></tr>
+<tr><th colspan="4">Default test &#8212; passed</th></tr>
+<tr class="passedodd"><td rowspan="7">org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest<td><a href="#m1"><b>testNeedsNewVersionChangedTemplateOk</b> (unit) </a></td><td class="numi">1</td><td>1341436416943</td><td class="numi">202</td></tr><tr class="passedodd"><td><a href="#m2"><b>testNeedsNewVersionEmptyTemplateOk</b> (unit) </a></td><td class="numi">1</td><td>1341436417146</td><td class="numi">1</td></tr><tr class="passedodd"><td><a href="#m3"><b>testNeedsNewVersionNonExistingTemplateOk</b> (unit) </a></td><td class="numi">1</td><td>1341436417149</td><td class="numi">1</td></tr><tr class="passedodd"><td><a href="#m4"><b>testNeedsNewVersionUnchangedTemplateOk</b> (unit) </a></td><td class="numi">1</td><td>1341436417151</td><td class="numi">2</td></tr><tr class="passedodd"><td><a href="#m5"><b>testPreprocessExistingNoTemplateOk</b> (unit) </a></td><td class="numi">1</td><td>1341436417155</td><td class="numi">2</td></tr><tr class="passedodd"><td><
 a href="#m6"><b>testPreprocessExistingRealTemplateOk</b> (unit) </a></td><td class="numi">1</td><td>1341436417158</td><td class="numi">2</td></tr><tr class="passedodd"><td><a href="#m7"><b>testPreprocessNonExistingTemplateOk</b> (unit) </a></td><td class="numi">1</td><td>1341436417162</td><td class="numi">1</td></tr>
+</table>
+<h1>Default test</h1>
+<a id="m1"></a><h2>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest:testNeedsNewVersionChangedTemplateOk</h2>
+<p class="totop"><a href="#summary">back to summary</a></p>
+<a id="m2"></a><h2>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest:testPreprocessExistingRealTemplateOk</h2>
+<p class="totop"><a href="#summary">back to summary</a></p>
+<a id="m3"></a><h2>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest:testNeedsNewVersionEmptyTemplateOk</h2>
+<p class="totop"><a href="#summary">back to summary</a></p>
+<a id="m4"></a><h2>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest:testNeedsNewVersionUnchangedTemplateOk</h2>
+<p class="totop"><a href="#summary">back to summary</a></p>
+<a id="m5"></a><h2>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest:testPreprocessExistingNoTemplateOk</h2>
+<p class="totop"><a href="#summary">back to summary</a></p>
+<a id="m6"></a><h2>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest:testPreprocessNonExistingTemplateOk</h2>
+<div style="padding-left:3em">
+<p>/path/to/nowhere-1341436417162 (No such file or directory)</p>
+java.io.FileInputStream.open(Native Method)
+<br/>at java.io.FileInputStream.&lt;init&gt;(FileInputStream.java:120)
+<br/>at java.io.FileInputStream.&lt;init&gt;(FileInputStream.java:79)
+<br/>at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70)
+<br/>at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161)
+<br/>at org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessor.getBytesFromUrl(VelocityArtifactPreprocessor.java:274)
+<br/>at org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessor.getArtifactAsBytes(VelocityArtifactPreprocessor.java:258)
+<br/>at org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessor.preprocess(VelocityArtifactPreprocessor.java:116)
+<br/>at org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest.testPreprocessNonExistingTemplateOk(VelocityArtifactPreprocessorTest.java:164)
+<br/>25 lines not shown
+</div>
+<p class="totop"><a href="#summary">back to summary</a></p>
+<a id="m7"></a><h2>org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest:testNeedsNewVersionNonExistingTemplateOk</h2>
+<p class="totop"><a href="#summary">back to summary</a></p>
+</body></html>

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/failed.png
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/failed.png?rev=1357570&view=auto
==============================================================================
Binary file - no diff available.

Propchange: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/failed.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/index.html
URL: http://svn.apache.org/viewvc/ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/index.html?rev=1357570&view=auto
==============================================================================
--- ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/index.html (added)
+++ ace/sandbox/marrs/org.apache.ace.client.repository.helper.base/test-output/index.html Thu Jul  5 12:09:30 2012
@@ -0,0 +1,389 @@
+<!DOCTYPE html>
+
+<html>
+  <head>
+  <title>TestNG new reports</title>
+
+    <link type="text/css" href="testng-reports.css" rel="stylesheet" />  
+    <script type="text/javascript" src="jquery-1.7.1.min.js"></script>
+    <script type="text/javascript" src="testng-reports.js"></script>
+    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+    <script type='text/javascript'>
+      google.load('visualization', '1', {packages:['table']});
+      google.setOnLoadCallback(drawTable);
+      var suiteTableInitFunctions = new Array();
+      var suiteTableData = new Array();
+    </script>
+    <!--
+      <script type="text/javascript" src="jquery-ui/js/jquery-ui-1.8.16.custom.min.js"></script>
+     -->
+  </head>
+
+  <body>
+    <div class="top-banner-root">
+      <span class="top-banner-title-font">Test results</span>
+      <br/>
+      <span class="top-banner-font-1">1 suite</span>
+    </div> <!-- top-banner-root -->
+    <div class="navigator-root">
+      <div class="navigator-suite-header">
+        <span>All suites</span>
+        <a href="#" class="collapse-all-link" title="Collapse/expand all the suites">
+          <img class="collapse-all-icon" src="collapseall.gif">
+          </img> <!-- collapse-all-icon -->
+        </a> <!-- collapse-all-link -->
+      </div> <!-- navigator-suite-header -->
+      <div class="suite">
+        <div class="rounded-window">
+          <div class="suite-header light-rounded-window-top">
+            <a href="#" class="navigator-link" panel-name="suite-Default_suite">
+              <span class="suite-name border-passed">Default suite</span>
+            </a> <!-- navigator-link -->
+          </div> <!-- suite-header light-rounded-window-top -->
+          <div class="navigator-suite-content">
+            <div class="suite-section-title">
+              <span>Info</span>
+            </div> <!-- suite-section-title -->
+            <div class="suite-section-content">
+              <ul>
+                <li>
+                  <a href="#" class="navigator-link " panel-name="test-xml-Default_suite">
+                    <span>testng-customsuite.xml</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+                <li>
+                  <a href="#" class="navigator-link " panel-name="testlist-Default_suite">
+                    <span class="test-stats">1 test</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+                <li>
+                  <a href="#" class="navigator-link " panel-name="group-Default_suite">
+                    <span>1 group</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+                <li>
+                  <a href="#" class="navigator-link " panel-name="times-Default_suite">
+                    <span>Times</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+                <li>
+                  <a href="#" class="navigator-link " panel-name="reporter-Default_suite">
+                    <span>Reporter output</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+                <li>
+                  <a href="#" class="navigator-link " panel-name="ignored-methods-Default_suite">
+                    <span>Ignored methods</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+                <li>
+                  <a href="#" class="navigator-link " panel-name="chronological-Default_suite">
+                    <span>Chronological view</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+              </ul>
+            </div> <!-- suite-section-content -->
+            <div class="result-section">
+              <div class="suite-section-title">
+                <span>Results</span>
+              </div> <!-- suite-section-title -->
+              <div class="suite-section-content">
+                <ul>
+                  <li>
+                    <span class="method-stats">7 methods,   7 passed</span>
+                  </li>
+                  <li>
+                    <span class="method-list-title passed">Passed methods</span>
+                    <span class="show-or-hide-methods passed">
+                      <a href="#" panel-name="suite-Default_suite" class="hide-methods passed suite-Default_suite"> (hide)</a> <!-- hide-methods passed suite-Default_suite -->
+                      <a href="#" panel-name="suite-Default_suite" class="show-methods passed suite-Default_suite"> (show)</a> <!-- show-methods passed suite-Default_suite -->
+                    </span>
+                    <div class="method-list-content passed suite-Default_suite">
+                      <span>
+                        <img width="3%" src="passed.png"/>
+                        <a href="#" class="method navigator-link" panel-name="suite-Default_suite" title="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest" hash-for-method="testNeedsNewVersionChangedTemplateOk">testNeedsNewVersionChangedTemplateOk</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img width="3%" src="passed.png"/>
+                        <a href="#" class="method navigator-link" panel-name="suite-Default_suite" title="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest" hash-for-method="testNeedsNewVersionEmptyTemplateOk">testNeedsNewVersionEmptyTemplateOk</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img width="3%" src="passed.png"/>
+                        <a href="#" class="method navigator-link" panel-name="suite-Default_suite" title="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest" hash-for-method="testNeedsNewVersionNonExistingTemplateOk">testNeedsNewVersionNonExistingTemplateOk</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img width="3%" src="passed.png"/>
+                        <a href="#" class="method navigator-link" panel-name="suite-Default_suite" title="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest" hash-for-method="testNeedsNewVersionUnchangedTemplateOk">testNeedsNewVersionUnchangedTemplateOk</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img width="3%" src="passed.png"/>
+                        <a href="#" class="method navigator-link" panel-name="suite-Default_suite" title="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest" hash-for-method="testPreprocessExistingNoTemplateOk">testPreprocessExistingNoTemplateOk</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img width="3%" src="passed.png"/>
+                        <a href="#" class="method navigator-link" panel-name="suite-Default_suite" title="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest" hash-for-method="testPreprocessExistingRealTemplateOk">testPreprocessExistingRealTemplateOk</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img width="3%" src="passed.png"/>
+                        <a href="#" class="method navigator-link" panel-name="suite-Default_suite" title="org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest" hash-for-method="testPreprocessNonExistingTemplateOk">testPreprocessNonExistingTemplateOk</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                    </div> <!-- method-list-content passed suite-Default_suite -->
+                  </li>
+                </ul>
+              </div> <!-- suite-section-content -->
+            </div> <!-- result-section -->
+          </div> <!-- navigator-suite-content -->
+        </div> <!-- rounded-window -->
+      </div> <!-- suite -->
+    </div> <!-- navigator-root -->
+    <div class="wrapper">
+      <div class="main-panel-root">
+        <div panel-name="suite-Default_suite" class="panel Default_suite">
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="testNeedsNewVersionChangedTemplateOk">
+                  </a> <!-- testNeedsNewVersionChangedTemplateOk -->
+                  <span class="method-name">testNeedsNewVersionChangedTemplateOk</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="testNeedsNewVersionEmptyTemplateOk">
+                  </a> <!-- testNeedsNewVersionEmptyTemplateOk -->
+                  <span class="method-name">testNeedsNewVersionEmptyTemplateOk</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="testNeedsNewVersionNonExistingTemplateOk">
+                  </a> <!-- testNeedsNewVersionNonExistingTemplateOk -->
+                  <span class="method-name">testNeedsNewVersionNonExistingTemplateOk</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="testNeedsNewVersionUnchangedTemplateOk">
+                  </a> <!-- testNeedsNewVersionUnchangedTemplateOk -->
+                  <span class="method-name">testNeedsNewVersionUnchangedTemplateOk</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="testPreprocessExistingNoTemplateOk">
+                  </a> <!-- testPreprocessExistingNoTemplateOk -->
+                  <span class="method-name">testPreprocessExistingNoTemplateOk</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="testPreprocessExistingRealTemplateOk">
+                  </a> <!-- testPreprocessExistingRealTemplateOk -->
+                  <span class="method-name">testPreprocessExistingRealTemplateOk</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="testPreprocessNonExistingTemplateOk">
+                  </a> <!-- testPreprocessNonExistingTemplateOk -->
+                  <span class="method-name">testPreprocessNonExistingTemplateOk</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+        </div> <!-- panel Default_suite -->
+        <div panel-name="test-xml-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">/private/var/folders/4k/58plh09n605ffjkhv0kpcx540000gn/T/testng-eclipse-1729083164/testng-customsuite.xml</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+            <pre>
+&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+&lt;!DOCTYPE suite SYSTEM &quot;http://testng.org/testng-1.0.dtd&quot;&gt;
+&lt;suite name=&quot;Default suite&quot;&gt;
+  &lt;test verbose=&quot;2&quot; name=&quot;Default test&quot; preserve-order=&quot;true&quot;&gt;
+    &lt;classes&gt;
+      &lt;class name=&quot;org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessor&quot;/&gt;
+      &lt;class name=&quot;org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest&quot;/&gt;
+      &lt;class name=&quot;org.apache.ace.client.repository.helper.base.ArtifactPreprocessorBase&quot;/&gt;
+    &lt;/classes&gt;
+  &lt;/test&gt; &lt;!-- Default test --&gt;
+&lt;/suite&gt; &lt;!-- Default suite --&gt;
+            </pre>
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+        <div panel-name="testlist-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">Tests for Default suite</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+            <ul>
+              <li>
+                <span class="test-name">Default test (3 classes)</span>
+              </li>
+            </ul>
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+        <div panel-name="group-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">Groups for Default suite</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+            <div class="test-group">
+              <span class="test-group-name">unit</span>
+              <br/>
+              <div class="method-in-group">
+                <span class="method-in-group-name">testNeedsNewVersionChangedTemplateOk</span>
+                <br/>
+              </div> <!-- method-in-group -->
+              <div class="method-in-group">
+                <span class="method-in-group-name">testNeedsNewVersionEmptyTemplateOk</span>
+                <br/>
+              </div> <!-- method-in-group -->
+              <div class="method-in-group">
+                <span class="method-in-group-name">testNeedsNewVersionNonExistingTemplateOk</span>
+                <br/>
+              </div> <!-- method-in-group -->
+              <div class="method-in-group">
+                <span class="method-in-group-name">testNeedsNewVersionUnchangedTemplateOk</span>
+                <br/>
+              </div> <!-- method-in-group -->
+              <div class="method-in-group">
+                <span class="method-in-group-name">testPreprocessExistingNoTemplateOk</span>
+                <br/>
+              </div> <!-- method-in-group -->
+              <div class="method-in-group">
+                <span class="method-in-group-name">testPreprocessExistingRealTemplateOk</span>
+                <br/>
+              </div> <!-- method-in-group -->
+              <div class="method-in-group">
+                <span class="method-in-group-name">testPreprocessNonExistingTemplateOk</span>
+                <br/>
+              </div> <!-- method-in-group -->
+            </div> <!-- test-group -->
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+        <div panel-name="times-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">Times for Default suite</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+            <div class="times-div">
+              <script type="text/javascript">
+suiteTableInitFunctions.push('tableData_Default_suite');
+function tableData_Default_suite() {
+var data = new google.visualization.DataTable();
+data.addColumn('number', 'Number');
+data.addColumn('string', 'Method');
+data.addColumn('string', 'Class');
+data.addColumn('number', 'Time (ms)');
+data.addRows(7);
+data.setCell(0, 0, 0)
+data.setCell(0, 1, 'testNeedsNewVersionChangedTemplateOk')
+data.setCell(0, 2, 'org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest')
+data.setCell(0, 3, 202);
+data.setCell(1, 0, 1)
+data.setCell(1, 1, 'testPreprocessExistingRealTemplateOk')
+data.setCell(1, 2, 'org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest')
+data.setCell(1, 3, 2);
+data.setCell(2, 0, 2)
+data.setCell(2, 1, 'testNeedsNewVersionUnchangedTemplateOk')
+data.setCell(2, 2, 'org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest')
+data.setCell(2, 3, 2);
+data.setCell(3, 0, 3)
+data.setCell(3, 1, 'testPreprocessExistingNoTemplateOk')
+data.setCell(3, 2, 'org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest')
+data.setCell(3, 3, 2);
+data.setCell(4, 0, 4)
+data.setCell(4, 1, 'testNeedsNewVersionEmptyTemplateOk')
+data.setCell(4, 2, 'org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest')
+data.setCell(4, 3, 1);
+data.setCell(5, 0, 5)
+data.setCell(5, 1, 'testPreprocessNonExistingTemplateOk')
+data.setCell(5, 2, 'org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest')
+data.setCell(5, 3, 1);
+data.setCell(6, 0, 6)
+data.setCell(6, 1, 'testNeedsNewVersionNonExistingTemplateOk')
+data.setCell(6, 2, 'org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest')
+data.setCell(6, 3, 1);
+window.suiteTableData['Default_suite']= { tableData: data, tableDiv: 'times-div-Default_suite'}
+return data;
+}
+              </script>
+              <span class="suite-total-time">Total running time: 211 ms</span>
+              <div id="times-div-Default_suite">
+              </div> <!-- times-div-Default_suite -->
+            </div> <!-- times-div -->
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+        <div panel-name="reporter-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">Reporter output for Default suite</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+        <div panel-name="ignored-methods-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">0 ignored methods</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+        <div panel-name="chronological-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">Methods in chronological order</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessorTest</div> <!-- chronological-class-name -->
+              <div class="configuration-test before">
+                <span class="method-name">setUp</span>
+                <span class="method-start">0 ms</span>
+              </div> <!-- configuration-test before -->
+              <div class="test-method">
+                <span class="method-name">testNeedsNewVersionChangedTemplateOk</span>
+                <span class="method-start">13 ms</span>
+              </div> <!-- test-method -->
+              <div class="test-method">
+                <span class="method-name">testNeedsNewVersionEmptyTemplateOk</span>
+                <span class="method-start">216 ms</span>
+              </div> <!-- test-method -->
+              <div class="test-method">
+                <span class="method-name">testNeedsNewVersionNonExistingTemplateOk</span>
+                <span class="method-start">219 ms</span>
+              </div> <!-- test-method -->
+              <div class="test-method">
+                <span class="method-name">testNeedsNewVersionUnchangedTemplateOk</span>
+                <span class="method-start">221 ms</span>
+              </div> <!-- test-method -->
+              <div class="test-method">
+                <span class="method-name">testPreprocessExistingNoTemplateOk</span>
+                <span class="method-start">225 ms</span>
+              </div> <!-- test-method -->
+              <div class="test-method">
+                <span class="method-name">testPreprocessExistingRealTemplateOk</span>
+                <span class="method-start">228 ms</span>
+              </div> <!-- test-method -->
+              <div class="test-method">
+                <span class="method-name">testPreprocessNonExistingTemplateOk</span>
+                <span class="method-start">232 ms</span>
+              </div> <!-- test-method -->
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+      </div> <!-- main-panel-root -->
+    </div> <!-- wrapper -->
+  </body>
+</html>



Mime
View raw message