You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2017/09/29 07:25:32 UTC

[1/9] karaf git commit: Reuse empty SimpleFilter

Repository: karaf
Updated Branches:
  refs/heads/master a3cb3a099 -> 69695c8bc


Reuse empty SimpleFilter

Rather than instantiating a new filter, use a precomputed constant.
This eliminates constructor calls from outside of the package, allowing
it be be hidden.

Signed-off-by: Robert Varga <ni...@hq.sk>


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/36f7c472
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/36f7c472
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/36f7c472

Branch: refs/heads/master
Commit: 36f7c4728eb66f95fff1c1b8a54e8616f160e380
Parents: c68e8c6
Author: Robert Varga <ni...@hq.sk>
Authored: Tue Sep 26 18:36:33 2017 +0200
Committer: Robert Varga <ni...@hq.sk>
Committed: Wed Sep 27 09:55:03 2017 +0200

----------------------------------------------------------------------
 .../internal/region/SubsystemResolver.java      | 33 ++++++++++----------
 .../internal/repository/BaseRepository.java     |  2 +-
 .../internal/resolver/SimpleFilter.java         | 21 ++++++-------
 .../internal/service/RequirementSort.java       |  2 +-
 4 files changed, 29 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/36f7c472/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
index b39c965..d9ec573 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
@@ -232,7 +232,7 @@ public class SubsystemResolver {
         return wiring;
     }
 
-    private Object toJson(Map<Resource, List<Wire>> wiring) {
+    private static Object toJson(Map<Resource, List<Wire>> wiring) {
         Map<String, List<Map<String, Object>>> wires = new HashMap<>();
         for (Map.Entry<Resource, List<Wire>> reswiring : wiring.entrySet()) {
             Resource resource = reswiring.getKey();
@@ -251,25 +251,25 @@ public class SubsystemResolver {
         return wires;
     }
 
-    private String toString(Resource r) {
+    private static String toString(Resource r) {
         return toString(r.getCapabilities(IDENTITY_NAMESPACE).get(0));
     }
 
-    private String toString(Requirement r) {
+    private static String toString(Requirement r) {
         return BaseClause.toString(null, r.getNamespace(), r.getAttributes(), r.getDirectives());
     }
 
-    private String toString(Capability c) {
+    private static String toString(Capability c) {
         return BaseClause.toString(null, c.getNamespace(), c.getAttributes(), c.getDirectives());
     }
 
-    private Object toJson(Repository repository) {
+    private static Object toJson(Repository repository) {
         Requirement req = new RequirementImpl(
                 null,
                 IDENTITY_NAMESPACE,
                 Collections.emptyMap(),
                 Collections.emptyMap(),
-                new SimpleFilter(null, null, SimpleFilter.MATCH_ALL));
+                SimpleFilter.MATCH_ALL_FILTER);
         Collection<Capability> identities = repository.findProviders(Collections.singleton(req)).get(req);
         List<Object> resources = new ArrayList<>();
         for (Capability identity : identities) {
@@ -279,7 +279,7 @@ public class SubsystemResolver {
         return resources;
     }
 
-    private Object toJson(Resource resource) {
+    private static Object toJson(Resource resource) {
         Map<String, Object> obj = new HashMap<>();
         List<Object> caps = new ArrayList<>();
         List<Object> reqs = new ArrayList<>();
@@ -371,7 +371,7 @@ public class SubsystemResolver {
     }
 
     /**
-     * 
+     *
      * @return map of bundles and the region they are deployed in
      */
     public Map<Resource, String> getBundles() {
@@ -403,7 +403,7 @@ public class SubsystemResolver {
     }
 
     /**
-     * 
+     *
      * @param resourceFilter
      * @return map from resource to region name
      */
@@ -475,7 +475,7 @@ public class SubsystemResolver {
         return null;
     }
 
-    private Capability findMatchingCapability(SimpleFilter filter, Collection<Capability> caps) {
+    private static Capability findMatchingCapability(SimpleFilter filter, Collection<Capability> caps) {
         for (Capability cap : caps) {
             if (CapabilitySet.matches(cap, filter)) {
                 return cap;
@@ -484,7 +484,7 @@ public class SubsystemResolver {
         return null;
     }
 
-    private Wire findMatchingWire(SimpleFilter filter, Collection<Wire> wires) {
+    private static Wire findMatchingWire(SimpleFilter filter, Collection<Wire> wires) {
         for (Wire wire : wires) {
             Capability cap = wire.getCapability();
             if (CapabilitySet.matches(cap, filter)) {
@@ -494,7 +494,7 @@ public class SubsystemResolver {
         return null;
     }
 
-    private SimpleFilter createFilter(String... s) {
+    private static SimpleFilter createFilter(String... s) {
         Map<String, Object> attrs = new HashMap<>();
         for (int i = 0; i < s.length - 1; i += 2) {
             attrs.put(s[i], s[i + 1]);
@@ -516,13 +516,14 @@ public class SubsystemResolver {
         }
     }
 
-    private boolean isFlat(Subsystem subsystem) {
-        if (subsystem == null || subsystem.getFeature() == null)
+    private static boolean isFlat(Subsystem subsystem) {
+        if (subsystem == null || subsystem.getFeature() == null) {
             return false;
+        }
         return subsystem.getFeature() != null && subsystem.getFeature().getScoping() == null;
     }
 
-    private Subsystem getOrCreateChild(Subsystem ss, String name) {
+    private static Subsystem getOrCreateChild(Subsystem ss, String name) {
         Subsystem child = ss.getChild(name);
         return child != null ? child : ss.createSubsystem(name, true);
     }
@@ -539,7 +540,7 @@ public class SubsystemResolver {
         }
     }
 
-    private RegionFilterBuilder createRegionFilterBuilder(RegionDigraph digraph, Map<String, Set<String>> sharingPolicy) throws InvalidSyntaxException {
+    private static RegionFilterBuilder createRegionFilterBuilder(RegionDigraph digraph, Map<String, Set<String>> sharingPolicy) throws InvalidSyntaxException {
         RegionFilterBuilder result = digraph.createRegionFilterBuilder();
         for (Map.Entry<String, Set<String>> entry : sharingPolicy.entrySet()) {
             for (String filter : entry.getValue()) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/36f7c472/features/core/src/main/java/org/apache/karaf/features/internal/repository/BaseRepository.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/repository/BaseRepository.java b/features/core/src/main/java/org/apache/karaf/features/internal/repository/BaseRepository.java
index 5b81a12..b8bfc62 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/repository/BaseRepository.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/repository/BaseRepository.java
@@ -79,7 +79,7 @@ public class BaseRepository implements Repository {
                     String filter = requirement.getDirectives().get(Constants.FILTER_DIRECTIVE);
                     sf = (filter != null)
                             ? SimpleFilter.parse(filter)
-                            : new SimpleFilter(null, null, SimpleFilter.MATCH_ALL);
+                            : SimpleFilter.MATCH_ALL_FILTER;
                 }
                 result.put(requirement, set.match(sf, true));
             } else {

http://git-wip-us.apache.org/repos/asf/karaf/blob/36f7c472/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
index 117734e..02635d4 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
@@ -55,11 +55,13 @@ public class SimpleFilter {
         COMMON_STRINGS = s;
     }
 
+    public static final SimpleFilter MATCH_ALL_FILTER = new SimpleFilter(null, null, MATCH_ALL);
+
     private final String name;
     private final Object value;
     private final int op;
 
-    public SimpleFilter(String name, Object value, int op) {
+    SimpleFilter(String name, Object value, int op) {
         this.name = internIfCommon(name);
         this.value = value;
         this.op = op;
@@ -572,16 +574,13 @@ public class SimpleFilter {
             }
         }
 
-        SimpleFilter sf = null;
-
-        if (filters.size() == 1) {
-            sf = filters.get(0);
-        } else if (attrs.size() > 1) {
-            sf = new SimpleFilter(null, filters, SimpleFilter.AND);
-        } else if (filters.isEmpty()) {
-            sf = new SimpleFilter(null, null, SimpleFilter.MATCH_ALL);
+        switch (filters.size()) {
+            case 0:
+                return MATCH_ALL_FILTER;
+            case 1:
+                return filters.get(0);
+            default:
+                return new SimpleFilter(null, filters, SimpleFilter.AND);
         }
-
-        return sf;
     }
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/36f7c472/features/core/src/main/java/org/apache/karaf/features/internal/service/RequirementSort.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/RequirementSort.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/RequirementSort.java
index 1bfe070..921fda8 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/service/RequirementSort.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/RequirementSort.java
@@ -79,7 +79,7 @@ public final class RequirementSort<T extends Resource> {
             String filter = requirement.getDirectives().get(Constants.FILTER_DIRECTIVE);
             SimpleFilter sf = (filter != null)
                     ? SimpleFilter.parse(filter)
-                    : new SimpleFilter(null, null, SimpleFilter.MATCH_ALL);
+                    : SimpleFilter.MATCH_ALL_FILTER;
             for (Capability cap : capSet.match(sf, true)) {
                 result.add((T) cap.getResource());
             }


[7/9] karaf git commit: Merge remote-tracking branch 'rovarga/feature-version-char' into master2

Posted by gn...@apache.org.
Merge remote-tracking branch 'rovarga/feature-version-char' into master2


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/1411e3c1
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/1411e3c1
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/1411e3c1

Branch: refs/heads/master
Commit: 1411e3c1972833647fb3c9dcc11bf3c89bf3bb85
Parents: b47bdae 826cf5c
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Fri Sep 29 09:08:35 2017 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Fri Sep 29 09:08:35 2017 +0200

----------------------------------------------------------------------
 .../java/org/apache/karaf/features/internal/model/Feature.java   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------



[9/9] karaf git commit: Use List.sort

Posted by gn...@apache.org.
Use List.sort


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/69695c8b
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/69695c8b
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/69695c8b

Branch: refs/heads/master
Commit: 69695c8bc48b862c916736b18d4755a727197f88
Parents: 1614ea7
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Fri Sep 29 09:06:53 2017 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Fri Sep 29 09:08:59 2017 +0200

----------------------------------------------------------------------
 .../java/org/apache/karaf/features/internal/service/Deployer.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/69695c8b/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
index e2c3522..6e2f729 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
@@ -1297,7 +1297,7 @@ public class Deployer {
                     deployment.toInstall.add(resource);
                 }
             }
-            Collections.sort(deployment.toInstall, new ResourceComparator());
+            deployment.toInstall.sort(new ResourceComparator());
 
             // Add this region if there is something to do
             if (!deployment.toDelete.isEmpty()


[6/9] karaf git commit: Merge remote-tracking branch 'rovarga/dup-objects' into master2

Posted by gn...@apache.org.
Merge remote-tracking branch 'rovarga/dup-objects' into master2


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/b47bdaea
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/b47bdaea
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/b47bdaea

Branch: refs/heads/master
Commit: b47bdaead292209eae63f8f321d38aa9185ac950
Parents: a3cb3a0 36f7c47
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Fri Sep 29 09:08:29 2017 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Fri Sep 29 09:08:29 2017 +0200

----------------------------------------------------------------------
 .../internal/region/SubsystemResolver.java      |  33 +++---
 .../internal/repository/BaseRepository.java     |   2 +-
 .../internal/resolver/ResourceBuilder.java      |  31 +++---
 .../internal/resolver/SimpleFilter.java         | 103 ++++++++++---------
 .../internal/service/RequirementSort.java       |   2 +-
 5 files changed, 92 insertions(+), 79 deletions(-)
----------------------------------------------------------------------



[8/9] karaf git commit: Minimize memory used by capabilities / requirements in LinkedHashMap

Posted by gn...@apache.org.
Minimize memory used by capabilities / requirements in LinkedHashMap


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/1614ea78
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/1614ea78
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/1614ea78

Branch: refs/heads/master
Commit: 1614ea780d71eb6d0e6870c2a1a3d117c4466cc8
Parents: 1411e3c
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Fri Sep 29 09:06:15 2017 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Fri Sep 29 09:08:52 2017 +0200

----------------------------------------------------------------------
 .../karaf/features/internal/resolver/ResourceBuilder.java    | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/1614ea78/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java
index b502b4e..afb05a1 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java
@@ -355,7 +355,7 @@ public final class ResourceBuilder {
                     String multiple = clause.dirs.get("multiple");
                     String avail = clause.dirs.get("availability");
                     String filter = (String) clause.attrs.get("filter");
-                    Map<String, String> dirs = new LinkedHashMap<>();
+                    Map<String, String> dirs = new LinkedHashMap<>(2);
                     dirs.put(ServiceNamespace.REQUIREMENT_EFFECTIVE_DIRECTIVE, ServiceNamespace.EFFECTIVE_ACTIVE);
                     if ("optional".equals(avail)) {
                         dirs.put(ServiceNamespace.REQUIREMENT_RESOLUTION_DIRECTIVE, ServiceNamespace.RESOLUTION_OPTIONAL);
@@ -1197,8 +1197,8 @@ public final class ResourceBuilder {
 
     static class ParsedHeaderClause {
         public final List<String> paths = new ArrayList<>();
-        public final Map<String, String> dirs = new LinkedHashMap<>();
-        public final Map<String, Object> attrs = new LinkedHashMap<>();
-        public final Map<String, String> types = new LinkedHashMap<>();
+        public final Map<String, String> dirs = new LinkedHashMap<>(1);
+        public final Map<String, Object> attrs = new LinkedHashMap<>(1);
+        public final Map<String, String> types = new LinkedHashMap<>(1);
     }
 }


[5/9] karaf git commit: Turn Feature.VERSION_SEPARATOR into a char

Posted by gn...@apache.org.
Turn Feature.VERSION_SEPARATOR into a char

String.indexOf(char) is faster than String.indexOf(String), so use
char for VERSION_SEPARATOR.

Signed-off-by: Robert Varga <ni...@hq.sk>


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/826cf5c2
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/826cf5c2
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/826cf5c2

Branch: refs/heads/master
Commit: 826cf5c205009a8e2b88fba9b43ea67623bdb802
Parents: 8228021
Author: Robert Varga <ni...@hq.sk>
Authored: Mon Sep 25 11:54:31 2017 +0200
Committer: Robert Varga <ni...@hq.sk>
Committed: Wed Sep 27 10:43:57 2017 +0200

----------------------------------------------------------------------
 .../java/org/apache/karaf/features/internal/model/Feature.java   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/826cf5c2/features/core/src/main/java/org/apache/karaf/features/internal/model/Feature.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/model/Feature.java b/features/core/src/main/java/org/apache/karaf/features/internal/model/Feature.java
index 9e838e6..54a739b 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/model/Feature.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/model/Feature.java
@@ -78,7 +78,7 @@ import org.apache.felix.utils.version.VersionCleaner;
         })
 public class Feature extends Content implements org.apache.karaf.features.Feature {
 
-    public static final String VERSION_SEPARATOR = "/";
+    public static final char VERSION_SEPARATOR = '/';
     public static final String DEFAULT_VERSION = "0.0.0";
 
     @XmlElement(name = "details", namespace=org.apache.karaf.features.FeaturesNamespaces.URI_CURRENT)
@@ -130,7 +130,7 @@ public class Feature extends Content implements org.apache.karaf.features.Featur
         int idx = str.indexOf(VERSION_SEPARATOR);
         if (idx >= 0) {
             String strName = str.substring(0, idx);
-            String strVersion = str.substring(idx + VERSION_SEPARATOR.length(), str.length());
+            String strVersion = str.substring(idx + 1, str.length());
             return new Feature(strName, strVersion);
         } else {
             return new Feature(str);


[2/9] karaf git commit: Deduplicate common OSGi filter strings

Posted by gn...@apache.org.
Deduplicate common OSGi filter strings

Based on a heap dump with a large number of features/bundles,
5 strings have a large number of duplicates -- ~48K duplicate strings,
wasting ~1.9MiB of memory.

Create a small interning Map, which can normalize these, squashing
a number of these duplicates.

Signed-off-by: Robert Varga <ni...@hq.sk>


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/c68e8c6e
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/c68e8c6e
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/c68e8c6e

Branch: refs/heads/master
Commit: c68e8c6e022d38b2d9fe293a4cb365eb6ffc96ca
Parents: 8fc4d28
Author: Robert Varga <ni...@hq.sk>
Authored: Tue Sep 26 17:20:10 2017 +0200
Committer: Robert Varga <ni...@hq.sk>
Committed: Wed Sep 27 09:55:03 2017 +0200

----------------------------------------------------------------------
 .../internal/resolver/SimpleFilter.java         | 23 +++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/c68e8c6e/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
index 3464a4e..117734e 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
@@ -19,10 +19,12 @@ package org.apache.karaf.features.internal.resolver;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Deque;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 
 import org.apache.felix.utils.version.VersionRange;
 
@@ -38,12 +40,27 @@ public class SimpleFilter {
     public static final int PRESENT = 8;
     public static final int APPROX = 9;
 
+    /**
+     * Strings which are commonly found in filter specification. We use this map as an interner.
+     */
+    private static final Set<String> COMMON_STRINGS;
+
+    static {
+        Set<String> s = new HashSet<>(8);
+        s.add("optional");
+        s.add("osgi.ee");
+        s.add("resolution");
+        s.add("uses");
+        s.add("version");
+        COMMON_STRINGS = s;
+    }
+
     private final String name;
     private final Object value;
     private final int op;
 
     public SimpleFilter(String name, Object value, int op) {
-        this.name = name;
+        this.name = internIfCommon(name);
         this.value = value;
         this.op = op;
     }
@@ -125,6 +142,10 @@ public class SimpleFilter {
         }
     }
 
+    private static String internIfCommon(String str) {
+        return str != null && COMMON_STRINGS.contains(str) ? str.intern() : str;
+    }
+
     private static void toString(StringBuilder sb, List<?> list) {
         for (Object o : list) {
             SimpleFilter sf = (SimpleFilter) o;


[3/9] karaf git commit: Clean SimpleFilter up

Posted by gn...@apache.org.
Clean SimpleFilter up

Profiling OpenDaylight SFT has turned up large memory usage when
a lot of features are created. Some of the memory wasted is in
over-allocated ArrayLists, which are using default pre-allocation
size.

This patch uses Collections.singletonList() to hold NOT operation
arguments and reduces pre-allocation for other compound operations
to 2.

Signed-off-by: Robert Varga <ni...@hq.sk>


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/8fc4d282
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/8fc4d282
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/8fc4d282

Branch: refs/heads/master
Commit: 8fc4d28219c729e09d295313a270c9e34330ee0b
Parents: 2a67918
Author: Robert Varga <ni...@hq.sk>
Authored: Tue Sep 26 16:40:38 2017 +0200
Committer: Robert Varga <ni...@hq.sk>
Committed: Wed Sep 27 09:55:03 2017 +0200

----------------------------------------------------------------------
 .../internal/resolver/SimpleFilter.java         | 59 +++++++++-----------
 1 file changed, 25 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/8fc4d282/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
index 70084ab..3464a4e 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
@@ -17,6 +17,7 @@
 package org.apache.karaf.features.internal.resolver;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Deque;
 import java.util.LinkedList;
 import java.util.List;
@@ -25,7 +26,6 @@ import java.util.Map.Entry;
 
 import org.apache.felix.utils.version.VersionRange;
 
-@SuppressWarnings("rawtypes")
 public class SimpleFilter {
     public static final int MATCH_ALL = 0;
     public static final int AND = 1;
@@ -60,30 +60,29 @@ public class SimpleFilter {
         return op;
     }
 
+    @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
         toString(sb);
         return sb.toString();
     }
 
-    @SuppressWarnings("unchecked")
-    private void toString(StringBuilder sb)
-    {
+    private void toString(StringBuilder sb) {
         switch (op)
         {
         case AND:
             sb.append("(&");
-            toString(sb, (List) value);
+            toString(sb, (List<?>) value);
             sb.append(")");
             break;
         case OR:
             sb.append("(|");
-            toString(sb, (List) value);
+            toString(sb, (List<?>) value);
             sb.append(")");
             break;
         case NOT:
             sb.append("(!");
-            toString(sb, (List) value);
+            toString(sb, (List<?>) value);
             sb.append(")");
             break;
         case EQ:
@@ -109,7 +108,7 @@ public class SimpleFilter {
             break;
         case SUBSTRING:
             sb.append("(").append(name).append("=");
-            unparseSubstring(sb, (List) value);
+            unparseSubstring(sb, (List<?>) value);
             sb.append(")");
             break;
         case PRESENT:
@@ -126,7 +125,7 @@ public class SimpleFilter {
         }
     }
 
-    private static void toString(StringBuilder sb, List list) {
+    private static void toString(StringBuilder sb, List<?> list) {
         for (Object o : list) {
             SimpleFilter sf = (SimpleFilter) o;
             sf.toString(sb);
@@ -195,7 +194,7 @@ public class SimpleFilter {
                     int peek = skipWhitespace(filter, idx + 1);
                     if (filter.charAt(peek) == '(') {
                         idx = peek - 1;
-                        stack.addFirst(new SimpleFilter(null, new ArrayList(), SimpleFilter.AND));
+                        stack.addFirst(new SimpleFilter(null, new ArrayList<>(2), SimpleFilter.AND));
                     } else {
                         stack.addFirst(idx);
                     }
@@ -203,7 +202,7 @@ public class SimpleFilter {
                     int peek = skipWhitespace(filter, idx + 1);
                     if (filter.charAt(peek) == '(') {
                         idx = peek - 1;
-                        stack.addFirst(new SimpleFilter(null, new ArrayList(), SimpleFilter.OR));
+                        stack.addFirst(new SimpleFilter(null, new ArrayList<>(2), SimpleFilter.OR));
                     } else {
                         stack.addFirst(idx);
                     }
@@ -211,7 +210,7 @@ public class SimpleFilter {
                     int peek = skipWhitespace(filter, idx + 1);
                     if (filter.charAt(peek) == '(') {
                         idx = peek - 1;
-                        stack.addFirst(new SimpleFilter(null, new ArrayList(), SimpleFilter.NOT));
+                        stack.addFirst(new SimpleFilter(null, new ArrayList<>(1), SimpleFilter.NOT));
                     } else {
                         stack.addFirst(idx);
                     }
@@ -248,13 +247,11 @@ public class SimpleFilter {
     }
 
     private static SimpleFilter subfilter(String filter, int startIdx, int endIdx) {
-        final String opChars = "=<>~";
-
         // Determine the ending index of the attribute name.
         int attrEndIdx = startIdx;
         for (int i = 0; i < (endIdx - startIdx); i++) {
             char c = filter.charAt(startIdx + i);
-            if (opChars.indexOf(c) >= 0) {
+            if ("=<>~".indexOf(c) >= 0) {
                 break;
             } else if (!Character.isWhitespace(c)) {
                 attrEndIdx = startIdx + i + 1;
@@ -327,7 +324,6 @@ public class SimpleFilter {
     }
 
     public static List<String> parseSubstring(String value) {
-        List<String> pieces = new ArrayList<>();
         int length = value.length();
 
         boolean isSimple = true;
@@ -339,8 +335,7 @@ public class SimpleFilter {
             }
         }
         if (isSimple) {
-            pieces.add(value);
-            return pieces;
+            return Collections.singletonList(value);
         }
 
         StringBuilder ss = new StringBuilder();
@@ -352,6 +347,7 @@ public class SimpleFilter {
         int idx = 0;
 
         // We assume (sub)strings can contain leading and trailing blanks
+        List<String> pieces = new ArrayList<>(2);
         boolean escaped = false;
         for (;;) {
             if (idx >= length) {
@@ -406,7 +402,7 @@ public class SimpleFilter {
         return pieces;
     }
 
-    public static void unparseSubstring(StringBuilder sb, List<String> pieces) {
+    public static void unparseSubstring(StringBuilder sb, List<?> pieces) {
         for (int i = 0; i < pieces.size(); i++) {
             if (i > 0) {
                 sb.append("*");
@@ -491,7 +487,6 @@ public class SimpleFilter {
      * @param attrs Map of attributes to convert to a filter.
      * @return A filter corresponding to the attributes.
      */
-    @SuppressWarnings("unchecked")
     public static SimpleFilter convert(Map<String, Object> attrs) {
         // Rather than building a filter string to be parsed into a SimpleFilter,
         // we will just create the parsed SimpleFilter directly.
@@ -509,14 +504,12 @@ public class SimpleFilter {
                                     SimpleFilter.GTE)
                     );
                 } else {
+                    SimpleFilter val = new SimpleFilter(
+                        entry.getKey(),
+                        vr.getFloor().toString(),
+                        SimpleFilter.LTE);
                     SimpleFilter not =
-                            new SimpleFilter(null, new ArrayList(), SimpleFilter.NOT);
-                    ((List<Object>) not.getValue()).add(
-                            new SimpleFilter(
-                                    entry.getKey(),
-                                    vr.getFloor().toString(),
-                                    SimpleFilter.LTE)
-                    );
+                            new SimpleFilter(null, Collections.singletonList(val), SimpleFilter.NOT);
                     filters.add(not);
                 }
 
@@ -529,14 +522,12 @@ public class SimpleFilter {
                                         SimpleFilter.LTE)
                         );
                     } else if (!vr.getCeiling().equals(VersionRange.INFINITE_VERSION)) {
+                        SimpleFilter val = new SimpleFilter(
+                            entry.getKey(),
+                            vr.getCeiling().toString(),
+                            SimpleFilter.GTE);
                         SimpleFilter not =
-                                new SimpleFilter(null, new ArrayList(), SimpleFilter.NOT);
-                        ((List<Object>) not.getValue()).add(
-                                new SimpleFilter(
-                                        entry.getKey(),
-                                        vr.getCeiling().toString(),
-                                        SimpleFilter.GTE)
-                        );
+                                new SimpleFilter(null, Collections.singletonList(val), SimpleFilter.NOT);
                         filters.add(not);
                     }
                 }


[4/9] karaf git commit: Improve ResourceBuilder's use of maps

Posted by gn...@apache.org.
Improve ResourceBuilder's use of maps

Do not instatiate an empty HashMap where Collections.emptyMap()
does the same. Also reuse default directives map, now backed by
a Collections.singletonMap().

Signed-off-by: Robert Varga <ni...@hq.sk>


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/2a679182
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/2a679182
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/2a679182

Branch: refs/heads/master
Commit: 2a679182e6e3ef1bad2b953c8aa5c82d905331a2
Parents: 8228021
Author: Robert Varga <ni...@hq.sk>
Authored: Tue Sep 26 17:54:02 2017 +0200
Committer: Robert Varga <ni...@hq.sk>
Committed: Wed Sep 27 09:55:03 2017 +0200

----------------------------------------------------------------------
 .../internal/resolver/ResourceBuilder.java      | 31 ++++++++++----------
 1 file changed, 16 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/2a679182/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java
index c524009..b502b4e 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceBuilder.java
@@ -58,6 +58,8 @@ public final class ResourceBuilder {
     private static final int STARTQUOTE = 4;
     private static final int ENDQUOTE = 8;
 
+    private static final Map<String, String> DEFAULT_DIRECTIVES = Collections.singletonMap(ServiceNamespace.CAPABILITY_EFFECTIVE_DIRECTIVE, ServiceNamespace.EFFECTIVE_ACTIVE);
+
     private ResourceBuilder() {
     }
 
@@ -111,18 +113,16 @@ public final class ResourceBuilder {
         // Now that we have symbolic name and version, create the resource
         String type = headerMap.get(Constants.FRAGMENT_HOST) == null ? IdentityNamespace.TYPE_BUNDLE : IdentityNamespace.TYPE_FRAGMENT;
         {
-            Map<String, String> dirs = new HashMap<>();
-            Map<String, Object> attrs = new HashMap<>();
+            Map<String, Object> attrs = new HashMap<>(4);
             attrs.put(IdentityNamespace.IDENTITY_NAMESPACE, bundleSymbolicName);
             attrs.put(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE, type);
             attrs.put(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE, bundleVersion);
-            CapabilityImpl identity = new CapabilityImpl(resource, IdentityNamespace.IDENTITY_NAMESPACE, dirs, attrs);
+            CapabilityImpl identity = new CapabilityImpl(resource, IdentityNamespace.IDENTITY_NAMESPACE, Collections.emptyMap(), attrs);
             resource.addCapability(identity);
         }
         if (uri != null) {
-            Map<String, Object> attrs = new HashMap<>();
-            attrs.put(ContentNamespace.CAPABILITY_URL_ATTRIBUTE, uri);
-            resource.addCapability(new CapabilityImpl(resource, ContentNamespace.CONTENT_NAMESPACE, Collections.emptyMap(), attrs));
+            resource.addCapability(new CapabilityImpl(resource, ContentNamespace.CONTENT_NAMESPACE, Collections.emptyMap(),
+                Collections.singletonMap(ContentNamespace.CAPABILITY_URL_ATTRIBUTE, uri)));
         }
 
         // Add a bundle and host capability to all
@@ -244,7 +244,7 @@ public final class ResourceBuilder {
                 }
             }
         }
-        
+
         // Combine all capabilities.
         resource.addCapabilities(exportCaps);
         resource.addCapabilities(provideCaps);
@@ -334,15 +334,13 @@ public final class ResourceBuilder {
         List<Capability> capList = new ArrayList<>();
         for (ParsedHeaderClause clause : clauses) {
             for (String path : clause.paths) {
-                Map<String, String> dirs = new LinkedHashMap<>();
-                dirs.put(ServiceNamespace.CAPABILITY_EFFECTIVE_DIRECTIVE, ServiceNamespace.EFFECTIVE_ACTIVE);
                 Map<String, Object> attrs = new LinkedHashMap<>();
                 attrs.put(Constants.OBJECTCLASS, path);
                 attrs.putAll(clause.attrs);
                 capList.add(new CapabilityImpl(
                         resource,
                         ServiceNamespace.SERVICE_NAMESPACE,
-                        dirs,
+                        DEFAULT_DIRECTIVES,
                         attrs));
             }
         }
@@ -899,16 +897,18 @@ public final class ResourceBuilder {
             }
 
             String nameClause;
-            if (rName != null)
+            if (rName != null) {
                 nameClause = "(" + ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE + "=" + lName + "/" + rName + ")";
-            else
+            } else {
                 nameClause = "(" + ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE + "=" + lName + ")";
+            }
 
             String filter;
-            if (versionClause != null)
+            if (versionClause != null) {
                 filter = "(&" + nameClause + versionClause + ")";
-            else
+            } else {
                 filter = nameClause;
+            }
 
             filters.add(filter);
         }
@@ -940,8 +940,9 @@ public final class ResourceBuilder {
     }
 
     private static String getBreeVersionClause(Version ver) {
-        if (ver == null)
+        if (ver == null) {
             return null;
+        }
 
         return "(" + ExecutionEnvironmentNamespace.CAPABILITY_VERSION_ATTRIBUTE + "=" + ver + ")";
     }