[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