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/09/18 08:26:08 UTC
[felix-dev] branch connect updated: Use content time of zip entries
where possible and clean up some code
This is an automated email from the ASF dual-hosted git repository.
pauls pushed a commit to branch connect
in repository https://gitbox.apache.org/repos/asf/felix-dev.git
The following commit(s) were added to refs/heads/connect by this push:
new 2bbc9b3 Use content time of zip entries where possible and clean up some code
2bbc9b3 is described below
commit 2bbc9b320a3223842a17d087e8fdbf771f8bc858
Author: Karl Pauls <ka...@gmail.com>
AuthorDate: Fri Sep 18 10:25:54 2020 +0200
Use content time of zip entries where possible and clean up some code
---
.../apache/felix/framework/BundleRevisionImpl.java | 9 +--
.../apache/felix/framework/BundleWiringImpl.java | 2 +-
.../apache/felix/framework/ExtensionManager.java | 6 ++
.../felix/framework/FrameworkWiringImpl.java | 3 -
.../org/apache/felix/framework/WovenClassImpl.java | 53 ++++++---------
.../framework/cache/ConnectContentContent.java | 1 +
.../org/apache/felix/framework/cache/Content.java | 2 +
.../framework/cache/ContentDirectoryContent.java | 41 ++++++------
.../felix/framework/cache/DirectoryContent.java | 36 ++++++-----
.../apache/felix/framework/cache/JarContent.java | 17 ++++-
.../felix/framework/util/MultiReleaseContent.java | 6 ++
.../apache/felix/framework/util/SecureAction.java | 24 +++++++
.../framework/wiring/BundleCapabilityImpl.java | 75 ++--------------------
.../framework/wiring/BundleRequirementImpl.java | 4 +-
14 files changed, 125 insertions(+), 154 deletions(-)
diff --git a/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java b/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java
index 8d5d4b9..5aa9daa 100644
--- a/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/BundleRevisionImpl.java
@@ -28,7 +28,6 @@ import java.util.Enumeration;
import java.util.List;
import java.util.Map;
-import org.apache.felix.framework.cache.ConnectContentContent;
import org.apache.felix.framework.cache.Content;
import org.apache.felix.framework.util.FelixConstants;
import org.apache.felix.framework.util.MultiReleaseContent;
@@ -641,12 +640,8 @@ public class BundleRevisionImpl implements BundleRevision, Resource
else {
content = getContentPath().get(index - 1);
}
- if (content instanceof ConnectContentContent) {
- return ((ConnectContentContent) content).getContentTime(urlPath);
- }
- else {
- return m_bundle.getLastModified();
- }
+ long result = content.getContentTime(urlPath);
+ return result > 0 ? result : m_bundle.getLastModified();
}
public URL getLocalURL(int index, String urlPath)
diff --git a/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java b/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
index 15ae43d..ac30c0a 100644
--- a/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
@@ -2071,7 +2071,7 @@ public class BundleWiringImpl implements BundleWiring
catch (Error e)
{
// Mark the woven class as incomplete.
- wci.complete(null, null, null);
+ wci.complete();
wci.setState(WovenClass.TRANSFORMING_FAILED);
callWovenClassListeners(felix, wovenClassListeners, wci);
throw e;
diff --git a/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java b/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
index 21613e2..26c4077 100644
--- a/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
+++ b/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
@@ -897,6 +897,12 @@ class ExtensionManager implements Content
return null;
}
+ @Override
+ public long getContentTime(String name)
+ {
+ return -1L;
+ }
+
//
// Utility methods.
//
diff --git a/framework/src/main/java/org/apache/felix/framework/FrameworkWiringImpl.java b/framework/src/main/java/org/apache/felix/framework/FrameworkWiringImpl.java
index 7bc42ce..f051ac0 100644
--- a/framework/src/main/java/org/apache/felix/framework/FrameworkWiringImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/FrameworkWiringImpl.java
@@ -63,9 +63,6 @@ class FrameworkWiringImpl implements FrameworkWiring, Runnable
* thread explicitly is required in the embedded case, where Felix may be
* stopped without the Java VM being stopped. In this case the
* FelixFrameworkWiring thread must be stopped explicitly.
- * <p>
- * This method is called by the
- * {@link PackageAdminActivator#stop(BundleContext)} method.
*/
void stop()
{
diff --git a/framework/src/main/java/org/apache/felix/framework/WovenClassImpl.java b/framework/src/main/java/org/apache/felix/framework/WovenClassImpl.java
index 9459f2f..837b58a 100644
--- a/framework/src/main/java/org/apache/felix/framework/WovenClassImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/WovenClassImpl.java
@@ -52,12 +52,10 @@ class WovenClassImpl implements WovenClass, List<String>
m_state = TRANSFORMING;
}
- synchronized void complete(Class definedClass, byte[] bytes,
- List<String> imports)
+ synchronized void complete()
{
- completeDefine(definedClass);
- m_bytes = (bytes == null) ? m_bytes : bytes;
- completeImports(imports);
+ completeDefine(null);
+ completeImports(null);
}
synchronized void completeImports(List<String> imports)
@@ -66,7 +64,7 @@ class WovenClassImpl implements WovenClass, List<String>
: Util.newImmutableList(imports);
}
- synchronized void completeDefine(Class definedClass)
+ synchronized void completeDefine(Class<?> definedClass)
{
m_definedClass = definedClass;
}
@@ -191,14 +189,12 @@ class WovenClassImpl implements WovenClass, List<String>
{
try
{
- List<BundleRequirement> reqs = ManifestParser
+ ManifestParser
.parseDynamicImportHeader(null, null, s);
} catch (Exception ex)
{
- RuntimeException re = new IllegalArgumentException(
- "Unable to parse dynamic import.");
- re.initCause(ex);
- throw re;
+ throw new IllegalArgumentException(
+ "Unable to parse dynamic import.", ex);
}
checkImport(s);
return m_imports.add(s);
@@ -244,14 +240,12 @@ class WovenClassImpl implements WovenClass, List<String>
{
try
{
- List<BundleRequirement> reqs = ManifestParser
+ ManifestParser
.parseDynamicImportHeader(null, null, s);
} catch (Exception ex)
{
- RuntimeException re = new IllegalArgumentException(
- "Unable to parse dynamic import.");
- re.initCause(ex);
- throw re;
+ throw new IllegalArgumentException(
+ "Unable to parse dynamic import.", ex);
}
checkImport(s);
}
@@ -271,14 +265,12 @@ class WovenClassImpl implements WovenClass, List<String>
{
try
{
- List<BundleRequirement> reqs = ManifestParser
+ ManifestParser
.parseDynamicImportHeader(null, null, s);
} catch (Exception ex)
{
- RuntimeException re = new IllegalArgumentException(
- "Unable to parse dynamic import.");
- re.initCause(ex);
- throw re;
+ throw new IllegalArgumentException(
+ "Unable to parse dynamic import.", ex);
}
checkImport(s);
}
@@ -333,14 +325,12 @@ class WovenClassImpl implements WovenClass, List<String>
}
try
{
- List<BundleRequirement> reqs = ManifestParser
+ ManifestParser
.parseDynamicImportHeader(null, null, s);
} catch (Exception ex)
{
- RuntimeException re = new IllegalArgumentException(
- "Unable to parse dynamic import.");
- re.initCause(ex);
- throw re;
+ throw new IllegalArgumentException(
+ "Unable to parse dynamic import.", ex);
}
checkImport(s);
return m_imports.set(i, s);
@@ -356,14 +346,13 @@ class WovenClassImpl implements WovenClass, List<String>
}
try
{
- List<BundleRequirement> reqs = ManifestParser
+ ManifestParser
.parseDynamicImportHeader(null, null, s);
- } catch (Exception ex)
+ }
+ catch (Exception ex)
{
- RuntimeException re = new IllegalArgumentException(
- "Unable to parse dynamic import.");
- re.initCause(ex);
- throw re;
+ throw new IllegalArgumentException(
+ "Unable to parse dynamic import.", ex);
}
checkImport(s);
m_imports.add(i, s);
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/ConnectContentContent.java b/framework/src/main/java/org/apache/felix/framework/cache/ConnectContentContent.java
index 7a985ac..bc0bd0e 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/ConnectContentContent.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/ConnectContentContent.java
@@ -208,6 +208,7 @@ public class ConnectContentContent implements Content
return null;
}
+ @Override
public long getContentTime(String urlPath)
{
return m_content.getEntry(urlPath).flatMap(entry -> Optional.of(entry.getLastModified())).orElse(-1L);
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/Content.java b/framework/src/main/java/org/apache/felix/framework/cache/Content.java
index 09ace44..79580c9 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/Content.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/Content.java
@@ -121,4 +121,6 @@ public interface Content
* or null if not possible.
*/
URL getEntryAsURL(String name);
+
+ long getContentTime(String urlPath);
}
\ No newline at end of file
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java b/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java
index a1b3367..e1f04ac 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/ContentDirectoryContent.java
@@ -47,10 +47,7 @@ public class ContentDirectoryContent implements Content
public boolean hasEntry(String name) throws IllegalStateException
{
- if ((name.length() > 0) && (name.charAt(0) == '/'))
- {
- name = name.substring(1);
- }
+ name = getName(name);
return m_content.hasEntry(m_rootPath + name);
}
@@ -63,10 +60,7 @@ public class ContentDirectoryContent implements Content
public byte[] getEntryAsBytes(String name) throws IllegalStateException
{
- if ((name.length() > 0) && (name.charAt(0) == '/'))
- {
- name = name.substring(1);
- }
+ name = getName(name);
return m_content.getEntryAsBytes(m_rootPath + name);
}
@@ -74,35 +68,42 @@ public class ContentDirectoryContent implements Content
public InputStream getEntryAsStream(String name)
throws IllegalStateException, IOException
{
- if ((name.length() > 0) && (name.charAt(0) == '/'))
- {
- name = name.substring(1);
- }
+ name = getName(name);
return m_content.getEntryAsStream(m_rootPath + name);
}
+ private String getName(String name)
+ {
+ if ((name.length() > 0) && (name.charAt(0) == '/')) {
+ name = name.substring(1);
+ }
+ return name;
+ }
+
public URL getEntryAsURL(String name)
{
return m_content.getEntryAsURL(m_rootPath + name);
}
+ @Override
+ public long getContentTime(String name)
+ {
+ name = getName(name);
+
+ return m_content.getContentTime(m_rootPath + name);
+ }
+
public Content getEntryAsContent(String name)
{
- if ((name.length() > 0) && (name.charAt(0) == '/'))
- {
- name = name.substring(1);
- }
+ name = getName(name);
return m_content.getEntryAsContent(m_rootPath + name);
}
public String getEntryAsNativeLibrary(String name)
{
- if ((name.length() > 0) && (name.charAt(0) == '/'))
- {
- name = name.substring(1);
- }
+ name = getName(name);
return m_content.getEntryAsNativeLibrary(m_rootPath + name);
}
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java b/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java
index 50da934..9046e17 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/DirectoryContent.java
@@ -72,10 +72,7 @@ public class DirectoryContent implements Content
public boolean hasEntry(String name) throws IllegalStateException
{
- if ((name.length() > 0) && (name.charAt(0) == '/'))
- {
- name = name.substring(1);
- }
+ name = getName(name);
// Return true if the file associated with the entry exists,
// unless the entry name ends with "/", in which case only
@@ -97,10 +94,7 @@ public class DirectoryContent implements Content
public byte[] getEntryAsBytes(String name) throws IllegalStateException
{
- if ((name.length() > 0) && (name.charAt(0) == '/'))
- {
- name = name.substring(1);
- }
+ name = getName(name);
// Get the embedded resource.
@@ -122,10 +116,7 @@ public class DirectoryContent implements Content
public InputStream getEntryAsStream(String name)
throws IllegalStateException, IOException
{
- if ((name.length() > 0) && (name.charAt(0) == '/'))
- {
- name = name.substring(1);
- }
+ name = getName(name);
File file = new File(m_dir, name);
try
@@ -141,12 +132,17 @@ public class DirectoryContent implements Content
}
}
- public URL getEntryAsURL(String name)
+ private String getName(String name)
{
- if ((name.length() > 0) && (name.charAt(0) == '/'))
- {
+ if ((name.length() > 0) && (name.charAt(0) == '/')) {
name = name.substring(1);
}
+ return name;
+ }
+
+ public URL getEntryAsURL(String name)
+ {
+ name = getName(name);
if (hasEntry(name))
{
@@ -165,6 +161,16 @@ public class DirectoryContent implements Content
}
}
+ @Override
+ public long getContentTime(String name)
+ {
+ name = getName(name);
+
+ File file = new File(m_dir, name);
+
+ return BundleCache.getSecureAction().getLastModified(file);
+ }
+
public Content getEntryAsContent(String entryName)
{
// If the entry name refers to the content itself, then
diff --git a/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java b/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java
index 885137a..79c2249 100644
--- a/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java
+++ b/framework/src/main/java/org/apache/felix/framework/cache/JarContent.java
@@ -112,9 +112,6 @@ public class JarContent implements Content
{
return false;
}
- finally
- {
- }
}
public Enumeration<String> getEntries()
@@ -195,6 +192,20 @@ public class JarContent implements Content
}
}
+ @Override
+ public long getContentTime(String urlPath)
+ {
+ try
+ {
+ ZipEntry ze = m_zipFile.getEntry(urlPath);
+ return ze.getTime();
+ }
+ catch (Exception ex)
+ {
+ return -1L;
+ }
+ }
+
public Content getEntryAsContent(String entryName)
{
// If the entry name refers to the content itself, then
diff --git a/framework/src/main/java/org/apache/felix/framework/util/MultiReleaseContent.java b/framework/src/main/java/org/apache/felix/framework/util/MultiReleaseContent.java
index 9653029..eed4553 100644
--- a/framework/src/main/java/org/apache/felix/framework/util/MultiReleaseContent.java
+++ b/framework/src/main/java/org/apache/felix/framework/util/MultiReleaseContent.java
@@ -164,6 +164,12 @@ public class MultiReleaseContent implements Content
return m_content.getEntryAsURL(findPath(name));
}
+ @Override
+ public long getContentTime(String name)
+ {
+ return m_content.getContentTime(findPath(name));
+ }
+
private String findPath(String path)
{
String internalPath = path;
diff --git a/framework/src/main/java/org/apache/felix/framework/util/SecureAction.java b/framework/src/main/java/org/apache/felix/framework/util/SecureAction.java
index 559075e..a37f524 100644
--- a/framework/src/main/java/org/apache/felix/framework/util/SecureAction.java
+++ b/framework/src/main/java/org/apache/felix/framework/util/SecureAction.java
@@ -1616,6 +1616,27 @@ public class SecureAction
}
}
+ public long getLastModified(File file)
+ {
+ if (System.getSecurityManager() != null)
+ {
+ Actions actions = (Actions) m_actions.get();
+ actions.set(Actions.LAST_MODIFIED, file);
+ try
+ {
+ return (Long) AccessController.doPrivileged(actions, m_acc);
+ }
+ catch (PrivilegedActionException e)
+ {
+ throw (RuntimeException) e.getException();
+ }
+ }
+ else
+ {
+ return file.lastModified();
+ }
+ }
+
private static class Actions implements PrivilegedExceptionAction
{
public static final int INITIALIZE_CONTEXT_ACTION = 0;
@@ -1677,6 +1698,7 @@ public class SecureAction
public static final int INVOKE_WOVEN_CLASS_LISTENER = 56;
public static final int GET_CANONICAL_PATH = 57;
public static final int CREATE_PROXY = 58;
+ public static final int LAST_MODIFIED = 59;
private int m_action = -1;
private Object m_arg1 = null;
@@ -1940,6 +1962,8 @@ public class SecureAction
case CREATE_PROXY:
return Proxy.newProxyInstance((ClassLoader)arg1, (Class<?>[])arg2,
(InvocationHandler) arg3);
+ case LAST_MODIFIED:
+ return ((File) arg1).lastModified();
}
return null;
diff --git a/framework/src/main/java/org/apache/felix/framework/wiring/BundleCapabilityImpl.java b/framework/src/main/java/org/apache/felix/framework/wiring/BundleCapabilityImpl.java
index 9fa3806..f426ad1 100644
--- a/framework/src/main/java/org/apache/felix/framework/wiring/BundleCapabilityImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/wiring/BundleCapabilityImpl.java
@@ -25,7 +25,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
-import org.apache.felix.framework.capabilityset.SimpleFilter;
import org.apache.felix.framework.util.Util;
import org.apache.felix.framework.util.manifestparser.ManifestParser;
import org.osgi.framework.Constants;
@@ -41,8 +40,6 @@ public class BundleCapabilityImpl implements BundleCapability
private final Map<String, String> m_dirs;
private final Map<String, Object> m_attrs;
private final List<String> m_uses;
- private final List<List<String>> m_includeFilter;
- private final List<List<String>> m_excludeFilter;
private final Set<String> m_mandatory;
public BundleCapabilityImpl(BundleRevision revision, String namespace,
@@ -55,13 +52,13 @@ public class BundleCapabilityImpl implements BundleCapability
// Find all export directives: uses, mandatory, include, and exclude.
- List<String> uses = Collections.EMPTY_LIST;
+ List<String> uses = Collections.emptyList();
String value = m_dirs.get(Constants.USES_DIRECTIVE);
if (value != null)
{
// Parse these uses directive.
StringTokenizer tok = new StringTokenizer(value, ",");
- uses = new ArrayList(tok.countTokens());
+ uses = new ArrayList<>(tok.countTokens());
while (tok.hasMoreTokens())
{
uses.add(tok.nextToken().trim());
@@ -69,44 +66,12 @@ public class BundleCapabilityImpl implements BundleCapability
}
m_uses = uses;
- value = m_dirs.get(Constants.INCLUDE_DIRECTIVE);
- if (value != null)
- {
- List<String> filters = ManifestParser.parseDelimitedString(value, ",");
- m_includeFilter = new ArrayList<List<String>>(filters.size());
- for (int filterIdx = 0; filterIdx < filters.size(); filterIdx++)
- {
- List<String> substrings = SimpleFilter.parseSubstring(filters.get(filterIdx));
- m_includeFilter.add(substrings);
- }
- }
- else
- {
- m_includeFilter = null;
- }
-
- value = m_dirs.get(Constants.EXCLUDE_DIRECTIVE);
- if (value != null)
- {
- List<String> filters = ManifestParser.parseDelimitedString(value, ",");
- m_excludeFilter = new ArrayList<List<String>>(filters.size());
- for (int filterIdx = 0; filterIdx < filters.size(); filterIdx++)
- {
- List<String> substrings = SimpleFilter.parseSubstring(filters.get(filterIdx));
- m_excludeFilter.add(substrings);
- }
- }
- else
- {
- m_excludeFilter = null;
- }
-
- Set<String> mandatory = Collections.EMPTY_SET;
+ Set<String> mandatory = Collections.emptySet();
value = m_dirs.get(Constants.MANDATORY_DIRECTIVE);
if (value != null)
{
List<String> names = ManifestParser.parseDelimitedString(value, ",");
- mandatory = new HashSet<String>(names.size());
+ mandatory = new HashSet<>(names.size());
for (String name : names)
{
// If attribute exists, then record it as mandatory.
@@ -160,38 +125,6 @@ public class BundleCapabilityImpl implements BundleCapability
return m_uses;
}
- public boolean isIncluded(String name)
- {
- if ((m_includeFilter == null) && (m_excludeFilter == null))
- {
- return true;
- }
-
- // Get the class name portion of the target class.
- String className = Util.getClassName(name);
-
- // If there are no include filters then all classes are included
- // by default, otherwise try to find one match.
- boolean included = (m_includeFilter == null);
- for (int i = 0;
- (!included) && (m_includeFilter != null) && (i < m_includeFilter.size());
- i++)
- {
- included = SimpleFilter.compareSubstring(m_includeFilter.get(i), className);
- }
-
- // If there are no exclude filters then no classes are excluded
- // by default, otherwise try to find one match.
- boolean excluded = false;
- for (int i = 0;
- (!excluded) && (m_excludeFilter != null) && (i < m_excludeFilter.size());
- i++)
- {
- excluded = SimpleFilter.compareSubstring(m_excludeFilter.get(i), className);
- }
- return included && !excluded;
- }
-
@Override
public String toString()
{
diff --git a/framework/src/main/java/org/apache/felix/framework/wiring/BundleRequirementImpl.java b/framework/src/main/java/org/apache/felix/framework/wiring/BundleRequirementImpl.java
index 3e3b685..881d366 100644
--- a/framework/src/main/java/org/apache/felix/framework/wiring/BundleRequirementImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/wiring/BundleRequirementImpl.java
@@ -61,7 +61,7 @@ public class BundleRequirementImpl implements BundleRequirement
BundleRevision revision, String namespace,
Map<String, String> dirs, Map<String, Object> attrs)
{
- this(revision, namespace, dirs, Collections.EMPTY_MAP, SimpleFilter.convert(attrs));
+ this(revision, namespace, dirs, Collections.emptyMap(), SimpleFilter.convert(attrs));
}
public String getNamespace()
@@ -91,7 +91,7 @@ public class BundleRequirementImpl implements BundleRequirement
public boolean matches(BundleCapability cap)
{
- return CapabilitySet.matches((BundleCapabilityImpl) cap, getFilter());
+ return CapabilitySet.matches(cap, getFilter());
}
public boolean isOptional()