You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by re...@apache.org on 2013/07/25 13:55:42 UTC
svn commit: r1506915 -
/clerezza/trunk/permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionGatherer.java
Author: reto
Date: Thu Jul 25 11:55:41 2013
New Revision: 1506915
URL: http://svn.apache.org/r1506915
Log:
CLEREZZA-806: fixed as suggested by Giuseppe Miscione but reduced the cpoe of the try to actual class loading
Modified:
clerezza/trunk/permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionGatherer.java
Modified: clerezza/trunk/permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionGatherer.java
URL: http://svn.apache.org/viewvc/clerezza/trunk/permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionGatherer.java?rev=1506915&r1=1506914&r2=1506915&view=diff
==============================================================================
--- clerezza/trunk/permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionGatherer.java (original)
+++ clerezza/trunk/permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionGatherer.java Thu Jul 25 11:55:41 2013
@@ -16,7 +16,6 @@
* specific language governing permissions and limitations
* under the License.
*/
-
package org.apache.clerezza.permissiondescriptions;
import java.net.URL;
@@ -44,39 +43,41 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * This binds all implementations of <code>PermissionDescriptionsProvider</code>,
- * and gathers their <code>PermissionDescription</code>s. Furthermore the gatherer
- * scans all activaded bundles for <code>Permission</code>s which are annonated with the
- * <code>PermissionInfo</code> annotation and generates <code>PermissionDescription</code>s
- * for them. This service provides methods to retrieve the gathered
- * <code>PermissionDescription</code>s and also methods to retrieve all unannotated
+ * This binds all implementations of
+ * <code>PermissionDescriptionsProvider</code>, and gathers their
+ * <code>PermissionDescription</code>s. Furthermore the gatherer scans all
+ * activaded bundles for
+ * <code>Permission</code>s which are annonated with the
+ * <code>PermissionInfo</code> annotation and generates
+ * <code>PermissionDescription</code>s for them. This service provides methods
+ * to retrieve the gathered
+ * <code>PermissionDescription</code>s and also methods to retrieve all
+ * unannotated
* <code>Permission</code> found in the activated bundles. If new bundles are
* started then they are also scanned.
*
* @author mir
*/
-@Component(immediate=true)
+@Component(immediate = true)
@Service(PermissionGatherer.class)
-@Reference(name="permissionProvider", policy=ReferencePolicy.DYNAMIC,
- referenceInterface=PermissionDescriptionsProvider.class, cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE)
+@Reference(name = "permissionProvider", policy = ReferencePolicy.DYNAMIC,
+ referenceInterface = PermissionDescriptionsProvider.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE)
public class PermissionGatherer implements BundleListener {
private final Logger logger = LoggerFactory.getLogger(getClass());
-
private Map<Bundle, Collection<Class<? extends Permission>>> bundle2PermissionClassesMap =
Collections.synchronizedMap(new HashMap<Bundle, Collection<Class<? extends Permission>>>());
private Map<Bundle, Collection<PermissionDescripton>> bundle2PermissionDescriptorsMap =
Collections.synchronizedMap(new HashMap<Bundle, Collection<PermissionDescripton>>());
-
private ComponentContext componentContext;
-
/**
- * stores all <code>ServiceReference</code>s of <code>PermissionDescriptionsProvider</code>s
- * that were bound before the PermissionGatherer was activated.
+ * stores all
+ * <code>ServiceReference</code>s of
+ * <code>PermissionDescriptionsProvider</code>s that were bound before the
+ * PermissionGatherer was activated.
*/
private Set<ServiceReference> serviceReferenceStore = new HashSet<ServiceReference>();
-
public Map<Bundle, Collection<PermissionDescripton>> getPermissionDescriptorsPerBundles() {
return Collections.unmodifiableMap(bundle2PermissionDescriptorsMap);
}
@@ -125,8 +126,7 @@ public class PermissionGatherer implemen
synchronized protected void unbindPermissionProvider(ServiceReference serviceReference) {
if (!serviceReferenceStore.remove(serviceReference)) {
- PermissionDescriptionsProvider permissionProvider = (PermissionDescriptionsProvider)
- componentContext.locateService("permissionProvider", serviceReference);
+ PermissionDescriptionsProvider permissionProvider = (PermissionDescriptionsProvider) componentContext.locateService("permissionProvider", serviceReference);
Bundle bundle = serviceReference.getBundle();
Collection<PermissionDescripton> permissionDescriptiors =
@@ -142,8 +142,7 @@ public class PermissionGatherer implemen
}
private void registerPermissionDescriptorsProvider(ServiceReference serviceReference) {
- PermissionDescriptionsProvider permissionProvider = (PermissionDescriptionsProvider)
- componentContext.locateService("permissionProvider", serviceReference);
+ PermissionDescriptionsProvider permissionProvider = (PermissionDescriptionsProvider) componentContext.locateService("permissionProvider", serviceReference);
if (permissionProvider == null) {
return;
}
@@ -195,26 +194,29 @@ public class PermissionGatherer implemen
Set<PermissionDescripton> newPermissionDescriptors =
new HashSet<PermissionDescripton>();
while (classUrls.hasMoreElements()) {
- URL url = classUrls.nextElement();
+ URL url = classUrls.nextElement();
+
+ String className = url.getPath();
+ int indexOfLastDot = className.lastIndexOf(".");
+ className = className.replaceAll("/", ".").substring(1, indexOfLastDot);
+ Class<?> clazz;
try {
- String className = url.getPath();
- int indexOfLastDot = className.lastIndexOf(".");
- className = className.replaceAll("/", ".").substring(1, indexOfLastDot);
- Class<?> clazz = bundle.loadClass(className);
- if (Permission.class.isAssignableFrom(clazz)) {
- PermissionInfo permissionInfo = clazz.getAnnotation(PermissionInfo.class);
- if (permissionInfo != null) {
- newPermissionDescriptors.add(new PermissionDescripton(permissionInfo.value(),
- permissionInfo.description(), clazz.getResource(permissionInfo.icon()),
- (Class<? extends Permission>) clazz,
- getJavaPermissionString(clazz)));
- } else {
- permissionClassesSet.add((Class<? extends Permission>) clazz);
- }
+ clazz = bundle.loadClass(className);
+ } catch (Throwable t) {
+ //we just ignore classes we coudln't read
+ continue;
+ }
+ if (Permission.class.isAssignableFrom(clazz)) {
+ PermissionInfo permissionInfo = clazz.getAnnotation(PermissionInfo.class);
+ if (permissionInfo != null) {
+ newPermissionDescriptors.add(new PermissionDescripton(permissionInfo.value(),
+ permissionInfo.description(), clazz.getResource(permissionInfo.icon()),
+ (Class<? extends Permission>) clazz,
+ getJavaPermissionString(clazz)));
+ } else {
+ permissionClassesSet.add((Class<? extends Permission>) clazz);
}
- } catch (Exception ex) {
- } catch (NoClassDefFoundError err) {}
-
+ }
}
if (!permissionClassesSet.isEmpty()) {
bundle2PermissionClassesMap.put(bundle, permissionClassesSet);