[jboss-svn-commits] JBoss Common SVN: r3645 - in shrinkwrap/trunk: impl-base/src/main/java/org/jboss/shrinkwrap/impl/base and 7 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Nov 10 09:15:12 EST 2009
Author: aslak
Date: 2009-11-10 09:15:11 -0500 (Tue, 10 Nov 2009)
New Revision: 3645
Added:
shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Specializer.java
shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ArchiveExtensionLoader.java
shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/SpecializedBase.java
shrinkwrap/trunk/impl-base/src/main/resources/META-INF/
shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/
shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.descriptor.WebArchiveDescriptor
shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.EnterpriseArchive
shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.JavaArchive
shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.WebArchive
shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ArchiveExtensionLoaderTest.java
shrinkwrap/trunk/impl-base/src/test/resources/META-INF/
shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/
shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ArchiveExtensionLoaderTest$Extension
shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ArchiveExtensionLoaderTest$WrongImplExtension
Modified:
shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Archive.java
shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ArchiveBase.java
shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ContainerBase.java
Log:
SHRINKWRAP-50 Adds support for dynamic loading/wrapping of Archive Descriptors/Extensions
Modified: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Archive.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Archive.java 2009-11-07 22:44:05 UTC (rev 3644)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Archive.java 2009-11-10 14:15:11 UTC (rev 3645)
@@ -27,7 +27,7 @@
* @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
* @version $Revision: $
*/
-public interface Archive<T extends Archive<T>>
+public interface Archive<T extends Archive<T>> extends Specializer
{
//-------------------------------------------------------------------------------------||
// Contracts --------------------------------------------------------------------------||
Added: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Specializer.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Specializer.java (rev 0)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Specializer.java 2009-11-10 14:15:11 UTC (rev 3645)
@@ -0,0 +1,35 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * 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.
+ */
+package org.jboss.shrinkwrap.api;
+
+/**
+ * General interface for wrapping archive as different extension types.
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public interface Specializer
+{
+ /**
+ * Wraps a Archive in a different 'view'.
+ *
+ * @param <TYPE>
+ * @param clazz Extension interface to load
+ * @return The Archive wrapped as TYPE
+ */
+ <TYPE extends Specializer> TYPE as(Class<TYPE> clazz);
+}
Modified: shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ArchiveBase.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ArchiveBase.java 2009-11-07 22:44:05 UTC (rev 3644)
+++ shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ArchiveBase.java 2009-11-10 14:15:11 UTC (rev 3645)
@@ -24,6 +24,7 @@
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.Asset;
import org.jboss.shrinkwrap.api.Path;
+import org.jboss.shrinkwrap.api.Specializer;
import org.jboss.shrinkwrap.impl.base.asset.ArchiveAsset;
import org.jboss.shrinkwrap.impl.base.path.BasicPath;
@@ -210,6 +211,17 @@
return covariantReturn();
}
+ /* (non-Javadoc)
+ * @see org.jboss.shrinkwrap.api.Specializer#as(java.lang.Class)
+ */
+ @Override
+ public <TYPE extends Specializer> TYPE as(Class<TYPE> clazz)
+ {
+ Validate.notNull(clazz, "Class must be specified");
+
+ return new ArchiveExtensionLoader<TYPE>(clazz).load(this);
+ }
+
//-------------------------------------------------------------------------------------||
// Contracts --------------------------------------------------------------------------||
//-------------------------------------------------------------------------------------||
@@ -243,5 +255,4 @@
throw cce;
}
}
-
}
Added: shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ArchiveExtensionLoader.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ArchiveExtensionLoader.java (rev 0)
+++ shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ArchiveExtensionLoader.java 2009-11-10 14:15:11 UTC (rev 3645)
@@ -0,0 +1,173 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * 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.
+ */
+package org.jboss.shrinkwrap.impl.base;
+
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.impl.base.io.IOUtil;
+
+/**
+ * ArchiveExtensionLoader responsible for loading the Archive extensions based on ShrinkWrap SPI.
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ * @param <T>
+ */
+public class ArchiveExtensionLoader<T>
+{
+ private Class<T> extensionInterface;
+
+ // TODO: generic clash, should be moved out, or only support overloading of Class<T> ?
+ private Map<Class<?>, Class<?>> extensionOverrides = new HashMap<Class<?>, Class<?>>();
+
+ private ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+
+ public ArchiveExtensionLoader(Class<T> extensionInterface)
+ {
+ Validate.notNull(extensionInterface, "ExtensionInterface must be specified");
+ this.extensionInterface = extensionInterface;
+ }
+
+ public <X> ArchiveExtensionLoader<T> addExtesionOverride(
+ Class<X> extensionInterfaceClas, Class<? extends X> extensionImplClass)
+ {
+ extensionOverrides.put(extensionInterfaceClas, extensionImplClass);
+ return this;
+ }
+
+ public ArchiveExtensionLoader<T> setClassLoader(ClassLoader classLoader)
+ {
+ Validate.notNull(classLoader, "ClassLoader must be specified");
+ this.classLoader = classLoader;
+ return this;
+ }
+
+ public final ClassLoader getClassLoader()
+ {
+ return classLoader;
+ }
+
+ public T load(Archive<?> archive)
+ {
+ Validate.notNull(archive, "Archive must be specified");
+ try
+ {
+ Class<T> extensionImplClass = null;
+
+ if(hasExtensionOverride())
+ {
+ extensionImplClass = (Class<T>)getExtensionOverride();
+ }
+ else
+ {
+ List<URL> urls = findExtensions(extensionInterface);
+ if(urls.size() == 0)
+ {
+ throw new RuntimeException(
+ "No extension implementation found for " + extensionInterface.getName() +
+ ", please verify classpath or add a extensionOverride");
+ }
+ if(urls.size() > 1)
+ {
+ throw new RuntimeException(
+ "Multiple extension implementations found for " + extensionInterface.getName() +
+ ", please verify classpath or add a extensionOverride");
+ }
+
+ String extensionClassName = loadExtensionName(urls.get(0));
+ extensionImplClass = loadExtensionClass(extensionClassName);
+ }
+
+ if(!extensionInterface.isAssignableFrom(extensionImplClass)) {
+ throw new RuntimeException(
+ "Found extension implementation is not of same type " + extensionImplClass.getName() +
+ " as " + extensionInterface.getName());
+ }
+
+ Constructor<T> extensionImplConstructor = findConstructor(extensionImplClass);
+ Class<?> constructorArg = extensionImplConstructor.getParameterTypes()[0];
+ if(constructorArg.isInstance(archive))
+ {
+ return extensionImplConstructor.newInstance(archive);
+ }
+ else
+ {
+ return extensionImplConstructor.newInstance(
+ new ArchiveExtensionLoader(constructorArg).load(archive)
+ );
+ }
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("Could not load extension for " + extensionInterface.getName(), e);
+ }
+ }
+
+ private boolean hasExtensionOverride() {
+ return extensionOverrides.containsKey(extensionInterface);
+ }
+
+ private Class<?> getExtensionOverride() {
+ return extensionOverrides.get(extensionInterface);
+ }
+
+ private List<URL> findExtensions(Class<T> extensionClass) throws IOException
+ {
+ Enumeration<URL> urls = getClassLoader().getResources(
+ "META-INF/services/" + extensionClass.getName());
+
+ return Collections.list(urls);
+ }
+
+ private String loadExtensionName(URL extensionURL) throws IOException
+ {
+ return new String(IOUtil.asByteArray(extensionURL.openStream()));
+ }
+
+ private Class<T> loadExtensionClass(String extensionClassName) throws ClassNotFoundException
+ {
+ return (Class<T>)getClassLoader().loadClass(extensionClassName);
+ }
+
+ private Constructor<T> findConstructor(Class<T> implClass)
+ {
+ Constructor<T>[] constructors = (Constructor<T>[])implClass.getConstructors();
+ for(Constructor<T> constructor : constructors) {
+ Class<?>[] parameters = constructor.getParameterTypes();
+ if(parameters.length != 1)
+ {
+ continue;
+ }
+ Class<?> parameter = parameters[0];
+ if(Archive.class.isAssignableFrom(parameter))
+ {
+ return constructor;
+ }
+ }
+ throw new RuntimeException(
+ "No constructor with a single argument of type " +
+ Archive.class.getName() + " could be found");
+ }
+}
Modified: shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ContainerBase.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ContainerBase.java 2009-11-07 22:44:05 UTC (rev 3644)
+++ shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ContainerBase.java 2009-11-10 14:15:11 UTC (rev 3645)
@@ -45,7 +45,7 @@
* @version $Revision: $
* @param <T>
*/
-public abstract class ContainerBase<T extends Archive<T>> implements
+public abstract class ContainerBase<T extends Archive<T>> extends SpecializedBase implements
Archive<T>, ManifestContainer<T>, ResourceContainer<T>, ClassContainer<T>, LibraryContainer<T>
{
//-------------------------------------------------------------------------------------||
@@ -204,6 +204,19 @@
}
//-------------------------------------------------------------------------------------||
+ // Required Implementations - SpecializedBase -----------------------------------------||
+ //-------------------------------------------------------------------------------------||
+
+ /* (non-Javadoc)
+ * @see org.jboss.shrinkwrap.impl.base.SpecializedBase#getArchive()
+ */
+ @Override
+ protected Archive<?> getArchive()
+ {
+ return archive;
+ }
+
+ //-------------------------------------------------------------------------------------||
// Required Implementations - ManifestContainer ---------------------------------------||
//-------------------------------------------------------------------------------------||
Added: shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/SpecializedBase.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/SpecializedBase.java (rev 0)
+++ shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/SpecializedBase.java 2009-11-10 14:15:11 UTC (rev 3645)
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * 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.
+ */
+package org.jboss.shrinkwrap.impl.base;
+
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.Specializer;
+
+/**
+ * A generic implementation of {@link Specializer} that delegates down to the Archive
+ * extensions inner archive. Used by Archive extensions to simplify handling the generic extension
+ * mechanism.
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public abstract class SpecializedBase implements Specializer
+{
+ /**
+ * Used by the Generic {@link Specializer} implementation to
+ * get the extension wrapped inner {@link Archive}.
+ *
+ * @return The wrapped {@link Archive}
+ */
+ protected abstract Archive<?> getArchive();
+
+ /* (non-Javadoc)
+ * @see org.jboss.shrinkwrap.api.Specializer#as(java.lang.Class)
+ */
+ @Override
+ public <TYPE extends Specializer> TYPE as(Class<TYPE> clazz)
+ {
+ return getArchive().as(clazz);
+ }
+}
Added: shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.descriptor.WebArchiveDescriptor
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.descriptor.WebArchiveDescriptor (rev 0)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.descriptor.WebArchiveDescriptor 2009-11-10 14:15:11 UTC (rev 3645)
@@ -0,0 +1 @@
+org.jboss.shrinkwrap.impl.base.descriptor.WebArchiveDescriptorAsset
\ No newline at end of file
Added: shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.EnterpriseArchive
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.EnterpriseArchive (rev 0)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.EnterpriseArchive 2009-11-10 14:15:11 UTC (rev 3645)
@@ -0,0 +1 @@
+org.jboss.shrinkwrap.impl.base.spec.EnterpriseArchiveImpl
\ No newline at end of file
Added: shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.JavaArchive
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.JavaArchive (rev 0)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.JavaArchive 2009-11-10 14:15:11 UTC (rev 3645)
@@ -0,0 +1 @@
+org.jboss.shrinkwrap.impl.base.spec.JavaArchiveImpl
\ No newline at end of file
Added: shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.WebArchive
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.WebArchive (rev 0)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.WebArchive 2009-11-10 14:15:11 UTC (rev 3645)
@@ -0,0 +1 @@
+org.jboss.shrinkwrap.impl.base.spec.WebArchiveImpl
\ No newline at end of file
Added: shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ArchiveExtensionLoaderTest.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ArchiveExtensionLoaderTest.java (rev 0)
+++ shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ArchiveExtensionLoaderTest.java 2009-11-10 14:15:11 UTC (rev 3645)
@@ -0,0 +1,105 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * 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.
+ */
+package org.jboss.shrinkwrap.impl.base;
+
+import junit.framework.Assert;
+
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.Specializer;
+import org.junit.Test;
+
+
+/**
+ * ArchiveExtensionLoaderTest to ensure extension loading correctness
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class ArchiveExtensionLoaderTest
+{
+
+ @Test
+ public void shouldBeAbleToLoadExtension() throws Exception {
+ Extension extension = new ArchiveExtensionLoader<Extension>(Extension.class)
+ .load(new MemoryMapArchiveImpl());
+
+ Assert.assertNotNull(extension);
+
+ Assert.assertTrue(extension.getClass() == ExtensionImpl.class);
+ }
+
+ @Test
+ public void shouldBeAbleToOverrideExtension() throws Exception {
+ Extension extension = new ArchiveExtensionLoader<Extension>(Extension.class)
+ .addExtesionOverride(Extension.class, ExtensionImpl2.class)
+ .load(new MemoryMapArchiveImpl());
+
+ Assert.assertNotNull(extension);
+
+ Assert.assertTrue(extension.getClass() == ExtensionImpl2.class);
+ }
+
+ @Test(expected = RuntimeException.class)
+ public void shouldThrowExceptionOnMissingExtension() throws Exception {
+ new ArchiveExtensionLoader<ArchiveExtensionLoaderTest>(ArchiveExtensionLoaderTest.class)
+ .load(new MemoryMapArchiveImpl());
+ }
+
+ @Test(expected = RuntimeException.class)
+ public void shouldThrowExceptionOnWrongImplType() throws Exception {
+ new ArchiveExtensionLoader<WrongImplExtension>(WrongImplExtension.class)
+ .load(new MemoryMapArchiveImpl());
+ }
+
+ public static interface WrongImplExtension extends Specializer {
+
+ }
+
+ public static interface Extension extends Specializer {
+
+ }
+
+ public static class ExtensionImpl extends SpecializedBase implements Extension {
+
+ private Archive<?> archive;
+ public ExtensionImpl(Archive<?> archive)
+ {
+ this.archive = archive;
+ }
+
+ @Override
+ protected Archive<?> getArchive()
+ {
+ return archive;
+ }
+ }
+
+ public static class ExtensionImpl2 extends SpecializedBase implements Extension {
+
+ private Archive<?> archive;
+ public ExtensionImpl2(Archive<?> archive)
+ {
+ this.archive = archive;
+ }
+
+ @Override
+ protected Archive<?> getArchive()
+ {
+ return archive;
+ }
+ }
+}
Added: shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ArchiveExtensionLoaderTest$Extension
===================================================================
--- shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ArchiveExtensionLoaderTest$Extension (rev 0)
+++ shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ArchiveExtensionLoaderTest$Extension 2009-11-10 14:15:11 UTC (rev 3645)
@@ -0,0 +1 @@
+org.jboss.shrinkwrap.impl.base.ArchiveExtensionLoaderTest$ExtensionImpl
\ No newline at end of file
Added: shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ArchiveExtensionLoaderTest$WrongImplExtension
===================================================================
--- shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ArchiveExtensionLoaderTest$WrongImplExtension (rev 0)
+++ shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ArchiveExtensionLoaderTest$WrongImplExtension 2009-11-10 14:15:11 UTC (rev 3645)
@@ -0,0 +1 @@
+org.jboss.shrinkwrap.impl.base.ArchiveExtensionLoaderTest$ExtensionImpl
\ No newline at end of file
More information about the jboss-svn-commits
mailing list