SLING-8595 update to bundle-parent 40 (#44)
* update pom, fix package-info.java files
* fix @ConsumerType annotations
* migrate the first large service to use OSGI annotations
* converted more services
* converted more services
* converted more services
* converted more services
* converted more stuff
* converted more stuff
* converted more stuff
* convert servlets
* more conversions
* fixed testing
* version bump
* fix issues pointed out by osgi-ds-metatype-diff
* implement Robert's suggestions, fixed the failing test (hardcoding the locale to english) and increased coverage a tiny bit; also fixed some sonar remarks
* fix previous merging issue
* SLING-8595 - Update parent
* implement PR feedback
* SLING-11255 - Use import rules from old bundle
* SLING-11255 - Fix ds config
Co-authored-by: Christian Schneider <cschneid@adobe.com>
diff --git a/.gitignore b/.gitignore
index 5b783ed..19758c5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,4 @@
.DS_Store
jcr.log
atlassian-ide-plugin.xml
+.vscode
diff --git a/bnd.bnd b/bnd.bnd
new file mode 100644
index 0000000..141452f
--- /dev/null
+++ b/bnd.bnd
@@ -0,0 +1,8 @@
+Import-Package: \
+ org.apache.http.nio.*;resolution:=optional,\
+ org.apache.http.impl.nio.client.*;resolution:=optional,\
+ org.apache.felix.hc.api;resolution:=optional,\
+ org.apache.sling.event.jobs;version="[1.5.0,3.0)",\
+ org.apache.sling.event.jobs.consumer;version="[1.1,2)",\
+ org.apache.sling.jcr.api;version="2.2.0",\
+ *
diff --git a/pom.xml b/pom.xml
index f072686..4a3bc27 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,16 +24,15 @@
<!-- ======================================================================= -->
<parent>
<groupId>org.apache.sling</groupId>
- <artifactId>sling</artifactId>
- <version>28</version>
+ <artifactId>sling-bundle-parent</artifactId>
+ <version>47</version>
</parent>
<!-- ======================================================================= -->
<!-- P R O J E C T -->
<!-- ======================================================================= -->
<artifactId>org.apache.sling.distribution.core</artifactId>
- <version>0.5.1-SNAPSHOT</version>
- <packaging>bundle</packaging>
+ <version>0.6.0-SNAPSHOT</version>
<name>Apache Sling Distribution Core</name>
<description>
@@ -51,6 +50,7 @@
<properties>
<exam.version>4.11.0</exam.version>
<sling.java.version>8</sling.java.version>
+ <project.build.outputTimestamp>10</project.build.outputTimestamp>
</properties>
<!-- ======================================================================= -->
@@ -59,42 +59,8 @@
<build>
<plugins>
<plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-scr-plugin</artifactId>
- </plugin>
- <plugin>
- <groupId>org.apache.sling</groupId>
- <artifactId>maven-sling-plugin</artifactId>
- </plugin>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Bundle-SymbolicName>org.apache.sling.distribution.core</Bundle-SymbolicName>
- <Export-Package>
- org.apache.sling.distribution.util,
- org.apache.sling.distribution.common,
- org.apache.sling.distribution.serialization,
- org.apache.sling.distribution.queue.spi,
- org.apache.sling.distribution.queue,
- org.apache.sling.distribution.log.spi,
- org.apache.sling.distribution.agent,
- org.apache.sling.distribution.agent.spi,
- org.apache.sling.distribution.packaging
- </Export-Package>
- <Import-Package>
- org.apache.http.nio.*;resolution:=optional,
- org.apache.http.impl.nio.client.*;resolution:=optional,
- org.apache.felix.hc.api;resolution:=optional,
- org.apache.sling.event.jobs;version="[1.5.0,3.0)",
- org.apache.sling.event.jobs.consumer;version="[1.1,2)",
- org.apache.sling.jcr.api;version="2.2.0",
- *
- </Import-Package>
- </instructions>
- </configuration>
+ <groupId>biz.aQute.bnd</groupId>
+ <artifactId>bnd-maven-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
@@ -159,21 +125,39 @@
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.cm</artifactId>
- <version>1.6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.component</artifactId>
- <version>1.4.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.event</artifactId>
- <version>1.4.0</version>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.annotation.versioning</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.annotation.bundle</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.service.component.annotations</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.service.metatype.annotations</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
<!-- need it here as to avoid classpath conflicts with testing mock -->
<dependency>
@@ -214,7 +198,7 @@
<!-- Sling Mock -->
<dependency>
<groupId>org.apache.sling</groupId>
- <artifactId>org.apache.sling.testing.osgi-mock</artifactId>
+ <artifactId>org.apache.sling.testing.osgi-mock.junit4</artifactId>
<version>2.4.10</version>
<scope>test</scope>
</dependency>
@@ -249,6 +233,10 @@
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.servlets.annotations</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.commons.scheduler</artifactId>
<version>2.4.0</version>
</dependency>
@@ -325,6 +313,7 @@
<artifactId>httpasyncclient</artifactId>
<version>4.0.2</version>
<scope>provided</scope>
+ <optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/DistributionRequestAuthorizationStrategy.java b/src/main/java/org/apache/sling/distribution/agent/impl/DistributionRequestAuthorizationStrategy.java
index 4d2fde0..506ee4d 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/DistributionRequestAuthorizationStrategy.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/DistributionRequestAuthorizationStrategy.java
@@ -18,12 +18,12 @@
*/
package org.apache.sling.distribution.agent.impl;
-import aQute.bnd.annotation.ConsumerType;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.distribution.DistributionRequest;
import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.packaging.DistributionPackage;
import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ConsumerType;
/**
* Strategy for authorizing requests
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactory.java b/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactory.java
index 977f652..b849aec 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactory.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactory.java
@@ -25,22 +25,12 @@
import java.util.Set;
import java.util.TreeSet;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyOption;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.jackrabbit.vault.packaging.Packaging;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.commons.scheduler.Scheduler;
import org.apache.sling.distribution.DistributionRequestType;
import org.apache.sling.distribution.agent.spi.DistributionAgent;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.component.impl.SettingsUtils;
import org.apache.sling.distribution.event.impl.DistributionEventFactory;
import org.apache.sling.distribution.log.impl.DefaultDistributionLog;
@@ -52,9 +42,9 @@
import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
import org.apache.sling.distribution.packaging.impl.exporter.LocalDistributionPackageExporter;
import org.apache.sling.distribution.packaging.impl.importer.RemoteDistributionPackageImporter;
-import org.apache.sling.distribution.queue.impl.DistributionQueueProvider;
import org.apache.sling.distribution.queue.impl.AsyncDeliveryDispatchingStrategy;
import org.apache.sling.distribution.queue.impl.DistributionQueueDispatchingStrategy;
+import org.apache.sling.distribution.queue.impl.DistributionQueueProvider;
import org.apache.sling.distribution.queue.impl.ErrorQueueDispatchingStrategy;
import org.apache.sling.distribution.queue.impl.MultipleQueueDispatchingStrategy;
import org.apache.sling.distribution.queue.impl.PriorityQueueDispatchingStrategy;
@@ -69,125 +59,52 @@
import org.apache.sling.settings.SlingSettingsService;
import org.osgi.framework.BundleContext;
import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.metatype.annotations.Designate;
+
+
+
/**
* An OSGi service factory for {@link DistributionAgent}s which references already existing OSGi services.
*/
-@Component(metatype = true,
- label = "Apache Sling Distribution Agent - Forward Agents Factory",
- description = "OSGi configuration factory for forward agents",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ property= {"webconsole.configurationFactory.nameHint=Agent name: {name}"}
)
-@Reference(name = "triggers", referenceInterface = DistributionTrigger.class,
- policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
- bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
-@Property(name = "webconsole.configurationFactory.nameHint", value = "Agent name: {name}")
+@Designate(ocd =ForwardDistributionAgentFactoryConfig.class, factory=true)
public class ForwardDistributionAgentFactory extends AbstractDistributionAgentFactory<ForwardDistributionAgentMBean> {
-
- @Property(label = "Name", description = "The name of the agent.")
- public static final String NAME = DistributionComponentConstants.PN_NAME;
-
- @Property(label = "Title", description = "The display friendly title of the agent.")
- public static final String TITLE = "title";
-
- @Property(label = "Details", description = "The display friendly details of the agent.")
- public static final String DETAILS = "details";
-
-
- @Property(boolValue = true, label = "Enabled", description = "Whether or not to start the distribution agent.")
- private static final String ENABLED = "enabled";
-
- @Property(label = "Service Name", description = "The name of the service used to access the repository. " +
- "If not set, the calling user ResourceResolver will be used")
- private static final String SERVICE_NAME = "serviceName";
-
- @Property(options = {
- @PropertyOption(name = "debug", value = "debug"), @PropertyOption(name = "info", value = "info"), @PropertyOption(name = "warn", value = "warn"),
- @PropertyOption(name = "error", value = "error")},
- value = "info",
- label = "Log Level", description = "The log level recorded in the transient log accessible via http."
- )
- public static final String LOG_LEVEL = AbstractDistributionAgentFactory.LOG_LEVEL;
-
-
- @Property(cardinality = 100, label = "Allowed roots", description = "If set the agent will allow only distribution requests under the specified roots.")
- private static final String ALLOWED_ROOTS = "allowed.roots";
-
-
- @Property(boolValue = true, label = "Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
- private static final String QUEUE_PROCESSING_ENABLED = "queue.processing.enabled";
-
-
+
/**
- * endpoints property
+ * Need to keep the constants around so the code below is still working.
*/
- @Property(cardinality = 100, label = "Importer Endpoints", description = "List of endpoints to which packages are sent (imported). " +
- "The list can be given as a map in case a queue should be configured for each endpoint, e.g. queueName=http://...")
- private static final String IMPORTER_ENDPOINTS = "packageImporter.endpoints";
-
-
- @Property(cardinality = 100, label = "Passive queues", description = "List of queues that should be disabled." +
- "These queues will gather all the packages until they are removed explicitly.")
+ private static final String ALLOWED_ROOTS = "allowed.roots";
+ private static final String SERVICE_NAME = "serviceName";
+ private static final Object QUEUE_PROCESSING_ENABLED = "queue.processing.enabled";
private static final String PASSIVE_QUEUES = "passiveQueues";
-
- @Property(cardinality = 100, label = "Priority queues", description = "List of priority queues that should used for specific paths." +
- "The selector format is {queuePrefix}[|{mainQueueMatcher}]={pathMatcher}, e.g. french=/content/fr.*")
private static final String PRIORITY_QUEUES = "priorityQueues";
+ private static final String QUEUE_PROVIDER = "queue.provider";
+ private static final String ASYNC_DELIVERY = "async.delivery";
+ private static final String RETRY_STRATEGY = "retry.attempt";
+ private static final String RETRY_ATTEMPTS = "retry.strategy";
+ private static final String IMPORTER_ENDPOINTS = "packageImporter.endpoints";
+ private static final String HTTP = "http.conn.timeout";
- @Property(options = {
- @PropertyOption(name = "none", value = "none"), @PropertyOption(name = "errorQueue", value = "errorQueue")},
- value = "none",
- label = "Retry Strategy", description = "The strategy to apply after a certain number of failed retries."
- )
- private static final String RETRY_STRATEGY = "retry.strategy";
-
- @Property(intValue = 100, label = "Retry attempts", description = "The number of times to retry until the retry strategy is applied.")
- private static final String RETRY_ATTEMPTS = "retry.attempts";
-
-
- @Property(name = "requestAuthorizationStrategy.target", label = "Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "requestAuthorizationStrategy")
private DistributionRequestAuthorizationStrategy requestAuthorizationStrategy;
-
- @Property(name = "transportSecretProvider.target", label = "Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "transportSecretProvider")
- private
- DistributionTransportSecretProvider transportSecretProvider;
+ private DistributionTransportSecretProvider transportSecretProvider;
-
- @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "packageBuilder")
private DistributionPackageBuilder packageBuilder;
- @Property(value = DEFAULT_TRIGGER_TARGET, label = "Triggers", description = "The target reference for DistributionTrigger used to trigger distribution, " +
- "e.g. use target=(name=...) to bind to services by name.")
- public static final String TRIGGERS_TARGET = "triggers.target";
-
- @Property(options = {
- @PropertyOption(name = JobHandlingDistributionQueueProvider.TYPE, value = "Sling Jobs"),
- @PropertyOption(name = ResourceQueueProvider.TYPE, value = "Resource Backed"),
- @PropertyOption(name = SimpleDistributionQueueProvider.TYPE, value = "In-memory"),
- @PropertyOption(name = SimpleDistributionQueueProvider.TYPE_CHECKPOINT, value = "In-file")},
- value = "jobs",
- label = "Queue provider", description = "The queue provider implementation."
- )
- public static final String QUEUE_PROVIDER = "queue.provider";
-
- @Property(boolValue = false, label = "Async delivery", description = "Whether or not to use a separate delivery queue to maximize transport throughput when queue has more than 100 items")
- public static final String ASYNC_DELIVERY = "async.delivery";
-
- /**
- * timeout for HTTP requests
- */
- @Property(label = "HTTP connection timeout", intValue = 10, description = "The connection timeout for HTTP requests (in seconds).")
- public static final String HTTP = "http.conn.timeout";
-
@Reference
private Packaging packaging;
@@ -216,11 +133,9 @@
super(ForwardDistributionAgentMBean.class);
}
- @Activate
- protected void activate(BundleContext context, Map<String, Object> config) {
- super.activate(context, config);
- }
-
+ @Reference(name = "triggers", service = DistributionTrigger.class,
+ policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.MULTIPLE,
+ bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
protected void bindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
super.bindDistributionTrigger(distributionTrigger, config);
}
@@ -228,6 +143,16 @@
protected void unbindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
super.unbindDistributionTrigger(distributionTrigger, config);
}
+
+ /**
+ * In the first round it's not possible to utilize the signature with the above
+ * config class because of the way the configuration is processed ...
+ *
+ */
+ @Activate
+ protected void activate(BundleContext context, Map<String, Object> config) {
+ super.activate(context, config);
+ }
@Deactivate
protected void deactivate(BundleContext context) {
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactoryConfig.java b/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactoryConfig.java
new file mode 100644
index 0000000..f6e47da
--- /dev/null
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/ForwardDistributionAgentFactoryConfig.java
@@ -0,0 +1,116 @@
+/*
+ * 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.sling.distribution.agent.impl;
+
+import org.apache.sling.distribution.component.impl.SettingsUtils;
+import org.apache.sling.distribution.queue.impl.jobhandling.JobHandlingDistributionQueueProvider;
+import org.apache.sling.distribution.queue.impl.resource.ResourceQueueProvider;
+import org.apache.sling.distribution.queue.impl.simple.SimpleDistributionQueueProvider;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
+
+@ObjectClassDefinition(name="Apache Sling Distribution Agent - Forward Agents Factory",
+ description="OSGi configuration factory for forward agents")
+public @interface ForwardDistributionAgentFactoryConfig {
+ @AttributeDefinition(name = "Name", description = "The name of the agent." )
+ String name() default "";
+
+ @AttributeDefinition(name="Title", description="The display friendly title of the agent.")
+ String title() default "";
+
+ @AttributeDefinition(name="Details",description = "The display friendly details of the agent.")
+ String details() default "";
+
+ @AttributeDefinition(name="Enabled", description = "Whether or not to start the distribution agent.")
+ boolean enabled() default true;
+
+ @AttributeDefinition(name="Service Name", description = "The name of the service used to access the repository. " +
+ "If not set, the calling user ResourceResolver will be used")
+ String serviceName() default "";
+
+ @AttributeDefinition(name="Log Level", description = "The log level recorded in the transient log accessible via http.",
+ options = {
+ @Option(label="debug", value="debug"),
+ @Option(label="info", value="info"),
+ @Option(label="warn", value="warn"),
+ @Option(label="error", value="error")
+ })
+ String log_level() default "info";
+
+ @AttributeDefinition(cardinality=100, name="Allowed roots", description = "If set the agent will allow only distribution requests under the specified roots.")
+ String[] allowed_roots();
+
+ @AttributeDefinition(name="Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
+ boolean queue_processing_enabled() default true;
+
+ // endpoints property
+ @AttributeDefinition(cardinality=100, name="Importer Endpoints", description = "List of endpoints to which packages are sent (imported). " +
+ "The list can be given as a map in case a queue should be configured for each endpoint, e.g. queueName=http://...")
+ String[] packageImporter_endpoints();
+
+ @AttributeDefinition(cardinality=100,name="passive queues", description = "List of queues that should be disabled." +
+ "These queues will gather all the packages until they are removed explicitly.")
+ String[] passiveQueues();
+
+ @AttributeDefinition(cardinality=100, name="Priority queues", description = "List of priority queues that should used for specific paths." +
+ "The selector format is {queuePrefix}[|{mainQueueMatcher}]={pathMatcher}, e.g. french=/content/fr.*")
+ String[] priorityQueues();
+
+ @AttributeDefinition(name="Retry Strategy", description = "The strategy to apply after a certain number of failed retries.",
+ options= {
+ @Option(label="none",value="none"),
+ @Option(label="errorQueue", value="errorQueue")
+ })
+ String retry_strategy() default "none";
+
+ @AttributeDefinition(name="Retry attemps", description = "The number of times to retry until the retry strategy is applied.")
+ int retry_attempts() default 100;
+
+ @AttributeDefinition(name="Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String requestAuthorizationStrategy_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ @AttributeDefinition(name="Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String transportSecretProvider_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String packageBuilder_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ @AttributeDefinition(name="Triggers",description = "The target reference for DistributionTrigger used to trigger distribution, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String triggers_target() default ForwardDistributionAgentFactory.DEFAULT_TRIGGER_TARGET;
+
+ @AttributeDefinition(name="Queue provider", description="he queue provider implementation.",
+ options = {
+ @Option(label=JobHandlingDistributionQueueProvider.TYPE, value="jobs"),
+ @Option(label=ResourceQueueProvider.TYPE, value="Resource Backed"),
+ @Option(label=SimpleDistributionQueueProvider.TYPE, value="In-memory"),
+ @Option(label=SimpleDistributionQueueProvider.TYPE_CHECKPOINT,value="In-file")
+ })
+ String queue_provider() default "jobs";
+
+ @AttributeDefinition(name="Async delivery", description = "Whether or not to use a separate delivery queue to maximize transport throughput when queue has more than 100 items" )
+ boolean async_delivery() default false;
+
+ @AttributeDefinition(name="HTTP connection timeout", description = "The connection timeout for HTTP requests (in seconds).")
+ int http_conn_timeout() default 10;
+}
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyFactory.java b/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyFactory.java
index fc93ce7..478a8cc 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyFactory.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyFactory.java
@@ -18,69 +18,58 @@
*/
package org.apache.sling.distribution.agent.impl;
-import java.util.Map;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.distribution.DistributionRequest;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.common.DistributionException;
import org.jetbrains.annotations.NotNull;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
/**
* OSGi configuration factory for {@link PrivilegeDistributionRequestAuthorizationStrategy}
*/
-@Component(metatype = true,
- label = "Apache Sling Distribution Request Authorization - Privilege Request Authorization Strategy",
- description = "OSGi configuration for request based authorization strategy based on privileges",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE,
- immediate = true
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionRequestAuthorizationStrategy.class,
+ immediate = true,
+ property = {
+ "webconsole.configurationFactory.nameHint=Strategy name: {name}"
+ }
)
-@Service(DistributionRequestAuthorizationStrategy.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Strategy name: {name}")
+@Designate(ocd = PrivilegeDistributionRequestAuthorizationStrategyFactory.Config.class, factory = true)
public class PrivilegeDistributionRequestAuthorizationStrategyFactory implements DistributionRequestAuthorizationStrategy {
-
- /**
- * name of this strategy.
- */
- @Property(label = "Name")
- public static final String NAME = DistributionComponentConstants.PN_NAME;
-
- /**
- * privilege request authorization strategy jcr privilege property
- */
- @Property(label = "Jcr Privilege", description = "Jcr privilege to check for authorizing distribution requests. The privilege is checked for the calling user session.")
- private static final String JCR_PRIVILEGE = "jcrPrivilege";
-
- /**
- * privilege ADD request authorization strategy jcr privilege property
- */
- @Property(cardinality = 100, label = "Additional Jcr Privileges for Add", description = "Additional Jcr privileges to check for authorizing ADD distribution requests. " +
- "The privilege is checked for the calling user session.", value = "jcr:read")
- private static final String JCR_ADD_PRIVILEGES = "additionalJcrPrivilegesForAdd";
-
- /**
- * privilege DELETE request authorization strategy jcr privilege property
- */
- @Property(cardinality = 100, label = "Additional Jcr Privileges for Delete", description = "Additional Jcr privileges to check for authorizing DELETE distribution requests. " +
- "The privilege is checked for the calling user session.", value = "jcr:removeNode")
- private static final String JCR_DELETE_PRIVILEGES = "additionalJcrPrivilegesForDelete";
+
+ @ObjectClassDefinition(name = "Apache Sling Distribution Request Authorization - Privilege Request Authorization Strategy",
+ description = "OSGi configuration for request based authorization strategy based on privileges")
+ public @interface Config {
+
+ @AttributeDefinition(name="name")
+ String name() default "";
+
+ @AttributeDefinition(name="Jcr Privilege", description = "Jcr privilege to check for authorizing distribution requests. The privilege is checked for the calling user session.")
+ String jcrPrivilege() default "";
+
+ @AttributeDefinition(cardinality = 100, name="Additional Jcr Privileges for Add",description = "Additional Jcr privileges to check for authorizing ADD distribution requests. " +
+ "The privilege is checked for the calling user session.")
+ String[] additionalJcrPrivilegesForAdd() default "jcr:read";
+
+ @AttributeDefinition(cardinality = 100, name="Additional Jcr Privileges for Delete", description = "Additional Jcr privileges to check for authorizing ADD distribution requests. " +
+ "The privilege is checked for the calling user session.")
+ String[] additionalJcrPrivilegesForDelete() default "jcr:removeNode";
+ }
private DistributionRequestAuthorizationStrategy authorizationStrategy;
@Activate
- public void activate(BundleContext context, Map<String, Object> config) {
- String jcrPrivilege = PropertiesUtil.toString(config.get(JCR_PRIVILEGE), null);
- String[] jcrAddPrivileges = PropertiesUtil.toStringArray(config.get(JCR_ADD_PRIVILEGES));
- String[] jcrDeletePrivileges = PropertiesUtil.toStringArray(config.get(JCR_DELETE_PRIVILEGES));
+ public void activate(BundleContext context, Config conf) {
+ String jcrPrivilege = conf.jcrPrivilege();
+ String[] jcrAddPrivileges = conf.additionalJcrPrivilegesForAdd();
+ String[] jcrDeletePrivileges = conf.additionalJcrPrivilegesForDelete();
authorizationStrategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, jcrAddPrivileges, jcrDeletePrivileges);
}
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java b/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java
index bd15e63..5a41cd1 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java
@@ -20,15 +20,7 @@
import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyOption;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.ReferencePolicy;
+
import org.apache.jackrabbit.vault.packaging.Packaging;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.commons.osgi.PropertiesUtil;
@@ -53,6 +45,17 @@
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.settings.SlingSettingsService;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
/**
* An OSGi service factory for "queuing agents" that queue resources from the local instance (and can be eventually
@@ -60,76 +63,84 @@
*
* @see {@link DistributionAgent}
*/
-@Component(metatype = true,
- label = "Apache Sling Distribution Agent - Queue Agents Factory",
- description = "OSGi configuration factory for queueing agents",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE
-)
-@Reference(name = "triggers", referenceInterface = DistributionTrigger.class,
- policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
- bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
-@Property(name="webconsole.configurationFactory.nameHint", value="Agent name: {name}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ property = {
+ "webconsole.configurationFactory.nameHint=Agent name: {name}"
+ })
+@Designate(ocd = QueueDistributionAgentFactory.Config.class,factory = true)
public class QueueDistributionAgentFactory extends AbstractDistributionAgentFactory<QueueDistributionAgentMBean> {
- @Property(label = "Name", description = "The name of the agent.")
+ @ObjectClassDefinition(name = "Apache Sling Distribution Agent - Queue Agents Factory",
+ description = "OSGi configuration factory for queueing agents")
+ public @interface Config {
+ @AttributeDefinition(name = "Name",description = "The name of the agent.")
+ String name() default "";
+
+ @AttributeDefinition(name="Title", description = "The display friendly title of the agent.")
+ String title() default "";
+
+ @AttributeDefinition(name="Details", description = "The display friendly details of the agent.")
+ String details() default "";
+
+ @AttributeDefinition(name="Enabled", description = "Whether or not to start the distribution agent.")
+ boolean enabled() default true;
+
+ @AttributeDefinition(name="Service Name", description = "The name of the service used to access the repository. " +
+ "If not set, the calling user ResourceResolver will be used" )
+ String serviceName() default "";
+
+ @AttributeDefinition(name="Log Level", description = "The log level recorded in the transient log accessible via http.",
+ options = {
+ @Option(label="debug", value="debug"),
+ @Option(label="info", value="info"),
+ @Option(label="warn", value="warn"),
+ @Option(label="error", value="error")
+ })
+ String log_level() default "info";
+
+ @AttributeDefinition(cardinality=100, name="Allowed roots", description = "If set the agent will allow only distribution requests under the specified roots.")
+ String[] allowed_roots();
+
+ @AttributeDefinition(name="Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String requestAuthorizationStrategy_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ @AttributeDefinition(name="Queue Provider Factory", description = "The target reference for the DistributionQueueProviderFactory used to build queues," +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String queueProviderFactory_target() default "(name=jobQueue)";
+
+ @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String packageBuilder_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ @AttributeDefinition(name="Triggers", description = "The target reference for DistributionTrigger used to trigger distribution, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String triggers_target() default DEFAULT_TRIGGER_TARGET;
+
+ @AttributeDefinition(cardinality = 100, name="Priority queues", description = "List of priority queues that should used for specific paths." +
+ "The selector format is {queuePrefix}[|{mainQueueMatcher}]={pathMatcher}, e.g. french=/content/fr.*" )
+ String[] priorityQueues();
+ }
+
public static final String NAME = DistributionComponentConstants.PN_NAME;
-
- @Property(label = "Title", description = "The display friendly title of the agent.")
public static final String TITLE = "title";
-
- @Property(label = "Details", description = "The display friendly details of the agent.")
public static final String DETAILS = "details";
-
-
- @Property(boolValue = true, label = "Enabled", description = "Whether or not to start the distribution agent.")
- private static final String ENABLED = "enabled";
-
-
- @Property(label = "Service Name", description = "The name of the service used to access the repository. " +
- "If not set, the calling user ResourceResolver will be used")
private static final String SERVICE_NAME = "serviceName";
-
- @Property(options = {
- @PropertyOption(name = "debug", value = "debug"), @PropertyOption(name = "info", value = "info"), @PropertyOption(name = "warn", value = "warn"),
- @PropertyOption(name = "error", value = "error")},
- value = "info",
- label = "Log Level", description = "The log level recorded in the transient log accessible via http."
- )
public static final String LOG_LEVEL = AbstractDistributionAgentFactory.LOG_LEVEL;
-
-
- @Property(cardinality = 100, label = "Allowed roots", description = "If set the agent will allow only distribution requests under the specified roots.")
private static final String ALLOWED_ROOTS = "allowed.roots";
+ public static final String TRIGGERS_TARGET = "triggers.target";
+ private static final String PRIORITY_QUEUES = "priorityQueues";
-
- @Property(name = "requestAuthorizationStrategy.target", label = "Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "requestAuthorizationStrategy")
private DistributionRequestAuthorizationStrategy requestAuthorizationStrategy;
-
- @Property(name = "queueProviderFactory.target", label = "Queue Provider Factory", description = "The target reference for the DistributionQueueProviderFactory used to build queues," +
- "e.g. use target=(name=...) to bind to services by name.", value = "(name=jobQueue)")
@Reference(name = "queueProviderFactory")
private DistributionQueueProviderFactory queueProviderFactory;
-
- @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "packageBuilder")
private DistributionPackageBuilder packageBuilder;
- @Property(value = DEFAULT_TRIGGER_TARGET, label = "Triggers", description = "The target reference for DistributionTrigger used to trigger distribution, " +
- "e.g. use target=(name=...) to bind to services by name.")
- public static final String TRIGGERS_TARGET = "triggers.target";
-
- @Property(cardinality = 100, label = "Priority queues", description = "List of priority queues that should used for specific paths." +
- "The selector format is {queuePrefix}[|{mainQueueMatcher}]={pathMatcher}, e.g. french=/content/fr.*")
- private static final String PRIORITY_QUEUES = "priorityQueues";
-
-
@Reference
private Packaging packaging;
@@ -156,6 +167,9 @@
super.activate(context, config);
}
+ @Reference(name = "triggers",
+ policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.MULTIPLE,
+ bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
protected void bindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
super.bindDistributionTrigger(distributionTrigger, config);
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/ReverseDistributionAgentFactory.java b/src/main/java/org/apache/sling/distribution/agent/impl/ReverseDistributionAgentFactory.java
index 49db09c..7fb0df8 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/ReverseDistributionAgentFactory.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/ReverseDistributionAgentFactory.java
@@ -22,15 +22,6 @@
import java.util.Map;
import java.util.Set;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyOption;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.jackrabbit.vault.packaging.Packaging;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.commons.osgi.PropertiesUtil;
@@ -59,90 +50,107 @@
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.settings.SlingSettingsService;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
/**
* An OSGi service factory for "reverse agents" that pull resources from remote instances (e.g. from "queueing agents").
*
* @see {@link DistributionAgent}
*/
-@Component(metatype = true,
- label = "Apache Sling Distribution Agent - Reverse Agents Factory",
- description = "OSGi configuration factory for reverse agents",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ property = {
+ "webconsole.configurationFactory.nameHint=Agent name: {name}"
+ }
)
-@Reference(name = "triggers", referenceInterface = DistributionTrigger.class,
- policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
- bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
-@Property(name="webconsole.configurationFactory.nameHint", value="Agent name: {name}")
+@Designate(ocd = ReverseDistributionAgentFactory.Config.class, factory = true)
public class ReverseDistributionAgentFactory extends AbstractDistributionAgentFactory<ReverseDistributionAgentMBean> {
+
+ @ObjectClassDefinition(name = "Apache Sling Distribution Agent - Reverse Agents Factory",
+ description = "OSGi configuration factory for reverse agents")
+ public @interface Config {
+ @AttributeDefinition(name = "Name", description = "The name of the agent." )
+ String name() default "";
+ @AttributeDefinition(name="Title", description="The display friendly title of the agent.")
+ String title() default "";
+ @AttributeDefinition(name="Details",description = "The display friendly details of the agent.")
+ String details() default "";
+ @AttributeDefinition(name="Enabled", description = "Whether or not to start the distribution agent.")
+ boolean enabled() default true;
+
+ @AttributeDefinition(name="Service Name", description = "The name of the service used to access the repository. " +
+ "If not set, the calling user ResourceResolver will be used" )
+ String serviceName() default "";
+
+ @AttributeDefinition(name="Log Level", description = "The log level recorded in the transient log accessible via http.",
+ options = {
+ @Option(label="debug", value="debug"),
+ @Option(label="info", value="info"),
+ @Option(label="warn", value="warn"),
+ @Option(label="error", value="error")
+ })
+ String log_level() default "info";
+
+ @AttributeDefinition(name="Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
+ boolean queue_processing_enabled() default true;
+
+ @AttributeDefinition(cardinality=100, name="Importer Endpoints", description = "List of endpoints to which packages are sent (imported). " +
+ "The list can be given as a map in case a queue should be configured for each endpoint, e.g. queueName=http://...")
+ String[] packageExporter_endpoints();
+
+ @AttributeDefinition(name="Pull Items", description = "Number of subsequent pull requests to make.")
+ int pull_items() default 100;
+
+ @AttributeDefinition(name="HTTP connection timeout", description = "The connection timeout for HTTP requests (in seconds).")
+ int http_conn_timeout() default 10;
+
+ @AttributeDefinition(name="Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String requestAuthorizationStrategy_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ @AttributeDefinition(name="Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String transportSecretProvider_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String packageBuilder_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ @AttributeDefinition(name="Triggers",description = "The target reference for DistributionTrigger used to trigger distribution, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String triggers_target() default DEFAULT_TRIGGER_TARGET;
+
+ }
- @Property(label = "Name", description = "The name of the agent.")
public static final String NAME = DistributionComponentConstants.PN_NAME;
-
- @Property(label = "Title", description = "The display friendly title of the agent.")
public static final String TITLE = "title";
-
- @Property(label = "Details", description = "The display friendly details of the agent.")
public static final String DETAILS = "details";
-
- @Property(boolValue = true, label = "Enabled", description = "Whether or not to start the distribution agent.")
- private static final String ENABLED = "enabled";
-
-
- @Property(label = "Service Name", description = "The name of the service used to access the repository.")
private static final String SERVICE_NAME = "serviceName";
-
- @Property(options = {
- @PropertyOption(name = "debug", value = "debug"), @PropertyOption(name = "info", value = "info"), @PropertyOption(name = "warn", value = "warn"),
- @PropertyOption(name = "error", value = "error")},
- value = "info",
- label = "Log Level", description = "The log level recorded in the transient log accessible via http."
- )
- public static final String LOG_LEVEL = AbstractDistributionAgentFactory.LOG_LEVEL;
-
-
- @Property(boolValue = true, label = "Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
private static final String QUEUE_PROCESSING_ENABLED = "queue.processing.enabled";
-
- /**
- * endpoints property
- */
- @Property(cardinality = 100, label = "Importer Endpoints", description = "List of endpoints from which packages are received (exported).")
private static final String EXPORTER_ENDPOINTS = "packageExporter.endpoints";
-
- /**
- * no. of items to poll property
- */
- @Property(intValue = 100, label = "Pull Items", description = "Number of subsequent pull requests to make.")
private static final String PULL_ITEMS = "pull.items";
-
- /**
- * timeout for HTTP requests
- */
- @Property(label = "HTTP connection timeout", intValue = 10, description = "The connection timeout for HTTP requests (in seconds).")
public static final String HTTP = "http.conn.timeout";
+ public static final String TRIGGERS_TARGET = "triggers.target";
- @Property(name = "requestAuthorizationStrategy.target", label = "Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "requestAuthorizationStrategy")
private DistributionRequestAuthorizationStrategy requestAuthorizationStrategy;
- @Property(name = "transportSecretProvider.target", label = "Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "transportSecretProvider")
private DistributionTransportSecretProvider transportSecretProvider;
- @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "packageBuilder")
private DistributionPackageBuilder packageBuilder;
- @Property(value = DEFAULT_TRIGGER_TARGET, label = "Triggers", description = "The target reference for DistributionTrigger used to trigger distribution, " +
- "e.g. use target=(name=...) to bind to services by name.")
- public static final String TRIGGERS_TARGET = "triggers.target";
-
@Reference
private Packaging packaging;
@@ -170,6 +178,9 @@
super.activate(context, config);
}
+ @Reference(name = "triggers",
+ policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.MULTIPLE,
+ bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
protected void bindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
super.bindDistributionTrigger(distributionTrigger, config);
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentFactory.java b/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentFactory.java
index b58f0b7..f23c8bb 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentFactory.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgentFactory.java
@@ -22,15 +22,6 @@
import java.util.Map;
import java.util.Set;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyOption;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.distribution.agent.spi.DistributionAgent;
@@ -51,73 +42,92 @@
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.settings.SlingSettingsService;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
/**
* An OSGi service factory for {@link DistributionAgent}s which references already existing OSGi services.
*/
-@Component(metatype = true,
- label = "Apache Sling Distribution Agent - Simple Agents Factory",
- description = "OSGi configuration factory for agents",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ property = {
+ "webconsole.configurationFactory.nameHint=Agent name: {name}"
+ }
)
-@Reference(name = "triggers", referenceInterface = DistributionTrigger.class,
- policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
- bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
-@Property(name="webconsole.configurationFactory.nameHint", value="Agent name: {name}")
+
+@Designate(ocd=SimpleDistributionAgentFactory.Config.class, factory = true)
public class SimpleDistributionAgentFactory extends AbstractDistributionAgentFactory<SimpleDistributionAgentMBean> {
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Agent - Simple Agents Factory",
+ description = "OSGi configuration factory for agents")
+ public @interface Config {
+ @AttributeDefinition(name = "Name", description = "The name of the agent." )
+ String name() default "";
+ @AttributeDefinition(name="Title", description="The display friendly title of the agent.")
+ String title() default "";
+ @AttributeDefinition(name="Details",description = "The display friendly details of the agent.")
+ String details() default "";
+ @AttributeDefinition(name="Enabled", description = "Whether or not to start the distribution agent.")
+ boolean enabled() default true;
+
+ @AttributeDefinition(name="Service Name", description = "The name of the service used to access the repository. " +
+ "If not set, the calling user ResourceResolver will be used" )
+ String serviceName() default "";
+
+ @AttributeDefinition(name="Log Level", description = "The log level recorded in the transient log accessible via http.",
+ options = {
+ @Option(label="debug", value="debug"),
+ @Option(label="info", value="info"),
+ @Option(label="warn", value="warn"),
+ @Option(label="error", value="error")
+ })
+ String log_level() default "info";
+
+ @AttributeDefinition(name="Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
+ boolean queue_processing_enabled() default true;
+
+ @AttributeDefinition(name="Exporter", description="The target reference for the DistributionPackageExporter used to receive (export) the distribution packages,\" +\n"
+ + " \"e.g. use target=(name=...) to bind to services by name.")
+ String packageExporter_target();
+
+ @AttributeDefinition(name="Importer", description = "The target reference for the DistributionPackageImporter used to send (import) the distribution packages," +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String packageImporter_target();
+
+ @AttributeDefinition(name="Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String requestAuthorizationStrategy_target();
+
+ @AttributeDefinition(name="Triggers",description = "The target reference for DistributionTrigger used to trigger distribution, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String triggers_target() default DEFAULT_TRIGGER_TARGET;
+ }
- @Property(label = "Name", description = "The name of the agent.")
public static final String NAME = DistributionComponentConstants.PN_NAME;
-
- @Property(label = "Title", description = "The display friendly title of the agent.")
public static final String TITLE = "title";
-
- @Property(label = "Details", description = "The display friendly details of the agent.")
public static final String DETAILS = "details";
-
-
- @Property(boolValue = true, label = "Enabled", description = "Whether or not to start the distribution agent.")
- private static final String ENABLED = "enabled";
-
-
- @Property(label = "Service Name", description = "The name of the service used to access the repository.")
private static final String SERVICE_NAME = "serviceName";
-
- @Property(options = {
- @PropertyOption(name = "debug", value = "debug"), @PropertyOption(name = "info", value = "info"), @PropertyOption(name = "warn", value = "warn"),
- @PropertyOption(name = "error", value = "error")},
- value = "info",
- label = "Log Level", description = "The log level recorded in the transient log accessible via http."
- )
- public static final String LOG_LEVEL = AbstractDistributionAgentFactory.LOG_LEVEL;
-
-
- @Property(boolValue = true, label = "Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
private static final String QUEUE_PROCESSING_ENABLED = "queue.processing.enabled";
- @Property(name = "packageExporter.target", label = "Exporter", description = "The target reference for the DistributionPackageExporter used to receive (export) the distribution packages," +
- "e.g. use target=(name=...) to bind to services by name.")
@Reference(name = "packageExporter")
private DistributionPackageExporter packageExporter;
-
- @Property(name = "packageImporter.target", label = "Importer", description = "The target reference for the DistributionPackageImporter used to send (import) the distribution packages," +
- "e.g. use target=(name=...) to bind to services by name.")
@Reference(name = "packageImporter")
private DistributionPackageImporter packageImporter;
-
- @Property(name = "requestAuthorizationStrategy.target", label = "Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
- "e.g. use target=(name=...) to bind to services by name.")
@Reference(name = "requestAuthorizationStrategy")
private DistributionRequestAuthorizationStrategy requestAuthorizationStrategy;
-
- @Property(value = DEFAULT_TRIGGER_TARGET, label = "Triggers", description = "The target reference for DistributionTrigger used to trigger distribution, " +
- "e.g. use target=(name=...) to bind to services by name.")
public static final String TRIGGERS_TARGET = "triggers.target";
@@ -145,6 +155,9 @@
super.activate(context, config);
}
+ @Reference(name = "triggers",
+ policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.MULTIPLE,
+ bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
protected void bindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
super.bindDistributionTrigger(distributionTrigger, config);
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/SyncDistributionAgentFactory.java b/src/main/java/org/apache/sling/distribution/agent/impl/SyncDistributionAgentFactory.java
index 1aa283c..3ebf6e2 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/SyncDistributionAgentFactory.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/SyncDistributionAgentFactory.java
@@ -18,7 +18,6 @@
*/
package org.apache.sling.distribution.agent.impl;
-import org.apache.felix.scr.annotations.*;
import org.apache.jackrabbit.vault.packaging.Packaging;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.commons.osgi.PropertiesUtil;
@@ -48,6 +47,17 @@
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.settings.SlingSettingsService;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
import java.util.*;
@@ -56,110 +66,116 @@
*
* @see {@link DistributionAgent}
*/
-@Component(metatype = true,
- label = "Apache Sling Distribution Agent - Sync Agents Factory",
- description = "OSGi configuration factory for syncing agents",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ property = {
+ "webconsole.configurationFactory.nameHint=Agent name: {name}"
+ }
)
-@Reference(name = "triggers", referenceInterface = DistributionTrigger.class,
- policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
- bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
-@Property(name = "webconsole.configurationFactory.nameHint", value = "Agent name: {name}")
+@Designate(ocd=SyncDistributionAgentFactory.Config.class, factory = true)
public class SyncDistributionAgentFactory extends AbstractDistributionAgentFactory<SyncDistributionAgentMBean> {
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Agent - Sync Agents Factory",
+ description = "OSGi configuration factory for syncing agents")
+ public @interface Config {
+ @AttributeDefinition(name = "Name", description = "The name of the agent." )
+ String name() default "";
+ @AttributeDefinition(name="Title", description="The display friendly title of the agent.")
+ String title() default "";
+ @AttributeDefinition(name="Details",description = "The display friendly details of the agent.")
+ String details() default "";
+ @AttributeDefinition(name="Enabled", description = "Whether or not to start the distribution agent.")
+ boolean enabled() default true;
+
+ @AttributeDefinition(name="Service Name", description = "The name of the service used to access the repository. " +
+ "If not set, the calling user ResourceResolver will be used" )
+ String serviceName() default "";
+
+ @AttributeDefinition(name="Log Level", description = "The log level recorded in the transient log accessible via http.",
+ options = {
+ @Option(label="debug", value="debug"),
+ @Option(label="info", value="info"),
+ @Option(label="warn", value="warn"),
+ @Option(label="error", value="error")
+ })
+ String log_level() default "info";
+
+ @AttributeDefinition(name="Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
+ boolean queue_processing_enabled() default true;
+
- @Property(label = "Name", description = "The name of the agent.")
+
+ @AttributeDefinition(cardinality=100,name="passive queues", description = "List of queues that should be disabled." +
+ "These queues will gather all the packages until they are removed explicitly.")
+ String[] passiveQueues();
+
+ @AttributeDefinition(cardinality=100, name="Exporter Endpoints", description = "List of endpoints to which packages are sent (imported). " +
+ "The list can be given as a map in case a queue should be configured for each endpoint, e.g. queueName=http://...")
+ String[] packageExporter_endpoints();
+
+ @AttributeDefinition(cardinality=100, name="Importer Endpoints", description = "List of endpoints from which packages are received (exported)")
+ String[] packageImporter_endpoints();
+
+ @AttributeDefinition(name="Retry Strategy", description = "The strategy to apply after a certain number of failed retries.",
+ options= {
+ @Option(label="none",value="none"),
+ @Option(label="errorQueue", value="errorQueue")
+ })
+ String retry_strategy() default "none";
+
+ @AttributeDefinition(name="Retry attempts", description = "The number of times to retry until the retry strategy is applied.")
+ int retry_attempts() default 100;
+
+ @AttributeDefinition(name="Pull items", description = "Number of subsequent pull requests to make.")
+ int pull_items() default 100;
+
+ @AttributeDefinition(name="HTTP connection timeout", description = "The connection timeout for HTTP requests (in seconds).")
+ int http_conn_timeout() default 10;
+
+ @AttributeDefinition(name="Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String requestAuthorizationStrategy_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ @AttributeDefinition(name="Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String transportSecretProvider_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String packageBuilder_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ @AttributeDefinition(name="Triggers",description = "The target reference for DistributionTrigger used to trigger distribution, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String triggers_target() default DEFAULT_TRIGGER_TARGET;
+ }
+
public static final String NAME = DistributionComponentConstants.PN_NAME;
-
- @Property(label = "Title", description = "The display friendly title of the agent.")
public static final String TITLE = "title";
-
- @Property(label = "Details", description = "The display friendly details of the agent.")
public static final String DETAILS = "details";
-
- @Property(boolValue = true, label = "Enabled", description = "Whether or not to start the distribution agent.")
- private static final String ENABLED = "enabled";
-
-
- @Property(label = "Service Name", description = "The name of the service used to access the repository. " +
- "If not set, the calling user ResourceResolver will be used")
private static final String SERVICE_NAME = "serviceName";
-
- @Property(options = {
- @PropertyOption(name = "debug", value = "debug"), @PropertyOption(name = "info", value = "info"), @PropertyOption(name = "warn", value = "warn"),
- @PropertyOption(name = "error", value = "error")},
- value = "info",
- label = "Log Level", description = "The log level recorded in the transient log accessible via http."
- )
- public static final String LOG_LEVEL = AbstractDistributionAgentFactory.LOG_LEVEL;
-
-
- @Property(boolValue = true, label = "Queue Processing Enabled", description = "Whether or not the distribution agent should process packages in the queues.")
private static final String QUEUE_PROCESSING_ENABLED = "queue.processing.enabled";
-
- @Property(cardinality = 100, label = "Passive queues", description = "List of queues that should be disabled." +
- "These queues will gather all the packages until they are removed explicitly.")
- private static final String PASSIVE_QUEUES = "passiveQueues";
-
- /**
- * endpoints property
- */
- @Property(cardinality = 100, label = "Exporter Endpoints", description = "List of endpoints from which packages are received (exported)")
private static final String EXPORTER_ENDPOINTS = "packageExporter.endpoints";
-
- /**
- * endpoints property
- */
- @Property(cardinality = 100, label = "Importer Endpoints", description = "List of endpoints to which packages are sent (imported). " +
- "The list can be given as a map in case a queue should be configured for each endpoint, e.g. queueName=http://...")
private static final String IMPORTER_ENDPOINTS = "packageImporter.endpoints";
-
- @Property(options = {
- @PropertyOption(name = "none", value = "none"), @PropertyOption(name = "errorQueue", value = "errorQueue")},
- value = "none",
- label = "Retry Strategy", description = "The strategy to apply after a certain number of failed retries."
- )
- private static final String RETRY_STRATEGY = "retry.strategy";
-
- @Property(intValue = 100, label = "Retry attempts", description = "The number of times to retry until the retry strategy is applied.")
- private static final String RETRY_ATTEMPTS = "retry.attempts";
-
- /**
- * no. of items to poll property
- */
- @Property(intValue = 100, label = "Pull Items", description = "Number of subsequent pull requests to make.")
private static final String PULL_ITEMS = "pull.items";
-
- /**
- * timeout for HTTP requests
- */
- @Property(label = "HTTP connection timeout", intValue = 10, description = "The connection timeout for HTTP requests (in seconds).")
public static final String HTTP = "http.conn.timeout";
+ public static final String TRIGGERS_TARGET = "triggers.target";
+ public static final String RETRY_ATTEMPTS = "retry.attempts";
+ public static final String RETRY_STRATEGY = "retry.strategy";
+ public static final String PASSIVE_QUEUES = "passiveQueues";
+
@Reference
private Packaging packaging;
- @Property(name = "requestAuthorizationStrategy.target", label = "Request Authorization Strategy", description = "The target reference for the DistributionRequestAuthorizationStrategy used to authorize the access to distribution process," +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "requestAuthorizationStrategy")
private DistributionRequestAuthorizationStrategy requestAuthorizationStrategy;
-
- @Property(name = "transportSecretProvider.target", label = "Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "transportSecretProvider")
private DistributionTransportSecretProvider transportSecretProvider;
- @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "packageBuilder")
private DistributionPackageBuilder packageBuilder;
- @Property(value = DEFAULT_TRIGGER_TARGET, label = "Triggers", description = "The target reference for DistributionTrigger used to trigger distribution, " +
- "e.g. use target=(name=...) to bind to services by name.")
- public static final String TRIGGERS_TARGET = "triggers.target";
-
@Reference
private DistributionEventFactory distributionEventFactory;
@@ -184,6 +200,9 @@
super.activate(context, config);
}
+ @Reference(name = "triggers",
+ policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.MULTIPLE,
+ bind = "bindDistributionTrigger", unbind = "unbindDistributionTrigger")
protected void bindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
super.bindDistributionTrigger(distributionTrigger, config);
diff --git a/src/main/java/org/apache/sling/distribution/agent/package-info.java b/src/main/java/org/apache/sling/distribution/agent/package-info.java
index 59b30d6..035ab12 100644
--- a/src/main/java/org/apache/sling/distribution/agent/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/agent/package-info.java
@@ -20,5 +20,4 @@
@Version("0.0.0")
package org.apache.sling.distribution.agent;
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/agent/spi/DistributionAgent.java b/src/main/java/org/apache/sling/distribution/agent/spi/DistributionAgent.java
index a27ee05..6c23fa6 100644
--- a/src/main/java/org/apache/sling/distribution/agent/spi/DistributionAgent.java
+++ b/src/main/java/org/apache/sling/distribution/agent/spi/DistributionAgent.java
@@ -18,7 +18,6 @@
*/
package org.apache.sling.distribution.agent.spi;
-import aQute.bnd.annotation.ConsumerType;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.distribution.DistributionRequest;
import org.apache.sling.distribution.DistributionResponse;
@@ -28,6 +27,7 @@
import org.apache.sling.distribution.queue.spi.DistributionQueue;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ConsumerType;
/**
* A distribution agent is responsible for handling {@link org.apache.sling.distribution.DistributionRequest}s.
diff --git a/src/main/java/org/apache/sling/distribution/agent/spi/package-info.java b/src/main/java/org/apache/sling/distribution/agent/spi/package-info.java
index dfd1253..3372ce4 100644
--- a/src/main/java/org/apache/sling/distribution/agent/spi/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/agent/spi/package-info.java
@@ -20,5 +20,4 @@
@Version("0.0.1")
package org.apache.sling.distribution.agent.spi;
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/common/package-info.java b/src/main/java/org/apache/sling/distribution/common/package-info.java
index 3101fcc..205b866 100644
--- a/src/main/java/org/apache/sling/distribution/common/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/common/package-info.java
@@ -20,5 +20,4 @@
@Version("0.1.0")
package org.apache.sling.distribution.common;
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionComponentProvider.java b/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionComponentProvider.java
index 05e92f0..000a22e 100644
--- a/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionComponentProvider.java
+++ b/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionComponentProvider.java
@@ -23,13 +23,6 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Property;
-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.References;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.distribution.agent.spi.DistributionAgent;
import org.apache.sling.distribution.agent.impl.DistributionRequestAuthorizationStrategy;
@@ -40,24 +33,17 @@
import org.apache.sling.distribution.queue.impl.DistributionQueueDispatchingStrategy;
import org.apache.sling.distribution.transport.DistributionTransportSecretProvider;
import org.apache.sling.distribution.trigger.DistributionTrigger;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
/**
* {@link DistributionComponentProvider} OSGi service.
*/
-@Component
-@Property(name = "name", value = "default")
-@References({
- @Reference(name = "distributionAgent", referenceInterface = DistributionAgent.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
- @Reference(name = "distributionPackageImporter", referenceInterface = DistributionPackageImporter.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
- @Reference(name = "distributionPackageExporter", referenceInterface = DistributionPackageExporter.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
- @Reference(name = "distributionQueueProvider", referenceInterface = DistributionQueueProvider.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
- @Reference(name = "distributionQueueDistributionStrategy", referenceInterface = DistributionQueueDispatchingStrategy.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
- @Reference(name = "distributionTransportSecretProvider", referenceInterface = DistributionTransportSecretProvider.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
- @Reference(name = "distributionTrigger", referenceInterface = DistributionTrigger.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
- @Reference(name = "distributionRequestAuthorizationStrategy", referenceInterface = DistributionRequestAuthorizationStrategy.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC),
- @Reference(name = "distributionPackageBuilder", referenceInterface = DistributionPackageBuilder.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC)
+@Component ( property = {
+ "name=default"
})
-@Service(DistributionComponentProvider.class)
public class DefaultDistributionComponentProvider implements DistributionComponentProvider {
private static final String NAME = DistributionComponentConstants.PN_NAME;
@@ -133,6 +119,9 @@
// (un)binding methods
+ @Reference(name = "distributionQueueProvider",
+ cardinality = ReferenceCardinality.MULTIPLE,
+ policy = ReferencePolicy.DYNAMIC)
public void bindDistributionQueueProvider(DistributionQueueProvider distributionQueueProvider, Map<String, Object> config) {
put(DistributionQueueProvider.class, distributionQueueProvider, config);
}
@@ -141,6 +130,9 @@
remove(DistributionQueueProvider.class, distributionQueueProvider, config);
}
+ @Reference(name = "distributionQueueDistributionStrategy",
+ cardinality = ReferenceCardinality.MULTIPLE,
+ policy = ReferencePolicy.DYNAMIC)
public void bindDistributionQueueDistributionStrategy(DistributionQueueDispatchingStrategy distributionQueueDispatchingStrategy, Map<String, Object> config) {
put(DistributionQueueDispatchingStrategy.class, distributionQueueDispatchingStrategy, config);
}
@@ -149,6 +141,9 @@
remove(DistributionQueueDispatchingStrategy.class, distributionQueueDispatchingStrategy, config);
}
+ @Reference(name = "distributionTransportSecretProvider",
+ cardinality = ReferenceCardinality.MULTIPLE,
+ policy = ReferencePolicy.DYNAMIC)
public void bindDistributionTransportSecretProvider(DistributionTransportSecretProvider distributionTransportSecretProvider, Map<String, Object> config) {
put(DistributionTransportSecretProvider.class, distributionTransportSecretProvider, config);
}
@@ -157,6 +152,9 @@
remove(DistributionTransportSecretProvider.class, distributionTransportSecretProvider, config);
}
+ @Reference(name = "distributionPackageImporter",
+ cardinality = ReferenceCardinality.MULTIPLE,
+ policy = ReferencePolicy.DYNAMIC)
public void bindDistributionPackageImporter(DistributionPackageImporter distributionPackageImporter, Map<String, Object> config) {
put(DistributionPackageImporter.class, distributionPackageImporter, config);
}
@@ -165,6 +163,9 @@
remove(DistributionPackageImporter.class, distributionPackageImporter, config);
}
+ @Reference(name = "distributionPackageExporter",
+ cardinality = ReferenceCardinality.MULTIPLE,
+ policy = ReferencePolicy.DYNAMIC)
public void bindDistributionPackageExporter(DistributionPackageExporter distributionPackageExporter, Map<String, Object> config) {
put(DistributionPackageExporter.class, distributionPackageExporter, config);
}
@@ -173,6 +174,9 @@
remove(DistributionPackageExporter.class, distributionPackageExporter, config);
}
+ @Reference(name = "distributionAgent",
+ cardinality = ReferenceCardinality.MULTIPLE,
+ policy = ReferencePolicy.DYNAMIC)
public void bindDistributionAgent(DistributionAgent distributionAgent, Map<String, Object> config) {
put(DistributionAgent.class, distributionAgent, config);
}
@@ -181,6 +185,9 @@
remove(DistributionAgent.class, distributionAgent, config);
}
+ @Reference(name = "distributionPackageBuilder",
+ cardinality = ReferenceCardinality.MULTIPLE,
+ policy = ReferencePolicy.DYNAMIC)
public void bindDistributionPackageBuilder(DistributionPackageBuilder distributionPackageBuilder, Map<String, Object> config) {
put(DistributionPackageBuilder.class, distributionPackageBuilder, config);
}
@@ -189,6 +196,9 @@
remove(DistributionPackageBuilder.class, distributionPackageBuilder, config);
}
+ @Reference(name = "distributionTrigger",
+ cardinality = ReferenceCardinality.MULTIPLE,
+ policy = ReferencePolicy.DYNAMIC)
public void bindDistributionTrigger(DistributionTrigger distributionTrigger, Map<String, Object> config) {
put(DistributionTrigger.class, distributionTrigger, config);
}
@@ -197,6 +207,9 @@
remove(DistributionTrigger.class, distributionTrigger, config);
}
+ @Reference(name = "distributionRequestAuthorizationStrategy",
+ cardinality = ReferenceCardinality.MULTIPLE,
+ policy = ReferencePolicy.DYNAMIC)
public void bindDistributionRequestAuthorizationStrategy(DistributionRequestAuthorizationStrategy distributionRequestAuthorizationStrategy, Map<String, Object> config) {
put(DistributionRequestAuthorizationStrategy.class, distributionRequestAuthorizationStrategy, config);
}
diff --git a/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionConfigurationManager.java b/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionConfigurationManager.java
index 6c2538b..54b0d0b 100644
--- a/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionConfigurationManager.java
+++ b/src/main/java/org/apache/sling/distribution/component/impl/DefaultDistributionConfigurationManager.java
@@ -24,16 +24,17 @@
import java.util.List;
import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.commons.osgi.PropertiesUtil;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -42,24 +43,27 @@
* For each tree of properties a set of OSGI configs is generated and registered in ConfigurationAdmin.
* To delete a component all configs owned by that component will be unregistered from ConfigurationAdmin.
*/
-@Component
-@Service(DistributionConfigurationManager.class)
+@Component(service=DistributionConfigurationManager.class)
+@Designate(ocd=DefaultDistributionConfigurationManager.Config.class)
public class DefaultDistributionConfigurationManager implements DistributionConfigurationManager {
-
- @Property(label = "Resource Config Enabled", description = "If storing config in resource tree is enabled.", boolValue = false)
- public static final String CONFIG_ENABLED = "resource.config.enabled";
-
- @Property(label = "Resource Config Prefix", description = "The prefix of properties to be stored in content", value = "etc.")
- public static final String CONFIG_PREFIX = "resource.config.prefix";
-
- @Property(label = "Resource Config Root", description = "The resource config root", value = "/etc/distribution")
- public static final String CONFIG_ROOT = "resource.config.root";
-
- @Property(label = "Resource Config Properties", description = "The resource config properties", value = {"enabled"})
- public static final String CONFIG_PROPERTIES = "resource.config.properties";
-
- @Property(label = "Resource Config Defaults", description = "The default values for resource config properties", value = {"serializationType=distribution"})
- public static final String CONFIG_DEFAULTS = "resource.config.defaults";
+
+ @ObjectClassDefinition()
+ public @interface Config {
+ @AttributeDefinition(name="Resource Config enabled",description = "If storing config in resource tree is enabled.")
+ boolean resource_config_enabled() default false;
+
+ @AttributeDefinition(name="Resource Config prefix",description = "The prefix of properties to be stored in content")
+ String resourceConfigPrefix() default "etc.";
+
+ @AttributeDefinition(name="Resource Config Root", description = "The resource config root")
+ String resourceConfigRoot() default "/etc/distribution";
+
+ @AttributeDefinition(name="Resource Config Properties", description = "The resource config properties")
+ String[] resourceConfigProperties() default {"enabled"};
+
+ @AttributeDefinition(name="Resource Config Defaults", description = "The default values for resource config properties")
+ String[] resourceConfigDefaults() default {"serializationType=distribution"};
+ }
@Reference
ConfigurationAdmin configurationAdmin;
@@ -70,22 +74,22 @@
private DistributionConfigurationManager osgiManager;
private DistributionConfigurationManager resourceManager;
- static String resourcePrefix;
+ private String resourcePrefix;
static final String OSGI_PREFIX = "";
private final Logger log = LoggerFactory.getLogger(getClass());
@Activate
- void activate(ComponentContext ctx, Map<String, Object> properties) {
- boolean configEnabled = PropertiesUtil.toBoolean(properties.get(CONFIG_ENABLED), false);
+ void activate(ComponentContext ctx, Config conf) {
+ boolean configEnabled = conf.resource_config_enabled();
- String configRoot = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(properties.get(CONFIG_ROOT), null));
- resourcePrefix = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(properties.get(CONFIG_PREFIX), null));
+ String configRoot = SettingsUtils.removeEmptyEntry(conf.resourceConfigRoot());
+ resourcePrefix = SettingsUtils.removeEmptyEntry(conf.resourceConfigPrefix());
- String[] configProperties = SettingsUtils.removeEmptyEntries(PropertiesUtil.toStringArray(properties.get(CONFIG_PROPERTIES), null));
+ String[] configProperties = SettingsUtils.removeEmptyEntries(conf.resourceConfigProperties());
if (configEnabled && configRoot != null && configProperties != null) {
- Map<String, String> configDefaults = PropertiesUtil.toMap(properties.get(CONFIG_DEFAULTS), new String[0]);
+ Map<String, String> configDefaults = PropertiesUtil.toMap(conf.resourceConfigDefaults(), new String[0]);
resourceManager = new ResourceConfigurationManager(configRoot, configProperties, configDefaults);
}
diff --git a/src/main/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMap.java b/src/main/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMap.java
index dfe2f53..7116d46 100644
--- a/src/main/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMap.java
+++ b/src/main/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMap.java
@@ -19,16 +19,22 @@
package org.apache.sling.distribution.component.impl;
+import static java.lang.String.format;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.AGENT;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.EXPORTER;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.IMPORTER;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.PACKAGE_BUILDER;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.QUEUE_PROVIDER;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.QUEUE_STRATEGY;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.REQUEST_AUTHORIZATION;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.TRANSPORT_SECRET_PROVIDER;
+import static org.apache.sling.distribution.component.impl.DistributionComponentKind.TRIGGER;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyUnbounded;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory;
import org.apache.sling.distribution.agent.impl.PrivilegeDistributionRequestAuthorizationStrategy;
import org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory;
@@ -49,16 +55,51 @@
import org.apache.sling.distribution.trigger.impl.ScheduledDistributionTriggerFactory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static java.lang.String.format;
-import static org.apache.sling.commons.osgi.PropertiesUtil.*;
-import static org.apache.sling.distribution.component.impl.DistributionComponentKind.*;
-@Service(value = DistributionComponentFactoryMap.class)
-@Component(metatype = false)
+@Component(service=DistributionComponentFactoryMap.class)
+@Designate(ocd=DistributionComponentFactoryMap.Config.class)
public class DistributionComponentFactoryMap {
+
+ // Note: Before converting to OSGI annotations there were properties, but
+ // not metatype(s)!
+
+ @ObjectClassDefinition()
+ public @interface Config {
+ @AttributeDefinition()
+ String[] mapping_agent();
+
+ @AttributeDefinition()
+ String[] mapping_importer();
+
+ @AttributeDefinition()
+ String[] mapping_exporter();
+
+ @AttributeDefinition()
+ String[] mapping_queueProvider();
+
+ @AttributeDefinition()
+ String[] mapping_queueStrategy();
+
+ @AttributeDefinition()
+ String[] mapping_transportSecretProvider();
+
+ @AttributeDefinition()
+ String[] mapping_packageBuilder();
+
+ @AttributeDefinition()
+ String[] mapping_requestAuthorization();
+
+ @AttributeDefinition()
+ String[] mapping_trigger();
+ }
private final Logger log = LoggerFactory.getLogger(getClass());
@@ -110,47 +151,20 @@
format("jcrEvent:%s", JcrEventDistributionTriggerFactory.class.getName()) };
- @Property(unbounded = PropertyUnbounded.ARRAY)
- private static final String MAPPING_AGENT = "mapping.agent";
-
- @Property(unbounded = PropertyUnbounded.ARRAY)
- private static final String MAPPING_IMPORTER = "mapping.importer";
-
- @Property(unbounded = PropertyUnbounded.ARRAY)
- private static final String MAPPING_EXPORTER = "mapping.exporter";
-
- @Property(unbounded = PropertyUnbounded.ARRAY)
- private static final String MAPPING_QUEUE_PROVIDER = "mapping.queueProvider";
-
- @Property(unbounded = PropertyUnbounded.ARRAY)
- private static final String MAPPING_QUEUE_STRATEGY = "mapping.queueStrategy";
-
- @Property(unbounded = PropertyUnbounded.ARRAY)
- private static final String MAPPING_TRANSPORT_SECRET_PROVIDER = "mapping.transportSecretProvider";
-
- @Property(unbounded = PropertyUnbounded.ARRAY)
- private static final String MAPPING_PACKAGE_BUILDER = "mapping.packageBuilder";
-
- @Property(unbounded = PropertyUnbounded.ARRAY)
- private static final String MAPPING_REQUEST_AUTHORIZATION = "mapping.requestAuthorization";
-
- @Property(unbounded = PropertyUnbounded.ARRAY)
- private static final String MAPPING_TRIGGER = "mapping.trigger";
-
private final Map<DistributionComponentKind, Map<String, String>> mapping =
new HashMap<DistributionComponentKind, Map<String, String>>();
@Activate
- protected void activate(Map<String, Object> config) {
- mapping.put(AGENT, parse(toStringArray(config.get(MAPPING_AGENT)), MAPPING_AGENT_DEFAULT));
- mapping.put(IMPORTER, parse(toStringArray(config.get(MAPPING_IMPORTER)), MAPPING_IMPORTER_DEFAULT));
- mapping.put(EXPORTER, parse(toStringArray(config.get(MAPPING_EXPORTER)), MAPPING_EXPORTER_DEFAULT));
- mapping.put(QUEUE_PROVIDER, parse(toStringArray(config.get(MAPPING_QUEUE_PROVIDER)), MAPPING_QUEUE_PROVIDER_DEFAULT));
- mapping.put(QUEUE_STRATEGY, parse(toStringArray(config.get(MAPPING_QUEUE_STRATEGY)), MAPPING_QUEUE_STRATEGY_DEFAULT));
- mapping.put(TRANSPORT_SECRET_PROVIDER, parse(toStringArray(config.get(MAPPING_TRANSPORT_SECRET_PROVIDER)), MAPPING_TRANSPORT_SECRET_PROVIDER_DEFAULT));
- mapping.put(PACKAGE_BUILDER, parse(toStringArray(config.get(MAPPING_PACKAGE_BUILDER)), MAPPING_PACKAGE_BUILDER_DEFAULT));
- mapping.put(REQUEST_AUTHORIZATION, parse(toStringArray(config.get(MAPPING_REQUEST_AUTHORIZATION)), MAPPING_REQUEST_AUTHORIZATION_DEFAULT));
- mapping.put(TRIGGER, parse(toStringArray(config.get(MAPPING_TRIGGER)), MAPPING_TRIGGER_DEFAULT));
+ protected void activate(Config conf) {
+ mapping.put(AGENT, parse(conf.mapping_agent(), MAPPING_AGENT_DEFAULT));
+ mapping.put(IMPORTER, parse(conf.mapping_importer(), MAPPING_IMPORTER_DEFAULT));
+ mapping.put(EXPORTER, parse(conf.mapping_exporter(), MAPPING_EXPORTER_DEFAULT));
+ mapping.put(QUEUE_PROVIDER, parse(conf.mapping_queueProvider(), MAPPING_QUEUE_PROVIDER_DEFAULT));
+ mapping.put(QUEUE_STRATEGY, parse(conf.mapping_queueStrategy(), MAPPING_QUEUE_STRATEGY_DEFAULT));
+ mapping.put(TRANSPORT_SECRET_PROVIDER, parse(conf.mapping_transportSecretProvider(), MAPPING_TRANSPORT_SECRET_PROVIDER_DEFAULT));
+ mapping.put(PACKAGE_BUILDER, parse(conf.mapping_packageBuilder(), MAPPING_PACKAGE_BUILDER_DEFAULT));
+ mapping.put(REQUEST_AUTHORIZATION, parse(conf.mapping_requestAuthorization(), MAPPING_REQUEST_AUTHORIZATION_DEFAULT));
+ mapping.put(TRIGGER, parse(conf.mapping_trigger(), MAPPING_TRIGGER_DEFAULT));
}
String getType(DistributionComponentKind kind, @NotNull String factoryPid) {
diff --git a/src/main/java/org/apache/sling/distribution/event/impl/DefaultDistributionEventFactory.java b/src/main/java/org/apache/sling/distribution/event/impl/DefaultDistributionEventFactory.java
index 695ee73..6ad5cd7 100644
--- a/src/main/java/org/apache/sling/distribution/event/impl/DefaultDistributionEventFactory.java
+++ b/src/main/java/org/apache/sling/distribution/event/impl/DefaultDistributionEventFactory.java
@@ -20,13 +20,12 @@
import java.util.Dictionary;
import java.util.Hashtable;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.distribution.component.impl.DistributionComponentKind;
import org.apache.sling.distribution.event.DistributionEventProperties;
import org.apache.sling.distribution.packaging.DistributionPackageInfo;
import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
import org.slf4j.Logger;
@@ -35,8 +34,7 @@
/**
* {@link DistributionEventFactory} OSGi service
*/
-@Component(immediate = true)
-@Service(value = DistributionEventFactory.class)
+@Component(immediate = true, service=DistributionEventFactory.class)
public class DefaultDistributionEventFactory implements DistributionEventFactory {
private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/distribution/impl/DefaultDistributor.java b/src/main/java/org/apache/sling/distribution/impl/DefaultDistributor.java
index 3b2537c..a9be2d7 100644
--- a/src/main/java/org/apache/sling/distribution/impl/DefaultDistributor.java
+++ b/src/main/java/org/apache/sling/distribution/impl/DefaultDistributor.java
@@ -19,9 +19,6 @@
package org.apache.sling.distribution.impl;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.distribution.DistributionRequest;
import org.apache.sling.distribution.DistributionRequestState;
@@ -31,22 +28,22 @@
import org.apache.sling.distribution.component.impl.DistributionComponentProvider;
import org.apache.sling.distribution.common.DistributionException;
import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Default implementation of Distributor interface that dispatches the request to available agents.
*/
-@Component
-@Service(Distributor.class)
+@Component()
public class DefaultDistributor implements Distributor {
private final Logger log = LoggerFactory.getLogger(getClass());
@Reference
- private
- DistributionComponentProvider componentProvider;
+ private DistributionComponentProvider componentProvider;
@NotNull
public DistributionResponse distribute(@NotNull String agentName, @NotNull ResourceResolver resourceResolver, @NotNull DistributionRequest distributionRequest) {
diff --git a/src/main/java/org/apache/sling/distribution/log/spi/DistributionLog.java b/src/main/java/org/apache/sling/distribution/log/spi/DistributionLog.java
index 289f81b..6760a54 100644
--- a/src/main/java/org/apache/sling/distribution/log/spi/DistributionLog.java
+++ b/src/main/java/org/apache/sling/distribution/log/spi/DistributionLog.java
@@ -22,7 +22,7 @@
import java.util.Collection;
import java.util.List;
-import aQute.bnd.annotation.ConsumerType;
+import org.osgi.annotation.versioning.ConsumerType;
/**
* The log of a distribution component activity (e.g. a DistributionAgent)
diff --git a/src/main/java/org/apache/sling/distribution/log/spi/package-info.java b/src/main/java/org/apache/sling/distribution/log/spi/package-info.java
index 71bb8a9..acd33e8 100644
--- a/src/main/java/org/apache/sling/distribution/log/spi/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/log/spi/package-info.java
@@ -20,5 +20,4 @@
@Version("0.0.0")
package org.apache.sling.distribution.log.spi;
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheck.java b/src/main/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheck.java
index 3ca3a36..2d3cdd8 100644
--- a/src/main/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheck.java
+++ b/src/main/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheck.java
@@ -26,22 +26,19 @@
import org.apache.felix.hc.api.FormattingResultLog;
import org.apache.felix.hc.api.HealthCheck;
import org.apache.felix.hc.api.Result;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyUnbounded;
-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.References;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.distribution.agent.spi.DistributionAgent;
import org.apache.sling.distribution.queue.DistributionQueueEntry;
import org.apache.sling.distribution.queue.DistributionQueueItemStatus;
import org.apache.sling.distribution.queue.spi.DistributionQueue;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -49,23 +46,19 @@
* {@link HealthCheck} that checks if distribution queues' first item has been retried more than a configurable amount
* of times
*/
-@Component(immediate = true,
- metatype = true,
- label = "Apache Sling Distribution Queue Health Check")
-@Properties({
- @Property(name = HealthCheck.NAME, value = "SlingDistributionQueueHC", description = "Health Check name", label = "Name"),
- @Property(name = HealthCheck.TAGS, unbounded = PropertyUnbounded.ARRAY, description = "Health Check tags", label = "Tags"),
- @Property(name = HealthCheck.MBEAN_NAME, value = "slingDistributionQueue", description = "Health Check MBean name", label = "MBean name")
-})
-@References({
- @Reference(name = "distributionAgent",
- referenceInterface = DistributionAgent.class,
- cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
- policy = ReferencePolicy.DYNAMIC)
-})
-
-@Service(value = HealthCheck.class)
+@Component(immediate = true, service=HealthCheck.class,
+ property = {
+ HealthCheck.NAME + "=SlingDistributionQueueHC",
+ HealthCheck.MBEAN_NAME + "=slingDistributionQueue"
+ })
+@Designate(ocd=DistributionQueueHealthCheck.Config.class)
public class DistributionQueueHealthCheck implements HealthCheck {
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Queue Health Check")
+ public @interface Config {
+ @AttributeDefinition(name="Allowed retries", description = "Number of allowed retries")
+ int numberOfRetriesAllowed() default DEFAULT_NUMBER_OF_RETRIES_ALLOWED;
+ }
private static final Logger log = LoggerFactory.getLogger(DistributionQueueHealthCheck.class);
@@ -73,14 +66,12 @@
private int numberOfRetriesAllowed;
- @Property(intValue = DEFAULT_NUMBER_OF_RETRIES_ALLOWED, description = "Number of allowed retries", label = "Allowed retries")
- private static final String NUMBER_OF_RETRIES_ALLOWED = "numberOfRetriesAllowed";
private final List<DistributionAgent> distributionAgents = new CopyOnWriteArrayList<DistributionAgent>();
@Activate
- public void activate(final Map<String, Object> properties) {
- numberOfRetriesAllowed = PropertiesUtil.toInteger(properties.get(NUMBER_OF_RETRIES_ALLOWED), DEFAULT_NUMBER_OF_RETRIES_ALLOWED);
+ public void activate(final Config conf) {
+ numberOfRetriesAllowed = conf.numberOfRetriesAllowed();
log.info("Activated, numberOfRetriesAllowed={}", numberOfRetriesAllowed);
}
@@ -89,6 +80,9 @@
distributionAgents.clear();
}
+ @Reference(name = "distributionAgent",
+ cardinality = ReferenceCardinality.MULTIPLE,
+ policy = ReferencePolicy.DYNAMIC)
void bindDistributionAgent(final DistributionAgent distributionAgent) {
distributionAgents.add(distributionAgent);
diff --git a/src/main/java/org/apache/sling/distribution/packaging/DistributionPackage.java b/src/main/java/org/apache/sling/distribution/packaging/DistributionPackage.java
index a2925d0..e36918a 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/DistributionPackage.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/DistributionPackage.java
@@ -20,9 +20,9 @@
import java.io.IOException;
import java.io.InputStream;
-import aQute.bnd.annotation.ProviderType;
import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ProviderType;
/**
* A distribution package
diff --git a/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageBuilder.java b/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageBuilder.java
index 46f0e4d..b8b2e75 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageBuilder.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageBuilder.java
@@ -19,12 +19,12 @@
package org.apache.sling.distribution.packaging;
import java.io.InputStream;
-import aQute.bnd.annotation.ProviderType;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.distribution.DistributionRequest;
import org.apache.sling.distribution.common.DistributionException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ProviderType;
/**
* A builder for {@link DistributionPackage}s
diff --git a/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageInfo.java b/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageInfo.java
index 828af92..a528d37 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageInfo.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/DistributionPackageInfo.java
@@ -21,12 +21,12 @@
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
-import aQute.bnd.annotation.ProviderType;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.wrappers.ValueMapDecorator;
import org.apache.sling.distribution.DistributionRequestType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ProviderType;
/**
* Additional information about a package.
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageBuilderProvider.java b/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageBuilderProvider.java
index 0c7169d..afa2bd1 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageBuilderProvider.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageBuilderProvider.java
@@ -18,9 +18,9 @@
*/
package org.apache.sling.distribution.packaging.impl;
-import aQute.bnd.annotation.ProviderType;
import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ProviderType;
/**
* A helper interface to allow finding registered {@link DistributionPackageBuilder}s
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageExporter.java b/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageExporter.java
index 975b986..c5855c2 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageExporter.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageExporter.java
@@ -18,7 +18,6 @@
*/
package org.apache.sling.distribution.packaging.impl;
-import aQute.bnd.annotation.ConsumerType;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.distribution.DistributionRequest;
import org.apache.sling.distribution.common.DistributionException;
@@ -26,13 +25,14 @@
import org.apache.sling.distribution.queue.spi.DistributionQueue;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ConsumerType;
/**
* A {@link DistributionPackageExporter) is responsible of exporting {@link DistributionPackage }s from a local or remote
* Sling instance.
* Such packages are usually imported by a {@link DistributionPackageImporter } or put inside
* {@link DistributionQueue }s for others to consume them.
- * Exporting a {@link DistributionPackage} means obtaining that package by e.g. directly creating it by bundling local
+ DistributionPackageExporter* Exporting a {@link DistributionPackage} means obtaining that package by e.g. directly creating it by bundling local
* Sling resources, retrieving it from a remote endpoint (by executing an HTTP POST request on another Sling
* instance exposing packages ina queue).
*/
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageImporter.java b/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageImporter.java
index 8122566..afaa44c 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageImporter.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageImporter.java
@@ -19,12 +19,13 @@
package org.apache.sling.distribution.packaging.impl;
import java.io.InputStream;
-import aQute.bnd.annotation.ConsumerType;
+
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.packaging.DistributionPackage;
import org.apache.sling.distribution.packaging.DistributionPackageInfo;
import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ConsumerType;
/**
* A {@link DistributionPackageImporter} is responsible for importing {@link DistributionPackage}s into either a local
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/SharedDistributionPackage.java b/src/main/java/org/apache/sling/distribution/packaging/impl/SharedDistributionPackage.java
index a48b11b..fe90ae4 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/SharedDistributionPackage.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/SharedDistributionPackage.java
@@ -18,9 +18,9 @@
*/
package org.apache.sling.distribution.packaging.impl;
-import aQute.bnd.annotation.ProviderType;
import org.apache.sling.distribution.packaging.DistributionPackage;
import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ProviderType;
/**
* A {@link DistributionPackage} that offers basic reference counting.
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporterFactory.java b/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporterFactory.java
index e4490f6..bc67aab 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporterFactory.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/AgentDistributionPackageExporterFactory.java
@@ -18,20 +18,10 @@
*/
package org.apache.sling.distribution.packaging.impl.exporter;
-import java.util.Map;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.distribution.DistributionRequest;
import org.apache.sling.distribution.agent.spi.DistributionAgent;
import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.component.impl.SettingsUtils;
import org.apache.sling.distribution.packaging.DistributionPackage;
import org.apache.sling.distribution.packaging.impl.DistributionPackageBuilderProvider;
@@ -39,32 +29,40 @@
import org.apache.sling.distribution.packaging.impl.DistributionPackageProcessor;
import org.apache.sling.distribution.queue.impl.DistributionQueueDispatchingStrategy;
import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
/**
* OSGi configuration factory for {@link AgentDistributionPackageExporter}s
*/
-@Component(label = "Apache Sling Distribution Exporter - Agent Based Package Exporter",
- metatype = true,
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE)
-@Service(value = DistributionPackageExporter.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Exporter name: {name}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionPackageExporter.class,
+ property = {
+ "webconsole.configurationFactory.nameHint=Exporter name: {name}"
+ })
+@Designate(ocd=AgentDistributionPackageExporterFactory.Config.class, factory = true)
public class AgentDistributionPackageExporterFactory implements DistributionPackageExporter {
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Exporter - Agent Based Package Exporter")
+ public @interface Config {
+ @AttributeDefinition(name="Name", description = "The name of the exporter.")
+ String name();
+ @AttributeDefinition(name="Queue", description = "The name of the queue from which the packages should be exported.")
+ String queue() default DistributionQueueDispatchingStrategy.DEFAULT_QUEUE_NAME;
+
+ @AttributeDefinition(name="Drop invalid queue items", description = "Remove invalid items from the queue.")
+ boolean drop_invalid_items() default false;
+
+ @AttributeDefinition(name = "The target reference for the DistributionAgent that will be used to export packages.")
+ String agent_target();
+ }
- /**
- * name of this exporter.
- */
- @Property(label = "Name", description = "The name of the exporter.")
- private static final String NAME = DistributionComponentConstants.PN_NAME;
-
- @Property(label = "Queue", description = "The name of the queue from which the packages should be exported.")
- private static final String QUEUE_NAME = "queue";
-
- @Property(label = "Drop invalid queue items", description = "Remove invalid items from the queue.", boolValue = false)
- private static final String DROP_INVALID_QUEUE_ITEMS = "drop.invalid.items";
-
- @Property(name = "agent.target", label = "The target reference for the DistributionAgent that will be used to export packages.")
@Reference(name = "agent")
private DistributionAgent agent;
@@ -76,14 +74,14 @@
@Activate
- public void activate(Map<String, Object> config) throws Exception {
+ public void activate(Config conf) {
- String queueName = PropertiesUtil.toString(config.get(QUEUE_NAME), DistributionQueueDispatchingStrategy.DEFAULT_QUEUE_NAME);
+ String queueName = conf.queue();
queueName = SettingsUtils.removeEmptyEntry(queueName);
queueName = queueName == null ? DistributionQueueDispatchingStrategy.DEFAULT_QUEUE_NAME : queueName;
- String name = PropertiesUtil.toString(config.get(NAME), "");
- boolean dropInvalidItems = PropertiesUtil.toBoolean(config.get(DROP_INVALID_QUEUE_ITEMS), false);
+ String name = conf.name();
+ boolean dropInvalidItems = conf.drop_invalid_items();
packageExporter = new AgentDistributionPackageExporter(queueName, agent, packageBuilderProvider, name, dropInvalidItems);
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/LocalDistributionPackageExporterFactory.java b/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/LocalDistributionPackageExporterFactory.java
index ca6663d..79b3dc0 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/LocalDistributionPackageExporterFactory.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/LocalDistributionPackageExporterFactory.java
@@ -20,42 +20,42 @@
import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.distribution.DistributionRequest;
import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.packaging.DistributionPackage;
import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
import org.apache.sling.distribution.packaging.impl.DistributionPackageExporter;
import org.apache.sling.distribution.packaging.impl.DistributionPackageProcessor;
import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
/**
* OSGi configuration factory for {@link LocalDistributionPackageExporter}s.
*/
-@Component(label = "Apache Sling Distribution Exporter - Local Package Exporter Factory",
- metatype = true,
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE)
-@Service(value = DistributionPackageExporter.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Exporter name: {name}")
+@Component(service=DistributionPackageExporter.class,
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ property = {
+ "webconsole.configurationFactory.nameHint=Exporter name: {name}"
+ })
+@Designate(ocd=LocalDistributionPackageExporterFactory.Config.class, factory=true)
public class LocalDistributionPackageExporterFactory implements DistributionPackageExporter {
-
- /**
- * name of this exporter.
- */
- @Property(label = "Name", description = "The name of the exporter.")
- public static final String NAME = DistributionComponentConstants.PN_NAME;
-
- @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Exporter - Local Package Exporter Factory")
+ public @interface Config {
+ @AttributeDefinition(name="Name", description = "The name of the exporter.")
+ String name();
+ @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
"e.g. use target=(name=...) to bind to services by name.")
+ String packageBuilder_target();
+ }
+
@Reference(name = "packageBuilder")
private DistributionPackageBuilder packageBuilder;
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/RemoteDistributionPackageExporterFactory.java b/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/RemoteDistributionPackageExporterFactory.java
index 9cc995d..ee91a3f 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/RemoteDistributionPackageExporterFactory.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/RemoteDistributionPackageExporterFactory.java
@@ -18,74 +18,64 @@
*/
package org.apache.sling.distribution.packaging.impl.exporter;
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.distribution.DistributionRequest;
import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.component.impl.DistributionComponentKind;
import org.apache.sling.distribution.component.impl.SettingsUtils;
import org.apache.sling.distribution.log.impl.DefaultDistributionLog;
-import org.apache.sling.distribution.packaging.impl.DistributionPackageExporter;
-import org.apache.sling.distribution.packaging.impl.DistributionPackageProcessor;
import org.apache.sling.distribution.packaging.DistributionPackage;
import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageExporter;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageProcessor;
import org.apache.sling.distribution.transport.DistributionTransportSecretProvider;
import org.apache.sling.distribution.transport.impl.HttpConfiguration;
import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* OSGi configuration factory for {@link RemoteDistributionPackageExporter}s.
*/
-@Component(label = "Apache Sling Distribution Exporter - Remote Package Exporter Factory",
- metatype = true,
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE
-)
-@Service(value = DistributionPackageExporter.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Exporter name: {name}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionPackageExporter.class,
+ property= {
+ "webconsole.configurationFactory.nameHint=Exporter name: {name}"
+ })
+@Designate(ocd=RemoteDistributionPackageExporterFactory.Config.class, factory=true)
public class RemoteDistributionPackageExporterFactory implements DistributionPackageExporter {
+ @ObjectClassDefinition(name="Apache Sling Distribution Exporter - Remote Package Exporter Factory")
+ public @interface Config {
+ @AttributeDefinition(name="Name", description = "The name of the exporter.")
+ String name();
+ @AttributeDefinition(cardinality = 100, name="Endpoints", description = "The list of endpoints from which the packages will be exported.")
+ String[] endpoints();
+ @AttributeDefinition(name="Pull Items", description = "number of subsequent pull requests to make")
+ int pull_items() default Integer.MAX_VALUE;
+ @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String packageBuilder_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ @AttributeDefinition(name="Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String transportSecretProvider_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+ }
private final Logger log = LoggerFactory.getLogger(getClass());
- /**
- * name of this exporter.
- */
- @Property(label = "Name", description = "The name of the exporter.")
- private static final String NAME = DistributionComponentConstants.PN_NAME;
-
- /**
- * endpoints property
- */
- @Property(cardinality = 100, label = "Endpoints", description = "The list of endpoints from which the packages will be exported.")
- private static final String ENDPOINTS = "endpoints";
-
- /**
- * no. of items to poll property
- */
- @Property(label = "Pull Items", description = "number of subsequent pull requests to make", intValue = 1)
- private static final String PULL_ITEMS = "pull.items";
-
- @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "packageBuilder")
private DistributionPackageBuilder packageBuilder;
-
- @Property(name = "transportSecretProvider.target", label = "Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "transportSecretProvider")
private
DistributionTransportSecretProvider transportSecretProvider;
@@ -93,17 +83,13 @@
private DistributionPackageExporter exporter;
@Activate
- protected void activate(Map<String, Object> config) throws Exception {
- log.info("activating remote exporter with pb {} and dtsp {}", packageBuilder, transportSecretProvider);
+ protected void activate(Config conf) {
+ log.info("activating remote exporter with packagebuilder {} and transportSecretProvider {}", packageBuilder, transportSecretProvider);
- String[] endpoints = PropertiesUtil.toStringArray(config.get(ENDPOINTS), new String[0]);
+ String[] endpoints = conf.endpoints();
endpoints = SettingsUtils.removeEmptyEntries(endpoints);
-
- int pollItems = PropertiesUtil.toInteger(config.get(PULL_ITEMS), Integer.MAX_VALUE);
-
-
-
- String exporterName = PropertiesUtil.toString(config.get(NAME), null);
+ int pollItems = conf.pull_items();
+ String exporterName = conf.name();
DefaultDistributionLog distributionLog = new DefaultDistributionLog(DistributionComponentKind.EXPORTER, exporterName, RemoteDistributionPackageExporter.class, DefaultDistributionLog.LogLevel.ERROR);
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterFactory.java b/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterFactory.java
index 381d69c..953aeff 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterFactory.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterFactory.java
@@ -19,44 +19,46 @@
package org.apache.sling.distribution.packaging.impl.importer;
import java.io.InputStream;
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
+
import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
+import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.component.impl.SettingsUtils;
import org.apache.sling.distribution.event.impl.DistributionEventFactory;
-import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.packaging.DistributionPackage;
-import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
-import org.apache.sling.distribution.packaging.DistributionPackageInfo;
import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
+import org.apache.sling.distribution.packaging.DistributionPackageInfo;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
/**
* OSGi configuration factory for {@link LocalDistributionPackageImporter}s.
*/
-@Component(label = "Apache Sling Distribution Importer - Local Package Importer Factory",
- metatype = true,
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE)
-@Service(value = DistributionPackageImporter.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Importer name: {name}")
+@Component(service=DistributionPackageImporter.class,
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ property = {
+ "webconsole.configurationFactory.nameHint=Importer name: {name}"
+ })
+@Designate(ocd=LocalDistributionPackageImporterFactory.Config.class, factory = true)
public class LocalDistributionPackageImporterFactory implements DistributionPackageImporter {
- /**
- * name of this importer.
- */
- @Property(label = "Name", description = "The name of the importer.")
- private static final String NAME = DistributionComponentConstants.PN_NAME;
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Importer - Local Package Importer Factory")
+ public @interface Config {
+ @AttributeDefinition(name="Name", description = "THe name of the importer.")
+ String name();
+
+ @AttributeDefinition(name="Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String packageBuilder_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ }
- @Property(name = "packageBuilder.target", label = "Package Builder", description = "The target reference for the DistributionPackageBuilder used to create distribution packages, " +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
@Reference(name = "packageBuilder")
private DistributionPackageBuilder packageBuilder;
@@ -66,8 +68,8 @@
private DistributionPackageImporter importer;
@Activate
- public void activate(Map<String, Object> config) {
- String name = PropertiesUtil.toString(config.get(NAME), null);
+ public void activate(Config conf) {
+ String name = conf.name();
importer = new LocalDistributionPackageImporter(name, eventFactory, packageBuilder);
}
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RemoteDistributionPackageImporterFactory.java b/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RemoteDistributionPackageImporterFactory.java
index 21e3db7..72c6ef9 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RemoteDistributionPackageImporterFactory.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RemoteDistributionPackageImporterFactory.java
@@ -21,53 +21,48 @@
import java.io.InputStream;
import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.component.impl.DistributionComponentKind;
import org.apache.sling.distribution.component.impl.SettingsUtils;
import org.apache.sling.distribution.log.impl.DefaultDistributionLog;
import org.apache.sling.distribution.packaging.DistributionPackage;
-import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
import org.apache.sling.distribution.packaging.DistributionPackageInfo;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
import org.apache.sling.distribution.transport.DistributionTransportSecretProvider;
import org.apache.sling.distribution.transport.impl.HttpConfiguration;
import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
/**
* OSGi configuration factory for {@link RemoteDistributionPackageImporter}s.
*/
-@Component(label = "Apache Sling Distribution Importer - Remote Package Importer Factory",
- metatype = true,
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE)
-@Service(value = DistributionPackageImporter.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Importer name: {name}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionPackageImporter.class,
+ property= {
+ "webconsole.configurationFactory.nameHint=Importer name: {name}"
+ })
+@Designate(ocd=RemoteDistributionPackageImporterFactory.Config.class, factory=true)
public class RemoteDistributionPackageImporterFactory implements DistributionPackageImporter {
-
- /**
- * name of this importer.
- */
- @Property(label = "Name", description = "The name of the importer.")
- private static final String NAME = DistributionComponentConstants.PN_NAME;
-
-
- /**
- * endpoints property
- */
- @Property(cardinality = 100, label = "Endpoints", description = "The list of endpoints to which the packages will be imported.")
- private static final String ENDPOINTS = "endpoints";
-
- @Property(name = "transportSecretProvider.target", label = "Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Importer - Remote Package Importer Factory")
+ public @interface Config {
+ @AttributeDefinition(name="Name", description = "The name of the importer.")
+ String name();
+ @AttributeDefinition(cardinality = 100, name="Endpoints", description = "The list of endpoints to which the packages will be imported.")
+ String[] endpoints();
+ @AttributeDefinition(name="Transport Secret Provider", description = "The target reference for the DistributionTransportSecretProvider used to obtain the credentials used for accessing the remote endpoints, " +
"e.g. use target=(name=...) to bind to services by name.")
+ String transportSecretProvider_target();
+ }
+
@Reference(name = "transportSecretProvider")
private
DistributionTransportSecretProvider transportSecretProvider;
@@ -75,11 +70,10 @@
private DistributionPackageImporter importer;
@Activate
- protected void activate(Map<String, Object> config) {
+ protected void activate(Config conf) {
- Map<String, String> endpoints = SettingsUtils.toUriMap(config.get(ENDPOINTS));
-
- String importerName = PropertiesUtil.toString(config.get(NAME), null);
+ Map<String, String> endpoints = SettingsUtils.toUriMap(conf.endpoints());
+ String importerName = conf.name();
DefaultDistributionLog distributionLog = new DefaultDistributionLog(DistributionComponentKind.IMPORTER, importerName, RemoteDistributionPackageImporter.class, DefaultDistributionLog.LogLevel.ERROR);
diff --git a/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java b/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java
index cc4f15e..02290fe 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java
@@ -19,50 +19,45 @@
package org.apache.sling.distribution.packaging.impl.importer;
import java.io.InputStream;
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.packaging.DistributionPackage;
-import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
import org.apache.sling.distribution.packaging.DistributionPackageInfo;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
import org.apache.sling.jcr.api.SlingRepository;
import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
/**
* OSGi configuration factory for {@link RepositoryDistributionPackageImporter}s.
*/
-@Component(label = "Apache Sling Distribution Importer - Repository Package Importer Factory",
- metatype = true,
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE)
-@Service(DistributionPackageImporter.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Importer name: {name}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionPackageImporter.class,
+ property= {
+ "webconsole.configurationFactory.nameHint=Importer name: {name}"
+ })
+@Designate(ocd=RepositoryDistributionPackageImporterFactory.Config.class, factory = true)
public class RepositoryDistributionPackageImporterFactory implements DistributionPackageImporter {
-
- /**
- * name of this component.
- */
- @Property
- private static final String NAME = DistributionComponentConstants.PN_NAME;
-
- @Property(name = "service.name")
- private static String SERVICE_NAME;
-
- @Property(name = "path")
- private static String PATH;
-
- @Property(name = "privilege.name")
- private static String PRIVILEGE_NAME;
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Importer - Repository Package Importer Factory")
+ public @interface Config {
+ @AttributeDefinition(name="Name", description = "The name of the importer.")
+ String name();
+ @AttributeDefinition()
+ String service_name() default "admin";
+ @AttributeDefinition()
+ String path() default "/var/sling/distribution/import";
+ @AttributeDefinition()
+ String privilege_name() default "jcr:read";
+ }
@Reference
private SlingRepository repository;
@@ -70,12 +65,12 @@
private RepositoryDistributionPackageImporter importer;
@Activate
- protected void activate(Map<String, Object> config) {
+ protected void activate(Config conf) {
importer = new RepositoryDistributionPackageImporter(repository,
- PropertiesUtil.toString(config.get(SERVICE_NAME), "admin"),
- PropertiesUtil.toString(config.get(PATH), "/var/sling/distribution/import"),
- PropertiesUtil.toString(config.get(PRIVILEGE_NAME), "jcr:read"));
+ conf.service_name(),
+ conf.path(),
+ conf.privilege_name());
}
public void importPackage(@NotNull ResourceResolver resourceResolver, @NotNull DistributionPackage distributionPackage) throws DistributionException {
diff --git a/src/main/java/org/apache/sling/distribution/packaging/package-info.java b/src/main/java/org/apache/sling/distribution/packaging/package-info.java
index 8f378be..88834d1 100644
--- a/src/main/java/org/apache/sling/distribution/packaging/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/packaging/package-info.java
@@ -20,5 +20,4 @@
@Version("0.0.1")
package org.apache.sling.distribution.packaging;
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/queue/DistributionQueueCapabilities.java b/src/main/java/org/apache/sling/distribution/queue/DistributionQueueCapabilities.java
index 048e815..18c0bbb 100644
--- a/src/main/java/org/apache/sling/distribution/queue/DistributionQueueCapabilities.java
+++ b/src/main/java/org/apache/sling/distribution/queue/DistributionQueueCapabilities.java
@@ -18,7 +18,7 @@
*/
package org.apache.sling.distribution.queue;
-import aQute.bnd.annotation.ProviderType;
+import org.osgi.annotation.versioning.ProviderType;
@ProviderType
public final class DistributionQueueCapabilities {
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueDispatchingStrategy.java b/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueDispatchingStrategy.java
index dae4877..f65c32e 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueDispatchingStrategy.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueDispatchingStrategy.java
@@ -19,12 +19,13 @@
package org.apache.sling.distribution.queue.impl;
import java.util.List;
-import aQute.bnd.annotation.ConsumerType;
+
import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.packaging.DistributionPackage;
import org.apache.sling.distribution.queue.DistributionQueueItemStatus;
import org.apache.sling.distribution.queue.spi.DistributionQueue;
import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ConsumerType;
/**
* a {@link DistributionQueueDispatchingStrategy} implements an algorithm for dispatching
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProcessor.java b/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProcessor.java
index 7597bcc..1f9d896 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProcessor.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProcessor.java
@@ -18,11 +18,11 @@
*/
package org.apache.sling.distribution.queue.impl;
-import aQute.bnd.annotation.ProviderType;
import org.apache.sling.distribution.queue.DistributionQueueEntry;
import org.apache.sling.distribution.queue.DistributionQueueItem;
import org.apache.sling.distribution.queue.spi.DistributionQueue;
import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ProviderType;
/**
* Processor of {@link DistributionQueueItem}s
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProvider.java b/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProvider.java
index 14e3ef7..430f621 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProvider.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/DistributionQueueProvider.java
@@ -18,11 +18,11 @@
*/
package org.apache.sling.distribution.queue.impl;
-import aQute.bnd.annotation.ProviderType;
import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.queue.DistributionQueueType;
import org.apache.sling.distribution.queue.spi.DistributionQueue;
import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ProviderType;
/**
* A provider for {@link DistributionQueue}s
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingQueueDistributionProviderFactory.java b/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingQueueDistributionProviderFactory.java
index d6a450d..6932a61 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingQueueDistributionProviderFactory.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/jobhandling/JobHandlingQueueDistributionProviderFactory.java
@@ -19,22 +19,21 @@
package org.apache.sling.distribution.queue.impl.jobhandling;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.queue.impl.DistributionQueueProvider;
import org.apache.sling.distribution.queue.impl.DistributionQueueProviderFactory;
import org.apache.sling.event.jobs.JobManager;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
import java.util.Map;
-@Component
-@Service(DistributionQueueProviderFactory.class)
-@Property(name = DistributionComponentConstants.PN_NAME, value = "jobQueue")
+@Component(service=DistributionQueueProviderFactory.class,
+ property= {
+ DistributionComponentConstants.PN_NAME + "=jobQueue"
+ })
public class JobHandlingQueueDistributionProviderFactory implements DistributionQueueProviderFactory {
@Reference
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueProviderFactory.java b/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueProviderFactory.java
index 76ae581..162bde0 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueProviderFactory.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueProviderFactory.java
@@ -19,38 +19,35 @@
package org.apache.sling.distribution.queue.impl.resource;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.commons.scheduler.Scheduler;
import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.queue.impl.DistributionQueueProvider;
import org.apache.sling.distribution.queue.impl.DistributionQueueProviderFactory;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
-import java.util.Map;
-
-@Component(metatype = true,
- label = "Apache Sling Resource Queue Provider Factory",
- description = "OSGi configuration factory for Resource-backed queues",
- configurationFactory = true,
- policy = ConfigurationPolicy.REQUIRE)
-@Service(DistributionQueueProviderFactory.class)
-@Properties({
- @Property(name = DistributionComponentConstants.PN_NAME, value = "resourceQueue"),
- @Property(name = ResourceQueueProviderFactory.PN_IS_ACTIVE,
- label = "Should the Resource-backed queue created with a Queue Processor (i.e., ACTIVE)",
- boolValue = {false})
-})
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionQueueProviderFactory.class,
+ property= {
+ DistributionComponentConstants.PN_NAME + "=resourceQueue"
+ })
+@Designate(ocd=ResourceQueueProviderFactory.Config.class, factory = true)
public class ResourceQueueProviderFactory implements DistributionQueueProviderFactory {
-
- static final String PN_IS_ACTIVE = "queue.isActive";
+
+ @ObjectClassDefinition(name="Apache Sling Resource Queue Provider Factory",
+ description="OSGi configuration factory for Resource-backed queues")
+ public @interface Config {
+ @AttributeDefinition(name="Should the Resource-backed queue created with a Queue Processor (i.e., ACTIVE)")
+ boolean queue_isActive() default false;
+ }
@Reference
ResourceResolverFactory resourceResolverFactory;
@@ -62,9 +59,8 @@
private boolean isActive;
@Activate
- protected void activate(BundleContext context, Map<String, Object> config)
- {
- this.isActive = PropertiesUtil.toBoolean(PN_IS_ACTIVE, false);
+ protected void activate(BundleContext context, Config conf) {
+ this.isActive = conf.queue_isActive();
this.context = context;
}
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueUtils.java b/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueUtils.java
index 2a389d2..4d139c4 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueUtils.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/resource/ResourceQueueUtils.java
@@ -36,12 +36,6 @@
import org.slf4j.LoggerFactory;
-import javax.jcr.NodeIterator;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.query.Query;
-import javax.jcr.query.QueryManager;
-import javax.jcr.query.QueryResult;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
diff --git a/src/main/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapper.java b/src/main/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapper.java
index 2b2b600..08545b2 100644
--- a/src/main/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapper.java
+++ b/src/main/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapper.java
@@ -23,6 +23,7 @@
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
import javax.json.Json;
@@ -52,7 +53,7 @@
JsonReader reader = Json.createReader(new StringReader(infoString));
JsonObject jsonObject = reader.readObject();
- NumberFormat numberFormat = NumberFormat.getInstance();
+ NumberFormat numberFormat = NumberFormat.getInstance(Locale.ENGLISH);
for (Map.Entry<String, JsonValue> entry : jsonObject.entrySet()) {
if (entry.getValue().getValueType().equals(JsonValue.ValueType.ARRAY)) {
diff --git a/src/main/java/org/apache/sling/distribution/queue/package-info.java b/src/main/java/org/apache/sling/distribution/queue/package-info.java
index 6f003ea..d543e33 100644
--- a/src/main/java/org/apache/sling/distribution/queue/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/queue/package-info.java
@@ -20,5 +20,4 @@
@Version("0.2.0")
package org.apache.sling.distribution.queue;
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/queue/spi/DistributionQueue.java b/src/main/java/org/apache/sling/distribution/queue/spi/DistributionQueue.java
index c14d069..4576a83 100644
--- a/src/main/java/org/apache/sling/distribution/queue/spi/DistributionQueue.java
+++ b/src/main/java/org/apache/sling/distribution/queue/spi/DistributionQueue.java
@@ -20,7 +20,6 @@
import java.util.Set;
-import aQute.bnd.annotation.ConsumerType;
import org.apache.sling.distribution.packaging.DistributionPackage;
import org.apache.sling.distribution.queue.DistributionQueueEntry;
import org.apache.sling.distribution.queue.DistributionQueueItem;
@@ -28,6 +27,7 @@
import org.apache.sling.distribution.queue.DistributionQueueType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ConsumerType;
/**
* Holds the {@link DistributionQueueItem} queue items in a sequential queue.
diff --git a/src/main/java/org/apache/sling/distribution/queue/spi/package-info.java b/src/main/java/org/apache/sling/distribution/queue/spi/package-info.java
index 912273a..0fa6cfc 100644
--- a/src/main/java/org/apache/sling/distribution/queue/spi/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/queue/spi/package-info.java
@@ -17,8 +17,7 @@
* under the License.
*/
-@Version("1.0.0")
+@Version("1.0.1")
package org.apache.sling.distribution.queue.spi;
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/resources/impl/DistributionConfigurationResourceProviderFactory.java b/src/main/java/org/apache/sling/distribution/resources/impl/DistributionConfigurationResourceProviderFactory.java
index 9f36c44..228366c 100644
--- a/src/main/java/org/apache/sling/distribution/resources/impl/DistributionConfigurationResourceProviderFactory.java
+++ b/src/main/java/org/apache/sling/distribution/resources/impl/DistributionConfigurationResourceProviderFactory.java
@@ -21,46 +21,46 @@
import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ResourceProvider;
import org.apache.sling.api.resource.ResourceProviderFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.component.impl.DistributionConfigurationManager;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A {@link ResourceProviderFactory} for distribution configuration resources.
*/
-@Component(metatype = true,
- label = "Apache Sling Distribution Resources - Configuration Resource Provider Factory",
- description = "Distribution Configuration Resource Provider Factory",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE)
-@Service(value = ResourceProviderFactory.class)
-@Properties({
- @Property(name = ResourceProvider.ROOTS),
- @Property(name = ResourceProvider.OWNS_ROOTS, boolValue = true, propertyPrivate = true)
-})
-@Property(name="webconsole.configurationFactory.nameHint", value="Resource kind: {kind}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=ResourceProviderFactory.class,
+ property= {
+ "webconsole.configurationFactory.nameHint=Resource kind: {kind}",
+ "provider.ownsRoots=true"
+ })
+@Designate(ocd=DistributionConfigurationResourceProviderFactory.Config.class, factory = true)
public class DistributionConfigurationResourceProviderFactory implements ResourceProviderFactory {
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Resources - Configuration Resource Provider Factory",
+ description="Distribution Configuration Resource Provider Factory")
+ public @interface Config {
+ @AttributeDefinition()
+ String provider_roots();
+ @AttributeDefinition()
+ String kind();
+ }
private final Logger log = LoggerFactory.getLogger(getClass());
- @Property
- private final static String KIND = DistributionComponentConstants.PN_KIND;
-
@Reference
private
DistributionConfigurationManager configurationManager;
@@ -69,13 +69,10 @@
private String kind;
@Activate
- public void activate(BundleContext context, Map<String, Object> properties) {
-
- log.debug("activating resource provider with config {}", properties);
-
- resourceRoot = PropertiesUtil.toString(properties.get(ResourceProvider.ROOTS), null);
- kind = PropertiesUtil.toString(properties.get(KIND), null);
-
+ public void activate(BundleContext context, Config conf) {
+ log.debug("activating resource provider with config {}", conf);
+ resourceRoot = conf.provider_roots();
+ kind = conf.kind();
}
@Deactivate
diff --git a/src/main/java/org/apache/sling/distribution/resources/impl/DistributionServiceResourceProviderFactory.java b/src/main/java/org/apache/sling/distribution/resources/impl/DistributionServiceResourceProviderFactory.java
index 8ed3d87..92f9100 100644
--- a/src/main/java/org/apache/sling/distribution/resources/impl/DistributionServiceResourceProviderFactory.java
+++ b/src/main/java/org/apache/sling/distribution/resources/impl/DistributionServiceResourceProviderFactory.java
@@ -19,51 +19,52 @@
package org.apache.sling.distribution.resources.impl;
-import javax.servlet.http.HttpServletRequest;
import java.util.Iterator;
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
+import javax.servlet.http.HttpServletRequest;
+
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceProvider;
import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.component.impl.DistributionComponentProvider;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A {@link org.apache.sling.api.resource.ResourceProviderFactory} for resources backing distribution services.
*/
-@Component(metatype = true,
- label = "Apache Sling Distribution Resources - Service Resource Provider Factory",
- description = "Distribution Service Resource Provider Factory",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE)
-@Service(value = ResourceProvider.class)
-@Properties({
- @Property(name = ResourceProvider.ROOTS),
- @Property(name = ResourceProvider.OWNS_ROOTS, boolValue = true, propertyPrivate = true)
-})
-@Property(name="webconsole.configurationFactory.nameHint", value="Resource kind: {kind}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=ResourceProvider.class,
+ enabled = true,
+ property = {
+ "webconsole.configurationFactory.nameHint=Resource kind: {kind}",
+ ResourceProvider.OWNS_ROOTS + ":Boolean=true",
+ "service.vendor=The Apache Software Foundation"
+ })
+@Designate(ocd=DistributionServiceResourceProviderFactory.Config.class, factory=true)
public class DistributionServiceResourceProviderFactory implements ResourceProvider {
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Resources - Service Resource Provider Factory",
+ description = "Distribution Service Resource Provider Factory")
+ public @interface Config {
+ @AttributeDefinition()
+ String provider_roots();
+ @AttributeDefinition()
+ String kind();
+ }
private final Logger log = LoggerFactory.getLogger(getClass());
-
- @Property
- private final static String KIND = DistributionComponentConstants.PN_KIND;
-
@Reference
private
DistributionComponentProvider componentProvider;
@@ -71,12 +72,12 @@
private ResourceProvider resourceProvider;
@Activate
- public void activate(BundleContext context, Map<String, Object> properties) {
+ public void activate(BundleContext context, Config conf) {
- log.debug("activating resource provider with config {}", properties);
+ log.debug("activating resource provider with config {}", conf);
- String kind = PropertiesUtil.toString(properties.get(KIND), null);
- String resourceRoot = PropertiesUtil.toString(properties.get(ResourceProvider.ROOTS), null);
+ String kind = conf.kind();
+ String resourceRoot = conf.provider_roots();
resourceProvider = new ExtendedDistributionServiceResourceProvider(kind,
componentProvider,
diff --git a/src/main/java/org/apache/sling/distribution/serialization/DistributionContentSerializer.java b/src/main/java/org/apache/sling/distribution/serialization/DistributionContentSerializer.java
index 60f1fa6..6244bac 100644
--- a/src/main/java/org/apache/sling/distribution/serialization/DistributionContentSerializer.java
+++ b/src/main/java/org/apache/sling/distribution/serialization/DistributionContentSerializer.java
@@ -21,9 +21,9 @@
import java.io.InputStream;
import java.io.OutputStream;
-import aQute.bnd.annotation.ConsumerType;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.distribution.common.DistributionException;
+import org.osgi.annotation.versioning.ConsumerType;
/**
* A content serializer used to convert distribution payloads to and from binary streams.
diff --git a/src/main/java/org/apache/sling/distribution/serialization/impl/DefaultDistributionPackageBuilderProvider.java b/src/main/java/org/apache/sling/distribution/serialization/impl/DefaultDistributionPackageBuilderProvider.java
index d1beb1f..3dd31ed 100644
--- a/src/main/java/org/apache/sling/distribution/serialization/impl/DefaultDistributionPackageBuilderProvider.java
+++ b/src/main/java/org/apache/sling/distribution/serialization/impl/DefaultDistributionPackageBuilderProvider.java
@@ -20,17 +20,15 @@
import java.util.List;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.distribution.component.impl.DistributionComponent;
import org.apache.sling.distribution.component.impl.DistributionComponentKind;
import org.apache.sling.distribution.component.impl.DistributionComponentProvider;
import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
import org.apache.sling.distribution.packaging.impl.DistributionPackageBuilderProvider;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
-@Component
-@Service(DistributionPackageBuilderProvider.class)
+@Component(service=DistributionPackageBuilderProvider.class)
public class DefaultDistributionPackageBuilderProvider implements DistributionPackageBuilderProvider {
@Reference
diff --git a/src/main/java/org/apache/sling/distribution/serialization/impl/DistributionPackageBuilderFactory.java b/src/main/java/org/apache/sling/distribution/serialization/impl/DistributionPackageBuilderFactory.java
index aaacbc1..534f9cc 100644
--- a/src/main/java/org/apache/sling/distribution/serialization/impl/DistributionPackageBuilderFactory.java
+++ b/src/main/java/org/apache/sling/distribution/serialization/impl/DistributionPackageBuilderFactory.java
@@ -21,24 +21,12 @@
import java.io.InputStream;
import java.util.Dictionary;
import java.util.Hashtable;
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.PropertyOption;
-import org.apache.felix.scr.annotations.PropertyUnbounded;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.commons.scheduler.Scheduler;
import org.apache.sling.distribution.DistributionRequest;
import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.component.impl.SettingsUtils;
import org.apache.sling.distribution.monitor.impl.MonitoringDistributionPackageBuilder;
import org.apache.sling.distribution.packaging.DistributionPackage;
@@ -54,155 +42,131 @@
import org.jetbrains.annotations.Nullable;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
/**
* A factory for package builders
*/
-@Component(metatype = true,
- label = "Apache Sling Distribution Packaging - Package Builder Factory",
- description = "OSGi configuration for package builders",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE
-)
-@Service(DistributionPackageBuilder.class)
-@Property(name = "webconsole.configurationFactory.nameHint", value = "Builder name: {name}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionPackageBuilder.class,
+ property= {
+ "webconsole.configurationFactory.nameHint=Builder name: {name}"
+ })
+@Designate(ocd=DistributionPackageBuilderFactory.Config.class, factory=true)
public class DistributionPackageBuilderFactory implements DistributionPackageBuilder {
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Packaging - Package Builder Factory",
+ description = "OSGi configuration for package builders")
+ public @interface Config {
+ @AttributeDefinition(name="name", description = "The name of the package builder.")
+ String name();
+ @AttributeDefinition(name="type",description = "The persistence type used by this package builder",
+ options = {
+ @Option(label = "resource", value="resource package"),
+ @Option(label="file", value="file package"),
+ @Option(label="inmemory", value="in memory packages")
+ })
+ String type() default "resource"; // persistence
+
+ @AttributeDefinition(name="Content Serializer",description = "The target reference for the DistributionSerializationFormat used to (de)serialize packages, " +
+ "e.g. use target=(name=...) to bind to services by name.")
+ String format_target() default SettingsUtils.COMPONENT_NAME_DEFAULT;
+
+ @AttributeDefinition(name="Temp Filesystem Folder", description = "The filesystem folder where the temporary files should be saved.")
+ String tempFsFolder();
+
+ @AttributeDefinition(name="File threshold",description = "Once the data reaches the configurable size value, buffering to memory switches to file buffering.")
+ int fileThreshold() default DEFAULT_FILE_THRESHOLD_VALUE;
+
+ @AttributeDefinition(name="The memory unit for the file threshold",
+ description = "The memory unit for the file threshold, Megabytes by default",
+ options = {
+ @Option(label = "BYTES", value = "Bytes"),
+ @Option(label = "KILO_BYTES", value = "Kilobytes"),
+ @Option(label = "MEGA_BYTES", value = "Megabytes"),
+ @Option(label = "GIGA_BYTES", value = "Gigabytes")
+ })
+ String memoryUnit() default DEFAULT_MEMORY_UNIT;
+
+ @AttributeDefinition(name="Flag to enable/disable the off-heap memory", description="Flag to enable/disable the off-heap memory, false by default")
+ boolean useOffHeapMemory() default DEFAULT_USE_OFF_HEAP_MEMORY;
+
+ @AttributeDefinition(
+ name = "The digest algorithm to calculate the package checksum",
+ description = "The digest algorithm to calculate the package checksum, Megabytes by default",
+ options = {
+ @Option(label = "NONE", value = "Do not send digest"),
+ @Option(label = "MD2", value = "md2"),
+ @Option(label = "MD5", value = "md5"),
+ @Option(label = "SHA-1", value = "sha1"),
+ @Option(label = "SHA-256", value = "sha256"),
+ @Option(label = "SHA-384", value = "sha384"),
+ @Option(label = "SHA-512", value = "sha512")
+ })
+ String digestAlgorithm() default DEFAULT_DIGEST_ALGORITHM;
+
+ @AttributeDefinition(
+ name="The number of items for monitoring distribution packages creation/installation",
+ description = "The number of items for monitoring distribution packages creation/installation, 100 by default")
+ int monitoringQueueSize() default DEFAULT_MONITORING_QUEUE_SIZE;
+
+ @AttributeDefinition(
+ name="The delay in seconds between two runs of the cleanup phase for resource persisted packages.",
+ description = "The resource persisted packages are cleaned up periodically (asynchronously) since SLING-6503." +
+ "The delay between two runs of the cleanup phase can be configured with this setting. 60 seconds by default")
+ long cleanupDelay() default DEFAULT_PACKAGE_CLEANUP_DELAY;
+
+ @AttributeDefinition(
+ name = "Package Node Filters",
+ description = "The package node path filters. Filter format: path|+include|-exclude",
+ cardinality = 100)
+ String[] package_filters();
+
+ @AttributeDefinition(
+ name = "Package Property Filters",
+ description = "The package property path filters. Filter format: path|+include|-exclude",
+ cardinality = Integer.MAX_VALUE)
+ String[] property_filters();
+ }
- /**
- * name of this package builder.
- */
- @Property(label = "Name", description = "The name of the package builder.")
- private static final String NAME = DistributionComponentConstants.PN_NAME;
+ private MonitoringDistributionPackageBuilder packageBuilder;
- /**
- * type of this package builder.
- */
- @Property(options = {
- @PropertyOption(name = "resource",
- value = "resource packages"
- ),
- @PropertyOption(name = "file",
- value = "file packages"
- ),
- @PropertyOption(name = "inmemory",
- value = "in memory packages"
- )},
- value = "resource", label = "type", description = "The persistence type used by this package builder")
- private static final String PERSISTENCE = DistributionComponentConstants.PN_TYPE;
-
- @Property(name = "format.target", label = "Content Serializer", description = "The target reference for the DistributionSerializationFormat used to (de)serialize packages, " +
- "e.g. use target=(name=...) to bind to services by name.", value = SettingsUtils.COMPONENT_NAME_DEFAULT)
+ private ServiceRegistration<Runnable> packageCleanup = null;
+
@Reference(name = "format")
private DistributionContentSerializer contentSerializer;
@Reference
private ResourceResolverFactory resolverFactory;
- /**
- * Temp file folder
- */
- @Property(label = "Temp Filesystem Folder", description = "The filesystem folder where the temporary files should be saved.")
- private static final String TEMP_FS_FOLDER = "tempFsFolder";
// 1M
private static final int DEFAULT_FILE_THRESHOLD_VALUE = 1;
-
- @Property(
- label="File threshold",
- description = "Once the data reaches the configurable size value, buffering to memory switches to file buffering.",
- intValue = DEFAULT_FILE_THRESHOLD_VALUE
- )
- public static final String FILE_THRESHOLD = "fileThreshold";
-
private static final String DEFAULT_MEMORY_UNIT = "MEGA_BYTES";
-
- @Property(
- label = "The memory unit for the file threshold",
- description = "The memory unit for the file threshold, Megabytes by default",
- value = DEFAULT_MEMORY_UNIT,
- options = {
- @PropertyOption(name = "BYTES", value = "Bytes"),
- @PropertyOption(name = "KILO_BYTES", value = "Kilobytes"),
- @PropertyOption(name = "MEGA_BYTES", value = "Megabytes"),
- @PropertyOption(name = "GIGA_BYTES", value = "Gigabytes")
- }
- )
- private static final String MEMORY_UNIT = "memoryUnit";
-
private static final boolean DEFAULT_USE_OFF_HEAP_MEMORY = false;
-
- @Property(
- label="Flag to enable/disable the off-heap memory",
- description = "Flag to enable/disable the off-heap memory, false by default",
- boolValue = DEFAULT_USE_OFF_HEAP_MEMORY
- )
- public static final String USE_OFF_HEAP_MEMORY = "useOffHeapMemory";
-
private static final String DEFAULT_DIGEST_ALGORITHM = "NONE";
-
- @Property(
- label = "The digest algorithm to calculate the package checksum",
- description = "The digest algorithm to calculate the package checksum, Megabytes by default",
- value = DEFAULT_DIGEST_ALGORITHM,
- options = {
- @PropertyOption(name = DEFAULT_DIGEST_ALGORITHM, value = "Do not send digest"),
- @PropertyOption(name = "MD2", value = "md2"),
- @PropertyOption(name = "MD5", value = "md5"),
- @PropertyOption(name = "SHA-1", value = "sha1"),
- @PropertyOption(name = "SHA-256", value = "sha256"),
- @PropertyOption(name = "SHA-384", value = "sha384"),
- @PropertyOption(name = "SHA-512", value = "sha512")
- }
- )
- private static final String DIGEST_ALGORITHM = "digestAlgorithm";
-
private static final int DEFAULT_MONITORING_QUEUE_SIZE = 0;
-
- @Property(
- label="The number of items for monitoring distribution packages creation/installation",
- description = "The number of items for monitoring distribution packages creation/installation, 100 by default",
- intValue = DEFAULT_MONITORING_QUEUE_SIZE
- )
- private static final String MONITORING_QUEUE_SIZE = "monitoringQueueSize";
-
private static final long DEFAULT_PACKAGE_CLEANUP_DELAY = 60L;
- @Property(
- label="The delay in seconds between two runs of the cleanup phase for resource persisted packages.",
- description = "The resource persisted packages are cleaned up periodically (asynchronously) since SLING-6503." +
- "The delay between two runs of the cleanup phase can be configured with this setting. 60 seconds by default",
- longValue = DEFAULT_PACKAGE_CLEANUP_DELAY
- )
- private static final String PACKAGE_CLEANUP_DELAY = "cleanupDelay";
-
- /**
- * Package node filters
- */
- @Property(label = "Package Node Filters", description = "The package node path filters. Filter format: path|+include|-exclude", cardinality = 100)
- private static final String PACKAGE_FILTERS = "package.filters";
-
- /**
- * Package property filters
- */
- @Property(label = "Package Property Filters", description = "The package property path filters. Filter format: path|+include|-exclude",
- unbounded = PropertyUnbounded.ARRAY, value = {})
- private static final String PROPERTY_FILTERS = "property.filters";
-
- private MonitoringDistributionPackageBuilder packageBuilder;
-
- private ServiceRegistration<Runnable> packageCleanup = null;
-
@Activate
public void activate(BundleContext context,
- Map<String, Object> config) {
+ Config conf) {
- String[] nodeFilters = SettingsUtils.removeEmptyEntries(PropertiesUtil.toStringArray(config.get(PACKAGE_FILTERS), null));
- String[] propertyFilters = SettingsUtils.removeEmptyEntries(PropertiesUtil.toStringArray(config.get(PROPERTY_FILTERS), null));
- String persistenceType = PropertiesUtil.toString(config.get(PERSISTENCE), null);
- String tempFsFolder = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(TEMP_FS_FOLDER), null));
- String digestAlgorithm = PropertiesUtil.toString(config.get(DIGEST_ALGORITHM), DEFAULT_DIGEST_ALGORITHM);
- long cleanupDelay = PropertiesUtil.toLong(config.get(PACKAGE_CLEANUP_DELAY), DEFAULT_PACKAGE_CLEANUP_DELAY);
+ String[] nodeFilters = SettingsUtils.removeEmptyEntries(conf.package_filters());
+ String[] propertyFilters = SettingsUtils.removeEmptyEntries(conf.property_filters());
+ String persistenceType = conf.type();
+ String tempFsFolder = SettingsUtils.removeEmptyEntry(conf.tempFsFolder());
+ String digestAlgorithm = conf.digestAlgorithm();
+ long cleanupDelay = conf.cleanupDelay();
if (DEFAULT_DIGEST_ALGORITHM.equals(digestAlgorithm)) {
digestAlgorithm = null;
}
@@ -213,10 +177,10 @@
} else if ("inmemory".equals(persistenceType)) {
wrapped = new InMemoryDistributionPackageBuilder(contentSerializer.getName(), contentSerializer, nodeFilters, propertyFilters);
} else {
- final int fileThreshold = PropertiesUtil.toInteger(config.get(FILE_THRESHOLD), DEFAULT_FILE_THRESHOLD_VALUE);
- String memoryUnitName = PropertiesUtil.toString(config.get(MEMORY_UNIT), DEFAULT_MEMORY_UNIT);
+ final int fileThreshold = conf.fileThreshold();
+ String memoryUnitName = conf.memoryUnit();
final MemoryUnit memoryUnit = MemoryUnit.valueOf(memoryUnitName);
- final boolean useOffHeapMemory = PropertiesUtil.toBoolean(config.get(USE_OFF_HEAP_MEMORY), DEFAULT_USE_OFF_HEAP_MEMORY);
+ final boolean useOffHeapMemory = conf.useOffHeapMemory();
ResourceDistributionPackageBuilder resourceDistributionPackageBuilder = new ResourceDistributionPackageBuilder(contentSerializer.getName(), contentSerializer, tempFsFolder, fileThreshold, memoryUnit, useOffHeapMemory, digestAlgorithm, nodeFilters, propertyFilters);
Runnable cleanup = new ResourceDistributionPackageCleanup(resolverFactory, resourceDistributionPackageBuilder);
Dictionary<String, Object> props = new Hashtable<String, Object>();
@@ -226,7 +190,7 @@
wrapped = resourceDistributionPackageBuilder;
}
- int monitoringQueueSize = PropertiesUtil.toInteger(config.get(MONITORING_QUEUE_SIZE), DEFAULT_MONITORING_QUEUE_SIZE);
+ int monitoringQueueSize = conf.monitoringQueueSize();
packageBuilder = new MonitoringDistributionPackageBuilder(monitoringQueueSize, wrapped, context);
}
diff --git a/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java b/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java
index 0b561c0..05c888f 100644
--- a/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java
+++ b/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java
@@ -18,17 +18,14 @@
*/
package org.apache.sling.distribution.serialization.impl.vlt;
-import org.apache.felix.scr.annotations.*;
import org.apache.jackrabbit.vault.fs.api.ImportMode;
import org.apache.jackrabbit.vault.fs.io.AccessControlHandling;
import org.apache.jackrabbit.vault.packaging.Packaging;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.commons.scheduler.Scheduler;
import org.apache.sling.distribution.DistributionRequest;
import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.component.impl.SettingsUtils;
import org.apache.sling.distribution.monitor.impl.MonitoringDistributionPackageBuilder;
import org.apache.sling.distribution.packaging.DistributionPackage;
@@ -44,183 +41,141 @@
import org.jetbrains.annotations.Nullable;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
import java.io.InputStream;
import java.util.Dictionary;
import java.util.Hashtable;
+import java.util.LinkedHashMap;
import java.util.Map;
/**
* A package builder for Apache Jackrabbit FileVault based implementations.
*/
-@Component(metatype = true,
- label = "Apache Sling Distribution Packaging - Vault Package Builder Factory",
- description = "OSGi configuration for vault package builders",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE
-)
-@Service(DistributionPackageBuilder.class)
-@Property(name = "webconsole.configurationFactory.nameHint", value = "Builder name: {name}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionPackageBuilder.class,
+ property= {
+ "webconsole.configurationFactory.nameHint=Builder name: {name}"
+ })
+@Designate(ocd=VaultDistributionPackageBuilderFactory.Config.class, factory=true)
public class VaultDistributionPackageBuilderFactory implements DistributionPackageBuilder {
-
- /**
- * name of this package builder.
- */
- @Property(label = "Name", description = "The name of the package builder.")
- private static final String NAME = DistributionComponentConstants.PN_NAME;
-
-
- /**
- * type of this package builder.
- */
- @Property(options = {
- @PropertyOption(name = "jcrvlt",
- value = "jcr packages"
- ),
- @PropertyOption(name = "filevlt",
- value = "file packages"
- ),
- @PropertyOption(name = "inmemory",
- value = "in memory packages"
- )},
- value = "jcrvlt", label = "type", description = "The type of this package builder")
- private static final String TYPE = DistributionComponentConstants.PN_TYPE;
-
-
- /**
- * import mode property for file vault package builder
- */
- @Property(label = "Import Mode", description = "The vlt import mode for created packages.")
- private static final String IMPORT_MODE = "importMode";
-
- /**
- * ACL handling property for file vault package builder
- */
- @Property(label = "Acl Handling", description = "The vlt acl handling mode for created packages.")
- private static final String ACL_HANDLING = "aclHandling";
-
- /**
- * CUG handling property for file vault package builder
- */
- @Property(label = "Cug Handling", description = "The vlt cug handling mode for created packages.")
- private static final String CUG_HANDLING = "cugHandling";
-
- /**
- * Package roots
- */
- @Property(label = "Package Roots", description = "The package roots to be used for created packages. (this is useful for assembling packages with an user that cannot read above the package root)")
- private static final String PACKAGE_ROOTS = "package.roots";
-
- /**
- * Package node filters
- */
- @Property(label = "Package Node Filters", description = "The package node path filters. Filter format: path|+include|-exclude", cardinality = 100)
- private static final String PACKAGE_FILTERS = "package.filters";
-
- /**
- * Package property filters
- */
- @Property(label = "Package Property Filters", description = "The package property path filters. Filter format: path|+include|-exclude",
- unbounded = PropertyUnbounded.ARRAY, value = {})
- private static final String PROPERTY_FILTERS = "property.filters";
-
- /**
- * Temp file folder
- */
- @Property(label = "Temp Filesystem Folder", description = "The filesystem folder where the temporary files should be saved.")
- private static final String TEMP_FS_FOLDER = "tempFsFolder";
-
- @Property(label = "Use Binary References", description = "If activated, it avoids sending binaries in the distribution package.", boolValue = false)
- public static final String USE_BINARY_REFERENCES = "useBinaryReferences";
-
- @Property(label = "Autosave threshold", description = "The value after which autosave is triggered for intermediate changes.", intValue = -1)
- public static final String AUTOSAVE_THRESHOLD = "autoSaveThreshold";
-
+
+ @ObjectClassDefinition(name="pache Sling Distribution Packaging - Vault Package Builder Factory",
+ description = "OSGi configuration for vault package builders")
+ public @interface Config {
+ @AttributeDefinition(name="name",description = "The name of the package builder.")
+ String name();
+ @AttributeDefinition(options = {
+ @Option(label = "jcrvlt", value = "jcr packages"),
+ @Option(label = "filevlt",value = "file packages"),
+ @Option(label = "inmemory",value = "in memory packages")},
+ name = "type", description = "The type of this package builder")
+ String type() default "jcrvlt";
+ @AttributeDefinition(name="Import Mode", description = "The vlt import mode for created packages.")
+ String importMode();
+ @AttributeDefinition(name="Acl Handling", description = "The vlt acl handling mode for created packages.")
+ String aclHandling();
+ @AttributeDefinition(name="Cug Handling", description = "The vlt cug handling mode for created packages.")
+ String cugHandling();
+ @AttributeDefinition(name="Package Roots", description = "The package roots to be used for created packages. "
+ + "(this is useful for assembling packages with an user that cannot read above the package root)")
+ String[] package_roots();
+
+ @AttributeDefinition(name="Package Node Filters",
+ description = "The package node path filters. Filter format: path|+include|-exclude",
+ cardinality = 100)
+ String[] package_filters();
+
+ @AttributeDefinition(name="Package Property Filters",
+ description = "The package property path filters. Filter format: path|+include|-exclude")
+ String[] property_filters();
+
+ @AttributeDefinition(name="Temp Filesystem Folder",
+ description = "The filesystem folder where the temporary files should be saved.")
+ String tempFsFolder();
+
+ @AttributeDefinition(name="Use Binary References",
+ description = "If activated, it avoids sending binaries in the distribution package.")
+ boolean useBinaryReferences() default false;
+
+ @AttributeDefinition(name="Autosave threshold", description = "The value after which autosave is triggered for intermediate changes.")
+ int autoSaveThreshold() default -1;
+
+ @AttributeDefinition(
+ name = "The delay in seconds between two runs of the cleanup phase for resource persisted packages.",
+ description = "The resource persisted packages are cleaned up periodically (asynchronously) since SLING-6503." +
+ "The delay between two runs of the cleanup phase can be configured with this setting. 60 seconds by default")
+ long cleanupDelay() default DEFAULT_PACKAGE_CLEANUP_DELAY;
+
+ @AttributeDefinition(
+ name = "File threshold (in bytes)",
+ description = "Once the data reaches the configurable size value, buffering to memory switches to file buffering.")
+ int fileThreshold() default DEFAULT_FILE_THRESHOLD_VALUE;
+
+ @AttributeDefinition(
+ name = "The memory unit for the file threshold",
+ description = "The memory unit for the file threshold, Megabytes by default",
+ options = {
+ @Option(label = "BYTES", value = "Bytes"),
+ @Option(label = "KILO_BYTES", value = "Kilobytes"),
+ @Option(label = "MEGA_BYTES", value = "Megabytes"),
+ @Option(label = "GIGA_BYTES", value = "Gigabytes")
+ })
+ String MEGA_BYTES() default DEFAULT_MEMORY_UNIT;
+
+ @AttributeDefinition(
+ name = "Flag to enable/disable the off-heap memory",
+ description = "Flag to enable/disable the off-heap memory, false by default")
+ boolean useOffHeapMemory() default DEFAULT_USE_OFF_HEAP_MEMORY;
+
+ @AttributeDefinition(
+ name = "The digest algorithm to calculate the package checksum",
+ description = "The digest algorithm to calculate the package checksum, Megabytes by default",
+ options = {
+ @Option(label = DEFAULT_DIGEST_ALGORITHM, value = "Do not send digest"),
+ @Option(label = "MD2", value = "md2"),
+ @Option(label = "MD5", value = "md5"),
+ @Option(label = "SHA-1", value = "sha1"),
+ @Option(label = "SHA-256", value = "sha256"),
+ @Option(label = "SHA-384", value = "sha384"),
+ @Option(label = "SHA-512", value = "sha512")
+ })
+ String digestAlgorithm() default DEFAULT_DIGEST_ALGORITHM;
+
+ @AttributeDefinition(
+ name = "The number of items for monitoring distribution packages creation/installation",
+ description = "The number of items for monitoring distribution packages creation/installation, 100 by default")
+ int monitoringQueueSize() default DEFAULT_MONITORING_QUEUE_SIZE;
+
+ @AttributeDefinition(cardinality = 100,
+ name = "Paths mapping",
+ description = "List of paths that require be mapped." +
+ "The format is {sourcePattern}={destinationPattern}, e.g. /etc/(.*)=/var/$1/some or simply /data=/bak")
+ String[] pathsMapping();
+
+ @AttributeDefinition(
+ name = "Install a content package in a strict mode",
+ description = "Flag to mark an error response will be thrown, if a content package will incorrectly installed")
+ boolean strictImport() default DEFAULT_STRICT_IMPORT_SETTINGS;
+ }
+
private static final long DEFAULT_PACKAGE_CLEANUP_DELAY = 60L;
-
- @Property(
- label = "The delay in seconds between two runs of the cleanup phase for resource persisted packages.",
- description = "The resource persisted packages are cleaned up periodically (asynchronously) since SLING-6503." +
- "The delay between two runs of the cleanup phase can be configured with this setting. 60 seconds by default",
- longValue = DEFAULT_PACKAGE_CLEANUP_DELAY
- )
- private static final String PACKAGE_CLEANUP_DELAY = "cleanupDelay";
-
// 1M
private static final int DEFAULT_FILE_THRESHOLD_VALUE = 1;
-
- @Property(
- label = "File threshold (in bytes)",
- description = "Once the data reaches the configurable size value, buffering to memory switches to file buffering.",
- intValue = DEFAULT_FILE_THRESHOLD_VALUE
- )
- public static final String FILE_THRESHOLD = "fileThreshold";
-
private static final String DEFAULT_MEMORY_UNIT = "MEGA_BYTES";
-
- @Property(
- label = "The memory unit for the file threshold",
- description = "The memory unit for the file threshold, Megabytes by default",
- value = DEFAULT_MEMORY_UNIT,
- options = {
- @PropertyOption(name = "BYTES", value = "Bytes"),
- @PropertyOption(name = "KILO_BYTES", value = "Kilobytes"),
- @PropertyOption(name = "MEGA_BYTES", value = "Megabytes"),
- @PropertyOption(name = "GIGA_BYTES", value = "Gigabytes")
- }
- )
- private static final String MEMORY_UNIT = "MEGA_BYTES";
-
private static final boolean DEFAULT_USE_OFF_HEAP_MEMORY = false;
-
- @Property(
- label = "Flag to enable/disable the off-heap memory",
- description = "Flag to enable/disable the off-heap memory, false by default",
- boolValue = DEFAULT_USE_OFF_HEAP_MEMORY
- )
- public static final String USE_OFF_HEAP_MEMORY = "useOffHeapMemory";
-
private static final String DEFAULT_DIGEST_ALGORITHM = "NONE";
-
- @Property(
- label = "The digest algorithm to calculate the package checksum",
- description = "The digest algorithm to calculate the package checksum, Megabytes by default",
- value = DEFAULT_DIGEST_ALGORITHM,
- options = {
- @PropertyOption(name = DEFAULT_DIGEST_ALGORITHM, value = "Do not send digest"),
- @PropertyOption(name = "MD2", value = "md2"),
- @PropertyOption(name = "MD5", value = "md5"),
- @PropertyOption(name = "SHA-1", value = "sha1"),
- @PropertyOption(name = "SHA-256", value = "sha256"),
- @PropertyOption(name = "SHA-384", value = "sha384"),
- @PropertyOption(name = "SHA-512", value = "sha512")
- }
- )
- private static final String DIGEST_ALGORITHM = "digestAlgorithm";
-
private static final int DEFAULT_MONITORING_QUEUE_SIZE = 0;
-
- @Property(
- label = "The number of items for monitoring distribution packages creation/installation",
- description = "The number of items for monitoring distribution packages creation/installation, 100 by default",
- intValue = DEFAULT_MONITORING_QUEUE_SIZE
- )
- private static final String MONITORING_QUEUE_SIZE = "monitoringQueueSize";
-
- @Property(cardinality = 100,
- label = "Paths mapping",
- description = "List of paths that require be mapped." +
- "The format is {sourcePattern}={destinationPattern}, e.g. /etc/(.*)=/var/$1/some or simply /data=/bak")
- private static final String PATHS_MAPPING = "pathsMapping";
-
private static final boolean DEFAULT_STRICT_IMPORT_SETTINGS = true;
- @Property(
- label = "Install a content package in a strict mode",
- description = "Flag to mark an error response will be thrown, if a content package will incorrectly installed",
- boolValue = DEFAULT_STRICT_IMPORT_SETTINGS
- )
- public static final String STRICT_IMPORT_SETTINGS = "strictImport";
@Reference
private Packaging packaging;
@@ -233,25 +188,25 @@
private MonitoringDistributionPackageBuilder packageBuilder;
@Activate
- public void activate(BundleContext context, Map<String, Object> config) {
+ public void activate(BundleContext context, Config conf) {
- String name = PropertiesUtil.toString(config.get(NAME), null);
- String type = PropertiesUtil.toString(config.get(TYPE), null);
- String importModeString = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(IMPORT_MODE), null));
- String aclHandlingString = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(ACL_HANDLING), null));
- String cugHandlingString = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(CUG_HANDLING), null));
+ String name = conf.name();
+ String type = conf.type();
+ String importModeString = SettingsUtils.removeEmptyEntry(conf.importMode());
+ String aclHandlingString = SettingsUtils.removeEmptyEntry(conf.aclHandling());
+ String cugHandlingString = SettingsUtils.removeEmptyEntry(conf.cugHandling());
- String[] packageRoots = SettingsUtils.removeEmptyEntries(PropertiesUtil.toStringArray(config.get(PACKAGE_ROOTS), null));
- String[] packageNodeFilters = SettingsUtils.removeEmptyEntries(PropertiesUtil.toStringArray(config.get(PACKAGE_FILTERS), null));
- String[] packagePropertyFilters = SettingsUtils.removeEmptyEntries(PropertiesUtil.toStringArray(config.get(PROPERTY_FILTERS), null));
+ String[] packageRoots = SettingsUtils.removeEmptyEntries(conf.package_roots());
+ String[] packageNodeFilters = SettingsUtils.removeEmptyEntries(conf.package_filters());
+ String[] packagePropertyFilters = SettingsUtils.removeEmptyEntries(conf.property_filters());
- long cleanupDelay = PropertiesUtil.toLong(config.get(PACKAGE_CLEANUP_DELAY), DEFAULT_PACKAGE_CLEANUP_DELAY);
+ long cleanupDelay = conf.cleanupDelay();
- String tempFsFolder = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(TEMP_FS_FOLDER), null));
- boolean useBinaryReferences = PropertiesUtil.toBoolean(config.get(USE_BINARY_REFERENCES), false);
- int autosaveThreshold = PropertiesUtil.toInteger(config.get(AUTOSAVE_THRESHOLD), -1);
+ String tempFsFolder = SettingsUtils.removeEmptyEntry(conf.tempFsFolder());
+ boolean useBinaryReferences = conf.useBinaryReferences();
+ int autosaveThreshold = conf.autoSaveThreshold();
- String digestAlgorithm = PropertiesUtil.toString(config.get(DIGEST_ALGORITHM), DEFAULT_DIGEST_ALGORITHM);
+ String digestAlgorithm = conf.digestAlgorithm();
if (DEFAULT_DIGEST_ALGORITHM.equals(digestAlgorithm)) {
digestAlgorithm = null;
}
@@ -272,10 +227,10 @@
}
// check the mount path patterns, if any
- Map<String, String> pathsMapping = PropertiesUtil.toMap(config.get(PATHS_MAPPING), new String[0]);
+ Map<String, String> pathsMapping = toMap(conf.pathsMapping(), new String[0]);
pathsMapping = SettingsUtils.removeEmptyEntries(pathsMapping);
- boolean strictImport = PropertiesUtil.toBoolean(config.get(STRICT_IMPORT_SETTINGS), DEFAULT_STRICT_IMPORT_SETTINGS);
+ boolean strictImport = conf.strictImport();
DistributionContentSerializer contentSerializer = new FileVaultContentSerializer(name, packaging, importMode, aclHandling, cugHandling,
packageRoots, packageNodeFilters, packagePropertyFilters, useBinaryReferences, autosaveThreshold, pathsMapping, strictImport);
@@ -286,10 +241,10 @@
} else if ("inmemory".equals(type)) {
wrapped = new InMemoryDistributionPackageBuilder(name, contentSerializer, packageNodeFilters, packagePropertyFilters);
} else {
- final int fileThreshold = PropertiesUtil.toInteger(config.get(FILE_THRESHOLD), DEFAULT_FILE_THRESHOLD_VALUE);
- String memoryUnitName = PropertiesUtil.toString(config.get(MEMORY_UNIT), DEFAULT_MEMORY_UNIT);
+ final int fileThreshold = conf.fileThreshold();
+ String memoryUnitName = conf.MEGA_BYTES();
final MemoryUnit memoryUnit = MemoryUnit.valueOf(memoryUnitName);
- final boolean useOffHeapMemory = PropertiesUtil.toBoolean(config.get(USE_OFF_HEAP_MEMORY), DEFAULT_USE_OFF_HEAP_MEMORY);
+ final boolean useOffHeapMemory = conf.useOffHeapMemory();
ResourceDistributionPackageBuilder resourceDistributionPackageBuilder = new ResourceDistributionPackageBuilder(contentSerializer.getName(), contentSerializer, tempFsFolder, fileThreshold, memoryUnit, useOffHeapMemory, digestAlgorithm, packageNodeFilters, packagePropertyFilters);
Runnable cleanup = new ResourceDistributionPackageCleanup(resolverFactory, resourceDistributionPackageBuilder);
Dictionary<String, Object> props = new Hashtable<String, Object>();
@@ -300,7 +255,7 @@
wrapped = resourceDistributionPackageBuilder;
}
- int monitoringQueueSize = PropertiesUtil.toInteger(config.get(MONITORING_QUEUE_SIZE), DEFAULT_MONITORING_QUEUE_SIZE);
+ int monitoringQueueSize = conf.monitoringQueueSize();
packageBuilder = new MonitoringDistributionPackageBuilder(monitoringQueueSize, wrapped, context);
}
@@ -340,4 +295,48 @@
public DistributionPackageInfo installPackage(@NotNull ResourceResolver resourceResolver, @NotNull InputStream stream) throws DistributionException {
return packageBuilder.installPackage(resourceResolver, stream);
}
+
+
+ /**
+ * (taken and adjusted from PropertiesUtil, because the handy toMap() function is not available as
+ * part of the metatype functionality
+ *
+ * @param propValue The object to convert.
+ * @param defaultArray The default array converted to map.
+ * @return Map value
+ */
+ private static Map<String, String> toMap(String[] values, String[] defaultArray) {
+
+ if (values == null) {
+ values = defaultArray;
+ }
+
+ //in property values
+ Map<String, String> result = new LinkedHashMap<String, String>();
+ for (String kv : values) {
+ int indexOfEqual = kv.indexOf('=');
+ if (indexOfEqual > 0) {
+ String key = trimToNull(kv.substring(0, indexOfEqual));
+ String value = trimToNull(kv.substring(indexOfEqual + 1));
+ if (key != null) {
+ result.put(key, value);
+ }
+ }
+ }
+ return result;
+ }
+
+ private static String trimToNull(String str) {
+ String ts = trim(str);
+ return isEmpty(ts) ? null : ts;
+ }
+
+ private static String trim(String str){
+ return str == null ? null : str.trim();
+ }
+
+ private static boolean isEmpty(String str){
+ return str == null || str.length() == 0;
+ }
+
}
diff --git a/src/main/java/org/apache/sling/distribution/serialization/package-info.java b/src/main/java/org/apache/sling/distribution/serialization/package-info.java
index 6832ef7..653beb5 100644
--- a/src/main/java/org/apache/sling/distribution/serialization/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/serialization/package-info.java
@@ -20,5 +20,4 @@
@Version("0.1.1")
package org.apache.sling.distribution.serialization;
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentCreationFilter.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentCreationFilter.java
index 33880a3..66397eb 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentCreationFilter.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentCreationFilter.java
@@ -18,6 +18,12 @@
*/
package org.apache.sling.distribution.servlet;
+import static java.lang.String.format;
+import static javax.servlet.http.HttpServletResponse.SC_CONFLICT;
+
+import java.io.IOException;
+import java.util.Collection;
+
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
@@ -25,38 +31,30 @@
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.Collection;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.distribution.agent.spi.DistributionAgent;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static java.lang.String.format;
-import static javax.servlet.http.HttpServletResponse.SC_CONFLICT;
-
/**
* {@link Filter} to avoid creation of duplicate agents.
*/
-@Component(immediate = true, metatype = false)
-@Service(value = Filter.class)
-@Properties({
- @Property(name = "service.description", value = "Duplicate replication agents IDs checking Filter"),
- @Property(name = "service.vendor", value = "The Apache Software Foundation"),
- @Property(name = "sling.filter.scope", value = "request"),
- @Property(name = "sling.filter.pattern", value = "/libs/sling/distribution/settings/agents/.*"),
- @Property(name = "osgi.http.whiteboard.filter.regex", value = "/libs/sling/distribution/settings/agents/.*"),
- @Property(name = "service.ranking", intValue = Integer.MAX_VALUE)
-})
+@Component(immediate = true, service=Filter.class,
+ property= {
+ "service.description=Duplicate replication agents IDs checking Filter",
+ "service.vendor=The Apache Software Foundation",
+ "sling.filter.scope=request",
+ "sling.filter.pattern=/libs/sling/distribution/settings/agents/.*",
+ "osgi.http.whiteboard.filter.regex=/libs/sling/distribution/settings/agents/.*",
+ "service.ranking="+ Integer.MAX_VALUE
+
+ })
public final class DistributionAgentCreationFilter implements Filter {
private static final String METHOD_POST = "POST";
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentLogServlet.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentLogServlet.java
index 1e2e485..fc84383 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentLogServlet.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentLogServlet.java
@@ -18,19 +18,22 @@
*/
package org.apache.sling.distribution.servlet;
-import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
-import org.apache.felix.scr.annotations.sling.SlingServlet;
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
-import org.apache.sling.api.servlets.SlingAllMethodsServlet;
+import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.apache.sling.distribution.DistributionRequest;
import org.apache.sling.distribution.agent.spi.DistributionAgent;
import org.apache.sling.distribution.log.spi.DistributionLog;
import org.apache.sling.distribution.resources.DistributionResourceTypes;
import org.apache.sling.distribution.util.RequestUtils;
+import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
+import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,8 +41,12 @@
* Servlet to ask {@link DistributionAgent}s to distribute (via HTTP POST).
*/
@SuppressWarnings("serial")
-@SlingServlet(resourceTypes = DistributionResourceTypes.LOG_RESOURCE_TYPE, methods = "GET", extensions = "txt")
-public class DistributionAgentLogServlet extends SlingAllMethodsServlet {
+@Component(service=Servlet.class)
+@SlingServletResourceTypes(
+ methods = {"GET"},
+ resourceTypes = {DistributionResourceTypes.LOG_RESOURCE_TYPE},
+ extensions = {"txt"})
+public class DistributionAgentLogServlet extends SlingSafeMethodsServlet {
private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentQueueServlet.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentQueueServlet.java
index 104fe19..7513960 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentQueueServlet.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentQueueServlet.java
@@ -18,14 +18,18 @@
*/
package org.apache.sling.distribution.servlet;
-import javax.servlet.ServletException;
+import static org.apache.sling.distribution.queue.DistributionQueueCapabilities.APPENDABLE;
+import static org.apache.sling.distribution.queue.DistributionQueueCapabilities.CLEARABLE;
+import static org.apache.sling.distribution.queue.DistributionQueueCapabilities.REMOVABLE;
+
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.sling.SlingServlet;
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ResourceResolver;
@@ -33,27 +37,29 @@
import org.apache.sling.distribution.agent.spi.DistributionAgent;
import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.packaging.DistributionPackage;
+import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
import org.apache.sling.distribution.packaging.DistributionPackageInfo;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageBuilderProvider;
import org.apache.sling.distribution.packaging.impl.DistributionPackageUtils;
-import org.apache.sling.distribution.queue.spi.DistributionQueue;
import org.apache.sling.distribution.queue.DistributionQueueEntry;
import org.apache.sling.distribution.queue.DistributionQueueItem;
+import org.apache.sling.distribution.queue.spi.DistributionQueue;
import org.apache.sling.distribution.resources.DistributionResourceTypes;
-import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
-import org.apache.sling.distribution.packaging.impl.DistributionPackageBuilderProvider;
+import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static org.apache.sling.distribution.queue.DistributionQueueCapabilities.REMOVABLE;
-import static org.apache.sling.distribution.queue.DistributionQueueCapabilities.CLEARABLE;
-import static org.apache.sling.distribution.queue.DistributionQueueCapabilities.APPENDABLE;
-
/**
* Servlet to retrieve a {@link DistributionQueue} status.
*/
@SuppressWarnings("serial")
-@SlingServlet(resourceTypes = DistributionResourceTypes.AGENT_QUEUE_RESOURCE_TYPE, methods = {"POST"})
+@Component(service=Servlet.class)
+@SlingServletResourceTypes(
+ methods = {"POST"},
+ resourceTypes = {DistributionResourceTypes.AGENT_QUEUE_RESOURCE_TYPE})
public class DistributionAgentQueueServlet extends SlingAllMethodsServlet {
private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentServlet.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentServlet.java
index edada7c..98acf36 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentServlet.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionAgentServlet.java
@@ -18,10 +18,10 @@
*/
package org.apache.sling.distribution.servlet;
+import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.IOException;
-import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ResourceResolver;
@@ -31,6 +31,8 @@
import org.apache.sling.distribution.agent.spi.DistributionAgent;
import org.apache.sling.distribution.resources.DistributionResourceTypes;
import org.apache.sling.distribution.util.RequestUtils;
+import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
+import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,7 +40,10 @@
* Servlet to ask {@link DistributionAgent}s to distribute (via HTTP POST).
*/
@SuppressWarnings("serial")
-@SlingServlet(resourceTypes = DistributionResourceTypes.AGENT_RESOURCE_TYPE, methods = "POST")
+@Component(service=Servlet.class)
+@SlingServletResourceTypes(
+ methods = {"POST"},
+ resourceTypes = {DistributionResourceTypes.AGENT_RESOURCE_TYPE})
public class DistributionAgentServlet extends SlingAllMethodsServlet {
private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java
index 88f6834..59ccdd3 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java
@@ -18,6 +18,7 @@
*/
package org.apache.sling.distribution.servlet;
+import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.InputStream;
@@ -25,7 +26,6 @@
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.io.IOUtils;
-import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.http.entity.ContentType;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
@@ -40,6 +40,8 @@
import org.apache.sling.distribution.packaging.impl.DistributionPackageExporter;
import org.apache.sling.distribution.resources.DistributionResourceTypes;
import org.apache.sling.distribution.util.RequestUtils;
+import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
+import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -47,7 +49,10 @@
* Servlet to handle fetching of distribution content.
*/
@SuppressWarnings("serial")
-@SlingServlet(resourceTypes = DistributionResourceTypes.EXPORTER_RESOURCE_TYPE, methods = "POST")
+@Component(service=Servlet.class)
+@SlingServletResourceTypes(
+ methods = {"POST"},
+ resourceTypes = {DistributionResourceTypes.EXPORTER_RESOURCE_TYPE})
public class DistributionPackageExporterServlet extends SlingAllMethodsServlet {
private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageImporterServlet.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageImporterServlet.java
index 85ead70..dad37de 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageImporterServlet.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageImporterServlet.java
@@ -30,9 +30,9 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import javax.servlet.Servlet;
import javax.servlet.ServletException;
-import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ResourceResolver;
@@ -40,6 +40,8 @@
import org.apache.sling.distribution.packaging.impl.DistributionPackageImporter;
import org.apache.sling.distribution.packaging.DistributionPackageInfo;
import org.apache.sling.distribution.resources.DistributionResourceTypes;
+import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
+import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -47,7 +49,10 @@
* Servlet to handle reception of distribution content.
*/
@SuppressWarnings("serial")
-@SlingServlet(resourceTypes = DistributionResourceTypes.IMPORTER_RESOURCE_TYPE, methods = "POST")
+@Component(service=Servlet.class)
+@SlingServletResourceTypes(
+ methods = {"POST"},
+ resourceTypes = {DistributionResourceTypes.IMPORTER_RESOURCE_TYPE})
public class DistributionPackageImporterServlet extends SlingAllMethodsServlet {
private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/distribution/servlet/DistributionTriggerServlet.java b/src/main/java/org/apache/sling/distribution/servlet/DistributionTriggerServlet.java
index 7430dba..38fc007 100644
--- a/src/main/java/org/apache/sling/distribution/servlet/DistributionTriggerServlet.java
+++ b/src/main/java/org/apache/sling/distribution/servlet/DistributionTriggerServlet.java
@@ -18,12 +18,12 @@
*/
package org.apache.sling.distribution.servlet;
+import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
-import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ResourceResolver;
@@ -34,8 +34,10 @@
import org.apache.sling.distribution.resources.DistributionResourceTypes;
import org.apache.sling.distribution.trigger.DistributionRequestHandler;
import org.apache.sling.distribution.trigger.DistributionTrigger;
+import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -43,7 +45,11 @@
* Triggers Server Sent Events servlet
*/
@SuppressWarnings("serial")
-@SlingServlet(resourceTypes = DistributionResourceTypes.TRIGGER_RESOURCE_TYPE, extensions = "event", methods = "GET")
+@Component(service=Servlet.class)
+@SlingServletResourceTypes(
+ methods = {"GET"},
+ resourceTypes = {DistributionResourceTypes.TRIGGER_RESOURCE_TYPE},
+ extensions = {"event"})
public class DistributionTriggerServlet extends SlingAllMethodsServlet {
private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java b/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java
index 3d57e44..663ed2e 100644
--- a/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java
+++ b/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java
@@ -30,9 +30,7 @@
import org.apache.http.client.fluent.Request;
import org.apache.http.client.fluent.Response;
import org.apache.http.conn.HttpHostConnectException;
-import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.entity.ContentType;
-import org.apache.http.entity.InputStreamEntity;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.apache.sling.api.resource.ResourceResolver;
diff --git a/src/main/java/org/apache/sling/distribution/transport/impl/UserCredentialsDistributionTransportSecretProvider.java b/src/main/java/org/apache/sling/distribution/transport/impl/UserCredentialsDistributionTransportSecretProvider.java
index f6b879e..1affcb5 100644
--- a/src/main/java/org/apache/sling/distribution/transport/impl/UserCredentialsDistributionTransportSecretProvider.java
+++ b/src/main/java/org/apache/sling/distribution/transport/impl/UserCredentialsDistributionTransportSecretProvider.java
@@ -27,42 +27,43 @@
import javax.management.ObjectName;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.monitor.impl.UserCredentialsDistributionTransportSecretMBean;
import org.apache.sling.distribution.monitor.impl.UserCredentialsDistributionTransportSecretMBeanImpl;
import org.apache.sling.distribution.transport.DistributionTransportSecret;
import org.apache.sling.distribution.transport.DistributionTransportSecretProvider;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.AttributeType;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
-@Component(metatype = true,
- label = "Apache Sling Distribution Transport Credentials - User Credentials based DistributionTransportSecretProvider",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE)
-@Service(value = DistributionTransportSecretProvider.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Secret provider name: {name}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionTransportSecretProvider.class,
+ property= {
+ "webconsole.configurationFactory.nameHint=Secret provider name: {name}"
+ })
+@Designate(ocd=UserCredentialsDistributionTransportSecretProvider.Config.class, factory = true)
public class UserCredentialsDistributionTransportSecretProvider implements
DistributionTransportSecretProvider {
-
- /**
- * name of this component.
- */
- @Property(label = "Name")
- public static final String NAME = DistributionComponentConstants.PN_NAME;
-
- @Property(label = "User Name", description = "The name of the user used to perform remote actions.")
- private final static String USERNAME = "username";
-
- @Property(passwordValue = "", label = "Password", description = "The clear text password to perform authentication. Warning: storing clear text passwords is not safe.")
- private final static String PASSWORD = "password";
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Transport Credentials - User Credentials based DistributionTransportSecretProvider")
+ public @interface Config {
+ @AttributeDefinition(name="Name")
+ String name();
+
+ @AttributeDefinition(name="User Name", description = "The name of the user used to perform remote actions.")
+ String username();
+
+ @AttributeDefinition(type = AttributeType.PASSWORD, name="Password",
+ description = "The clear text password to perform authentication. Warning: storing clear text passwords is not safe.")
+ String password();
+ }
private String username;
private String password;
@@ -70,9 +71,9 @@
private ServiceRegistration<UserCredentialsDistributionTransportSecretMBean> mbeanServiceRegistration;
@Activate
- protected void activate(BundleContext context, Map<String, Object> config) {
- username = PropertiesUtil.toString(config.get(USERNAME), "").trim();
- password = PropertiesUtil.toString(config.get(PASSWORD), "").trim();
+ protected void activate(BundleContext context, Config conf) {
+ username = conf.username().trim();
+ password = conf.password().trim();
String id = String.valueOf(username.hashCode());
@@ -97,8 +98,8 @@
return new DistributionTransportSecret() {
public Map<String, String> asCredentialsMap() {
Map<String, String> map = new HashMap<String, String>();
- map.put(USERNAME, username);
- map.put(PASSWORD, password);
+ map.put("username", username);
+ map.put("password", password);
return Collections.unmodifiableMap(map);
}
};
diff --git a/src/main/java/org/apache/sling/distribution/trigger/DistributionRequestHandler.java b/src/main/java/org/apache/sling/distribution/trigger/DistributionRequestHandler.java
index a84b579..a1bf41f 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/DistributionRequestHandler.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/DistributionRequestHandler.java
@@ -18,12 +18,12 @@
*/
package org.apache.sling.distribution.trigger;
-import aQute.bnd.annotation.ConsumerType;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.distribution.DistributionRequest;
import org.apache.sling.distribution.component.impl.DistributionComponentKind;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ConsumerType;
/**
* An handler for {@link org.apache.sling.distribution.DistributionRequest}s passed to a
diff --git a/src/main/java/org/apache/sling/distribution/trigger/DistributionTrigger.java b/src/main/java/org/apache/sling/distribution/trigger/DistributionTrigger.java
index fa4a7ed..ae8ee4a 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/DistributionTrigger.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/DistributionTrigger.java
@@ -18,9 +18,9 @@
*/
package org.apache.sling.distribution.trigger;
-import aQute.bnd.annotation.ConsumerType;
import org.apache.sling.distribution.common.DistributionException;
import org.jetbrains.annotations.NotNull;
+import org.osgi.annotation.versioning.ConsumerType;
/**
* A {@link DistributionTrigger} is responsible to trigger
diff --git a/src/main/java/org/apache/sling/distribution/trigger/impl/DistributionEventDistributeDistributionTriggerFactory.java b/src/main/java/org/apache/sling/distribution/trigger/impl/DistributionEventDistributeDistributionTriggerFactory.java
index b90b715..11d2f0d 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/impl/DistributionEventDistributeDistributionTriggerFactory.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/impl/DistributionEventDistributeDistributionTriggerFactory.java
@@ -18,48 +18,42 @@
*/
package org.apache.sling.distribution.trigger.impl;
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.trigger.DistributionRequestHandler;
import org.apache.sling.distribution.trigger.DistributionTrigger;
import org.jetbrains.annotations.NotNull;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
-@Component(metatype = true,
- label = "Apache Sling Distribution Trigger - Distribution Event Triggers Factory",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE
-)
-@Service(DistributionTrigger.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Trigger name: {name}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionTrigger.class,
+ property= {
+ "webconsole.configurationFactory.nameHint=Trigger name: {name}"
+ })
+@Designate(ocd=DistributionEventDistributeDistributionTriggerFactory.Config.class, factory = true)
public class DistributionEventDistributeDistributionTriggerFactory implements DistributionTrigger {
-
- @Property(label = "Name", description = "The name of the trigger.")
- public static final String NAME = DistributionComponentConstants.PN_NAME;
-
- /**
- * chain distribution path property
- */
- @Property(label = "Path", description = "The path for which the distribution events will be forwarded.")
- private static final String PATH = "path";
-
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Trigger - Distribution Event Triggers Factory")
+ public @interface Config {
+ @AttributeDefinition(name="Name",description = "The name of the trigger.")
+ String name();
+ @AttributeDefinition(name="Path", description = "The path for which the distribution events will be forwarded.")
+ String path();
+ }
private DistributionEventDistributeDistributionTrigger trigger;
@Activate
- public void activate(BundleContext bundleContext, Map<String, Object> config) {
- String path = PropertiesUtil.toString(config.get(PATH), null);
-
+ public void activate(BundleContext bundleContext, Config conf) {
+ String path = conf.path();
trigger = new DistributionEventDistributeDistributionTrigger(path, bundleContext);
}
diff --git a/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java b/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java
index fa0914d..6213d45 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java
@@ -18,65 +18,49 @@
*/
package org.apache.sling.distribution.trigger.impl;
-import java.util.Map;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.commons.scheduler.Scheduler;
import org.apache.sling.distribution.common.DistributionException;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.component.impl.SettingsUtils;
import org.apache.sling.distribution.trigger.DistributionRequestHandler;
import org.apache.sling.distribution.trigger.DistributionTrigger;
import org.apache.sling.jcr.api.SlingRepository;
import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
-@Component(metatype = true,
- label = "Apache Sling Distribution Trigger - Jcr Event Triggers Factory",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE,
- description = "Triggers a distribution request ('ADD', 'DELETE') " +
- "for the given path (path) whenever the JCR node at the given path is modified (added, resp. removed)."
-)
-@Service(DistributionTrigger.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Trigger name: {name} on path {path}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionTrigger.class,
+ property= {
+ "webconsole.configurationFactory.nameHint=Trigger name: {name} on path {path}"
+ })
+@Designate(ocd=JcrEventDistributionTriggerFactory.Config.class, factory = true)
public class JcrEventDistributionTriggerFactory implements DistributionTrigger {
-
- @Property(label = "Name", description = "The name of the trigger.")
- public static final String NAME = DistributionComponentConstants.PN_NAME;
-
- /**
- * jcr event trigger path property
- */
- @Property(label = "Path", description = "The path for which changes are distributed.")
- private static final String PATH = "path";
-
- /**
- * jcr event trigger path property
- */
- @Property(cardinality = 100, label = "Ignored Paths Patterns", description = "The paths matching one of these patterns will be ignored.")
- private static final String IGNORED_PATHS_PATTERNS = "ignoredPathsPatterns";
-
- /**
- * jcr event trigger service user property
- */
- @Property(label = "Service Name", description = "The service used to listen for jcr events")
- private static final String SERVICE_NAME = "serviceName";
-
- /**
- * use deep distribution
- */
- @Property(label = "Use deep distribution", description = "Distribute entire subtree of the event node path. Default is 'false'.", boolValue = false)
- private static final String DEEP = "deep";
+ @ObjectClassDefinition(name="Apache Sling Distribution Trigger - Jcr Event Triggers Factory",
+ description = "Triggers a distribution request ('ADD', 'DELETE') " +
+ "for the given path (path) whenever the JCR node at the given path is modified (added, resp. removed).")
+ public @interface Config {
+ @AttributeDefinition(name="Name", description = "The name of the trigger.")
+ String name();
+ @AttributeDefinition(name="Name", description = "The path for which changes are distributed.")
+ String path();
+ @AttributeDefinition(cardinality = 100,
+ name = "Ignored Paths Patterns",
+ description = "The paths matching one of these patterns will be ignored.")
+ String[] ignoredPathsPatterns();
+ @AttributeDefinition(name="Service Name", description = "The service used to listen for jcr events")
+ String serviceName();
+ @AttributeDefinition(name="Use deep distribution", description = "Distribute entire subtree of the event node path. Default is 'false'.")
+ boolean deep() default false;
+ }
private JcrEventDistributionTrigger trigger;
@@ -92,12 +76,12 @@
@Activate
- public void activate(Map<String, Object> config) {
- String path = PropertiesUtil.toString(config.get(PATH), null);
- String serviceName = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(SERVICE_NAME), null));
- String[] ignoredPathsPatterns = PropertiesUtil.toStringArray(config.get(IGNORED_PATHS_PATTERNS), null);
+ public void activate(Config conf) {
+ String path = conf.path();
+ String serviceName = SettingsUtils.removeEmptyEntry(conf.serviceName());
+ String[] ignoredPathsPatterns = conf.ignoredPathsPatterns();
ignoredPathsPatterns = SettingsUtils.removeEmptyEntries(ignoredPathsPatterns);
- boolean deep = PropertiesUtil.toBoolean(config.get(DEEP), false);
+ boolean deep = conf.deep();
trigger = new JcrEventDistributionTrigger(repository, scheduler, resolverFactory, path, deep, serviceName, ignoredPathsPatterns);
trigger.enable();
diff --git a/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTriggerFactory.java b/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTriggerFactory.java
index 5d71e5b..18b746e 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTriggerFactory.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/impl/PersistedJcrEventDistributionTriggerFactory.java
@@ -18,18 +18,9 @@
*/
package org.apache.sling.distribution.trigger.impl;
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
+
import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.commons.scheduler.Scheduler;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.component.impl.SettingsUtils;
import org.apache.sling.distribution.trigger.DistributionRequestHandler;
@@ -37,39 +28,35 @@
import org.apache.sling.jcr.api.SlingRepository;
import org.jetbrains.annotations.NotNull;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
-@Component(metatype = true,
- label = "Apache Sling Distribution Trigger - Persisted Jcr Event Triggers Factory",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE
-)
-@Service(DistributionTrigger.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Trigger name: {name}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionTrigger.class,
+ property= {
+ "webconsole.configurationFactory.nameHint=Trigger name: {name}"
+ })
+@Designate(ocd=PersistedJcrEventDistributionTriggerFactory.Config.class, factory = true)
public class PersistedJcrEventDistributionTriggerFactory implements DistributionTrigger {
-
- @Property(label = "Name", description = "The name of the trigger.")
- public static final String NAME = DistributionComponentConstants.PN_NAME;
-
-
- /**
- * jcr persisting event trigger path property
- */
- @Property(label = "Path", description = "The path for which changes are listened and distributed as persisted nugget events.")
- private static final String PATH = "path";
-
- /**
- * jcr persisting event trigger service user property
- */
- @Property(label = "Service Name", description = "The service used to listen for jcr events")
- private static final String SERVICE_NAME = "serviceName";
-
- /**
- * jcr persisting event trigger nuggets path property
- */
- @Property(value = PersistedJcrEventDistributionTrigger.DEFAULT_NUGGETS_PATH, label = "Nuggets Path", description = "The location where serialization of jcr events will be stored")
- private static final String NUGGETS_PATH = "nuggetsPath";
+ @ObjectClassDefinition(name = "Apache Sling Distribution Trigger - Persisted Jcr Event Triggers Factory")
+ public @interface Config {
+ @AttributeDefinition(name="Name", description = "The name of the trigger.")
+ String name();
+ @AttributeDefinition(name="Name", description = "The path for which changes are listened and distributed as persisted nugget events.")
+ String path();
+ @AttributeDefinition(name="Service Name", description = "The service used to listen for jcr events")
+ String serviceName();
+ @AttributeDefinition(name="Nuggets Path", description = "The location where serialization of jcr events will be stored")
+ String nuggetsPath() default PersistedJcrEventDistributionTrigger.DEFAULT_NUGGETS_PATH;
+ }
private PersistedJcrEventDistributionTrigger trigger;
@@ -85,11 +72,11 @@
@Activate
- public void activate(BundleContext bundleContext, Map<String, Object> config) {
+ public void activate(BundleContext bundleContext, Config conf) {
- String path = PropertiesUtil.toString(config.get(PATH), null);
- String serviceName = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(SERVICE_NAME), null));
- String nuggetsPath = PropertiesUtil.toString(config.get(NUGGETS_PATH), null);
+ String path = conf.path();
+ String serviceName = SettingsUtils.removeEmptyEntry(conf.serviceName());
+ String nuggetsPath = conf.nuggetsPath();
trigger = new PersistedJcrEventDistributionTrigger(repository, scheduler, resolverFactory, path, serviceName, nuggetsPath);
trigger.enable();
diff --git a/src/main/java/org/apache/sling/distribution/trigger/impl/RemoteEventDistributionTriggerFactory.java b/src/main/java/org/apache/sling/distribution/trigger/impl/RemoteEventDistributionTriggerFactory.java
index 05d591a..41a1fd3 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/impl/RemoteEventDistributionTriggerFactory.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/impl/RemoteEventDistributionTriggerFactory.java
@@ -18,46 +18,42 @@
*/
package org.apache.sling.distribution.trigger.impl;
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.commons.scheduler.Scheduler;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.transport.DistributionTransportSecretProvider;
import org.apache.sling.distribution.trigger.DistributionRequestHandler;
import org.apache.sling.distribution.trigger.DistributionTrigger;
import org.jetbrains.annotations.NotNull;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
-@Component(metatype = true,
- label = "Apache Sling Distribution Trigger - Remote Event Triggers Factory",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionTrigger.class,
+ property= {
+ "webconsole.configurationFactory.nameHint=Trigger name: {name}"
+ }
)
-@Service(DistributionTrigger.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Trigger name: {name}")
+@Designate(ocd=RemoteEventDistributionTriggerFactory.Config.class)
public class RemoteEventDistributionTriggerFactory implements DistributionTrigger {
+
+ @ObjectClassDefinition(name="Apache Sling Distribution Trigger - Remote Event Triggers Factory")
+ public @interface Config {
+ @AttributeDefinition(name="Name", description = "The name of the trigger.")
+ String name();
+ @AttributeDefinition(name="Endpoint", description = "The endpoint from which the remote requests should be polled.")
+ String endpoint();
+ @AttributeDefinition()
+ String transportSecretProvider_target();
+ }
-
- @Property(label = "Name", description = "The name of the trigger.")
- public static final String NAME = DistributionComponentConstants.PN_NAME;
-
- /**
- * remote event endpoint property
- */
- @Property(label = "Endpoint", description = "The endpoint from which the remote requests should be polled.")
- private static final String ENDPOINT = "endpoint";
-
-
- @Property(name = "transportSecretProvider.target")
@Reference(name = "transportSecretProvider")
private
DistributionTransportSecretProvider transportSecretProvider;
@@ -70,8 +66,8 @@
@Activate
- public void activate(BundleContext bundleContext, Map<String, Object> config) {
- String endpoint = PropertiesUtil.toString(config.get(ENDPOINT), null);
+ public void activate(BundleContext bundleContext, Config conf) {
+ String endpoint = conf.endpoint();
trigger = new RemoteEventDistributionTrigger(endpoint, transportSecretProvider, scheduler);
}
diff --git a/src/main/java/org/apache/sling/distribution/trigger/impl/ResourceEventDistributionTriggerFactory.java b/src/main/java/org/apache/sling/distribution/trigger/impl/ResourceEventDistributionTriggerFactory.java
index 7a4c951..4bb3be6 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/impl/ResourceEventDistributionTriggerFactory.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/impl/ResourceEventDistributionTriggerFactory.java
@@ -18,44 +18,40 @@
*/
package org.apache.sling.distribution.trigger.impl;
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.commons.osgi.PropertiesUtil;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.trigger.DistributionRequestHandler;
import org.apache.sling.distribution.trigger.DistributionTrigger;
import org.apache.sling.jcr.api.SlingRepository;
import org.jetbrains.annotations.NotNull;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
-@Component(metatype = true,
- label = "Apache Sling Distribution Trigger - Resource Event Triggers Factory",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE,
- description = "Triggers a distribution request ('ADD', 'DELETE') " +
- "for the given path (path) whenever the resource at the given path is modified (added, resp. removed)."
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionTrigger.class,
+ property= {
+ "webconsole.configurationFactory.nameHint=Trigger name: {name}"
+ }
)
-@Service(DistributionTrigger.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Trigger name: {name}")
+@Designate(ocd=ResourceEventDistributionTriggerFactory.Config.class, factory=true)
public class ResourceEventDistributionTriggerFactory implements DistributionTrigger {
-
- @Property(label = "Name", description = "The name of the trigger.")
- public static final String NAME = DistributionComponentConstants.PN_NAME;
-
- /**
- * resource event path property
- */
- @Property(label = "Path", description = "The resource path for which changes are distributed")
- private static final String PATH = "path";
+ @ObjectClassDefinition(name="Apache Sling Distribution Trigger - Resource Event Triggers Factory",
+ description = "Triggers a distribution request ('ADD', 'DELETE') " +
+ "for the given path (path) whenever the resource at the given path is modified (added, resp. removed).")
+ public @interface Config {
+ @AttributeDefinition(name="Name", description = "The name of the trigger.")
+ String name();
+ @AttributeDefinition(name="Name", description = "The resource path for which changes are distributed")
+ String path();
+ }
private ResourceEventDistributionTrigger trigger;
@@ -63,8 +59,8 @@
private SlingRepository repository;
@Activate
- public void activate(BundleContext bundleContext, Map<String, Object> config) {
- String path = PropertiesUtil.toString(config.get(PATH), null);
+ public void activate(BundleContext bundleContext, Config conf) {
+ String path = conf.path();
trigger = new ResourceEventDistributionTrigger(path, bundleContext);
}
diff --git a/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerFactory.java b/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerFactory.java
index a0109d3..b6f5d97 100644
--- a/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerFactory.java
+++ b/src/main/java/org/apache/sling/distribution/trigger/impl/ScheduledDistributionTriggerFactory.java
@@ -18,62 +18,52 @@
*/
package org.apache.sling.distribution.trigger.impl;
-import java.util.Map;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.commons.scheduler.Scheduler;
import org.apache.sling.distribution.DistributionRequestType;
-import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
import org.apache.sling.distribution.common.DistributionException;
import org.apache.sling.distribution.component.impl.SettingsUtils;
import org.apache.sling.distribution.trigger.DistributionRequestHandler;
import org.apache.sling.distribution.trigger.DistributionTrigger;
import org.jetbrains.annotations.NotNull;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
-@Component(metatype = true,
- label = "Apache Sling Distribution Trigger - Scheduled Triggers Factory",
- configurationFactory = true,
- specVersion = "1.1",
- policy = ConfigurationPolicy.REQUIRE,
- description = "Triggers a distribution request of the given type (action) " +
- "for the given path (path) at a periodical time interval (seconds)."
-)
-@Service(DistributionTrigger.class)
-@Property(name="webconsole.configurationFactory.nameHint", value="Trigger name: {name}")
+@Component(
+ configurationPolicy = ConfigurationPolicy.REQUIRE,
+ service=DistributionTrigger.class,
+ property= {
+ "webconsole.configurationFactory.nameHint=Trigger name: {name}"
+ })
+@Designate(ocd=ScheduledDistributionTriggerFactory.Config.class,factory=true)
public class ScheduledDistributionTriggerFactory implements DistributionTrigger {
-
- @Property(label = "Name", description = "The name of the trigger.")
- public static final String NAME = DistributionComponentConstants.PN_NAME;
-
- /**
- * scheduled trigger action property
- */
- @Property(label = "Distribution Type", description = "The type of the distribution request produced by this trigger in ('ADD', 'DELETE', 'PULL', 'TEST'). Default 'PULL'.")
- private static final String ACTION = "action";
-
- /**
- * scheduled trigger path property
- */
- @Property(label = "Distributed Path", description = "The path to be distributed periodically.")
- private static final String PATH = "path";
-
- /**
- * scheduled trigger seconds property
- */
- @Property(label = "Interval in Seconds", description = "The number of seconds between distribution requests. Default 30 seconds.")
- private static final String SECONDS = "seconds";
-
- @Property(label = "Service Name", description = "The name of the service used to trigger the distribution requests.")
- private static final String SERVICE_NAME = "serviceName";
+ @ObjectClassDefinition(name="Apache Sling Distribution Trigger - Scheduled Triggers Factory",
+ description = "Triggers a distribution request of the given type (action) " +
+ "for the given path (path) at a periodical time interval (seconds).")
+ public @interface Config {
+ @AttributeDefinition(name="Name", description = "The name of the trigger.")
+ String name();
+ @AttributeDefinition(name="Distribution Type", description = "The type of the distribution request produced by "
+ + "this trigger in ('ADD', 'DELETE', 'PULL', 'TEST'). Default 'PULL'.")
+ String action();
+ @AttributeDefinition(name="Name", description = "The path to be distributed periodically.")
+ String path();
+
+ @AttributeDefinition(name="Interval in Seconds",
+ description = "The number of seconds between distribution requests. Default 30 seconds.")
+ int seconds() default 30;
+
+ @AttributeDefinition(name="Service Name", description = "The name of the service used to trigger the distribution requests.")
+ String serviceName();
+ }
private ScheduledDistributionTrigger trigger;
@@ -85,11 +75,16 @@
@Activate
- public void activate(BundleContext bundleContext, Map<String, Object> config) {
- String action = PropertiesUtil.toString(config.get(ACTION), DistributionRequestType.PULL.name());
- String path = PropertiesUtil.toString(config.get(PATH), null);
- int interval = PropertiesUtil.toInteger(config.get(SECONDS), 30);
- String serviceName = SettingsUtils.removeEmptyEntry(PropertiesUtil.toString(config.get(SERVICE_NAME), null));
+ public void activate(BundleContext bundleContext, Config conf) {
+ // Unfortunately we cannot make DistributionRequestType.PULL.name() a default value in the above annotation.
+ // see https://stackoverflow.com/questions/13253624/how-to-supply-enum-value-to-an-annotation-from-a-constant-in-java
+ String action = conf.action();
+ if (action == null || action.isEmpty()) {
+ action = DistributionRequestType.PULL.name();
+ }
+ String path = conf.path();
+ int interval = conf.seconds();
+ String serviceName = SettingsUtils.removeEmptyEntry(conf.serviceName());
trigger = new ScheduledDistributionTrigger(action, path, interval, serviceName, scheduler, resolverFactory);
}
diff --git a/src/main/java/org/apache/sling/distribution/util/package-info.java b/src/main/java/org/apache/sling/distribution/util/package-info.java
index 01f959e..aa1d89a 100644
--- a/src/main/java/org/apache/sling/distribution/util/package-info.java
+++ b/src/main/java/org/apache/sling/distribution/util/package-info.java
@@ -19,5 +19,5 @@
@Version("0.1.1") package org.apache.sling.distribution.util;
-import aQute.bnd.annotation.Version;
+import org.osgi.annotation.versioning.Version;
diff --git a/src/test/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMapTest.java b/src/test/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMapTest.java
index 3cbb9f3..a592a28 100644
--- a/src/test/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMapTest.java
+++ b/src/test/java/org/apache/sling/distribution/component/impl/DistributionComponentFactoryMapTest.java
@@ -20,17 +20,22 @@
import java.util.Collections;
+import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
+import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
public class DistributionComponentFactoryMapTest {
+
+ @Rule
+ public final OsgiContext context = new OsgiContext();
@Test
public void testGetDefaultType() throws Exception {
DistributionComponentFactoryMap dcfm = new DistributionComponentFactoryMap();
- dcfm.activate(Collections.<String,Object>emptyMap());
+ context.registerInjectActivateService(dcfm);
String type = dcfm.getType(DistributionComponentKind.AGENT,
"org.apache.sling.distribution.agent.impl.SimpleDistributionAgentFactory");
assertEquals("simple", type);
@@ -39,7 +44,7 @@
@Test
public void testGetDefaultFactoryPid() throws Exception {
DistributionComponentFactoryMap dcfm = new DistributionComponentFactoryMap();
- dcfm.activate(Collections.<String,Object>emptyMap());
+ context.registerInjectActivateService(dcfm);
String factoryPid = dcfm.getFactoryPid(DistributionComponentKind.AGENT, "simple");
assertEquals("org.apache.sling.distribution.agent.impl.SimpleDistributionAgentFactory",
factoryPid);
@@ -48,7 +53,7 @@
@Test
public void testGetDefaultFactoryPids() throws Exception {
DistributionComponentFactoryMap dcfm = new DistributionComponentFactoryMap();
- dcfm.activate(Collections.<String,Object>emptyMap());
+ context.registerInjectActivateService(dcfm);
assertEquals(5, dcfm.getFactoryPids(DistributionComponentKind.AGENT).size());
}
@@ -56,7 +61,7 @@
public void testAddMapping() throws Exception {
DistributionComponentFactoryMap dcfm = new DistributionComponentFactoryMap();
String customFactoryPid = "org.test.CustomAgentFactory";
- dcfm.activate(Collections.<String, Object>singletonMap("mapping.agent", String.format("custom:%s", customFactoryPid)));
+ context.registerInjectActivateService(dcfm,Collections.<String, Object>singletonMap("mapping.agent", String.format("custom:%s", customFactoryPid)));
assertEquals(6, dcfm.getFactoryPids(DistributionComponentKind.AGENT).size());
String type = dcfm.getType(DistributionComponentKind.AGENT, customFactoryPid);
assertEquals("custom", type);
@@ -66,7 +71,7 @@
public void testAddWrongMapping() throws Exception {
DistributionComponentFactoryMap dcfm = new DistributionComponentFactoryMap();
String customFactoryPid = "org.test.CustomAgentFactory";
- dcfm.activate(Collections.<String, Object>singletonMap("mapping.agent", String.format("custom-%s", customFactoryPid)));
+ context.registerInjectActivateService(dcfm,Collections.<String, Object>singletonMap("mapping.agent", String.format("custom-%s", customFactoryPid)));
assertEquals(5, dcfm.getFactoryPids(DistributionComponentKind.AGENT).size());
String type = dcfm.getType(DistributionComponentKind.AGENT, customFactoryPid);
assertNull(type);
diff --git a/src/test/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheckTest.java b/src/test/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheckTest.java
index 6b39611..08d01f8 100644
--- a/src/test/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheckTest.java
+++ b/src/test/java/org/apache/sling/distribution/monitor/DistributionQueueHealthCheckTest.java
@@ -27,10 +27,12 @@
import org.apache.sling.distribution.agent.spi.DistributionAgent;
import org.apache.sling.distribution.queue.DistributionQueueItemState;
import org.apache.sling.distribution.queue.spi.DistributionQueue;
+import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
import org.apache.sling.distribution.queue.DistributionQueueEntry;
import org.apache.sling.distribution.queue.DistributionQueueItem;
import org.apache.sling.distribution.queue.DistributionQueueItemStatus;
import org.apache.felix.hc.api.Result;
+import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.assertFalse;
@@ -45,11 +47,14 @@
* Testcase for {@link DistributionQueueHealthCheck}
*/
public class DistributionQueueHealthCheckTest {
+
+ @Rule
+ public final OsgiContext context = new OsgiContext();
@Test
public void testWithNoDistributionQueueProvider() throws Exception {
DistributionQueueHealthCheck distributionQueueHealthCheck = new DistributionQueueHealthCheck();
- distributionQueueHealthCheck.activate(Collections.<String, Object>emptyMap());
+ context.registerInjectActivateService(distributionQueueHealthCheck);
Result result = distributionQueueHealthCheck.execute();
assertNotNull(result);
assertTrue(result.isOk());
@@ -59,7 +64,7 @@
public void testWithNoItemInTheQueue() throws Exception {
DistributionQueueHealthCheck distributionQueueHealthCheck = new DistributionQueueHealthCheck();
- distributionQueueHealthCheck.activate(Collections.<String, Object>emptyMap());
+ context.registerInjectActivateService(distributionQueueHealthCheck);
DistributionQueue queue = mock(DistributionQueue.class);
when(queue.getHead()).thenReturn(null);
DistributionAgent distributionAgent = mock(DistributionAgent.class);
@@ -79,7 +84,7 @@
public void testWithOneOkItemInTheQueue() throws Exception {
DistributionQueueHealthCheck distributionQueueHealthCheck = new DistributionQueueHealthCheck();
- distributionQueueHealthCheck.activate(Collections.<String, Object>emptyMap());
+ context.registerInjectActivateService(distributionQueueHealthCheck);
DistributionQueue queue = mock(DistributionQueue.class);
DistributionQueueItem item = new DistributionQueueItem("packageId", new HashMap<String, Object>());
DistributionQueueItemStatus status = new DistributionQueueItemStatus(Calendar.getInstance(), DistributionQueueItemState.QUEUED, 1, "queueName");
@@ -103,7 +108,7 @@
public void testWithNotOkItemInTheQueue() throws Exception {
DistributionQueueHealthCheck distributionQueueHealthCheck = new DistributionQueueHealthCheck();
- distributionQueueHealthCheck.activate(Collections.<String, Object>emptyMap());
+ context.registerInjectActivateService(distributionQueueHealthCheck);
DistributionQueue queue = mock(DistributionQueue.class);
DistributionQueueItem item = new DistributionQueueItem("packageId", new HashMap<String, Object>());
DistributionQueueItemStatus status = new DistributionQueueItemStatus(Calendar.getInstance(), DistributionQueueItemState.QUEUED, 10, "queueName");
diff --git a/src/test/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapperTest.java b/src/test/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapperTest.java
index 09dd7e8..a58877e 100644
--- a/src/test/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapperTest.java
+++ b/src/test/java/org/apache/sling/distribution/queue/impl/simple/QueueItemMapperTest.java
@@ -18,14 +18,15 @@
*/
package org.apache.sling.distribution.queue.impl.simple;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
import java.util.HashMap;
import java.util.Map;
import org.apache.sling.distribution.queue.DistributionQueueItem;
import org.junit.Test;
-import static org.junit.Assert.*;
-
public class QueueItemMapperTest {
@Test
@@ -36,11 +37,18 @@
properties.put("null", null);
properties.put("long", 200L);
properties.put("double", 300.3d);
+ properties.put("array", new String[] {"one","two"});
DistributionQueueItem expected = new DistributionQueueItem("packageId", properties);
DistributionQueueItem actual = mapper.readQueueItem(mapper.writeQueueItem(expected));
assertEquals(expected.getPackageId(), actual.getPackageId());
for (Map.Entry<String, Object> entry : actual.entrySet()) {
- assertEquals(expected.get(entry.getKey()), entry.getValue());
+ if (entry.getValue() != null && entry.getValue().getClass().isArray()) {
+ Object[] e = (Object[]) expected.get(entry.getKey());
+ Object[] a = (Object[]) entry.getValue();
+ assertArrayEquals(e, a);
+ } else {
+ assertEquals(expected.get(entry.getKey()), entry.getValue());
+ }
}
}
}
\ No newline at end of file