[jboss-svn-commits] JBoss Common SVN: r4443 - in shrinkwrap/trunk: impl-base/src/test/java/org/jboss/shrinkwrap/impl/base and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed May 26 12:00:46 EDT 2010


Author: ALRubinger
Date: 2010-05-26 12:00:45 -0400 (Wed, 26 May 2010)
New Revision: 4443

Added:
   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/ShrinkWrap.java
   shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ShrinkWrapTestCase.java
Log:
[SHRINKWRAP-163] Make archive name optional in ShrinkWrap.create and ArchiveFactory.create.  Original patch by Ken Gullaksen with some adjustments by ALR:
Added UnknownExtensionTypeException
Made JavaDoc more explicit
Removed impl-base test class to get the extension names; the test should define these on its own so we do not pass the test if the API accidentally changes extension mappings

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-05-25 18:23:20 UTC (rev 4442)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ArchiveFactory.java	2010-05-26 16:00:45 UTC (rev 4443)
@@ -16,6 +16,10 @@
  */
 package org.jboss.shrinkwrap.api;
 
+import java.util.UUID;
+
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+
 /**
  * Responsible for creating {@link Archive}s, which may be
  * presented to the caller in a designated {@link Assignable} view.
@@ -51,7 +55,8 @@
     * Creates a new {@link ArchiveFactory} which will use the supplied 
     * {@link Configuration} for each new {@link Archive} it creates.
     * 
-    * @param configuration
+    * @param configuration the {@link Configuration} to use
+    * @throws IllegalArgumentException if configuration is not supplied
     */
    ArchiveFactory(final Configuration configuration) throws IllegalArgumentException
    {
@@ -70,23 +75,82 @@
     * Creates a new archive of the specified type.  The archive
     * will be be backed by the {@link Configuration}
     * specific to this {@link ArchiveFactory}.
-    * 
+    *
+    * Deprecated as part of SHRINKWRAP-163
+    * Use {@link ArchiveFactory#create(Class, String)} instead.
+    *
     * @param archiveName The name of the archive
-    * @return An {@link Assignable} archive base  
+    * @param type The type of the archive e.g. {@link org.jboss.shrinkwrap.api.spec.WebArchive}
+    * @return An {@link Assignable} archive base
     * @throws IllegalArgumentException If either argument is not specified
     */
+   @Deprecated
    public <T extends Assignable> T create(final String archiveName, final Class<T> type)
          throws IllegalArgumentException
    {
+      return create(type, archiveName);
+   }
+
+   /**
+    * Creates a new archive of the specified type.  The archive
+    * 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#getExtensionMapping()}s.
+    * If no extension is found for the given type an {@link UnknownExtensionTypeException}
+    * is thrown.
+    *
+    * @param type The type of the archive e.g. {@link WebArchive}
+    * @return An {@link Assignable} archive base
+    * @throws IllegalArgumentException if type is not specified
+    * @throws UnknownExtensionTypeException If no extension mapping is found for the specified type
+    */
+   public <T extends Assignable> T create(final Class<T> type)
+      throws IllegalArgumentException, UnknownExtensionTypeException
+   {
       // Precondition checks
-      if (archiveName == null)
+      if (type == null)
       {
-         throw new IllegalArgumentException("ArchiveName must be specified");
+         throw new IllegalArgumentException("Type must be specified");
       }
+
+      // Get the extension type
+      final ExtensionType extensionType = configuration.getExtensionMapping().get(type);
+      if (extensionType == null)
+      {
+         throw UnknownExtensionTypeException.newInstance(type);
+      }
+      
+      // Generate a random name
+      String archiveName = UUID.randomUUID().toString();
+      
+      // Delegate
+      return create(type, archiveName += extensionType);
+   }
+
+   /**
+    * Creates a new archive of the specified type.  The archive
+    * will be be backed by the {@link Configuration}
+    * 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
+    * @return An {@link Assignable} archive base
+    * @throws IllegalArgumentException either argument is not supplied
+    */
+   public <T extends Assignable> T create(final Class<T> type, final String archiveName)
+      throws IllegalArgumentException
+   {
+      // Precondition checks
       if (type == null)
       {
          throw new IllegalArgumentException("Type must be specified");
       }
+      if (archiveName == null)
+      {
+         throw new IllegalArgumentException("ArchiveName must be specified");
+      }
 
       final Archive<?> archive = SecurityActions.newInstance(ARCHIVE_IMPL, new Class<?>[]
       {String.class, Configuration.class}, new Object[]

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-05-25 18:23:20 UTC (rev 4442)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/Configuration.java	2010-05-26 16:00:45 UTC (rev 4443)
@@ -16,6 +16,7 @@
  */
 package org.jboss.shrinkwrap.api;
 
+import java.util.Map;
 import java.util.concurrent.ExecutorService;
 
 /**
@@ -31,6 +32,7 @@
  * {@link Domain}s when creating {@link Archive}s.
  * 
  * @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 class Configuration
@@ -53,6 +55,8 @@
     */
    private final ExecutorService executorService;
 
+   private final Map<Class<?>, ExtensionType> extensionMapping;
+
    //-------------------------------------------------------------------------------------||
    // Constructor ------------------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
@@ -75,6 +79,7 @@
       // Set 
       this.extensionLoader = builder.getExtensionLoader();
       this.executorService = builder.getExecutorService();
+      this.extensionMapping = builder.getExtensionMapping();
    }
 
    //-------------------------------------------------------------------------------------||
@@ -97,4 +102,11 @@
       return executorService;
    }
 
+   /**
+    * @return the extensionMapping
+    */
+   public Map<Class<?>, ExtensionType> getExtensionMapping()
+   {
+      return extensionMapping;
+   }
 }

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-05-25 18:23:20 UTC (rev 4442)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ConfigurationBuilder.java	2010-05-26 16:00:45 UTC (rev 4443)
@@ -16,6 +16,13 @@
  */
 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;
@@ -33,6 +40,7 @@
  * constructed by calling upon {@link ConfigurationBuilder#build()}.
  *
  * @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 class ConfigurationBuilder
@@ -65,6 +73,11 @@
     */
    private ExecutorService executorService;
 
+   /**
+    * Mapping between {@link org.jboss.shrinkwrap.api.Assignable}  and {@link org.jboss.shrinkwrap.api.ExtensionType}
+    */
+   private Map<Class<?>, ExtensionType> extensionMapping;
+
    //-------------------------------------------------------------------------------------||
    // Constructor ------------------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
@@ -99,6 +112,14 @@
    }
 
    /**
+    * @return the extensionMapping
+    */
+   public Map<Class<?>, ExtensionType> getExtensionMapping()
+   {
+      return extensionMapping;
+   }
+
+   /**
     * Sets the {@link ExtensionLoader} to be used, returning this instance
     * 
     * @param extensionLoader
@@ -122,6 +143,17 @@
    }
 
    /**
+    *  Sets the extensionMapping to be used, returning this instance
+    * @param extensionMapping the extensionMapping
+    * @return the ConfigurationBuilder
+    */
+   public ConfigurationBuilder extensionMapping(final Map<Class<?>, ExtensionType> extensionMapping)
+   {
+      this.extensionMapping = extensionMapping;
+      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.
@@ -157,10 +189,18 @@
          }
          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.extensionMapping(extensionMapping);
+      }
    }
 
    /**
-    * Obtains the default {@link ExtensionLoader} to be used if none 
+    * Obtains the default {@link ExtensionLoader} to be used if none
     * is specified
     * @return
     */
@@ -171,4 +211,20 @@
       {}, ExtensionLoader.class);
    }
 
+   /**
+    * Creates and populates the default extensionMapping
+    * @return the extensionMapping
+    */
+   private Map<Class<?>, ExtensionType> createDefaultExtensionMapping()
+   {
+      extensionMapping = new HashMap<Class<?>, ExtensionType>();
+
+      extensionMapping.put(WebArchive.class, ExtensionType.WAR);
+      extensionMapping.put(JavaArchive.class, ExtensionType.JAR);
+      extensionMapping.put(EnterpriseArchive.class, ExtensionType.EAR);
+      extensionMapping.put(ResourceAdapterArchive.class, ExtensionType.RAR);
+
+      return extensionMapping;
+   }
+
 }

Added: shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ExtensionType.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ExtensionType.java	                        (rev 0)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ExtensionType.java	2010-05-26 16:00:45 UTC (rev 4443)
@@ -0,0 +1,46 @@
+/*
+ * 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/ShrinkWrap.java
===================================================================
--- shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ShrinkWrap.java	2010-05-25 18:23:20 UTC (rev 4442)
+++ shrinkwrap/trunk/api/src/main/java/org/jboss/shrinkwrap/api/ShrinkWrap.java	2010-05-26 16:00:45 UTC (rev 4443)
@@ -16,6 +16,8 @@
  */
 package org.jboss.shrinkwrap.api;
 
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+
 /**
  * Main entry point into the ShrinkWrap system.  Each {@link Archive}
  * has an associated {@link Configuration}
@@ -30,6 +32,7 @@
  * {@link ShrinkWrap#createDomain(Configuration)}.
  *
  * @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 ShrinkWrap
@@ -113,7 +116,7 @@
     * Returns a single domain with default configuration
     * for use in applications with no explicit configuration
     * or isolation requirements.
-    * @return
+    * @return default {@link Domain}
     */
    public static Domain getDefaultDomain()
    {
@@ -129,9 +132,13 @@
     * by {@link ShrinkWrap#getDefaultDomain()}.
     * 
     * @param archiveName The name of the archive
-    * @return An {@link Assignable} archive base  
+    * @param type The type of the archive e.g. {@link WebArchive}
+    * @return An {@link Assignable} archive base
     * @throws IllegalArgumentException If either argument is not specified
+    * @deprecated As part of SHRINKWRAP-163
+    * Use {@link ShrinkWrap#create(Class, String)} instead.
     */
+   @Deprecated
    public static <T extends Assignable> T create(final String archiveName, final Class<T> type)
          throws IllegalArgumentException
    {
@@ -146,9 +153,71 @@
       }
 
       // Delegate to the default domain's archive factory for creation
-      return ShrinkWrap.getDefaultDomain().getArchiveFactory().create(archiveName, type);
+      return ShrinkWrap.getDefaultDomain().getArchiveFactory().create(type, archiveName);
    }
 
+   /**
+    * Creates a new archive of the specified type.  The archive
+    * will be be backed by the default {@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 the default {@link Domain}'s 
+    * {@link Configuration#getExtensionMapping()}s.
+    * If no extension is found for the given type an {@link UnknownExtensionTypeException}
+    * is thrown.
+    * Invoking this method is functionally equivalent to calling
+    * {@link ArchiveFactory#create(Class)} upon
+    * {@link Domain#getArchiveFactory()} upon the domain returned
+    * by {@link ShrinkWrap#getDefaultDomain()}.
+    *
+    * @param type The type of the archive e.g. {@link WebArchive}
+    * @return An {@link Assignable} archive base
+    * @throws IllegalArgumentException if type is not specified
+    * @throws UnknownExtensionTypeException If no extension mapping is found for the specified type
+    */
+   public static <T extends Assignable> T create(final Class<T> type)
+      throws IllegalArgumentException
+   {
+      // Precondition checks
+      if (type == null)
+      {
+         throw new IllegalArgumentException("Type must be specified");
+      }
+
+      // Delegate to the default domain's archive factory for creation
+      return ShrinkWrap.getDefaultDomain().getArchiveFactory().create(type);
+   }
+
+   /**
+    * Creates a new archive of the specified type.  The archive
+    * will be be backed by the default {@link Configuration}.
+    * Invoking this method is functionally equivalent to calling
+    * {@link ArchiveFactory#create(String, Class)} upon
+    * {@link Domain#getArchiveFactory()} upon the domain returned
+    * by {@link ShrinkWrap#getDefaultDomain()}.
+    *
+    * @param type The type of the archive e.g. {@link WebArchive}
+    * @param archiveName The name of the archive
+    * @return An {@link Assignable} archive base
+    * @throws IllegalArgumentException either argument is not specified
+    */
+   public static <T extends Assignable> T create(final Class<T> type, final String archiveName)
+      throws IllegalArgumentException
+   {
+      // Precondition checks
+      if (type == null)
+      {
+         throw new IllegalArgumentException("Type must be specified");
+      }
+      if (archiveName == null || archiveName.length() == 0)
+      {
+         throw new IllegalArgumentException("ArchiveName must be specified");
+      }
+
+      // Delegate to the default domain's archive factory for creation
+      return ShrinkWrap.getDefaultDomain().getArchiveFactory().create(type, archiveName);
+   }
+
    //-------------------------------------------------------------------------------------||
    // Internal Helper Members ------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||

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-05-25 18:23:20 UTC (rev 4442)
+++ shrinkwrap/trunk/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ShrinkWrapTestCase.java	2010-05-26 16:00:45 UTC (rev 4443)
@@ -32,7 +32,10 @@
 import org.jboss.shrinkwrap.api.ExtensionLoader;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.formatter.Formatter;
+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 org.jboss.shrinkwrap.impl.base.container.ContainerBase;
 import org.junit.Test;
 
@@ -58,7 +61,7 @@
    public void createNewArchiveUnderDefaultDomain()
    {
       final String archiveName = "test.war";
-      final JavaArchive archive = ShrinkWrap.create(archiveName, JavaArchive.class);
+      final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, archiveName);
 
       // Test
       Assert.assertNotNull("A archive should have been created", archive);
@@ -183,13 +186,79 @@
    {
       final Domain domain = ShrinkWrap.createDomain();
       domain.getConfiguration().getExtensionLoader().addOverride(JavaArchive.class, MockJavaArchiveImpl.class);
-      final JavaArchive archive = domain.getArchiveFactory().create("test.jar", JavaArchive.class);
+      final JavaArchive archive = domain.getArchiveFactory().create(JavaArchive.class, "test.jar");
 
       Assert.assertEquals("Should have overridden normal JavaArchive impl", MockJavaArchiveImpl.class, archive
             .getClass());
 
    }
 
+   @Test
+   public void shouldCreateArchiveWithCorrectExtensionForJavaArchive() throws Exception
+   {
+      JavaArchive javaArchive = ShrinkWrap.create(JavaArchive.class);
+      String archiveExtension = javaArchive.getName().substring(javaArchive.getName().lastIndexOf("."));
+      Assert.assertEquals("JavaArchive should have proper extension", ".jar", archiveExtension);
+   }
+
+   @Test
+   public void shouldCreateJavaArchiveWithGivenName() throws Exception
+   {
+      String archiveName = "testArchive";
+      JavaArchive javaArchive = ShrinkWrap.create(JavaArchive.class, archiveName);
+      Assert.assertEquals("JavaArchive should have given name", archiveName, javaArchive.getName());
+   }
+
+   @Test
+   public void shouldCreateArchiveWithCorrectExtensionForWebArchive() throws Exception
+   {
+      WebArchive webArchive = ShrinkWrap.create(WebArchive.class);
+      String archiveExtension = webArchive.getName().substring(webArchive.getName().lastIndexOf("."));
+      Assert.assertEquals("WebArchive should have proper extension", ".war", archiveExtension);
+   }
+
+   @Test
+   public void shouldCreateWebArchiveWithGivenName() throws Exception
+   {
+      String archiveName = "testArchive";
+      WebArchive webArchive = ShrinkWrap.create(WebArchive.class, archiveName);
+      Assert.assertEquals("WebArchive should have given name", archiveName, webArchive.getName());
+   }
+
+   @Test
+   public void shouldCreateArchiveWithCorrectExtensionForEnterpriseArchive() throws Exception
+   {
+      EnterpriseArchive enterpriseArchive = ShrinkWrap.create(EnterpriseArchive.class);
+      String archiveExtension = enterpriseArchive.getName().substring(enterpriseArchive.getName().lastIndexOf("."));
+      Assert.assertEquals("EnterpriseArchive should have proper extension", ".ear", archiveExtension);
+   }
+
+   @Test
+   public void shouldCreateEnterpriseArchiveWithGivenName() throws Exception
+   {
+      String archiveName = "testArchive";
+      EnterpriseArchive enterpriseArchive = ShrinkWrap.create(EnterpriseArchive.class, archiveName);
+      Assert.assertEquals("EnterpriseArchive should have given name", archiveName, enterpriseArchive.getName());
+   }
+
+   @Test
+   public void shouldCreateArchiveWithCorrectExtensionForResourceAdapterArchive() throws Exception
+   {
+      ResourceAdapterArchive resourceAdapterArchive = ShrinkWrap.create(ResourceAdapterArchive.class);
+      String archiveExtension = resourceAdapterArchive.getName().substring(
+            resourceAdapterArchive.getName().lastIndexOf("."));
+      Assert.assertEquals("ResourceAdapterArchive should have proper extension", ".rar", archiveExtension);
+   }
+
+   @Test
+   public void shouldCreateResourceAdapterArchiveWithGivenName() throws Exception
+   {
+      String archiveName = "testArchive";
+      ResourceAdapterArchive resourceAdapterArchive = ShrinkWrap.create(ResourceAdapterArchive.class, archiveName);
+      Assert.assertEquals("ResourceAdapterArchive should have given name", archiveName, resourceAdapterArchive
+            .getName());
+   }
+
    //-------------------------------------------------------------------------------------||
    // Internal Helper Members ------------------------------------------------------------||
    //-------------------------------------------------------------------------------------||



More information about the jboss-svn-commits mailing list