[jboss-cvs] JBossAS SVN: r72285 - in projects/vfs/trunk/src: main/java/org/jboss/virtual/plugins/context and 5 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Apr 16 10:40:05 EDT 2008


Author: alesj
Date: 2008-04-16 10:40:05 -0400 (Wed, 16 Apr 2008)
New Revision: 72285

Modified:
   projects/vfs/trunk/src/main/java/org/jboss/virtual/VFSUtils.java
   projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/AbstractVirtualFileHandler.java
   projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/DelegatingHandler.java
   projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/file/FileHandler.java
   projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/AbstractStructuredJarHandler.java
   projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/JarEntryContents.java
   projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/JarEntryHandler.java
   projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/NoCopyNestedJarHandler.java
   projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/SynthenticDirEntryHandler.java
   projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledDirectoryHandler.java
   projects/vfs/trunk/src/main/java/org/jboss/virtual/spi/VirtualFileHandler.java
   projects/vfs/trunk/src/test/java/org/jboss/test/virtual/support/AbstractMockVirtualFileHandler.java
Log:
Initial commit on the unpack.
TODO on tests.

Modified: projects/vfs/trunk/src/main/java/org/jboss/virtual/VFSUtils.java
===================================================================
--- projects/vfs/trunk/src/main/java/org/jboss/virtual/VFSUtils.java	2008-04-16 14:10:52 UTC (rev 72284)
+++ projects/vfs/trunk/src/main/java/org/jboss/virtual/VFSUtils.java	2008-04-16 14:40:05 UTC (rev 72285)
@@ -21,8 +21,11 @@
 */
 package org.jboss.virtual;
 
+import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -40,6 +43,9 @@
 
 import org.jboss.logging.Logger;
 import org.jboss.util.StringPropertyReplacer;
+import org.jboss.virtual.plugins.context.file.FileSystemContext;
+import org.jboss.virtual.plugins.context.jar.AbstractJarHandler;
+import org.jboss.virtual.plugins.context.jar.NestedJarHandler;
 import org.jboss.virtual.spi.LinkInfo;
 import org.jboss.virtual.spi.VFSContext;
 import org.jboss.virtual.spi.VirtualFileHandler;
@@ -398,6 +404,9 @@
     */
    private static Map<String, String> getOptions(VirtualFile file)
    {
+      if (file == null)
+         throw new IllegalArgumentException("Null file");
+
       VirtualFileHandler handler = file.getHandler();
       VFSContext context = handler.getVFSContext();
       return context.getOptions();
@@ -443,4 +452,99 @@
 
       options.remove(USE_COPY_QUERY);
    }
+
+   /**
+    * Unpack the artifact under original param.
+    *
+    * @param file the file to unpack
+    * @return unpacked file
+    * @throws IOException for any io error
+    * @throws URISyntaxException for any uri error
+    */
+   public static VirtualFile unpack(VirtualFile file) throws IOException, URISyntaxException
+   {
+      if (file == null)
+         throw new IllegalArgumentException("Null file");
+      if (file.isLeaf())
+         return file;
+
+      VirtualFileHandler handler = file.getHandler();
+      // already unpacked
+      if (handler instanceof NestedJarHandler)
+         return file;
+      if (handler instanceof AbstractJarHandler == false)
+         throw new IllegalArgumentException("Can only handle jar files: " + file);
+
+      File unpacked = File.createTempFile("nestedjar", null);
+      unpack(handler, unpacked);
+      FileSystemContext fileSystemContext = new FileSystemContext(unpacked);
+      VirtualFileHandler newHandler = fileSystemContext.getRoot();
+      VirtualFileHandler parent = handler.getParent();
+      if (parent != null)
+         parent.replaceChild(handler, newHandler);
+
+      return newHandler.getVirtualFile();
+   }
+
+   /**
+    * Unpack the root into file.
+    * Repeat this on the root's children.
+    *
+    * @param root the root
+    * @param file the file
+    * @throws IOException for any error
+    */
+   private static void unpack(VirtualFileHandler root, File file) throws IOException
+   {
+      rewrite(root, file);
+      List<VirtualFileHandler> children = root.getChildren(true);
+      if (children != null && children.isEmpty() == false)
+      {
+         for (VirtualFileHandler handler : children)
+         {
+            File next = new File(file, handler.getName());
+            unpack(handler, next);
+         }
+      }
+   }
+
+   /**
+    * Rewrite contents of handler into file.
+    *
+    * @param handler the handler
+    * @param file the file
+    * @throws IOException for any error
+    */
+   private static void rewrite(VirtualFileHandler handler, File file) throws IOException
+   {
+      OutputStream out = new FileOutputStream(file);
+      InputStream in = handler.openStream();
+      try
+      {
+         byte[] bytes = new byte[1024];
+         while (in.available() > 0)
+         {
+            int length = in.read(bytes);
+            if (length > 0)
+               out.write(bytes, 0, length);
+         }
+      }
+      finally
+      {
+         try
+         {
+            in.close();
+         }
+         catch (IOException ignored)
+         {
+         }
+         try
+         {
+            out.close();
+         }
+         catch (IOException ignored)
+         {
+         }
+      }
+   }
 }

Modified: projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/AbstractVirtualFileHandler.java
===================================================================
--- projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/AbstractVirtualFileHandler.java	2008-04-16 14:10:52 UTC (rev 72284)
+++ projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/AbstractVirtualFileHandler.java	2008-04-16 14:40:05 UTC (rev 72285)
@@ -399,6 +399,27 @@
       return null;
    }
 
+   public void replaceChild(VirtualFileHandler original, VirtualFileHandler replacement)
+   {
+      internalReplaceChild(original, replacement);
+      if (replacement instanceof AbstractVirtualFileHandler)
+      {
+         AbstractVirtualFileHandler avfh = (AbstractVirtualFileHandler)replacement;
+         avfh.parent = this;
+      }
+   }
+
+   /**
+    * Replace original child with unpacked replacement.
+    *
+    * @param original the original
+    * @param replacement the replacement
+    */
+   protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement)
+   {
+      throw new UnsupportedOperationException("Replacement is unsupported: " + toString());
+   }
+
    @Override
    public String toString()
    {

Modified: projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/DelegatingHandler.java
===================================================================
--- projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/DelegatingHandler.java	2008-04-16 14:10:52 UTC (rev 72284)
+++ projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/DelegatingHandler.java	2008-04-16 14:40:05 UTC (rev 72285)
@@ -114,4 +114,9 @@
    {
       return delegate.toURL();
    }
+
+   protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement)
+   {
+      delegate.replaceChild(original, replacement);
+   }
 }

Modified: projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/file/FileHandler.java
===================================================================
--- projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/file/FileHandler.java	2008-04-16 14:10:52 UTC (rev 72284)
+++ projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/file/FileHandler.java	2008-04-16 14:40:05 UTC (rev 72285)
@@ -217,6 +217,11 @@
       return structuredFindChild(path);
    }
 
+   protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement)
+   {
+      childCache.put(original.getName(), replacement);
+   }
+
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
    {
       in.defaultReadObject();

Modified: projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/AbstractStructuredJarHandler.java
===================================================================
--- projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/AbstractStructuredJarHandler.java	2008-04-16 14:10:52 UTC (rev 72284)
+++ projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/AbstractStructuredJarHandler.java	2008-04-16 14:40:05 UTC (rev 72285)
@@ -316,6 +316,13 @@
       return vfh;
    }
 
+   protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement)
+   {
+      entries.remove(original);
+      entries.add(replacement);
+      entryMap.put(original.getName(), replacement);
+   }
+
    /**
     * Restore the jar file
     *

Modified: projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/JarEntryContents.java
===================================================================
--- projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/JarEntryContents.java	2008-04-16 14:10:52 UTC (rev 72284)
+++ projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/JarEntryContents.java	2008-04-16 14:40:05 UTC (rev 72285)
@@ -238,6 +238,13 @@
       return entryURL.toURI();
    }
 
+   protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement)
+   {
+      entryChildren.remove(original);
+      entryChildren.add(replacement);
+      entryMap.put(original.getName(), replacement);
+   }
+
    public String toString()
    {
       StringBuffer tmp = new StringBuffer(super.toString());

Modified: projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/JarEntryHandler.java
===================================================================
--- projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/JarEntryHandler.java	2008-04-16 14:10:52 UTC (rev 72284)
+++ projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/JarEntryHandler.java	2008-04-16 14:40:05 UTC (rev 72285)
@@ -163,4 +163,11 @@
    {
       return structuredFindChild(path);
    }
+
+   protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement)
+   {
+      entryChildren.remove(original);
+      entryChildren.add(replacement);
+      entryMap.put(original.getName(), replacement);
+   }
 }

Modified: projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/NoCopyNestedJarHandler.java
===================================================================
--- projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/NoCopyNestedJarHandler.java	2008-04-16 14:10:52 UTC (rev 72284)
+++ projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/NoCopyNestedJarHandler.java	2008-04-16 14:40:05 UTC (rev 72285)
@@ -134,4 +134,9 @@
    {
       return njar.getChildren(ignoreErrors);
    }
+
+   protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement)
+   {
+      njar.internalReplaceChild(original, replacement);
+   }
 }

Modified: projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/SynthenticDirEntryHandler.java
===================================================================
--- projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/SynthenticDirEntryHandler.java	2008-04-16 14:10:52 UTC (rev 72284)
+++ projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/jar/SynthenticDirEntryHandler.java	2008-04-16 14:40:05 UTC (rev 72285)
@@ -180,4 +180,11 @@
    {
       return structuredFindChild(path);
    }
+
+   protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement)
+   {
+      entryChildren.remove(original);
+      entryChildren.add(replacement);
+      entryMap.put(original.getName(), replacement);
+   }
 }

Modified: projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledDirectoryHandler.java
===================================================================
--- projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledDirectoryHandler.java	2008-04-16 14:10:52 UTC (rev 72284)
+++ projects/vfs/trunk/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledDirectoryHandler.java	2008-04-16 14:40:05 UTC (rev 72285)
@@ -148,4 +148,11 @@
    {
       return getVfsUrl();
    }
+
+   protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement)
+   {
+      children.remove(original);
+      children.add(replacement);
+      childrenMap.put(original.getName(), replacement);
+   }
 }

Modified: projects/vfs/trunk/src/main/java/org/jboss/virtual/spi/VirtualFileHandler.java
===================================================================
--- projects/vfs/trunk/src/main/java/org/jboss/virtual/spi/VirtualFileHandler.java	2008-04-16 14:10:52 UTC (rev 72284)
+++ projects/vfs/trunk/src/main/java/org/jboss/virtual/spi/VirtualFileHandler.java	2008-04-16 14:40:05 UTC (rev 72285)
@@ -193,4 +193,12 @@
     * Close the resources
     */
    void close();
+
+   /**
+    * Replace child.
+    *
+    * @param original the original
+    * @param replacement the replacement
+    */
+   void replaceChild(VirtualFileHandler original, VirtualFileHandler replacement);
 }

Modified: projects/vfs/trunk/src/test/java/org/jboss/test/virtual/support/AbstractMockVirtualFileHandler.java
===================================================================
--- projects/vfs/trunk/src/test/java/org/jboss/test/virtual/support/AbstractMockVirtualFileHandler.java	2008-04-16 14:10:52 UTC (rev 72284)
+++ projects/vfs/trunk/src/test/java/org/jboss/test/virtual/support/AbstractMockVirtualFileHandler.java	2008-04-16 14:40:05 UTC (rev 72285)
@@ -269,6 +269,12 @@
       return MockVFSContext.createMockURL(uri);
    }
 
+   protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement)
+   {
+      children.remove(original);
+      children.add(replacement);
+   }
+
    @Override
    public VirtualFileHandler getParent() throws IOException
    {




More information about the jboss-cvs-commits mailing list