You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pa...@apache.org on 2020/01/31 22:53:45 UTC

svn commit: r1873450 - in /felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework: URLHandlers.java URLHandlersStreamHandlerProxy.java cache/BundleArchive.java cache/ConnectContentContent.java cache/ConnectRevision.java

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