You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ap...@apache.org on 2022/07/22 06:57:05 UTC
[sling-org-apache-sling-discovery-oak] 01/01: Revert "SLING-11355: sling discovery bundles: update to sling 48"
This is an automated email from the ASF dual-hosted git repository.
apelluru pushed a commit to branch revert-5-master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-discovery-oak.git
commit d4e82a31de3f835a12abb66d0b580e4703af3298
Author: Ashok Pelluru <37...@users.noreply.github.com>
AuthorDate: Fri Jul 22 08:56:59 2022 +0200
Revert "SLING-11355: sling discovery bundles: update to sling 48"
---
bnd.bnd | 13 -
pom.xml | 113 +++--
.../org/apache/sling/discovery/oak/Config.java | 464 +++++++++++++--------
.../oak/DiscoveryServiceCentralConfig.java | 175 --------
.../sling/discovery/oak/OakDiscoveryService.java | 216 +++++-----
.../oak/SynchronizedClocksHealthCheck.java | 20 +-
.../discovery/oak/TopologyWebConsolePlugin.java | 30 +-
.../oak/cluster/OakClusterViewService.java | 16 +-
.../sling/discovery/oak/pinger/OakViewChecker.java | 21 +-
.../discovery/oak/OakDiscoveryServiceTest.java | 1 -
10 files changed, 528 insertions(+), 541 deletions(-)
diff --git a/bnd.bnd b/bnd.bnd
deleted file mode 100644
index c652385..0000000
--- a/bnd.bnd
+++ /dev/null
@@ -1,13 +0,0 @@
-Import-Package:\
- org.apache.felix.webconsole;resolution:=optional,\
- org.apache.felix.hc.api;resolution:=optional,\
- *
-
-Export-Package:\
- !org.apache.sling.discovery.oak
-
-Provide-Capability:\
- osgi.service;objectClass:List<String>="org.apache.sling.discovery.oak.Config,org.apache.sling.discovery.base.connectors.BaseConfig,org.apache.sling.discovery.commons.providers.spi.base.DiscoveryLiteConfig"
-
--includeresource:\
- @commons-net-*.jar!/org/apache/commons/net/util/SubnetUtils*
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 4602203..dec13d1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,31 +22,32 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.sling</groupId>
- <artifactId>sling-bundle-parent</artifactId>
- <version>48</version>
+ <artifactId>sling</artifactId>
+ <version>29</version>
<relativePath />
</parent>
<artifactId>org.apache.sling.discovery.oak</artifactId>
+ <packaging>bundle</packaging>
<version>1.2.39-SNAPSHOT</version>
<name>Apache Sling Oak-Based Discovery Service</name>
<description>Implementation of Apache Sling Discovery based on Jackrabbit Oak using its discovery-lite descriptor for in-cluster view detection and a TopologyView through HTTP POST heartbeats announcing sub-topologies to each other.</description>
<properties>
- <sling.java.version>8</sling.java.version>
- <jackrabbit.version>2.14.3</jackrabbit.version>
- <oak.version>1.4.4</oak.version>
- <!-- by default Slow tests are excluded - use -PincludeSlowTests to include them -->
- <sling.excluded.surefire.groups>org.apache.sling.commons.testing.junit.categories.Slow</sling.excluded.surefire.groups>
+ <jackrabbit.version>2.12.2</jackrabbit.version>
+ <oak.version>1.4.4</oak.version>
+ <!-- by default Slow tests are excluded - use -PincludeSlowTests to include them -->
+ <sling.excluded.surefire.groups>org.apache.sling.commons.testing.junit.categories.Slow</sling.excluded.surefire.groups>
+ <sling.java.version>8</sling.java.version>
</properties>
<scm>
<connection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-discovery-oak.git</connection>
<developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-discovery-oak.git</developerConnection>
<url>https://gitbox.apache.org/repos/asf?p=sling-org-apache-sling-discovery-oak.git</url>
- <tag>HEAD</tag>
- </scm>
+ <tag>HEAD</tag>
+ </scm>
<build>
<plugins>
@@ -83,6 +84,35 @@
<excludedGroups>${sling.excluded.surefire.groups}</excludedGroups>
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-scr-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Import-Package>
+ <!-- WebConsole support is optional -->
+ org.apache.felix.webconsole;resolution:=optional,
+ org.apache.felix.hc.api;resolution:=optional,
+ *
+ </Import-Package>
+ <Embed-Dependency>
+ commons-net;inline=org/apache/commons/net/util/SubnetUtils*
+ </Embed-Dependency>
+ <Export-Package>
+ !org.apache.sling.discovery.oak
+ </Export-Package>
+ <!-- remove when upgrading to bnd Maven plugin -->
+ <Provide-Capability><![CDATA[
+ osgi.service;objectClass:List<String>="org.apache.sling.discovery.oak.Config,org.apache.sling.discovery.base.connectors.BaseConfig,org.apache.sling.discovery.commons.providers.spi.base.DiscoveryLiteConfig"
+ ]]></Provide-Capability>
+ </instructions>
+ </configuration>
+ </plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
@@ -153,30 +183,28 @@
</profiles>
<dependencies>
<dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <scope>provided</scope>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.scr.annotations</artifactId>
</dependency>
<dependency>
- <groupId>org.osgi</groupId>
- <artifactId>osgi.core</artifactId>
- <scope>provided</scope>
+ <groupId>biz.aQute</groupId>
+ <artifactId>bndlib</artifactId>
+ <version>1.50.0</version>
</dependency>
<dependency>
- <groupId>org.osgi</groupId>
- <artifactId>org.osgi.service.metatype.annotations</artifactId>
- <scope>provided</scope>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
- <artifactId>org.osgi.service.component.annotations</artifactId>
- <scope>provided</scope>
+ <artifactId>org.osgi.core</artifactId>
+ <version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
- <artifactId>org.osgi.service.http</artifactId>
- <version>1.2.1</version>
- <scope>provided</scope>
+ <artifactId>org.osgi.compendium</artifactId>
+ <version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
@@ -187,6 +215,7 @@
<dependency>
<groupId>javax.jcr</groupId>
<artifactId>jcr</artifactId>
+ <version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -198,7 +227,7 @@
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.commons.osgi</artifactId>
- <version>2.4.2</version>
+ <version>2.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -263,10 +292,16 @@
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-servlet</artifactId>
+ <version>8.1.2.v20120308</version>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <scope>provided</scope>
+ <artifactId>servlet-api</artifactId>
+ <version>2.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
@@ -286,18 +321,10 @@
<version>3.3</version>
<scope>provided</scope>
</dependency>
-
<!-- Testing -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-servlet</artifactId>
- <version>8.1.2.v20120308</version>
- <scope>test</scope>
</dependency>
<dependency>
<groupId>junit-addons</groupId>
@@ -305,10 +332,14 @@
<version>1.4</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.jmock</groupId>
+ <artifactId>jmock-junit4</artifactId>
+ </dependency>
<dependency>
<groupId>org.mockito</groupId>
- <artifactId>mockito-core</artifactId>
- <version>4.4.0</version>
+ <artifactId>mockito-all</artifactId>
+ <version>1.9.5</version>
<scope>test</scope>
</dependency>
<dependency>
@@ -363,8 +394,8 @@
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
- <artifactId>org.apache.sling.testing.sling-mock.junit4</artifactId>
- <version>3.2.2</version>
+ <artifactId>org.apache.sling.testing.sling-mock</artifactId>
+ <version>1.2.0</version>
<scope>test</scope>
</dependency>
<dependency>
@@ -373,12 +404,6 @@
<version>${jackrabbit.version}</version>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>org.apache.jackrabbit</groupId>
- <artifactId>jackrabbit-spi-commons</artifactId>
- <version>${jackrabbit.version}</version>
- <scope>provided</scope>
- </dependency>
<dependency>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>oak-core</artifactId>
diff --git a/src/main/java/org/apache/sling/discovery/oak/Config.java b/src/main/java/org/apache/sling/discovery/oak/Config.java
index fb1f0dd..90ba296 100644
--- a/src/main/java/org/apache/sling/discovery/oak/Config.java
+++ b/src/main/java/org/apache/sling/discovery/oak/Config.java
@@ -22,68 +22,192 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedList;
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.Service;
import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.discovery.base.connectors.BaseConfig;
import org.apache.sling.discovery.commons.providers.spi.base.DiscoveryLiteConfig;
-import org.osgi.framework.BundleContext;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.metatype.annotations.Designate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_BACKOFF_STABLE_FACTOR;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_BACKOFF_STANDBY_FACTOR;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_CLUSTER_SYNC_SERVICE_INTERVAL;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_CLUSTER_SYNC_SERVICE_TIMEOUT;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_DISCOVERY_LITE_CHECK_INTERVAL;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_DISCOVERY_RESOURCE_PATH;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_INVERT_LEADER_ELECTION_PREFIX_ORDER;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_JOINER_DELAY_SECONDS;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_LEADER_ELECTION_PREFIX;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_MIN_EVENT_DELAY;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_SOCKET_CONNECT_TIMEOUT;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_SO_TIMEOUT;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_SUPPRESSION_TIMEOUT_SECONDS;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_SUPPRESS_PARTIALLY_STARTED_INSTANCES;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_TOPOLOGY_CONNECTOR_INTERVAL;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_TOPOLOGY_CONNECTOR_TIMEOUT;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_TOPOLOGY_CONNECTOR_WHITELIST;
-import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.JOINER_DELAY_ENABLED_SYSTEM_PROPERTY_NAME;
-
/**
* Configuration object used as a central config point for the discovery service
* implementation
* <p>
* The properties are described below under.
*/
-@Component(service = {Config.class, BaseConfig.class, DiscoveryLiteConfig.class})
-@Designate(ocd = DiscoveryServiceCentralConfig.class)
+@Component(metatype = true, label="%config.name", description="%config.description")
+@Service(value = { Config.class, BaseConfig.class, DiscoveryLiteConfig.class })
public class Config implements BaseConfig, DiscoveryLiteConfig {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
- /**
- * resource used to keep instance information such as last heartbeat, properties, incoming announcements
- **/
+ /** resource used to keep instance information such as last heartbeat, properties, incoming announcements **/
private static final String CLUSTERINSTANCES_RESOURCE = "clusterInstances";
- /**
- * resource used to store the sync tokens as part of a topology change
- **/
+ /** resource used to store the sync tokens as part of a topology change **/
private static final String SYNC_TOKEN_RESOURCE = "syncTokens";
- /**
- * resource used to store the clusterNodeIds to slingIds map
- **/
+ /** resource used to store the clusterNodeIds to slingIds map **/
private static final String ID_MAP_RESOURCE = "idMap";
+ /** Configure the timeout (in seconds) after which an instance is considered dead/crashed. */
+ public static final long DEFAULT_TOPOLOGY_CONNECTOR_TIMEOUT = 120;
+ @Property(longValue=DEFAULT_TOPOLOGY_CONNECTOR_TIMEOUT)
+ public static final String TOPOLOGY_CONNECTOR_TIMEOUT_KEY = "connectorPingTimeout";
+ protected long connectorPingTimeout = DEFAULT_TOPOLOGY_CONNECTOR_TIMEOUT;
+
+ /** Configure the interval (in seconds) according to which the heartbeats are exchanged in the topology. */
+ public static final long DEFAULT_TOPOLOGY_CONNECTOR_INTERVAL = 30;
+ @Property(longValue=DEFAULT_TOPOLOGY_CONNECTOR_INTERVAL)
+ public static final String TOPOLOGY_CONNECTOR_INTERVAL_KEY = "connectorPingInterval";
+ protected long connectorPingInterval = DEFAULT_TOPOLOGY_CONNECTOR_INTERVAL;
+
+ /** Configure the interval (in seconds) according to which the heartbeats are exchanged in the topology. */
+ public static final long DEFAULT_DISCOVERY_LITE_CHECK_INTERVAL = 2;
+ @Property(longValue=DEFAULT_DISCOVERY_LITE_CHECK_INTERVAL)
+ public static final String DISCOVERY_LITE_CHECK_INTERVAL_KEY = "discoveryLiteCheckInterval";
+ protected long discoveryLiteCheckInterval = DEFAULT_DISCOVERY_LITE_CHECK_INTERVAL;
+
+ public static final long DEFAULT_CLUSTER_SYNC_SERVICE_TIMEOUT = 120;
+ @Property(longValue=DEFAULT_CLUSTER_SYNC_SERVICE_TIMEOUT)
+ public static final String CLUSTER_SYNC_SERVICE_TIMEOUT_KEY = "clusterSyncServiceTimeout";
+ protected long clusterSyncServiceTimeout = DEFAULT_CLUSTER_SYNC_SERVICE_TIMEOUT;
+
+ public static final long DEFAULT_CLUSTER_SYNC_SERVICE_INTERVAL = 2;
+ @Property(longValue=DEFAULT_CLUSTER_SYNC_SERVICE_INTERVAL)
+ public static final String CLUSTER_SYNC_SERVICE_INTERVAL_KEY = "clusterSyncServiceInterval";
+ protected long clusterSyncServiceInterval = DEFAULT_CLUSTER_SYNC_SERVICE_INTERVAL;
+
/**
- * True when auto-stop of a local-loop is enabled. Default is false.
- **/
- private boolean autoStopLocalLoopEnabled;
+ * If set to true a syncToken will be used on top of waiting for
+ * deactivating instances to be fully processed.
+ * If set to false, only deactivating instances will be waited for
+ * to be fully processed.
+ */
+ @Property(boolValue=true)
+ private static final String SYNC_TOKEN_ENABLED = "enableSyncToken";
+
+ /** Configure the time (in seconds) which must be passed at minimum between sending TOPOLOGY_CHANGING/_CHANGED (avoid flooding). */
+ public static final int DEFAULT_MIN_EVENT_DELAY = 3;
+ @Property(intValue=DEFAULT_MIN_EVENT_DELAY)
+ public static final String MIN_EVENT_DELAY_KEY = "minEventDelay";
+ protected int minEventDelay = DEFAULT_MIN_EVENT_DELAY;
+
+ /** Configure the socket connect timeout for topology connectors. */
+ public static final int DEFAULT_SOCKET_CONNECT_TIMEOUT = 10;
+ @Property(intValue=DEFAULT_SOCKET_CONNECT_TIMEOUT)
+ public static final String SOCKET_CONNECT_TIMEOUT_KEY = "socketConnectTimeout";
+ private int socketConnectTimeout = DEFAULT_SOCKET_CONNECT_TIMEOUT;
+
+ /** Configure the socket read timeout (SO_TIMEOUT) for topology connectors. */
+ public static final int DEFAULT_SO_TIMEOUT = 10;
+ @Property(intValue=DEFAULT_SO_TIMEOUT)
+ public static final String SO_TIMEOUT_KEY = "soTimeout";
+ private int soTimeout = DEFAULT_SO_TIMEOUT;
+
+ /** URLs where to join a topology, eg http://localhost:4502/libs/sling/topology/connector */
+ @Property(cardinality=1024)
+ public static final String TOPOLOGY_CONNECTOR_URLS_KEY = "topologyConnectorUrls";
+ private URL[] topologyConnectorUrls = {null};
+
+ /** list of ips and/or hostnames which are allowed to connect to /libs/sling/topology/connector */
+ private static final String[] DEFAULT_TOPOLOGY_CONNECTOR_WHITELIST = {"localhost","127.0.0.1"};
+ @Property(value={"localhost","127.0.0.1"})
+ public static final String TOPOLOGY_CONNECTOR_WHITELIST_KEY = "topologyConnectorWhitelist";
+ protected String[] topologyConnectorWhitelist = DEFAULT_TOPOLOGY_CONNECTOR_WHITELIST;
+
+ /** Path of resource where to keep discovery information, e.g /var/discovery/oak/ */
+ private static final String DEFAULT_DISCOVERY_RESOURCE_PATH = "/var/discovery/oak/";
+ @Property(value=DEFAULT_DISCOVERY_RESOURCE_PATH, propertyPrivate=true)
+ public static final String DISCOVERY_RESOURCE_PATH_KEY = "discoveryResourcePath";
+ protected String discoveryResourcePath = DEFAULT_DISCOVERY_RESOURCE_PATH;
+
+ /**
+ * If set to true, local-loops of topology connectors are automatically stopped when detected so.
+ */
+ @Property(boolValue=false)
+ private static final String AUTO_STOP_LOCAL_LOOP_ENABLED = "autoStopLocalLoopEnabled";
+
+ /**
+ * If set to true, request body will be gzipped - only works if counter-part accepts gzip-requests!
+ */
+ @Property(boolValue=false)
+ private static final String GZIP_CONNECTOR_REQUESTS_ENABLED = "gzipConnectorRequestsEnabled";
+
+ /**
+ * If set to true, hmac is enabled and the white list is disabled.
+ */
+ @Property(boolValue=false)
+ private static final String HMAC_ENABLED = "hmacEnabled";
+
+ /**
+ * If set to true, and the whitelist is disabled, messages will be encrypted.
+ */
+ @Property(boolValue=false)
+ private static final String ENCRYPTION_ENABLED = "enableEncryption";
+
+ /**
+ * The value fo the shared key, shared amongst all instances in the same cluster.
+ */
+ @Property
+ private static final String SHARED_KEY = "sharedKey";
+
+ /**
+ * The default lifetime of a HMAC shared key in ms. (4h)
+ */
+ private static final long DEFAULT_SHARED_KEY_INTERVAL = 3600*1000*4;
+ @Property(longValue=DEFAULT_SHARED_KEY_INTERVAL)
+ private static final String SHARED_KEY_INTERVAL = "hmacSharedKeyTTL";
+
+ /**
+ * The property for defining the backoff factor for standby (loop) connectors
+ */
+ @Property
+ private static final String BACKOFF_STANDBY_FACTOR = "backoffStandbyFactor";
+ private static final int DEFAULT_BACKOFF_STANDBY_FACTOR = 5;
+
+ /**
+ * The property for defining the maximum backoff factor for stable connectors
+ */
+ @Property
+ private static final String BACKOFF_STABLE_FACTOR = "backoffStableFactor";
+ private static final int DEFAULT_BACKOFF_STABLE_FACTOR = 5;
+
+ private static final long DEFAULT_LEADER_ELECTION_PREFIX = 1;
+ @Property(longValue=DEFAULT_LEADER_ELECTION_PREFIX)
+ private static final String LEADER_ELECTION_PREFIX = "leaderElectionPrefix";
+ protected long leaderElectionPrefix = DEFAULT_LEADER_ELECTION_PREFIX;
+
+ private static final boolean DEFAULT_INVERT_LEADER_ELECTION_PREFIX_ORDER = false;
+ @Property(boolValue=DEFAULT_INVERT_LEADER_ELECTION_PREFIX_ORDER)
+ private static final String INVERT_LEADER_ELECTION_PREFIX_ORDER = "invertLeaderElectionPrefixOrder";
+ protected boolean invertLeaderElectionPrefixOrder = DEFAULT_INVERT_LEADER_ELECTION_PREFIX_ORDER;
+
+ private static final boolean DEFAULT_SUPPRESS_PARTIALLY_STARTED_INSTANCES = false;
+ @Property(boolValue=DEFAULT_SUPPRESS_PARTIALLY_STARTED_INSTANCES)
+ private static final String SUPPRESS_PARTIALLY_STARTED_INSTANCES = "suppressPartiallyStartedInstance";
+ protected boolean suppressPartiallyStartedInstance = DEFAULT_SUPPRESS_PARTIALLY_STARTED_INSTANCES;
+ private static final String JOINER_DELAY_ENABLED_SYSTEM_PROPERTY_NAME = "org.apache.sling.discovery.oak.joinerdelay.enabled";
+
+ private static final long DEFAULT_SUPPRESSION_TIMEOUT_SECONDS = -1;
+ @Property(longValue=DEFAULT_SUPPRESSION_TIMEOUT_SECONDS)
+ private static final String SUPPRESSION_TIMEOUT_SECONDS = "suppressionTimeoutSeconds";
+ protected long suppressionTimeoutSeconds = DEFAULT_SUPPRESSION_TIMEOUT_SECONDS;
+
+ private static final long DEFAULT_JOINER_DELAY_SECONDS = 0;
+ @Property(longValue=DEFAULT_JOINER_DELAY_SECONDS)
+ private static final String JOINER_DELAY_SECONDS = "joinerDelaySeconds";
+ protected long joinerDelaySeconds = DEFAULT_JOINER_DELAY_SECONDS;
+
+ /** True when auto-stop of a local-loop is enabled. Default is false. **/
+ private boolean autoStopLocalLoopEnabled;
+
/**
* True when the hmac is enabled and signing is disabled.
*/
@@ -103,105 +227,105 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
* true when encryption is enabled.
*/
private boolean encryptionEnabled;
-
+
/**
* true when topology connector requests should be gzipped
*/
private boolean gzipConnectorRequestsEnabled;
- /**
- * the backoff factor to be used for standby (loop) connectors
- **/
+ /** the backoff factor to be used for standby (loop) connectors **/
private int backoffStandbyFactor = DEFAULT_BACKOFF_STANDBY_FACTOR;
-
- /**
- * the maximum backoff factor to be used for stable connectors
- **/
+
+ /** the maximum backoff factor to be used for stable connectors **/
private int backoffStableFactor = DEFAULT_BACKOFF_STABLE_FACTOR;
-
+
/**
* Whether, on top of waiting for deactivating instances,
* a syncToken should also be used
*/
private boolean syncTokenEnabled;
- /**
- * only check system property JOINER_DELAY_ENABLED_SYSTEM_PROPERTY_NAME every 5 minutes, here's to the next check
- */
+ /** only check system property JOINER_DELAY_ENABLED_SYSTEM_PROPERTY_NAME every 5 minutes, here's to the next check */
private long joinerDelayOverwriteNextCheck;
- /**
- * cache of last read of system property JOINER_DELAY_ENABLED_SYSTEM_PROPERTY_NAME
- **/
+ /** cache of last read of system property JOINER_DELAY_ENABLED_SYSTEM_PROPERTY_NAME **/
private boolean joinerDelayOverwrite;
- protected long connectorPingTimeout = DEFAULT_TOPOLOGY_CONNECTOR_TIMEOUT;
- protected long connectorPingInterval = DEFAULT_TOPOLOGY_CONNECTOR_INTERVAL;
- protected long discoveryLiteCheckInterval = DEFAULT_DISCOVERY_LITE_CHECK_INTERVAL;
- protected long clusterSyncServiceTimeout = DEFAULT_CLUSTER_SYNC_SERVICE_TIMEOUT;
- protected long clusterSyncServiceInterval = DEFAULT_CLUSTER_SYNC_SERVICE_INTERVAL;
- protected int minEventDelay = DEFAULT_MIN_EVENT_DELAY;
- private int socketConnectTimeout = DEFAULT_SOCKET_CONNECT_TIMEOUT;
- private int soTimeout = DEFAULT_SO_TIMEOUT;
- private URL[] topologyConnectorUrls = {null};
- protected String[] topologyConnectorWhitelist = DEFAULT_TOPOLOGY_CONNECTOR_WHITELIST;
- protected String discoveryResourcePath = DEFAULT_DISCOVERY_RESOURCE_PATH;
-
- protected long leaderElectionPrefix = DEFAULT_LEADER_ELECTION_PREFIX;
- protected boolean invertLeaderElectionPrefixOrder = DEFAULT_INVERT_LEADER_ELECTION_PREFIX_ORDER;
- protected boolean suppressPartiallyStartedInstance = DEFAULT_SUPPRESS_PARTIALLY_STARTED_INSTANCES;
- protected long suppressionTimeoutSeconds = DEFAULT_SUPPRESSION_TIMEOUT_SECONDS;
- protected long joinerDelaySeconds = DEFAULT_JOINER_DELAY_SECONDS;
-
@Activate
- protected void activate(BundleContext context, DiscoveryServiceCentralConfig config) {
- logger.debug("activate: config activated.");
- configure(config);
- }
-
- protected void configure(final DiscoveryServiceCentralConfig config) {
- this.connectorPingTimeout = config.connectorPingTimeout();
- logger.debug("configure: connectorPingTimeout='{}'", this.connectorPingTimeout);
-
- this.connectorPingInterval = config.connectorPingInterval();
- logger.debug("configure: connectorPingInterval='{}'", this.connectorPingInterval);
-
- this.discoveryLiteCheckInterval = config.discoveryLiteCheckInterval();
- logger.debug("configure: discoveryLiteCheckInterval='{}'", this.discoveryLiteCheckInterval);
-
- this.clusterSyncServiceTimeout = config.clusterSyncServiceTimeout();
- logger.debug("configure: clusterSyncServiceTimeout='{}'", this.clusterSyncServiceTimeout);
-
- this.clusterSyncServiceInterval = config.clusterSyncServiceInterval();
- logger.debug("configure: clusterSyncServiceInterval='{}'", this.clusterSyncServiceInterval);
-
- this.minEventDelay = config.minEventDelay();
- logger.debug("configure: minEventDelay='{}'", this.minEventDelay);
-
- this.socketConnectTimeout = config.socketConnectTimeout();
- logger.debug("configure: socketConnectTimeout='{}'", this.socketConnectTimeout);
-
- this.soTimeout = config.soTimeout();
- logger.debug("configure: soTimeout='{}'", this.soTimeout);
-
- String[] topologyConnectorUrlsStr = config.topologyConnectorUrls();
- if (topologyConnectorUrlsStr != null && topologyConnectorUrlsStr.length > 0) {
- List<URL> urls = new LinkedList<>();
+ protected void activate(final Map<String, Object> properties) {
+ logger.debug("activate: config activated.");
+ configure(properties);
+ }
+
+ protected void configure(final Map<String, Object> properties) {
+ this.connectorPingTimeout = PropertiesUtil.toLong(
+ properties.get(TOPOLOGY_CONNECTOR_TIMEOUT_KEY),
+ DEFAULT_TOPOLOGY_CONNECTOR_TIMEOUT);
+ logger.debug("configure: connectorPingTimeout='{}'",
+ this.connectorPingTimeout);
+
+ this.connectorPingInterval = PropertiesUtil.toLong(
+ properties.get(TOPOLOGY_CONNECTOR_INTERVAL_KEY),
+ DEFAULT_TOPOLOGY_CONNECTOR_INTERVAL);
+ logger.debug("configure: connectorPingInterval='{}'",
+ this.connectorPingInterval);
+
+ this.discoveryLiteCheckInterval = PropertiesUtil.toLong(
+ properties.get(DISCOVERY_LITE_CHECK_INTERVAL_KEY),
+ DEFAULT_DISCOVERY_LITE_CHECK_INTERVAL);
+ logger.debug("configure: discoveryLiteCheckInterval='{}'",
+ this.discoveryLiteCheckInterval);
+
+ this.clusterSyncServiceTimeout = PropertiesUtil.toLong(
+ properties.get(CLUSTER_SYNC_SERVICE_TIMEOUT_KEY),
+ DEFAULT_CLUSTER_SYNC_SERVICE_TIMEOUT);
+ logger.debug("configure: clusterSyncServiceTimeout='{}'",
+ this.clusterSyncServiceTimeout);
+
+ this.clusterSyncServiceInterval = PropertiesUtil.toLong(
+ properties.get(CLUSTER_SYNC_SERVICE_INTERVAL_KEY),
+ DEFAULT_CLUSTER_SYNC_SERVICE_TIMEOUT);
+ logger.debug("configure: clusterSyncServiceInterval='{}'",
+ this.clusterSyncServiceInterval);
+
+ this.minEventDelay = PropertiesUtil.toInteger(
+ properties.get(MIN_EVENT_DELAY_KEY),
+ DEFAULT_MIN_EVENT_DELAY);
+ logger.debug("configure: minEventDelay='{}'",
+ this.minEventDelay);
+
+ this.socketConnectTimeout = PropertiesUtil.toInteger(
+ properties.get(SOCKET_CONNECT_TIMEOUT_KEY),
+ DEFAULT_SOCKET_CONNECT_TIMEOUT);
+ logger.debug("configure: socketConnectTimeout='{}'",
+ this.socketConnectTimeout);
+
+ this.soTimeout = PropertiesUtil.toInteger(
+ properties.get(SO_TIMEOUT_KEY),
+ DEFAULT_SO_TIMEOUT);
+ logger.debug("configure: soTimeout='{}'",
+ this.soTimeout);
+
+
+ String[] topologyConnectorUrlsStr = PropertiesUtil.toStringArray(
+ properties.get(TOPOLOGY_CONNECTOR_URLS_KEY), null);
+ if (topologyConnectorUrlsStr!=null && topologyConnectorUrlsStr.length > 0) {
+ List<URL> urls = new LinkedList<URL>();
for (int i = 0; i < topologyConnectorUrlsStr.length; i++) {
String anUrlStr = topologyConnectorUrlsStr[i];
try {
- if (anUrlStr != null && anUrlStr.length() > 0) {
- URL url = new URL(anUrlStr);
- logger.debug("configure: a topologyConnectorbUrl='{}'",
- url);
- urls.add(url);
- }
+ if (anUrlStr!=null && anUrlStr.length()>0) {
+ URL url = new URL(anUrlStr);
+ logger.debug("configure: a topologyConnectorbUrl='{}'",
+ url);
+ urls.add(url);
+ }
} catch (MalformedURLException e) {
logger.error("configure: could not set a topologyConnectorUrl: " + e,
e);
}
}
- if (urls.size() > 0) {
+ if (urls.size()>0) {
this.topologyConnectorUrls = urls.toArray(new URL[urls.size()]);
logger.debug("configure: number of topologyConnectorUrls='{}''",
urls.size());
@@ -213,50 +337,73 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
this.topologyConnectorUrls = null;
logger.debug("configure: no (valid) topologyConnectorUrls configured");
}
- this.topologyConnectorWhitelist = config.topologyConnectorWhitelist();
- logger.debug("configure: topologyConnectorWhitelist='{}'", this.topologyConnectorWhitelist);
-
- this.discoveryResourcePath = config.discoveryResourcePath();
- while (this.discoveryResourcePath.endsWith("/")) {
- this.discoveryResourcePath = this.discoveryResourcePath.substring(0, this.discoveryResourcePath.length() - 1);
+ this.topologyConnectorWhitelist = PropertiesUtil.toStringArray(
+ properties.get(TOPOLOGY_CONNECTOR_WHITELIST_KEY),
+ DEFAULT_TOPOLOGY_CONNECTOR_WHITELIST);
+ logger.debug("configure: topologyConnectorWhitelist='{}'",
+ this.topologyConnectorWhitelist);
+
+ this.discoveryResourcePath = PropertiesUtil.toString(
+ properties.get(DISCOVERY_RESOURCE_PATH_KEY),
+ "");
+ while(this.discoveryResourcePath.endsWith("/")) {
+ this.discoveryResourcePath = this.discoveryResourcePath.substring(0,
+ this.discoveryResourcePath.length()-1);
}
this.discoveryResourcePath = this.discoveryResourcePath + "/";
- if (this.discoveryResourcePath == null || this.discoveryResourcePath.length() <= 1) {
+ if (this.discoveryResourcePath==null || this.discoveryResourcePath.length()<=1) {
// if the path is empty, or /, then use the default
this.discoveryResourcePath = DEFAULT_DISCOVERY_RESOURCE_PATH;
}
- logger.debug("configure: discoveryResourcePath='{}'", this.discoveryResourcePath);
-
- autoStopLocalLoopEnabled = config.autoStopLocalLoopEnabled();
- gzipConnectorRequestsEnabled = config.gzipConnectorRequestsEnabled();
- hmacEnabled = config.hmacEnabled();
- encryptionEnabled = config.enableEncryption();
- syncTokenEnabled = config.enableSyncToken();
- sharedKey = config.sharedKey();
- keyInterval = config.hmacSharedKeyTTL();
-
- backoffStandbyFactor = config.backoffStandbyFactor();
- backoffStableFactor = config.backoffStableFactor();
-
- this.invertLeaderElectionPrefixOrder = config.invertLeaderElectionPrefixOrder();
- logger.debug("configure: invertLeaderElectionPrefixOrder='{}'", this.invertLeaderElectionPrefixOrder);
-
- this.leaderElectionPrefix = config.leaderElectionPrefix();
- logger.debug("configure: leaderElectionPrefix='{}'", this.leaderElectionPrefix);
-
- this.suppressPartiallyStartedInstance = config.suppressPartiallyStartedInstance();
- logger.debug("configure: suppressPartiallyStartedInstance='{}'", this.suppressPartiallyStartedInstance);
-
- this.suppressionTimeoutSeconds = config.suppressionTimeoutSeconds();
- logger.debug("configure: suppressionTimeoutSeconds='{}'", this.suppressionTimeoutSeconds);
-
- this.joinerDelaySeconds = config.joinerDelaySeconds();
- logger.debug("configure: joinerDelaySeconds='{}'", this.joinerDelaySeconds);
+ logger.debug("configure: discoveryResourcePath='{}'",
+ this.discoveryResourcePath);
+
+ autoStopLocalLoopEnabled = PropertiesUtil.toBoolean(properties.get(AUTO_STOP_LOCAL_LOOP_ENABLED), false);
+ gzipConnectorRequestsEnabled = PropertiesUtil.toBoolean(properties.get(GZIP_CONNECTOR_REQUESTS_ENABLED), false);
+
+ hmacEnabled = PropertiesUtil.toBoolean(properties.get(HMAC_ENABLED), true);
+ encryptionEnabled = PropertiesUtil.toBoolean(properties.get(ENCRYPTION_ENABLED), false);
+ syncTokenEnabled = PropertiesUtil.toBoolean(properties.get(SYNC_TOKEN_ENABLED), true);
+ sharedKey = PropertiesUtil.toString(properties.get(SHARED_KEY), null);
+ keyInterval = PropertiesUtil.toLong(SHARED_KEY_INTERVAL, DEFAULT_SHARED_KEY_INTERVAL);
+
+ backoffStandbyFactor = PropertiesUtil.toInteger(properties.get(BACKOFF_STANDBY_FACTOR),
+ DEFAULT_BACKOFF_STANDBY_FACTOR);
+ backoffStableFactor = PropertiesUtil.toInteger(properties.get(BACKOFF_STABLE_FACTOR),
+ DEFAULT_BACKOFF_STABLE_FACTOR);
+
+ this.invertLeaderElectionPrefixOrder = PropertiesUtil.toBoolean(
+ properties.get(INVERT_LEADER_ELECTION_PREFIX_ORDER),
+ DEFAULT_INVERT_LEADER_ELECTION_PREFIX_ORDER);
+ logger.debug("configure: invertLeaderElectionPrefixOrder='{}'",
+ this.invertLeaderElectionPrefixOrder);
+ this.leaderElectionPrefix = PropertiesUtil.toLong(
+ properties.get(LEADER_ELECTION_PREFIX),
+ DEFAULT_LEADER_ELECTION_PREFIX);
+ logger.debug("configure: leaderElectionPrefix='{}'",
+ this.leaderElectionPrefix);
+
+ this.suppressPartiallyStartedInstance = PropertiesUtil.toBoolean(
+ properties.get(SUPPRESS_PARTIALLY_STARTED_INSTANCES),
+ DEFAULT_SUPPRESS_PARTIALLY_STARTED_INSTANCES);
+ logger.debug("configure: suppressPartiallyStartedInstance='{}'",
+ this.suppressPartiallyStartedInstance);
+
+ this.suppressionTimeoutSeconds = PropertiesUtil.toLong(
+ properties.get(SUPPRESSION_TIMEOUT_SECONDS),
+ DEFAULT_SUPPRESSION_TIMEOUT_SECONDS);
+ logger.debug("configure: suppressionTimeoutSeconds='{}'",
+ this.suppressionTimeoutSeconds);
+
+ this.joinerDelaySeconds = PropertiesUtil.toLong(
+ properties.get(JOINER_DELAY_SECONDS),
+ DEFAULT_JOINER_DELAY_SECONDS);
+ logger.debug("configure: joinerDelaySeconds='{}'",
+ this.joinerDelaySeconds);
}
/**
* Returns the socket connect() timeout used by the topology connector, 0 disables the timeout
- *
* @return the socket connect() timeout used by the topology connector, 0 disables the timeout
*/
public int getSocketConnectTimeout() {
@@ -265,16 +412,14 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
/**
* Returns the socket read timeout (SO_TIMEOUT) used by the topology connector, 0 disables the timeout
- *
* @return the socket read timeout (SO_TIMEOUT) used by the topology connector, 0 disables the timeout
*/
public int getSoTimeout() {
return soTimeout;
}
-
+
/**
* Returns the minimum time (in seconds) between sending TOPOLOGY_CHANGING/_CHANGED events - to avoid flooding
- *
* @return the minimum time (in seconds) between sending TOPOLOGY_CHANGING/_CHANGED events - to avoid flooding
*/
public int getMinEventDelay() {
@@ -284,7 +429,6 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
/**
* Returns the URLs to which to open a topology connector - or null/empty if no topology connector
* is configured (default is null)
- *
* @return the URLs to which to open a topology connector - or null/empty if no topology connector
* is configured
*/
@@ -295,21 +439,19 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
/**
* Returns a comma separated list of hostnames and/or ip addresses which are allowed as
* remote hosts to open connections to the topology connector servlet
- *
* @return a comma separated list of hostnames and/or ip addresses which are allowed as
* remote hosts to open connections to the topology connector servlet
*/
public String[] getTopologyConnectorWhitelist() {
return topologyConnectorWhitelist;
}
-
+
protected String getDiscoveryResourcePath() {
return discoveryResourcePath;
}
/**
* Returns the resource path where cluster instance informations are stored.
- *
* @return the resource path where cluster instance informations are stored
*/
public String getClusterInstancesPath() {
@@ -353,7 +495,7 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
public boolean isEncryptionEnabled() {
return encryptionEnabled;
}
-
+
/**
* @return true if requests on the topology connector should be gzipped
* (which only works if the server accepts that.. ie discovery.impl 1.0.4+)
@@ -361,7 +503,7 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
public boolean isGzipConnectorRequestsEnabled() {
return gzipConnectorRequestsEnabled;
}
-
+
/**
* @return true if the auto-stopping of local-loop topology connectors is enabled.
*/
@@ -371,7 +513,6 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
/**
* Returns the backoff factor to be used for standby (loop) connectors
- *
* @return the backoff factor to be used for standby (loop) connectors
*/
public int getBackoffStandbyFactor() {
@@ -380,7 +521,6 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
/**
* Returns the (maximum) backoff factor to be used for stable connectors
- *
* @return the (maximum) backoff factor to be used for stable connectors
*/
public int getBackoffStableFactor() {
@@ -389,12 +529,11 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
/**
* Returns the backoff interval for standby (loop) connectors in seconds
- *
* @return the backoff interval for standby (loop) connectors in seconds
*/
public long getBackoffStandbyInterval() {
final int factor = getBackoffStandbyFactor();
- if (factor <= 1) {
+ if (factor<=1) {
return -1;
} else {
return factor * getConnectorPingInterval();
@@ -405,16 +544,16 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
public long getConnectorPingInterval() {
return connectorPingInterval;
}
-
+
@Override
public long getConnectorPingTimeout() {
return connectorPingTimeout;
}
-
+
public long getDiscoveryLiteCheckInterval() {
return discoveryLiteCheckInterval;
}
-
+
@Override
public long getClusterSyncServiceTimeoutMillis() {
return clusterSyncServiceTimeout * 1000;
@@ -424,7 +563,7 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
public long getClusterSyncServiceIntervalMillis() {
return clusterSyncServiceInterval * 1000;
}
-
+
public boolean getSyncTokenEnabled() {
return syncTokenEnabled;
}
@@ -440,7 +579,6 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
/**
* Checks if the system property JOIN_DELAY_SYSTEM_PROPERTY_NAME is set
* and uses that value. Otherwise uses the provided default.
- *
* @param configValue the provided default to be used unless the system property is set
* @return the overwritten value to be used as the actual config value
*/
diff --git a/src/main/java/org/apache/sling/discovery/oak/DiscoveryServiceCentralConfig.java b/src/main/java/org/apache/sling/discovery/oak/DiscoveryServiceCentralConfig.java
deleted file mode 100644
index 5e27a9f..0000000
--- a/src/main/java/org/apache/sling/discovery/oak/DiscoveryServiceCentralConfig.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * 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.discovery.oak;
-
-import org.osgi.service.metatype.annotations.ObjectClassDefinition;
-import org.osgi.service.metatype.annotations.AttributeDefinition;
-
-@SuppressWarnings("java:S100")
-@ObjectClassDefinition(name = "%config.name", description = "%config.description")
-public @interface DiscoveryServiceCentralConfig {
-
- long DEFAULT_TOPOLOGY_CONNECTOR_TIMEOUT = 120;
- long DEFAULT_TOPOLOGY_CONNECTOR_INTERVAL = 30;
- long DEFAULT_DISCOVERY_LITE_CHECK_INTERVAL = 2;
- long DEFAULT_CLUSTER_SYNC_SERVICE_TIMEOUT = 120;
- long DEFAULT_CLUSTER_SYNC_SERVICE_INTERVAL = 2;
- int DEFAULT_MIN_EVENT_DELAY = 3;
- int DEFAULT_SOCKET_CONNECT_TIMEOUT = 10;
- int DEFAULT_SO_TIMEOUT = 10;
- int DEFAULT_BACKOFF_STANDBY_FACTOR = 5;
- int DEFAULT_BACKOFF_STABLE_FACTOR = 5;
- long DEFAULT_LEADER_ELECTION_PREFIX = 1;
- String[] DEFAULT_TOPOLOGY_CONNECTOR_WHITELIST = {"localhost", "127.0.0.1"};
- String DEFAULT_DISCOVERY_RESOURCE_PATH = "/var/discovery/oak/";
-
- boolean DEFAULT_INVERT_LEADER_ELECTION_PREFIX_ORDER = false;
- boolean DEFAULT_SUPPRESS_PARTIALLY_STARTED_INSTANCES = false;
- String JOINER_DELAY_ENABLED_SYSTEM_PROPERTY_NAME = "org.apache.sling.discovery.oak.joinerdelay.enabled";
- long DEFAULT_SUPPRESSION_TIMEOUT_SECONDS = -1;
- long DEFAULT_JOINER_DELAY_SECONDS = 0;
- /**
- * The default lifetime of a HMAC shared key in ms. (4h)
- */
- long DEFAULT_SHARED_KEY_INTERVAL = 3600 * 1000 * 4;
-
- /**
- * Configure the timeout (in seconds) after which an instance is considered dead/crashed.
- */
- @AttributeDefinition
- long connectorPingTimeout() default DEFAULT_TOPOLOGY_CONNECTOR_TIMEOUT;
-
- /**
- * Configure the interval (in seconds) according to which the heartbeats are exchanged in the topology.
- */
- @AttributeDefinition
- long connectorPingInterval() default DEFAULT_TOPOLOGY_CONNECTOR_INTERVAL;
-
- @AttributeDefinition
- long discoveryLiteCheckInterval() default DEFAULT_DISCOVERY_LITE_CHECK_INTERVAL;
-
- @AttributeDefinition
- long clusterSyncServiceTimeout() default DEFAULT_CLUSTER_SYNC_SERVICE_TIMEOUT;
-
- @AttributeDefinition
- long clusterSyncServiceInterval() default DEFAULT_CLUSTER_SYNC_SERVICE_INTERVAL;
-
- /**
- * If set to true a syncToken will be used on top of waiting for deactivating instances to be fully processed.
- * If set to false, only deactivating instances will be waited for to be fully processed.
- */
- @AttributeDefinition
- boolean enableSyncToken() default true;
-
- /**
- * Configure the time (in seconds) which must be passed at minimum between sending TOPOLOGY_CHANGING/_CHANGED (avoid flooding).
- */
- @AttributeDefinition
- int minEventDelay() default DEFAULT_MIN_EVENT_DELAY;
-
- /**
- * Configure the socket connect timeout for topology connectors.
- */
- @AttributeDefinition
- int socketConnectTimeout() default DEFAULT_SOCKET_CONNECT_TIMEOUT;
-
- /**
- * Configure the socket read timeout (SO_TIMEOUT) for topology connectors.
- */
- @AttributeDefinition
- int soTimeout() default DEFAULT_SO_TIMEOUT;
-
- /**
- * URLs where to join a topology, eg http://localhost:4502/libs/sling/topology/connector
- */
- @AttributeDefinition (cardinality = 1024)
- String[] topologyConnectorUrls() default {};
-
- /**
- * list of ips and/or hostnames which are allowed to connect to /libs/sling/topology/connector
- */
- @AttributeDefinition (cardinality = 1024)
- String[] topologyConnectorWhitelist() default {"localhost", "127.0.0.1"};
-
- /**
- * Path of resource where to keep discovery information, e.g /var/discovery/oak/
- */
- @AttributeDefinition
- String discoveryResourcePath() default DEFAULT_DISCOVERY_RESOURCE_PATH;
-
- /**
- * If set to true, local-loops of topology connectors are automatically stopped when detected so.
- */
- @AttributeDefinition
- boolean autoStopLocalLoopEnabled() default false;
-
- /**
- * If set to true, request body will be gzipped - only works if counter-part accepts gzip-requests!
- */
- @AttributeDefinition
- boolean gzipConnectorRequestsEnabled() default false;
-
- /**
- * If set to true, hmac is enabled and the white list is disabled.
- */
- @AttributeDefinition
- boolean hmacEnabled() default false;
-
- /**
- * If set to true, and the whitelist is disabled, messages will be encrypted.
- */
- @AttributeDefinition
- boolean enableEncryption() default false;
-
- /**
- * The value fo the shared key, shared amongst all instances in the same cluster.
- */
- @AttributeDefinition
- String sharedKey() default "";
-
- @AttributeDefinition
- long hmacSharedKeyTTL() default DEFAULT_SHARED_KEY_INTERVAL;
-
- /**
- * The property for defining the backoff factor for standby (loop) connectors
- */
- @AttributeDefinition
- int backoffStandbyFactor() default DEFAULT_BACKOFF_STANDBY_FACTOR;
-
- /**
- * The property for defining the maximum backoff factor for stable connectors
- */
- @AttributeDefinition
- int backoffStableFactor() default DEFAULT_BACKOFF_STABLE_FACTOR;
-
- @AttributeDefinition
- long leaderElectionPrefix() default DEFAULT_LEADER_ELECTION_PREFIX;
-
- @AttributeDefinition
- boolean invertLeaderElectionPrefixOrder() default DEFAULT_INVERT_LEADER_ELECTION_PREFIX_ORDER;
-
- @AttributeDefinition
- boolean suppressPartiallyStartedInstance() default DEFAULT_SUPPRESS_PARTIALLY_STARTED_INSTANCES;
-
- @AttributeDefinition
- long suppressionTimeoutSeconds() default DEFAULT_SUPPRESSION_TIMEOUT_SECONDS;
-
- @AttributeDefinition
- long joinerDelaySeconds() default DEFAULT_JOINER_DELAY_SECONDS;
-}
diff --git a/src/main/java/org/apache/sling/discovery/oak/OakDiscoveryService.java b/src/main/java/org/apache/sling/discovery/oak/OakDiscoveryService.java
index d98e1b2..19f8ebb 100644
--- a/src/main/java/org/apache/sling/discovery/oak/OakDiscoveryService.java
+++ b/src/main/java/org/apache/sling/discovery/oak/OakDiscoveryService.java
@@ -32,6 +32,13 @@ import java.util.Set;
import java.util.UUID;
import java.util.concurrent.locks.ReentrantLock;
+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.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.PersistenceException;
@@ -67,12 +74,6 @@ import org.apache.sling.settings.SlingSettingsService;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
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.Deactivate;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferenceCardinality;
-import org.osgi.service.component.annotations.ReferencePolicy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -81,7 +82,8 @@ import org.slf4j.LoggerFactory;
* implementation for detecting changes in a cluster and only supports one
* cluster (of which this instance is part of).
*/
-@Component(immediate = true, service = {DiscoveryService.class, OakDiscoveryService.class})
+@Component(immediate = true)
+@Service(value = { DiscoveryService.class, OakDiscoveryService.class })
public class OakDiscoveryService extends BaseDiscoveryService {
private final static Logger logger = LoggerFactory.getLogger(OakDiscoveryService.class);
@@ -89,18 +91,20 @@ public class OakDiscoveryService extends BaseDiscoveryService {
@Reference
private SlingSettingsService settingsService;
+ @Reference(cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC, referenceInterface = TopologyEventListener.class)
+ private TopologyEventListener[] eventListeners = new TopologyEventListener[0];
+
/**
* All property providers.
*/
+ @Reference(cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC, referenceInterface = PropertyProvider.class, updated = "updatedPropertyProvider")
private List<ProviderInfo> providerInfos = new ArrayList<ProviderInfo>();
- /**
- * lock object used for syncing bind/unbind and topology event sending
- **/
+ /** lock object used for synching bind/unbind and topology event sending **/
private final Object lock = new Object();
/**
- * whether this service is activated - necessary to avoid sending
+ * whether or not this service is activated - necessary to avoid sending
* events to discovery awares before activate is done
**/
private volatile boolean activated = false;
@@ -135,9 +139,7 @@ public class OakDiscoveryService extends BaseDiscoveryService {
@Reference
private SyncTokenService syncTokenService;
- /**
- * the slingId of the local instance
- **/
+ /** the slingId of the local instance **/
private String slingId;
private ServiceRegistration mbeanRegistration;
@@ -162,16 +164,16 @@ public class OakDiscoveryService extends BaseDiscoveryService {
};
public static OakDiscoveryService testConstructor(SlingSettingsService settingsService,
- AnnouncementRegistry announcementRegistry,
- ConnectorRegistry connectorRegistry,
- ClusterViewService clusterViewService,
- Config config,
- OakViewChecker connectorPinger,
- Scheduler scheduler,
- IdMapService idMapService,
- OakBacklogClusterSyncService oakBacklogClusterSyncService,
- SyncTokenService syncTokenService,
- ResourceResolverFactory factory) {
+ AnnouncementRegistry announcementRegistry,
+ ConnectorRegistry connectorRegistry,
+ ClusterViewService clusterViewService,
+ Config config,
+ OakViewChecker connectorPinger,
+ Scheduler scheduler,
+ IdMapService idMapService,
+ OakBacklogClusterSyncService oakBacklogClusterSyncService,
+ SyncTokenService syncTokenService,
+ ResourceResolverFactory factory) {
OakDiscoveryService discoService = new OakDiscoveryService();
discoService.settingsService = settingsService;
discoService.announcementRegistry = announcementRegistry;
@@ -189,7 +191,7 @@ public class OakDiscoveryService extends BaseDiscoveryService {
@Override
protected void handleIsolatedFromTopology() {
- if (oakViewChecker != null) {
+ if (oakViewChecker!=null) {
// SLING-5030 part 2: when we detect being isolated we should
// step at the end of the leader-election queue and
// that can be achieved by resetting the leaderElectionId
@@ -237,20 +239,22 @@ public class OakDiscoveryService extends BaseDiscoveryService {
}
viewStateManager = ViewStateManagerFactory.newViewStateManager(viewStateManagerLock, consistencyService);
- if (config.getMinEventDelay() > 0) {
+ if (config.getMinEventDelay()>0) {
viewStateManager.installMinEventDelayHandler(this, scheduler, config.getMinEventDelay());
}
final String isolatedClusterId = UUID.randomUUID().toString();
{
- // create a pre-voting/isolated topologyView which would be used until the first voting has finished.
+ // create a pre-voting/isolated topologyView which would be used
+ // until the first voting has finished.
// this way for the single-instance case the clusterId can
- // remain the same between a getTopology() that is invoked before the first TOPOLOGY_INIT and afterwards
+ // remain the same between a getTopology() that is invoked before
+ // the first TOPOLOGY_INIT and afterwards
DefaultClusterView isolatedCluster = new DefaultClusterView(isolatedClusterId);
- Map<String, String> emptyProperties = new HashMap<>();
+ Map<String, String> emptyProperties = new HashMap<String, String>();
DefaultInstanceDescription isolatedInstance =
new DefaultInstanceDescription(isolatedCluster, true, true, slingId, emptyProperties);
- Collection<InstanceDescription> col = new ArrayList<>();
+ Collection<InstanceDescription> col = new ArrayList<InstanceDescription>();
col.add(isolatedInstance);
final DefaultTopologyView topology = new DefaultTopologyView();
topology.addInstances(col);
@@ -267,7 +271,7 @@ public class OakDiscoveryService extends BaseDiscoveryService {
oakViewChecker.initialize(this);
viewStateManagerLock.lock();
- try {
+ try{
viewStateManager.handleActivated();
doUpdateProperties();
@@ -291,7 +295,7 @@ public class OakDiscoveryService extends BaseDiscoveryService {
viewStateManager.bind(changePropagationListener);
} finally {
- if (viewStateManagerLock != null) {
+ if (viewStateManagerLock!=null) {
viewStateManagerLock.unlock();
}
}
@@ -300,13 +304,13 @@ public class OakDiscoveryService extends BaseDiscoveryService {
if (topologyConnectorURLs != null) {
for (int i = 0; i < topologyConnectorURLs.length; i++) {
final URL aURL = topologyConnectorURLs[i];
- if (aURL != null) {
- try {
- logger.info("activate: registering outgoing topology connector to " + aURL);
- connectorRegistry.registerOutgoingConnector(clusterViewService, aURL);
- } catch (final Exception e) {
- logger.info("activate: could not register url: " + aURL + " due to: " + e, e);
- }
+ if (aURL!=null) {
+ try{
+ logger.info("activate: registering outgoing topology connector to "+aURL);
+ connectorRegistry.registerOutgoingConnector(clusterViewService, aURL);
+ } catch (final Exception e) {
+ logger.info("activate: could not register url: "+aURL+" due to: "+e, e);
+ }
}
}
}
@@ -321,45 +325,40 @@ public class OakDiscoveryService extends BaseDiscoveryService {
protected void deactivate() {
logger.debug("OakDiscoveryService deactivated.");
viewStateManagerLock.lock();
- try {
+ try{
viewStateManager.unbind(changePropagationListener);
viewStateManager.handleDeactivated();
activated = false;
} finally {
- if (viewStateManagerLock != null) {
+ if (viewStateManagerLock!=null) {
viewStateManagerLock.unlock();
}
}
- try {
- if (this.mbeanRegistration != null) {
+ try{
+ if ( this.mbeanRegistration != null ) {
this.mbeanRegistration.unregister();
this.mbeanRegistration = null;
}
- } catch (Exception e) {
- logger.error("deactivate: Error on unregister: " + e, e);
+ } catch(Exception e) {
+ logger.error("deactivate: Error on unregister: "+e, e);
}
}
/**
* bind a topology event listener
*/
- @Reference(name = "eventListeners",
- service = TopologyEventListener.class,
- cardinality = ReferenceCardinality.MULTIPLE,
- policy = ReferencePolicy.DYNAMIC,
- bind = "bindTopologyEventListener", unbind = "bindTopologyEventListener")
protected void bindTopologyEventListener(final TopologyEventListener eventListener) {
viewStateManagerLock.lock();
- try {
+ try{
if (!activated) {
pendingListeners.add(eventListener);
} else {
viewStateManager.bind(eventListener);
}
} finally {
- if (viewStateManagerLock != null) {
+ if (viewStateManagerLock!=null) {
viewStateManagerLock.unlock();
}
}
@@ -370,14 +369,14 @@ public class OakDiscoveryService extends BaseDiscoveryService {
*/
protected void unbindTopologyEventListener(final TopologyEventListener eventListener) {
viewStateManagerLock.lock();
- try {
+ try{
if (!activated) {
pendingListeners.remove(eventListener);
} else {
viewStateManager.unbind(eventListener);
}
} finally {
- if (viewStateManagerLock != null) {
+ if (viewStateManagerLock!=null) {
viewStateManagerLock.unlock();
}
}
@@ -386,13 +385,10 @@ public class OakDiscoveryService extends BaseDiscoveryService {
/**
* Bind a new property provider.
*/
- @Reference(name = "providerInfos",
- service = PropertyProvider.class,
- cardinality = ReferenceCardinality.MULTIPLE,
- policy = ReferencePolicy.DYNAMIC,
- bind = "bindPropertyProvider", unbind = "unbindPropertyProvider", updated = "updatedPropertyProvider")
- protected void bindPropertyProvider(final PropertyProvider propertyProvider, final Map<String, Object> props) {
- logger.debug("bindPropertyProvider: Binding PropertyProvider {}", propertyProvider);
+ protected void bindPropertyProvider(final PropertyProvider propertyProvider,
+ final Map<String, Object> props) {
+ logger.debug("bindPropertyProvider: Binding PropertyProvider {}",
+ propertyProvider);
synchronized (lock) {
try {
@@ -408,7 +404,8 @@ public class OakDiscoveryService extends BaseDiscoveryService {
/**
* Bind a new property provider.
*/
- private void bindPropertyProviderInteral(final PropertyProvider propertyProvider, final Map<String, Object> props) {
+ private void bindPropertyProviderInteral(final PropertyProvider propertyProvider,
+ final Map<String, Object> props) {
final ProviderInfo info = new ProviderInfo(propertyProvider, props);
this.providerInfos.add(info);
Collections.sort(this.providerInfos);
@@ -421,8 +418,10 @@ public class OakDiscoveryService extends BaseDiscoveryService {
/**
* Update a property provider.
*/
- protected void updatedPropertyProvider(final PropertyProvider propertyProvider, final Map<String, Object> props) {
- logger.debug("bindPropertyProvider: Updating PropertyProvider {}", propertyProvider);
+ protected void updatedPropertyProvider(final PropertyProvider propertyProvider,
+ final Map<String, Object> props) {
+ logger.debug("bindPropertyProvider: Updating PropertyProvider {}",
+ propertyProvider);
synchronized (lock) {
try {
@@ -439,8 +438,10 @@ public class OakDiscoveryService extends BaseDiscoveryService {
/**
* Unbind a property provider
*/
- protected void unbindPropertyProvider(final PropertyProvider propertyProvider, final Map<String, Object> props) {
- logger.debug("unbindPropertyProvider: Releasing PropertyProvider {}", propertyProvider);
+ protected void unbindPropertyProvider(final PropertyProvider propertyProvider,
+ final Map<String, Object> props) {
+ logger.debug("unbindPropertyProvider: Releasing PropertyProvider {}",
+ propertyProvider);
synchronized (lock) {
try {
this.unbindPropertyProviderInternal(propertyProvider, props, true);
@@ -460,7 +461,7 @@ public class OakDiscoveryService extends BaseDiscoveryService {
final Map<String, Object> props, final boolean update) {
final ProviderInfo info = new ProviderInfo(propertyProvider, props);
- if (this.providerInfos.remove(info) && update) {
+ if ( this.providerInfos.remove(info) && update ) {
if (activated) {
this.doUpdateProperties();
}
@@ -475,7 +476,6 @@ public class OakDiscoveryService extends BaseDiscoveryService {
* The properties are stored in the repository under Config.getClusterInstancesPath()
* and announced in the topology.
* <p>
- *
* @see Config#getClusterInstancesPath()
*/
private void doUpdateProperties() {
@@ -490,14 +490,14 @@ public class OakDiscoveryService extends BaseDiscoveryService {
if (rrf == null || c == null || sid == null) {
// cannot update the properties then..
logger.debug("doUpdateProperties: too early to update the properties. "
- + "resourceResolverFactory ({}), config ({}) or slingId ({}) not yet set.",
- new Object[]{rrf, c, sid});
+ + "resourceResolverFactory ({}), config ({}) or slingId ({}) not yet set.",
+ new Object[] {rrf, c, sid});
return;
} else {
logger.debug("doUpdateProperties: updating properties now..");
}
- final Map<String, String> newProps = new HashMap<>();
+ final Map<String, String> newProps = new HashMap<String, String>();
for (final ProviderInfo info : this.providerInfos) {
info.refreshProperties();
newProps.putAll(info.properties);
@@ -505,10 +505,14 @@ public class OakDiscoveryService extends BaseDiscoveryService {
ResourceResolver resourceResolver = null;
try {
- resourceResolver = rrf.getServiceResourceResolver(null);
+ resourceResolver = rrf
+ .getServiceResourceResolver(null);
Resource myInstance = ResourceHelper
- .getOrCreateResource(resourceResolver, c.getClusterInstancesPath() + "/" + sid + "/properties");
+ .getOrCreateResource(
+ resourceResolver,
+ c.getClusterInstancesPath()
+ + "/" + sid + "/properties");
// SLING-2879 - revert/refresh resourceResolver here to work
// around a potential issue with jackrabbit in a clustered environment
resourceResolver.revert();
@@ -516,33 +520,33 @@ public class OakDiscoveryService extends BaseDiscoveryService {
final ModifiableValueMap myInstanceMap = myInstance.adaptTo(ModifiableValueMap.class);
final Set<String> keys = new HashSet<String>(myInstanceMap.keySet());
- for (final String key : keys) {
+ for(final String key : keys) {
if (newProps.containsKey(key)) {
// perfect
continue;
- } else if (key.indexOf(":") != -1) {
+ } else if (key.indexOf(":")!=-1) {
// ignore
continue;
} else {
// remove
- myInstanceMap.remove(key);
+ myInstanceMap.remove(key);
}
}
boolean anyChanges = false;
- for (final Entry<String, String> entry : newProps.entrySet()) {
- Object existingValue = myInstanceMap.get(entry.getKey());
- if (entry.getValue().equals(existingValue)) {
- // SLING-3389: dont rewrite the properties if nothing changed!
+ for(final Entry<String, String> entry : newProps.entrySet()) {
+ Object existingValue = myInstanceMap.get(entry.getKey());
+ if (entry.getValue().equals(existingValue)) {
+ // SLING-3389: dont rewrite the properties if nothing changed!
if (logger.isDebugEnabled()) {
logger.debug("doUpdateProperties: unchanged: {}={}", entry.getKey(), entry.getValue());
}
- continue;
- }
- if (logger.isDebugEnabled()) {
- logger.debug("doUpdateProperties: changed: {}={}", entry.getKey(), entry.getValue());
- }
- anyChanges = true;
+ continue;
+ }
+ if (logger.isDebugEnabled()) {
+ logger.debug("doUpdateProperties: changed: {}={}", entry.getKey(), entry.getValue());
+ }
+ anyChanges = true;
myInstanceMap.put(entry.getKey(), entry.getValue());
}
@@ -550,11 +554,14 @@ public class OakDiscoveryService extends BaseDiscoveryService {
resourceResolver.commit();
}
} catch (LoginException e) {
- logger.error("handleEvent: could not log in administratively: " + e, e);
- throw new RuntimeException("Could not log in to repository (" + e + ")", e);
+ logger.error(
+ "handleEvent: could not log in administratively: " + e, e);
+ throw new RuntimeException("Could not log in to repository (" + e
+ + ")", e);
} catch (PersistenceException e) {
logger.error("handleEvent: got a PersistenceException: " + e, e);
- throw new RuntimeException( "Exception while talking to repository (" + e + ")", e);
+ throw new RuntimeException(
+ "Exception while talking to repository (" + e + ")", e);
} finally {
if (resourceResolver != null) {
resourceResolver.close();
@@ -593,7 +600,7 @@ public class OakDiscoveryService extends BaseDiscoveryService {
public final Map<String, String> properties = new HashMap<String, String>();
public ProviderInfo(final PropertyProvider provider,
- final Map<String, Object> serviceProps) {
+ final Map<String, Object> serviceProps) {
this.provider = provider;
this.propertyProperties = serviceProps.get(PropertyProvider.PROPERTY_PROPERTIES);
final Object sr = serviceProps.get(Constants.SERVICE_RANKING);
@@ -611,7 +618,7 @@ public class OakDiscoveryService extends BaseDiscoveryService {
if (this.propertyProperties instanceof String) {
final String val = provider.getProperty((String) this.propertyProperties);
if (val != null) {
- putPropertyIfValid((String) this.propertyProperties, val);
+ putPropertyIfValid((String) this.propertyProperties, val);
}
} else if (this.propertyProperties instanceof String[]) {
for (final String name : (String[]) this.propertyProperties) {
@@ -623,16 +630,14 @@ public class OakDiscoveryService extends BaseDiscoveryService {
}
}
- /**
- * SLING-2883 : put property only if valid
- **/
- private void putPropertyIfValid(final String name, final String val) {
- if (PropertyNameHelper.isValidPropertyName(name)) {
- this.properties.put(name, val);
- }
- }
+ /** SLING-2883 : put property only if valid **/
+ private void putPropertyIfValid(final String name, final String val) {
+ if (PropertyNameHelper.isValidPropertyName(name)) {
+ this.properties.put(name, val);
+ }
+ }
- /**
+ /**
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
@@ -666,7 +671,7 @@ public class OakDiscoveryService extends BaseDiscoveryService {
*/
public void checkForTopologyChange() {
viewStateManagerLock.lock();
- try {
+ try{
if (!activated) {
logger.debug("checkForTopologyChange: not yet activated, ignoring");
return;
@@ -683,7 +688,7 @@ public class OakDiscoveryService extends BaseDiscoveryService {
viewStateManager.handleChanging();
}
} finally {
- if (viewStateManagerLock != null) {
+ if (viewStateManagerLock!=null) {
viewStateManagerLock.unlock();
}
}
@@ -707,11 +712,8 @@ public class OakDiscoveryService extends BaseDiscoveryService {
return announcementRegistry;
}
- /**
- * for testing only
- *
- * @return
- */
+ /** for testing only
+ * @return */
public ViewStateManager getViewStateManager() {
return viewStateManager;
}
diff --git a/src/main/java/org/apache/sling/discovery/oak/SynchronizedClocksHealthCheck.java b/src/main/java/org/apache/sling/discovery/oak/SynchronizedClocksHealthCheck.java
index f6447bc..c5d60a2 100644
--- a/src/main/java/org/apache/sling/discovery/oak/SynchronizedClocksHealthCheck.java
+++ b/src/main/java/org/apache/sling/discovery/oak/SynchronizedClocksHealthCheck.java
@@ -25,14 +25,18 @@ import java.util.Set;
import javax.management.MBeanServer;
import javax.management.ObjectName;
+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.PropertyUnbounded;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.Service;
import org.apache.sling.discovery.base.connectors.announcement.Announcement;
import org.apache.sling.discovery.base.connectors.announcement.AnnouncementRegistry;
import org.apache.felix.hc.api.HealthCheck;
import org.apache.felix.hc.api.Result;
import org.apache.felix.hc.api.FormattingResultLog;
import org.apache.sling.settings.SlingSettingsService;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -50,12 +54,12 @@ import org.slf4j.LoggerFactory;
* info</li>
* </ul>
*/
-@Component(immediate = true, service = HealthCheck.class,
- property = {
- HealthCheck.NAME + "=Synchronized Clocks",
- HealthCheck.MBEAN_NAME + "=slingDiscoveryOakSynchronizedClocks"
- })
- //label = "Apache Sling Discovery Oak Synchronized Clocks Health Check")
+@Component(immediate = true, metatype = true, label = "Apache Sling Discovery Oak Synchronized Clocks Health Check")
+@Properties({
+ @Property(name = HealthCheck.NAME, value = "Synchronized Clocks", 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 = "slingDiscoveryOakSynchronizedClocks", description = "Health Check MBean name", label = "MBean name") })
+@Service(value = HealthCheck.class)
public class SynchronizedClocksHealthCheck implements HealthCheck {
protected final Logger logger = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/discovery/oak/TopologyWebConsolePlugin.java b/src/main/java/org/apache/sling/discovery/oak/TopologyWebConsolePlugin.java
index d6f3fa9..d671bd2 100644
--- a/src/main/java/org/apache/sling/discovery/oak/TopologyWebConsolePlugin.java
+++ b/src/main/java/org/apache/sling/discovery/oak/TopologyWebConsolePlugin.java
@@ -38,6 +38,13 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+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.Reference;
+import org.apache.felix.scr.annotations.Service;
import org.apache.felix.webconsole.AbstractWebConsolePlugin;
import org.apache.felix.webconsole.WebConsoleConstants;
import org.apache.sling.api.resource.LoginException;
@@ -60,11 +67,6 @@ import org.apache.sling.discovery.commons.InstancesDiff;
import org.apache.sling.discovery.commons.providers.spi.base.DiscoveryLiteDescriptor;
import org.apache.sling.discovery.commons.providers.spi.base.OakBacklogClusterSyncService;
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.Deactivate;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.propertytypes.ServiceDescription;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -72,14 +74,16 @@ import org.slf4j.LoggerFactory;
* Simple webconsole which gives an overview of the topology visible by the
* discovery service
*/
-@Component(service = { TopologyEventListener.class, Servlet.class },
- property = {
- WebConsoleConstants.PLUGIN_LABEL+"="+TopologyWebConsolePlugin.LABEL,
- WebConsoleConstants.PLUGIN_TITLE+"="+TopologyWebConsolePlugin.TITLE,
- "felix.webconsole.category=Sling",
- "felix.webconsole.configprinter.modes={zip}"
- })
-@ServiceDescription("Apache Sling Web Console Plugin to display Background servlets and ExecutionEngine status")
+@Component
+@Service(value = { TopologyEventListener.class, Servlet.class })
+@Properties({
+ @Property(name=org.osgi.framework.Constants.SERVICE_DESCRIPTION,
+ value="Apache Sling Web Console Plugin to display Background servlets and ExecutionEngine status"),
+ @Property(name=WebConsoleConstants.PLUGIN_LABEL, value=TopologyWebConsolePlugin.LABEL),
+ @Property(name=WebConsoleConstants.PLUGIN_TITLE, value=TopologyWebConsolePlugin.TITLE),
+ @Property(name="felix.webconsole.category", value="Sling"),
+ @Property(name="felix.webconsole.configprinter.modes", value={"zip"})
+})
@SuppressWarnings("serial")
public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implements TopologyEventListener {
diff --git a/src/main/java/org/apache/sling/discovery/oak/cluster/OakClusterViewService.java b/src/main/java/org/apache/sling/discovery/oak/cluster/OakClusterViewService.java
index 7f67375..9602860 100644
--- a/src/main/java/org/apache/sling/discovery/oak/cluster/OakClusterViewService.java
+++ b/src/main/java/org/apache/sling/discovery/oak/cluster/OakClusterViewService.java
@@ -32,6 +32,10 @@ import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
+import org.apache.felix.scr.annotations.Activate;
+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.LoginException;
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.PersistenceException;
@@ -51,16 +55,14 @@ import org.apache.sling.discovery.commons.providers.util.LogSilencer;
import org.apache.sling.discovery.commons.providers.util.ResourceHelper;
import org.apache.sling.discovery.oak.Config;
import org.apache.sling.settings.SlingSettingsService;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Oak-based implementation of the ClusterViewService interface.
*/
-@Component (service = ClusterViewService.class)
+@Component
+@Service(value = ClusterViewService.class)
public class OakClusterViewService implements ClusterViewService {
private static final String PROPERTY_CLUSTER_ID = "clusterId";
@@ -493,8 +495,10 @@ public class OakClusterViewService implements ClusterViewService {
}
private Map<String, String> readProperties(String slingId, ResourceResolver resourceResolver) {
- Resource res = resourceResolver.getResource(config.getClusterInstancesPath() + "/" + slingId);
- final Map<String, String> props = new HashMap<>();
+ Resource res = resourceResolver.getResource(
+ config.getClusterInstancesPath() + "/"
+ + slingId);
+ final Map<String, String> props = new HashMap<String, String>();
if (res != null) {
final Resource propertiesChild = res.getChild("properties");
if (propertiesChild != null) {
diff --git a/src/main/java/org/apache/sling/discovery/oak/pinger/OakViewChecker.java b/src/main/java/org/apache/sling/discovery/oak/pinger/OakViewChecker.java
index f7bbe1c..3773166 100644
--- a/src/main/java/org/apache/sling/discovery/oak/pinger/OakViewChecker.java
+++ b/src/main/java/org/apache/sling/discovery/oak/pinger/OakViewChecker.java
@@ -21,6 +21,11 @@ package org.apache.sling.discovery.oak.pinger;
import java.util.Calendar;
import java.util.UUID;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.PersistenceException;
@@ -37,10 +42,6 @@ import org.apache.sling.discovery.commons.providers.util.ResourceHelper;
import org.apache.sling.discovery.oak.Config;
import org.apache.sling.discovery.oak.OakDiscoveryService;
import org.apache.sling.settings.SlingSettingsService;
-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;
import org.osgi.service.http.HttpService;
/**
@@ -53,13 +54,11 @@ import org.osgi.service.http.HttpService;
* Remote heartbeats are POSTs to remote TopologyConnectorServlets using
* discovery.base
*/
-@Component(service = OakViewChecker.class,
- reference = {
- @Reference(name = "HttpService",
- service = HttpService.class,
- cardinality = ReferenceCardinality.MULTIPLE,
- policy = ReferencePolicy.DYNAMIC)
- })
+@Component
+@Service(value = OakViewChecker.class)
+@Reference(referenceInterface=HttpService.class,
+ cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE,
+ policy=ReferencePolicy.DYNAMIC)
public class OakViewChecker extends BaseViewChecker {
@Reference
diff --git a/src/test/java/org/apache/sling/discovery/oak/OakDiscoveryServiceTest.java b/src/test/java/org/apache/sling/discovery/oak/OakDiscoveryServiceTest.java
index 08d1768..c2392cf 100644
--- a/src/test/java/org/apache/sling/discovery/oak/OakDiscoveryServiceTest.java
+++ b/src/test/java/org/apache/sling/discovery/oak/OakDiscoveryServiceTest.java
@@ -56,7 +56,6 @@ import org.apache.sling.discovery.oak.its.setup.OakTestConfig;
import org.apache.sling.discovery.oak.its.setup.OakVirtualInstanceBuilder;
import org.apache.sling.discovery.oak.its.setup.SimulatedLease;
import org.apache.sling.discovery.oak.its.setup.SimulatedLeaseCollection;
-
import org.junit.After;
import org.junit.Before;
import org.junit.Test;