Author: pauls
Date: Fri Jan 31 22:53:44 2020
New Revision: 1873450

URL: http://svn.apache.org/viewvc?rev=1873450&view=rev
Log:
Implement getEntryAsContent

Modified:
    
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/URLHandlers.java
    
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java
    
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/BundleArchive.java
    
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/ConnectContentContent.java
    
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/ConnectRevision.java

Modified: 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/URLHandlers.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/URLHandlers.java?rev=1873450&r1=1873449&r2=1873450&view=diff
==============================================================================
--- 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/URLHandlers.java
 (original)
+++ 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/URLHandlers.java
 Fri Jan 31 22:53:44 2020
@@ -117,7 +117,7 @@ class URLHandlers implements URLStreamHa
             ? DEFAULT_STREAM_HANDLER_PACKAGE
             : pkgs + "|" + DEFAULT_STREAM_HANDLER_PACKAGE;
         m_loaded = (null != URLHandlersStreamHandlerProxy.class) &&
-            (null != URLHandlersContentHandlerProxy.class) && (null != 
URLStreamHandlerService.class);
+            (null != URLHandlersContentHandlerProxy.class) && (null != 
URLStreamHandlerService.class) && new URLHandlersStreamHandlerProxy(null, null) 
!= null;
     }
 
     private void init(String protocol, URLStreamHandlerFactory factory)

Modified: 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java?rev=1873450&r1=1873449&r2=1873450&view=diff
==============================================================================
--- 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java
 (original)
+++ 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/URLHandlersStreamHandlerProxy.java
 Fri Jan 31 22:53:44 2020
@@ -138,7 +138,7 @@ public class URLHandlersStreamHandlerPro
         m_builtInURL = builtInURL;
     }
 
-    private URLHandlersStreamHandlerProxy(Object service, SecureAction action)
+    URLHandlersStreamHandlerProxy(Object service, SecureAction action)
     {
         m_protocol = null;
         m_service = service;

Modified: 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/BundleArchive.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/BundleArchive.java?rev=1873450&r1=1873449&r2=1873450&view=diff
==============================================================================
--- 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/BundleArchive.java
 (original)
+++ 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/BundleArchive.java
 Fri Jan 31 22:53:44 2020
@@ -825,7 +825,7 @@ public class BundleArchive
             }
             else if (m_module != null)
             {
-                result = new ConnectRevision(m_logger, m_configMap, 
revisionRootDir, location, m_module);
+                result = new ConnectRevision(m_logger, m_configMap, 
m_zipFactory, revisionRootDir, location, m_module);
             }
             else
             {

Modified: 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/ConnectContentContent.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/ConnectContentContent.java?rev=1873450&r1=1873449&r2=1873450&view=diff
==============================================================================
--- 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/ConnectContentContent.java
 (original)
+++ 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/ConnectContentContent.java
 Fri Jan 31 22:53:44 2020
@@ -18,23 +18,41 @@
  */
 package org.apache.felix.framework.cache;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.util.Enumeration;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Optional;
 
+import org.apache.felix.framework.Logger;
+import org.apache.felix.framework.util.WeakZipFileFactory;
 import org.osgi.framework.connect.ConnectContent;
 
 public class ConnectContentContent implements Content
 {
+    private static final transient String EMBEDDED_DIRECTORY = "-embedded";
+    private static final transient String LIBRARY_DIRECTORY = "-lib";
 
+    private final Logger m_logger;
+    private final WeakZipFileFactory m_zipFactory;
+    private final Map m_configMap;
+    private final String m_name;
+    private final File m_rootDir;
+    private final Object m_revisionLock;
     private final ConnectContent m_content;
 
-    public ConnectContentContent(ConnectContent content) throws IOException
+    public ConnectContentContent(Logger logger, WeakZipFileFactory zipFactory, 
Map configMap, String name, File rootDir, Object revisionLock, ConnectContent 
content) throws IOException
     {
-       m_content = content;
+        m_logger = logger;
+        m_zipFactory = zipFactory;
+        m_configMap = configMap;
+        m_name = name;
+        m_rootDir = rootDir;
+        m_revisionLock = revisionLock;
+        m_content = content;
     }
 
     @Override
@@ -118,7 +136,61 @@ public class ConnectContentContent imple
     @Override
     public Content getEntryAsContent(String name)
     {
-        // TODO: Connect
+        if (".".equals(name) || "".equals(name)) {
+            return this;
+        }
+        String dir = name.endsWith("/") ? name : name + "/";
+
+        if (hasEntry(dir)) {
+            return new ContentDirectoryContent(this, name);
+        }
+
+        if (hasEntry(name) && name.endsWith(".jar"))
+        {
+            // Any embedded JAR files will be extracted to the embedded 
directory.
+            // Since embedded JAR file names may clash when extracting from 
multiple
+            // embedded JAR files, the embedded directory is per embedded JAR 
file.
+            File embedDir = new File(m_rootDir, m_name + EMBEDDED_DIRECTORY);
+
+            File extractJar = new File(embedDir, name);
+
+            try
+            {
+                if (!BundleCache.getSecureAction().fileExists(extractJar))
+                {
+                    // Extracting the embedded JAR file impacts all other 
existing
+                    // contents for this revision, so we have to grab the 
revision
+                    // lock first before trying to extract the embedded JAR 
file
+                    // to avoid a race condition.
+                    synchronized (m_revisionLock)
+                    {
+                        if 
(!BundleCache.getSecureAction().fileExists(extractJar))
+                        {
+                            // Make sure that the embedded JAR's parent 
directory exists;
+                            // it may be in a sub-directory.
+                            File jarDir = extractJar.getParentFile();
+                            if 
(!BundleCache.getSecureAction().fileExists(jarDir) && 
!BundleCache.getSecureAction().mkdirs(jarDir))
+                            {
+                                throw new IOException("Unable to create 
embedded JAR directory.");
+                            }
+
+                            // Extract embedded JAR into its directory.
+                            
BundleCache.copyStreamToFile(m_content.getEntry(name).get().getInputStream(), 
extractJar);
+                        }
+                    }
+                }
+                return new JarContent(
+                    m_logger, m_configMap, m_zipFactory, m_revisionLock,
+                    extractJar.getParentFile(), extractJar, null);
+            }
+            catch (Exception ex)
+            {
+                m_logger.log(
+                    Logger.LOG_ERROR,
+                    "Unable to extract embedded JAR file.", ex);
+            }
+        }
+
         return null;
     }
 

Modified: 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/ConnectRevision.java
URL: 
http://svn.apache.org/viewvc/felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/ConnectRevision.java?rev=1873450&r1=1873449&r2=1873450&view=diff
==============================================================================
--- 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/ConnectRevision.java
 (original)
+++ 
felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/cache/ConnectRevision.java
 Fri Jan 31 22:53:44 2020
@@ -27,16 +27,20 @@ import java.util.Optional;
 
 import org.apache.felix.framework.Logger;
 import org.apache.felix.framework.util.StringMap;
+import org.apache.felix.framework.util.WeakZipFileFactory;
 import org.osgi.framework.connect.ConnectContent;
 import org.osgi.framework.connect.ConnectModule;
 
 public class ConnectRevision extends BundleArchiveRevision
 {
+    private final WeakZipFileFactory m_zipFactory;
     private final ConnectContent m_module;
 
-    public ConnectRevision(Logger logger, Map configMap, File revisionRootDir, 
String location, ConnectModule module) throws Exception
+    public ConnectRevision(Logger logger, Map configMap, WeakZipFileFactory 
zipFactory,
+        File revisionRootDir, String location, ConnectModule module) throws 
Exception
     {
         super(logger, configMap, revisionRootDir, location);
+        m_zipFactory = zipFactory;
         m_module = module.getContent().open();
         // If the revision directory exists, then we don't
         // need to initialize since it has already been done.
@@ -74,7 +78,7 @@ public class ConnectRevision extends Bun
     @Override
     public Content getContent() throws Exception
     {
-        return new ConnectContentContent(m_module);
+        return new ConnectContentContent(getLogger(), m_zipFactory, 
getConfig(), "connect", getRevisionRootDir(), this, m_module);
     }
 
     @Override


Reply via email to