[jboss-svn-commits] JBoss Common SVN: r4555 - in shrinkwrap/trunk: extension-glassfish/src/main/resources/META-INF/services and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Jun 25 10:23:09 EDT 2010


Author: kenglxn
Date: 2010-06-25 10:23:08 -0400 (Fri, 25 Jun 2010)
New Revision: 4555

Added:
   shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/api/UnknownExtensionTypeExceptionDelegator.java
   shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ExtensionWrapper.java
Removed:
   shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ExtensionType.java
Modified:
   shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ArchiveFactory.java
   shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Configuration.java
   shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ConfigurationBuilder.java
   shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ExtensionLoader.java
   shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/UnknownExtensionTypeException.java
   shrinkwrap/trunk/extension-glassfish/src/main/resources/META-INF/services/org.jboss.shrinkwrap.glassfish.api.ShrinkwrapReadableArchive
   shrinkwrap/trunk/extension-jetty/src/main/resources/META-INF/services/org.jboss.shrinkwrap.jetty.api.ShrinkWrapWebAppContext
   shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ServiceExtensionLoader.java
   shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.exporter.ExplodedExporter
   shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.exporter.ZipExporter
   shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.importer.ExplodedImporter
   shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.importer.ZipImporter
   shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.serialization.SerializableView
   shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.serialization.ZipSerializableView
   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.ResourceAdapterArchive
   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.spi.Configurable
   shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ConfigurationBuilderTestCase.java
   shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ShrinkWrapTestCase.java
   shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ServiceExtensionLoaderTestCase$Extension
   shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ServiceExtensionLoaderTestCase$WrongImplExtension
Log:
SHRINKWRAP-183 - Rework configuration mechanism for type mappings to default extensions

Moved the ExtensionMapping map from Configuration to ExtensionLoader.
Added method to ExtensionLoader to get the extension from the mapping.
Added ExtensionWrapper, and changed the extensionMapping to contain it as the value field.
Updated all META-INF/services files. 
The loading of services files now throws a pretty exception if the file does not contain implementingClassName property.
The ServiceExtensionLoader now exposes the extension via getExtensionFromExtensionMapping. It also initializes the extensionMapping.
Added a delegator to be able to use UnknownExtensionTypeException from impl-base. Also removed code in UnknownExtensionTypeException that was no longer relevant.


Modified: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ArchiveFactory.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ArchiveFactory.java	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ArchiveFactory.java	2010-06-25 14:23:08 UTC (rev 4555)
@@ -31,6 +31,7 @@
  * presented to the caller in a designated {@link Assignable} view.
  *
  * @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
+ * @author <a href="mailto:ken at glxn.net">Ken Gullaksen</a>
  * @version $Revision: $
  */
 public final class ArchiveFactory
@@ -82,8 +83,7 @@
     * will be be backed by the {@link Configuration}
     * specific to this {@link ArchiveFactory}.
     * Generates a random name for the archive and adds proper extension based 
-    * on the type mappings found in this {@link Domain}'s 
-    * {@link Configuration#getExtensionMappings()}s.
+    * on {@link ExtensionLoader#getExtensionFromExtensionMapping(Class)}.
     * If no extension is found for the given type an {@link UnknownExtensionTypeException}
     * is thrown.
     *
@@ -101,18 +101,14 @@
          throw new IllegalArgumentException("Type must be specified");
       }
 
-      // Get the extension type
-      final ExtensionType extensionType = configuration.getExtensionMappings().get(type);
-      if (extensionType == null)
-      {
-         throw UnknownExtensionTypeException.newInstance(type);
-      }
+      // Get the extensionType type
+      final String extension = configuration.getExtensionLoader().getExtensionFromExtensionMapping(type);
 
       // Generate a random name
       String archiveName = UUID.randomUUID().toString();
 
       // Delegate
-      return create(type, archiveName += extensionType);
+      return create(type, archiveName += extension);
    }
 
    /**
@@ -152,7 +148,7 @@
     * specific to this {@link ArchiveFactory}.
     *
     * @param type The type of the archive e.g. {@link org.jboss.shrinkwrap.api.spec.WebArchive}
-    * @param archiveName the archiveName to use
+    * @param archiveFile the archiveFile to use
     * @return An {@link Assignable} view
     * @throws IllegalArgumentException If either argument is not supplied, if the specified
     * {@link File} does not exist, or is not a valid ZIP file

Modified: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Configuration.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Configuration.java	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Configuration.java	2010-06-25 14:23:08 UTC (rev 4555)
@@ -16,7 +16,6 @@
  */
 package org.jboss.shrinkwrap.api;
 
-import java.util.Map;
 import java.util.concurrent.ExecutorService;
 
 /**
@@ -55,8 +54,6 @@
     */
    private final ExecutorService executorService;
 
-   private final Map<Class<?>, ExtensionType> extensionMappings;
-
    //-------------------------------------------------------------------------------------||
    // Constructor ------------------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
@@ -79,7 +76,6 @@
       // Set 
       this.extensionLoader = builder.getExtensionLoader();
       this.executorService = builder.getExecutorService();
-      this.extensionMappings = builder.getExtensionMapping();
    }
 
    //-------------------------------------------------------------------------------------||
@@ -101,12 +97,4 @@
    {
       return executorService;
    }
-
-   /**
-    * @return the extensionMapping
-    */
-   public Map<Class<?>, ExtensionType> getExtensionMappings()
-   {
-      return extensionMappings;
-   }
 }

Modified: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ConfigurationBuilder.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ConfigurationBuilder.java	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ConfigurationBuilder.java	2010-06-25 14:23:08 UTC (rev 4555)
@@ -16,13 +16,6 @@
  */
 package org.jboss.shrinkwrap.api;
 
-import org.jboss.shrinkwrap.api.spec.EnterpriseArchive;
-import org.jboss.shrinkwrap.api.spec.JavaArchive;
-import org.jboss.shrinkwrap.api.spec.ResourceAdapterArchive;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
-
-import java.util.HashMap;
-import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -73,11 +66,6 @@
     */
    private ExecutorService executorService;
 
-   /**
-    * Mapping between {@link org.jboss.shrinkwrap.api.Assignable}  and {@link org.jboss.shrinkwrap.api.ExtensionType}
-    */
-   private Map<Class<?>, ExtensionType> extensionMappings;
-
    //-------------------------------------------------------------------------------------||
    // Constructor ------------------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
@@ -111,13 +99,6 @@
       return executorService;
    }
 
-   /**
-    * @return the extensionMapping
-    */
-   public Map<Class<?>, ExtensionType> getExtensionMapping()
-   {
-      return extensionMappings;
-   }
 
    /**
     * Sets the {@link ExtensionLoader} to be used, returning this instance
@@ -143,17 +124,6 @@
    }
 
    /**
-    *  Sets the extensionMapping to be used, returning this instance
-    * @param extensionMappings the extensionMapping
-    * @return the ConfigurationBuilder
-    */
-   public ConfigurationBuilder extensionMappings(final Map<Class<?>, ExtensionType> extensionMappings)
-   {
-      this.extensionMappings = extensionMappings;
-      return this;
-   }
-
-   /**
     * Builds a new {@link Configuration} using the properties contained
     * in this builder.  In the case a property has not been specified, it will be defaulted
     * according to the rules set forth in this {@link ConfigurationBuilder}'s contract.
@@ -189,14 +159,6 @@
          }
          this.extensionLoader(loader);
       }
-      if(getExtensionMapping() == null) {
-         final Map<Class<?>, ExtensionType> extensionMapping = createDefaultExtensionMapping();
-         if (log.isLoggable(Level.FINER))
-         {
-            log.finer("User has not defined an explicit extensionMapping; defaulting to " + extensionMapping);
-         }
-         this.extensionMappings(extensionMapping);
-      }
    }
 
    /**
@@ -211,20 +173,4 @@
       {}, ExtensionLoader.class);
    }
 
-   /**
-    * Creates and populates the default extensionMapping
-    * @return the extensionMapping
-    */
-   private Map<Class<?>, ExtensionType> createDefaultExtensionMapping()
-   {
-      extensionMappings = new HashMap<Class<?>, ExtensionType>();
-
-      extensionMappings.put(WebArchive.class, ExtensionType.WAR);
-      extensionMappings.put(JavaArchive.class, ExtensionType.JAR);
-      extensionMappings.put(EnterpriseArchive.class, ExtensionType.EAR);
-      extensionMappings.put(ResourceAdapterArchive.class, ExtensionType.RAR);
-
-      return extensionMappings;
-   }
-
 }

Modified: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ExtensionLoader.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ExtensionLoader.java	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ExtensionLoader.java	2010-06-25 14:23:08 UTC (rev 4555)
@@ -22,6 +22,7 @@
  * Describes a way for the {@link Archive} to load extensions.
  *
  * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @author <a href="mailto:ken at glxn.net">Ken Gullaksen</a>
  * @version $Revision: $
  */
 public interface ExtensionLoader
@@ -50,5 +51,13 @@
     */
    public <T extends Assignable> ExtensionLoader addOverride(
          Class<T> extensionClass, 
-         Class<? extends T> extensionImplClass); 
+         Class<? extends T> extensionImplClass);
+
+   /**
+    * Gets the extension for the given type from the extensionMapping
+    * @param extensionClass The Extension interface class
+    * @param <T> The type of Extension
+    * @return the filename extension
+    */
+   public <T extends Assignable> String getExtensionFromExtensionMapping(Class<T> extensionClass);
 }

Deleted: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ExtensionType.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ExtensionType.java	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ExtensionType.java	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1,46 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, 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;
-
-/**
- * Class to help provide correct extension 
- * in {@link ArchiveFactory#create(Class)} 
- *
- * @author <a href="mailto:ken at glxn.net">Ken Gullaksen</a>
- * @version $Revision: $
- */
-class ExtensionType
-{
-   static final ExtensionType WAR = new ExtensionType("war");
-   static final ExtensionType JAR = new ExtensionType("jar");
-   static final ExtensionType EAR = new ExtensionType("ear");
-   static final ExtensionType RAR = new ExtensionType("rar");
-   private static final String DOT_DELIMITER = ".";
-   private final String extension;
-
-   private ExtensionType(String extension)
-   {
-      this.extension = extension;
-   }
-
-   @Override
-   public String toString()
-   {
-      return DOT_DELIMITER + extension;
-   }
-}

Modified: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/UnknownExtensionTypeException.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/UnknownExtensionTypeException.java	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/UnknownExtensionTypeException.java	2010-06-25 14:23:08 UTC (rev 4555)
@@ -14,17 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.jboss.shrinkwrap.api;
 
-import java.lang.reflect.Method;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
 /**
  * Indicates that a default name cannot be generated for
  * a given type because no extension mapping has been configured
- * via {@link Configuration#getExtensionMappings()}.  
- * 
+ * via {@link ExtensionLoader#getExtensionFromExtensionMapping(Class)}.
+ *
  * @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
  * @version $Revision: $
  */
@@ -40,45 +37,17 @@
     */
    private static final long serialVersionUID = 1L;
 
-   /**
-    * Method used in the error message instructing a developer how to add new extension
-    * mappings
-    */
-   private static final Method GET_EXTENSION_MAPPING;
-   static
-   {
-      GET_EXTENSION_MAPPING = AccessController.doPrivileged(new PrivilegedAction<Method>()
-      {
-
-         @Override
-         public Method run()
-         {
-            try
-            {
-               return Configuration.class.getMethod("getExtensionMappings", new Class<?>[]
-               {});
-            }
-            catch (final NoSuchMethodException e)
-            {
-               throw new RuntimeException(
-                     "Incorrect extension mappings method defined for error message; development error in ShrinkWrap");
-            }
-         }
-      });
-   }
-
    //-------------------------------------------------------------------------------------||
    // Constructor ------------------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
 
    /**
-    * Creates a new instance with message indicating the missing type 
+    * Creates a new instance with message indicating the missing type
     */
    private <T extends Assignable> UnknownExtensionTypeException(final Class<T> type)
    {
       super("The current configuration has no mapping for type " + type.getCanonicalName()
-            + ", unable to determine extension. Either add a mapping via " + GET_EXTENSION_MAPPING.toString()
-            + " or manually assign a name.");
+            + ", unable to determine extension. You should provide extension in the services descriptor file");
    }
 
    //-------------------------------------------------------------------------------------||
@@ -87,7 +56,7 @@
 
    /**
     * Creates a new {@link UnknownExtensionTypeException} for the specified type
-    * 
+    *
     * @throws IllegalArgumentException If the type is not specified
     */
    static <T extends Assignable> UnknownExtensionTypeException newInstance(final Class<T> type)

Modified: shrinkwrap/trunk/extension-glassfish/src/main/resources/META-INF/services/org.jboss.shrinkwrap.glassfish.api.ShrinkwrapReadableArchive
===================================================================
--- shrinkwrap/trunk/extension-glassfish/src/main/resources/META-INF/services/org.jboss.shrinkwrap.glassfish.api.ShrinkwrapReadableArchive	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/extension-glassfish/src/main/resources/META-INF/services/org.jboss.shrinkwrap.glassfish.api.ShrinkwrapReadableArchive	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1 @@
-org.jboss.shrinkwrap.glassfish.impl.ShrinkwrapReadableArchiveImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.glassfish.impl.ShrinkwrapReadableArchiveImpl
\ No newline at end of file

Modified: shrinkwrap/trunk/extension-jetty/src/main/resources/META-INF/services/org.jboss.shrinkwrap.jetty.api.ShrinkWrapWebAppContext
===================================================================
--- shrinkwrap/trunk/extension-jetty/src/main/resources/META-INF/services/org.jboss.shrinkwrap.jetty.api.ShrinkWrapWebAppContext	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/extension-jetty/src/main/resources/META-INF/services/org.jboss.shrinkwrap.jetty.api.ShrinkWrapWebAppContext	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1 @@
-org.jboss.shrinkwrap.jetty.api.ShrinkWrapWebAppContext
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.jetty.api.ShrinkWrapWebAppContext
\ No newline at end of file

Added: shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/api/UnknownExtensionTypeExceptionDelegator.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/api/UnknownExtensionTypeExceptionDelegator.java	                        (rev 0)
+++ shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/api/UnknownExtensionTypeExceptionDelegator.java	2010-06-25 14:23:08 UTC (rev 4555)
@@ -0,0 +1,39 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, 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;
+
+/**
+ * UnknownExtensionTypeExceptionDelegator
+ * Delegator added to be able to reach {@link UnknownExtensionTypeException} from impl-base
+ *
+ * @author <a href="mailto:ken at glxn.net">Ken Gullaksen</a>
+ * @version $Revision: $
+ */
+public class UnknownExtensionTypeExceptionDelegator
+{
+   /**
+    *
+    * @param type The Extension interface class
+    * @param <T> The type of extension
+    * @return an UnknownExtensionTypeException to be thrown
+    */
+   public static <T extends Assignable> UnknownExtensionTypeException newExceptionInstance(Class<T> type)
+   {
+      return UnknownExtensionTypeException.newInstance(type);
+   }
+}

Added: shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ExtensionWrapper.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ExtensionWrapper.java	                        (rev 0)
+++ shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ExtensionWrapper.java	2010-06-25 14:23:08 UTC (rev 4555)
@@ -0,0 +1,66 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, 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.Assignable;
+
+import java.util.Map;
+
+/**
+ * ExtensionWrapper
+ * Wrapper used in the extensionMapping of {@link org.jboss.shrinkwrap.api.ExtensionLoader}
+ * Initialized in {@link org.jboss.shrinkwrap.impl.base.ServiceExtensionLoader#loadExtensionMapping(Class)}
+ *
+ * @author <a href="mailto:ken at glxn.net">Ken Gullaksen</a>
+ * @version $Revision: $
+ */
+class ExtensionWrapper
+{
+
+   final Map<String, String> properties;
+
+   final String implementingClassName;
+
+   final Class<? extends Assignable> extension;
+
+   public ExtensionWrapper(String implementingClassName, Map<String, String> properties, Class<? extends Assignable> extension)
+   {
+      this.properties = properties;
+      this.implementingClassName = implementingClassName;
+      this.extension = extension;
+   }
+
+   /**
+    * Gets the value for the given key in the properties map.
+    * If the property is not found, an exception is thrown.
+    *
+    * @param key the key to look up value for
+    * @return value of the property
+    * @throws RuntimeException if the property is not found
+    */
+   public String getProperty(String key)
+   {
+      String value = properties.get(key);
+      if(value == null)
+      {
+         throw new RuntimeException("No property value found for key " + key);
+      }
+      return value;
+   }
+
+}

Modified: shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ServiceExtensionLoader.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ServiceExtensionLoader.java	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ServiceExtensionLoader.java	2010-06-25 14:23:08 UTC (rev 4555)
@@ -24,17 +24,19 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Properties;
 import java.util.logging.Logger;
 
 import org.jboss.shrinkwrap.api.Archive;
 import org.jboss.shrinkwrap.api.ExtensionLoader;
 import org.jboss.shrinkwrap.api.Assignable;
-import org.jboss.shrinkwrap.impl.base.io.IOUtil;
+import org.jboss.shrinkwrap.api.UnknownExtensionTypeExceptionDelegator;
 
 /**
  * ServiceExtensionLoader
  *
  * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @author <a href="mailto:ken at glxn.net">Ken Gullaksen</a>
  * @version $Revision: $
  */
 public class ServiceExtensionLoader implements ExtensionLoader
@@ -54,6 +56,8 @@
    
    private ClassLoader classLoader = SecurityActions.getThreadContextClassLoader();
    private Map<Class<?>, Class<?>> cache = new HashMap<Class<?>, Class<?>>();
+   private Map<Class<?>, ExtensionWrapper> extensionMappings = new HashMap<Class<?>, ExtensionWrapper>();
+
    
    //-------------------------------------------------------------------------------------||
    // Required Implementations - ExtensionLoader -----------------------------------------||
@@ -115,10 +119,28 @@
       return this;
    }
 
+   /* (non-Javadoc)
+    * @see org.jboss.shrinkwrap.api.ExtensionLoader#getExtensionFromExtensionMapping(java.lang.Class)
+    */
+   public <T extends Assignable> String getExtensionFromExtensionMapping(Class<T> type)
+   {
+
+      ExtensionWrapper extensionWrapper = extensionMappings.get(type);
+      if (extensionWrapper == null) {
+         loadExtensionMapping(type);
+      }
+      extensionWrapper = extensionMappings.get(type);
+      if (extensionWrapper == null)
+      {
+         throw UnknownExtensionTypeExceptionDelegator.newExceptionInstance(type);
+      }
+      return extensionWrapper.getProperty("extension");
+   }
+
    /**
     * Check to see if a specific extension interface is beeing overloaded
     * 
-    * @param extensionClass The Extension interface class
+    * @param extensionClass The ExtensionType interface class
     * @return true if found
     */
    public boolean isOverriden(Class<?> extensionClass) 
@@ -131,24 +153,38 @@
    // Internal Helper Methods - Loading --------------------------------------------------||
    //-------------------------------------------------------------------------------------||
    
-   private <T extends Assignable> T createFromLoadExtension(Class<T> extensionClass, Archive<?> archive) 
+   private <T extends Assignable> T createFromLoadExtension(Class<T> extensionClass, Archive<?> archive)
    {
-      Class<T> extensionImplClass = loadExtension(extensionClass);
-      if(!extensionClass.isAssignableFrom(extensionImplClass)) 
+      ExtensionWrapper extensionWrapper = loadExtensionMapping(extensionClass);
+      if (extensionWrapper == null)
       {
+         throw new RuntimeException("Failed to load ExtensionMapping");
+      }
+
+      Class<T> extensionImplClass = loadExtension(extensionWrapper);
+
+      if (!extensionClass.isAssignableFrom(extensionImplClass)) {
          throw new RuntimeException(
-               "Found extension impl class " + extensionImplClass.getName() + 
+            "Found extension impl class " + extensionImplClass.getName() +
                " not assignable to extension interface " + extensionClass.getName());
       }
       return createExtension(extensionImplClass, archive);
    }
 
-   private <T extends Assignable> Class<T> loadExtension(Class<T> extensionClass) 
+   private <T extends Assignable> Class<T> loadExtension(ExtensionWrapper extensionWrapper)
    {
+      return loadExtensionClass(extensionWrapper.implementingClassName);
+   }
+
+   private <T extends Assignable> ExtensionWrapper loadExtensionMapping(Class<T> extensionClass)   
+   {
       URL extensionImplUrl = findExtensionImpl(extensionClass);
-      String extensionImplClassName = loadExtensionName(extensionImplUrl);
-      return loadExtensionClass(extensionImplClassName);
+
+      ExtensionWrapper extensionWrapper = loadExtensionWrapper(extensionImplUrl, extensionClass);
+      this.extensionMappings.put(extensionClass, extensionWrapper);
+      return extensionWrapper;
    }
+
    
    private <T extends Assignable> URL findExtensionImpl(Class<T> extensionClass) 
    {
@@ -177,24 +213,30 @@
       } 
       catch (Exception e) 
       {
-         throw new RuntimeException("Could not find any mapping for extension " + extensionClass.getName(), e);
+         throw UnknownExtensionTypeExceptionDelegator.newExceptionInstance(extensionClass);
       }
    }
 
-   private String loadExtensionName(URL extensionURL) 
+   @SuppressWarnings({"unchecked"})
+   private <T extends Assignable> ExtensionWrapper loadExtensionWrapper(URL extensionURL, Class<T> extensionClass)
    {
-      try 
+      Properties properties = new Properties();
+      try
       {
-         return new String(IOUtil.asByteArray(extensionURL.openStream()));
-      } 
-      catch (IOException e) 
+         properties.load(extensionURL.openStream());
+      } catch (IOException e) {
+         throw new RuntimeException("Could not open stream for extensionURL " + extensionURL, e);
+      }
+      String implementingClassName = (String) properties.get("implementingClassName");
+      if(implementingClassName == null)
       {
-         throw new RuntimeException("Could not read extension mapping " + extensionURL, e);
+         throw new RuntimeException("Property implementingClassName is not present in " + extensionURL);
       }
+      return new ExtensionWrapper(implementingClassName, new HashMap<String, String>((Map) properties), extensionClass);
    }
 
    @SuppressWarnings("unchecked")
-   private <T extends Assignable> Class<T> loadExtensionClass(String extensionClassName)  
+   private <T extends Assignable> Class<T> loadExtensionClass(String extensionClassName)
    {
       try 
       {

Modified: shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.exporter.ExplodedExporter
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.exporter.ExplodedExporter	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.exporter.ExplodedExporter	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1 @@
-org.jboss.shrinkwrap.impl.base.exporter.ExplodedExporterImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.impl.base.exporter.ExplodedExporterImpl
\ No newline at end of file

Modified: shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.exporter.ZipExporter
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.exporter.ZipExporter	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.exporter.ZipExporter	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1 @@
-org.jboss.shrinkwrap.impl.base.exporter.ZipExporterImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.impl.base.exporter.ZipExporterImpl
\ No newline at end of file

Modified: shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.importer.ExplodedImporter
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.importer.ExplodedImporter	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.importer.ExplodedImporter	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1 @@
-org.jboss.shrinkwrap.impl.base.importer.ExplodedImporterImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.impl.base.importer.ExplodedImporterImpl
\ No newline at end of file

Modified: shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.importer.ZipImporter
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.importer.ZipImporter	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.importer.ZipImporter	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1 @@
-org.jboss.shrinkwrap.impl.base.importer.ZipImporterImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.impl.base.importer.ZipImporterImpl
\ No newline at end of file

Modified: shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.serialization.SerializableView
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.serialization.SerializableView	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.serialization.SerializableView	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1 @@
-org.jboss.shrinkwrap.impl.base.serialization.ZipSerializableViewImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.impl.base.serialization.ZipSerializableViewImpl
\ No newline at end of file

Modified: shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.serialization.ZipSerializableView
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.serialization.ZipSerializableView	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.serialization.ZipSerializableView	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1 @@
-org.jboss.shrinkwrap.impl.base.serialization.ZipSerializableViewImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.impl.base.serialization.ZipSerializableViewImpl
\ No newline at end of file

Modified: 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	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.EnterpriseArchive	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1,2 @@
-org.jboss.shrinkwrap.impl.base.spec.EnterpriseArchiveImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.impl.base.spec.EnterpriseArchiveImpl
+extension=.ear
\ No newline at end of file

Modified: 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	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.JavaArchive	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1,2 @@
-org.jboss.shrinkwrap.impl.base.spec.JavaArchiveImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.impl.base.spec.JavaArchiveImpl
+extension=.jar
\ No newline at end of file

Modified: shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.ResourceAdapterArchive
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.ResourceAdapterArchive	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.ResourceAdapterArchive	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1,2 @@
-org.jboss.shrinkwrap.impl.base.spec.ResourceAdapterArchiveImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.impl.base.spec.ResourceAdapterArchiveImpl
+extension=.rar
\ No newline at end of file

Modified: 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	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.api.spec.WebArchive	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1,2 @@
-org.jboss.shrinkwrap.impl.base.spec.WebArchiveImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.impl.base.spec.WebArchiveImpl
+extension=.war
\ No newline at end of file

Modified: shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.spi.Configurable
===================================================================
--- shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.spi.Configurable	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/main/resources/META-INF/services/org.jboss.shrinkwrap.spi.Configurable	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1 @@
-org.jboss.shrinkwrap.impl.base.ConfigurableArchiveImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.impl.base.ConfigurableArchiveImpl
\ No newline at end of file

Modified: shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ConfigurationBuilderTestCase.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ConfigurationBuilderTestCase.java	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ConfigurationBuilderTestCase.java	2010-06-25 14:23:08 UTC (rev 4555)
@@ -138,6 +138,12 @@
          {
             return null;
          }
+
+         @Override
+         public String getExtensionFromExtensionMapping(Class type)
+         {
+            return null;
+         }
       };
 
       // Supply and build

Modified: shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ShrinkWrapTestCase.java
===================================================================
--- shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ShrinkWrapTestCase.java	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ShrinkWrapTestCase.java	2010-06-25 14:23:08 UTC (rev 4555)
@@ -393,6 +393,12 @@
       {
          return null;
       }
+
+      @Override
+      public String getExtensionFromExtensionMapping(Class type)
+      {
+         return null;
+      }
    }
 
    /**

Modified: shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ServiceExtensionLoaderTestCase$Extension
===================================================================
--- shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ServiceExtensionLoaderTestCase$Extension	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ServiceExtensionLoaderTestCase$Extension	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1 @@
-org.jboss.shrinkwrap.impl.base.ServiceExtensionLoaderTestCase$ExtensionImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.impl.base.ServiceExtensionLoaderTestCase$ExtensionImpl
\ No newline at end of file

Modified: shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ServiceExtensionLoaderTestCase$WrongImplExtension
===================================================================
--- shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ServiceExtensionLoaderTestCase$WrongImplExtension	2010-06-25 07:22:54 UTC (rev 4554)
+++ shrinkwrap/trunk/impl-base/src/test/resources/META-INF/services/org.jboss.shrinkwrap.impl.base.ServiceExtensionLoaderTestCase$WrongImplExtension	2010-06-25 14:23:08 UTC (rev 4555)
@@ -1 +1 @@
-org.jboss.shrinkwrap.impl.base.ServiceExtensionLoaderTestCase$ExtensionImpl
\ No newline at end of file
+implementingClassName=org.jboss.shrinkwrap.impl.base.ServiceExtensionLoaderTestCase$ExtensionImpl
\ No newline at end of file



More information about the jboss-svn-commits mailing list