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