Author: mir
Date: Tue Jun 29 16:46:09 2010
New Revision: 959024
URL: http://svn.apache.org/viewvc?rev=959024&view=rev
Log:
CLEREZZA-250: implemented a way to describe permissions and a service that
finds and provides these descriptions
Added:
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/pom.xml
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionDescriptionsProvider.java
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionDescripton.java
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionGatherer.java
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionInfo.java
Modified:
incubator/clerezza/trunk/org.apache.clerezza.parent/pom.xml
Added:
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/pom.xml?rev=959024&view=auto
==============================================================================
---
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/pom.xml
(added)
+++
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/pom.xml
Tue Jun 29 16:46:09 2010
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.clerezza</groupId>
+ <artifactId>org.apache.clerezza.parent</artifactId>
+ <version>0.2-incubating-SNAPSHOT</version>
+ </parent>
+ <groupId>org.apache.clerezza</groupId>
+ <artifactId>org.apache.clerezza.permissiondescriptions</artifactId>
+ <packaging>bundle</packaging>
+ <version>0.1-incubating-SNAPSHOT</version>
+ <name>Clerezza - Permission Descriptions</name>
+ <description>A bundle providing class and interface for providing
permission descriptions.</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+
<artifactId>org.apache.felix.scr.annotations</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.clerezza</groupId>
+ <artifactId>org.apache.clerezza.utils</artifactId>
+ </dependency>
+ </dependencies>
+</project>
Added:
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionDescriptionsProvider.java
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionDescriptionsProvider.java?rev=959024&view=auto
==============================================================================
---
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionDescriptionsProvider.java
(added)
+++
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionDescriptionsProvider.java
Tue Jun 29 16:46:09 2010
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.clerezza.permissiondescriptions;
+
+import java.util.Set;
+
+/**
+ * A class implementing this interface, provides information about permissions
+ * needed by the class itself, the package or bundle that it is part of.
+ *
+ * @author mir
+ */
+public interface PermissionDescriptionsProvider {
+
+
+ /**
+ * Returns a set of <code>PermissionDescriptor</code>s.
+ *
+ * @return
+ */
+ public Set<PermissionDescripton> getPermissionDescriptors();
+}
Added:
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionDescripton.java
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionDescripton.java?rev=959024&view=auto
==============================================================================
---
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionDescripton.java
(added)
+++
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionDescripton.java
Tue Jun 29 16:46:09 2010
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.clerezza.permissiondescriptions;
+
+import java.net.URL;
+import java.security.Permission;
+
+/**
+ * The implementation of <code>PermissionDescription</code> used by the
+ * <code>PersmissionDescriptionsProvider</code>
+ *
+ * @author mir
+ */
+public class PermissionDescripton {
+
+ private String name, description, javaPermissionString;
+ private URL iconUri;
+
+ public PermissionDescripton(String name, String description, URL
iconUri,
+ Class<? extends Permission> permissionClassName, String
javaPermissionString) {
+ this.name = name;
+ this.description = description;
+ this.javaPermissionString = javaPermissionString;
+ this.iconUri = iconUri;
+ }
+
+ /**
+ * Returns a description about the permission.
+ *
+ * @return
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * Returns an icon URI that describes pictorgraphically what the
permission
+ * in its current configuration does. E.g. the icon of a file read
permission
+ * may depict an eye, while the icon for a file write permission might
be a pencil.
+ *
+ * @return
+ */
+ public URL getIcon () {
+ return iconUri;
+ }
+
+ /**
+ * The name of the permission in a human comprehensible form.
+ *
+ * @return
+ */
+ public String getSimpleName() {
+ return name;
+ }
+
+ /**
+ * Returns a string describing this Permission. It has to be formated
according
+ * the java.security.Permission toString()-convention. The convention
is to specify
+ * the class name, the permission name, and the actions in the
following format:
+ * '("ClassName" "name" "actions")'.
+ * @return
+ */
+ public String getJavaPermissionString() {
+ return javaPermissionString ;
+ }
+
+}
Added:
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionGatherer.java
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionGatherer.java?rev=959024&view=auto
==============================================================================
---
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionGatherer.java
(added)
+++
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionGatherer.java
Tue Jun 29 16:46:09 2010
@@ -0,0 +1,238 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.clerezza.permissiondescriptions;
+
+import java.net.URL;
+import java.security.Permission;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import org.apache.clerezza.utils.IteratorMerger;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.Service;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.component.ComponentContext;
+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
+ * <code>Permission</code> found in the activated bundles. If new bundles are
+ * started then they are also scanned.
+ *
+ * @author mir
+ */
+...@component()
+...@service(PermissionGatherer.class)
+...@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.
+ */
+ private Set<ServiceReference> serviceReferenceStore = new
HashSet<ServiceReference>();
+
+
+ public Map<Bundle, Collection<PermissionDescripton>>
getPermissionDescriptorsPerBundles() {
+ return
Collections.unmodifiableMap(bundle2PermissionDescriptorsMap);
+ }
+
+ public Iterator<PermissionDescripton> getAllPermissionDescriptors() {
+ return new
IteratorMerger<PermissionDescripton>(bundle2PermissionDescriptorsMap.values());
+ }
+
+ public Map<Bundle, Collection<Class<? extends Permission>>>
getPermissionsPerBundles() {
+ return Collections.unmodifiableMap(bundle2PermissionClassesMap);
+ }
+
+ public Iterator<Class<? extends Permission>> getAllPermissions() {
+ return new IteratorMerger<Class<? extends Permission>>(
+ bundle2PermissionClassesMap.values());
+ }
+
+ protected void activate(final ComponentContext componentContext) {
+ this.componentContext = componentContext;
+ registerFromServiceReferenceStore();
+ componentContext.getBundleContext().addBundleListener(this);
+ logger.debug("Start registering permissions from activated
bundles");
+ registerPermissionsFromActivatedBundles(componentContext);
+ logger.debug("Registered permissions from activated bundles");
+ }
+
+ synchronized private void registerFromServiceReferenceStore() {
+ if (componentContext != null) {
+
+ for (ServiceReference ref : serviceReferenceStore) {
+ this.registerPermissionDescriptorsProvider(ref);
+ }
+ serviceReferenceStore.clear();
+ }
+ }
+
+ synchronized protected void bindPermissionProvider(ServiceReference
serviceReference) {
+ if (componentContext != null) {
+ registerPermissionDescriptorsProvider(serviceReference);
+ } else {
+ serviceReferenceStore.add(serviceReference);
+ }
+
+ }
+
+ synchronized protected void unbindPermissionProvider(ServiceReference
serviceReference) {
+
+ if (!serviceReferenceStore.remove(serviceReference)) {
+ PermissionDescriptionsProvider permissionProvider =
(PermissionDescriptionsProvider)
+
componentContext.locateService("permissionProvider", serviceReference);
+ Bundle bundle = serviceReference.getBundle();
+
+ Collection<PermissionDescripton> permissionDescriptiors
=
+ bundle2PermissionDescriptorsMap.get(bundle);
+
+
permissionDescriptiors.removeAll(permissionProvider.getPermissionDescriptors());
+ if (permissionDescriptiors.isEmpty()) {
+ bundle2PermissionDescriptorsMap.remove(bundle);
+ }
+ }
+
+ }
+
+ private void registerPermissionDescriptorsProvider(ServiceReference
serviceReference) {
+ PermissionDescriptionsProvider permissionProvider =
(PermissionDescriptionsProvider)
+
componentContext.locateService("permissionProvider", serviceReference);
+ if (permissionProvider == null) {
+ return;
+ }
+ Collection<PermissionDescripton> permissionDescriptiors =
+
bundle2PermissionDescriptorsMap.get(serviceReference.getBundle());
+ if (permissionDescriptiors == null) {
+ permissionDescriptiors = new
HashSet<PermissionDescripton>();
+ }
+
permissionDescriptiors.addAll(permissionProvider.getPermissionDescriptors());
+
+ }
+
+ protected void deactivate(final ComponentContext componentContext) {
+ componentContext.getBundleContext().removeBundleListener(this);
+ }
+
+ @Override
+ public void bundleChanged(BundleEvent event) {
+ Bundle bundle = event.getBundle();
+ switch (event.getType()) {
+ case BundleEvent.STARTED:
+ registerPermissions(bundle);
+ break;
+ case BundleEvent.STOPPED:
+ unregisterPermissions(bundle);
+ break;
+ }
+ }
+
+ private void registerPermissionsFromActivatedBundles(ComponentContext
componentContext) {
+ Bundle[] bundles =
componentContext.getBundleContext().getBundles();
+ for (Bundle bundle : bundles) {
+ if (bundle.getState() == Bundle.ACTIVE) {
+ registerPermissions(bundle);
+ }
+ }
+ }
+
+ private void registerPermissions(Bundle bundle) {
+ Enumeration<URL> classUrls = bundle.findEntries("/", "*.class",
true);
+ if (classUrls == null) {
+ return;
+ }
+ Set<Class<? extends Permission>> permissionClassesSet = new
HashSet<Class<? extends Permission>>();
+ Set<PermissionDescripton> newPermissionDescriptors =
+ new HashSet<PermissionDescripton>();
+ while (classUrls.hasMoreElements()) {
+ URL url = classUrls.nextElement();
+ 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);
+ }
+ }
+ } catch (Exception ex) {
+ } catch (NoClassDefFoundError err) {}
+
+ }
+ if (!permissionClassesSet.isEmpty()) {
+ bundle2PermissionClassesMap.put(bundle,
permissionClassesSet);
+ }
+ if (!newPermissionDescriptors.isEmpty()) {
+
+ Collection<PermissionDescripton> permissionDescriptiors
=
+
bundle2PermissionDescriptorsMap.get(bundle);
+ if (permissionDescriptiors == null) {
+ permissionDescriptiors =
newPermissionDescriptors;
+ } else {
+
permissionDescriptiors.addAll(newPermissionDescriptors);
+ }
+ bundle2PermissionDescriptorsMap.put(bundle,
permissionDescriptiors);
+ }
+ }
+
+ private void unregisterPermissions(Bundle bundle) {
+ bundle2PermissionClassesMap.remove(bundle);
+ bundle2PermissionDescriptorsMap.remove(bundle);
+ }
+
+ private String getJavaPermissionString(Class clazz) {
+ return "(" + clazz.getName() + " \"\" \"\")";
+ }
+}
Added:
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionInfo.java
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionInfo.java?rev=959024&view=auto
==============================================================================
---
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionInfo.java
(added)
+++
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.permissiondescriptions/src/main/java/org/apache/clerezza/permissiondescriptions/PermissionInfo.java
Tue Jun 29 16:46:09 2010
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.permissiondescriptions;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation is used to annotate {...@link Permission}s to provide
additional
+ * information about the permission
+ *
+ * @author mir
+ */
+...@target({ElementType.TYPE})
+...@retention(RetentionPolicy.RUNTIME)
+public @interface PermissionInfo {
+
+ /**
+ * The name of the permission in a human comprehensible form.
+ */
+ String value();
+
+ /**
+ * A description about the permission.
+ */
+ String description() default "";
+
+ /**
+ * A relative path to the icon resource that describes
pictorgraphically what
+ * the permission does. E.g. the icon of a file read permission may
depict an eye,
+ * while the icon for a file write permission might be a pencil.
+ */
+ String icon() default "";
+
+}
Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/pom.xml?rev=959024&r1=959023&r2=959024&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/pom.xml (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/pom.xml Tue Jun 29
16:46:09 2010
@@ -37,6 +37,7 @@
<module>org.apache.clerezza.maven-jaxrs-report-plugin</module>
<module>org.apache.clerezza.maven-ontologies-plugin</module>
<module>org.apache.clerezza.maven-pladoc-plugin</module>
+ <module>org.apache.clerezza.permissiondescriptions</module>
<module>org.apache.clerezza.platform</module>
<module>org.apache.clerezza.platform.accountcontrolpanel</module>
<module>org.apache.clerezza.platform.concepts</module>
@@ -1057,6 +1058,11 @@
<artifactId>org.apache.clerezza.uima</artifactId>
<version>0.1-incubating-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.clerezza</groupId>
+
<artifactId>org.apache.clerezza.permissiondescriptions</artifactId>
+ <version>0.1-incubating-SNAPSHOT</version>
+ </dependency>
</dependencies>
</dependencyManagement>
<distributionManagement>