KNOX-2395 - Make Gateway Services Pluggable (#358)
diff --git a/gateway-release/home/conf/gateway-site.xml b/gateway-release/home/conf/gateway-site.xml
index 2b214da..7ca8705 100644
--- a/gateway-release/home/conf/gateway-site.xml
+++ b/gateway-release/home/conf/gateway-site.xml
@@ -19,6 +19,10 @@
<configuration>
<property>
+ <name>gateway.service.alias.impl</name>
+ <value>org.apache.knox.gateway.services.security.impl.RemoteAliasService</value>
+ </property>
+ <property>
<name>gateway.port</name>
<value>8443</value>
<description>The HTTP port for the Gateway.</description>
diff --git a/gateway-server/pom.xml b/gateway-server/pom.xml
index 5afed31..142101e 100644
--- a/gateway-server/pom.xml
+++ b/gateway-server/pom.xml
@@ -71,6 +71,10 @@
</dependency>
<dependency>
<groupId>org.apache.knox</groupId>
+ <artifactId>gateway-service-hashicorp-vault</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.knox</groupId>
<artifactId>gateway-i18n</artifactId>
</dependency>
<dependency>
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/GatewayMessages.java b/gateway-server/src/main/java/org/apache/knox/gateway/GatewayMessages.java
index 18c3a4b..3c18484 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/GatewayMessages.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/GatewayMessages.java
@@ -698,4 +698,10 @@
@Message(level = MessageLevel.ERROR, text = "Error creating provider descriptor {0} from topology {1}, cause: {2}")
void errorSavingDescriptorConfiguration(String providerPath, String topologyName, String message);
+
+ @Message(level = MessageLevel.ERROR, text = "No service found by type {0}")
+ void noServiceFound(String serviceType);
+
+ @Message(level = MessageLevel.INFO, text = "Using {0} implementation for {1}")
+ void usingServiceImplementation(String implementation, String serviceType);
}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/config/impl/GatewayConfigImpl.java b/gateway-server/src/main/java/org/apache/knox/gateway/config/impl/GatewayConfigImpl.java
index d03deec..2968b44 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/config/impl/GatewayConfigImpl.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/config/impl/GatewayConfigImpl.java
@@ -97,6 +97,7 @@
private static final String[] GATEWAY_CONFIG_FILENAMES = {GATEWAY_CONFIG_FILE_PREFIX + "-default.xml", GATEWAY_CONFIG_FILE_PREFIX + "-site.xml"};
+ private static final String GATEWAY_SERVICE_PREFIX = GATEWAY_CONFIG_FILE_PREFIX + ".service.";
public static final String HTTP_HOST = GATEWAY_CONFIG_FILE_PREFIX + ".host";
public static final String HTTP_PORT = GATEWAY_CONFIG_FILE_PREFIX + ".port";
public static final String HTTP_PATH = GATEWAY_CONFIG_FILE_PREFIX + ".path";
@@ -1165,4 +1166,10 @@
return getBoolean(KNOX_TOKEN_PERMISSIVE_VALIDATION_ENABLED,
KNOX_TOKEN_PERMISSIVE_VALIDATION_ENABLED_DEFAULT);
}
+
+ @Override
+ public String getServiceParameter(String service, String parameter) {
+ return get(GATEWAY_SERVICE_PREFIX + service + "." + parameter, "");
+ }
+
}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/CLIGatewayServices.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/CLIGatewayServices.java
index 1223be1..4fdbf55 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/services/CLIGatewayServices.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/CLIGatewayServices.java
@@ -17,44 +17,28 @@
*/
package org.apache.knox.gateway.services;
+import java.util.List;
+import java.util.Map;
+
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.deploy.DeploymentContext;
import org.apache.knox.gateway.descriptor.FilterParamDescriptor;
import org.apache.knox.gateway.descriptor.ResourceDescriptor;
-import org.apache.knox.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceFactory;
-import org.apache.knox.gateway.services.config.client.RemoteConfigurationRegistryClientService;
-import org.apache.knox.gateway.services.security.impl.RemoteAliasService;
-import org.apache.knox.gateway.services.topology.impl.DefaultTopologyService;
-import org.apache.knox.gateway.services.security.impl.DefaultAliasService;
-import org.apache.knox.gateway.services.security.impl.DefaultCryptoService;
-import org.apache.knox.gateway.services.security.impl.DefaultKeystoreService;
import org.apache.knox.gateway.services.security.impl.CLIMasterService;
import org.apache.knox.gateway.topology.Provider;
-import java.util.List;
-import java.util.Map;
-
public class CLIGatewayServices extends AbstractGatewayServices {
+ private final GatewayServiceFactory gatewayServiceFactory = new GatewayServiceFactory();
+
public CLIGatewayServices() {
super("Services", "GatewayServices");
}
@Override
public void init(GatewayConfig config, Map<String,String> options) throws ServiceLifecycleException {
- CLIMasterService ms = new CLIMasterService();
- ms.init(config, options);
- addService(ServiceType.MASTER_SERVICE, ms);
-
- DefaultKeystoreService ks = new DefaultKeystoreService();
- ks.setMasterService(ms);
- ks.init(config, options);
- addService(ServiceType.KEYSTORE_SERVICE, ks);
-
- DefaultAliasService defaultAlias = new DefaultAliasService();
- defaultAlias.setKeystoreService(ks);
- defaultAlias.setMasterService(ms);
- defaultAlias.init(config, options);
+ addService(ServiceType.MASTER_SERVICE, gatewayServiceFactory.create(this, ServiceType.MASTER_SERVICE, config, options, CLIMasterService.class.getName()));
+ addService(ServiceType.KEYSTORE_SERVICE, gatewayServiceFactory.create(this, ServiceType.KEYSTORE_SERVICE, config, options));
/*
Doesn't make sense for this to be set to the remote alias service since the impl could
@@ -62,32 +46,13 @@
IE: If ZK digest auth and using ZK remote alias service, then wouldn't be able to connect
to ZK anyway due to the circular dependency.
*/
- final RemoteConfigurationRegistryClientService registryClientService =
- RemoteConfigurationRegistryClientServiceFactory.newInstance(config);
- registryClientService.setAliasService(defaultAlias);
- registryClientService.init(config, options);
- addService(ServiceType.REMOTE_REGISTRY_CLIENT_SERVICE, registryClientService);
+ addService(ServiceType.REMOTE_REGISTRY_CLIENT_SERVICE, gatewayServiceFactory.create(this, ServiceType.REMOTE_REGISTRY_CLIENT_SERVICE, config, options));
+ addService(ServiceType.ALIAS_SERVICE, gatewayServiceFactory.create(this, ServiceType.ALIAS_SERVICE, config, options));
- /* create an instance so that it can be passed to other services */
- final RemoteAliasService alias = new RemoteAliasService(defaultAlias, ms);
- /*
- * Setup and initialize remote Alias Service.
- * NOTE: registryClientService.init() needs to
- * be called before alias.start();
- */
- alias.init(config, options);
- addService(ServiceType.ALIAS_SERVICE, alias);
+ addService(ServiceType.CRYPTO_SERVICE, gatewayServiceFactory.create(this, ServiceType.CRYPTO_SERVICE, config, options));
- DefaultCryptoService crypto = new DefaultCryptoService();
- crypto.setKeystoreService(ks);
- crypto.setAliasService(alias);
- crypto.init(config, options);
- addService(ServiceType.CRYPTO_SERVICE, crypto);
-
- DefaultTopologyService tops = new DefaultTopologyService();
- tops.init( config, options );
- addService(ServiceType.TOPOLOGY_SERVICE, tops);
+ addService(ServiceType.TOPOLOGY_SERVICE, gatewayServiceFactory.create(this, ServiceType.TOPOLOGY_SERVICE, config, options));
}
@Override
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/DefaultGatewayServices.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/DefaultGatewayServices.java
index b120dec..0517763 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/services/DefaultGatewayServices.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/DefaultGatewayServices.java
@@ -17,37 +17,22 @@
*/
package org.apache.knox.gateway.services;
+import java.util.List;
+import java.util.Map;
+
import org.apache.knox.gateway.GatewayMessages;
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.deploy.DeploymentContext;
import org.apache.knox.gateway.descriptor.FilterParamDescriptor;
import org.apache.knox.gateway.descriptor.ResourceDescriptor;
import org.apache.knox.gateway.i18n.messages.MessagesFactory;
-import org.apache.knox.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceFactory;
-import org.apache.knox.gateway.services.config.client.RemoteConfigurationRegistryClientService;
-import org.apache.knox.gateway.services.registry.impl.DefaultServiceDefinitionRegistry;
-import org.apache.knox.gateway.services.metrics.impl.DefaultMetricsService;
import org.apache.knox.gateway.services.security.KeystoreService;
-import org.apache.knox.gateway.services.security.impl.RemoteAliasService;
-import org.apache.knox.gateway.services.token.impl.AliasBasedTokenStateService;
-import org.apache.knox.gateway.services.topology.impl.DefaultClusterConfigurationMonitorService;
-import org.apache.knox.gateway.services.topology.impl.DefaultTopologyService;
-import org.apache.knox.gateway.services.hostmap.impl.DefaultHostMapperService;
-import org.apache.knox.gateway.services.registry.impl.DefaultServiceRegistryService;
import org.apache.knox.gateway.services.security.KeystoreServiceException;
-import org.apache.knox.gateway.services.security.impl.DefaultAliasService;
-import org.apache.knox.gateway.services.security.impl.DefaultCryptoService;
-import org.apache.knox.gateway.services.security.impl.DefaultKeystoreService;
-import org.apache.knox.gateway.services.security.impl.DefaultMasterService;
-import org.apache.knox.gateway.services.security.impl.JettySSLService;
-import org.apache.knox.gateway.services.token.impl.DefaultTokenAuthorityService;
import org.apache.knox.gateway.topology.Provider;
-import java.util.List;
-import java.util.Map;
-
public class DefaultGatewayServices extends AbstractGatewayServices {
private static GatewayMessages log = MessagesFactory.get( GatewayMessages.class );
+ private final GatewayServiceFactory gatewayServiceFactory = new GatewayServiceFactory();
public DefaultGatewayServices() {
super("Services", "GatewayServices");
@@ -55,19 +40,9 @@
@Override
public void init(GatewayConfig config, Map<String,String> options) throws ServiceLifecycleException {
- DefaultMasterService ms = new DefaultMasterService();
- ms.init(config, options);
- addService(ServiceType.MASTER_SERVICE, ms);
-
- DefaultKeystoreService ks = new DefaultKeystoreService();
- ks.setMasterService(ms);
- ks.init(config, options);
- addService(ServiceType.KEYSTORE_SERVICE, ks);
-
- final DefaultAliasService defaultAlias = new DefaultAliasService();
- defaultAlias.setKeystoreService(ks);
- defaultAlias.setMasterService(ms);
- defaultAlias.init(config, options);
+ //order is important: different service factory implementations may use already added services
+ addService(ServiceType.MASTER_SERVICE, gatewayServiceFactory.create(this, ServiceType.MASTER_SERVICE, config, options));
+ addService(ServiceType.KEYSTORE_SERVICE, gatewayServiceFactory.create(this, ServiceType.KEYSTORE_SERVICE, config, options));
/*
Doesn't make sense for this to be set to the remote alias service since the impl could
@@ -75,80 +50,34 @@
IE: If ZK digest auth and using ZK remote alias service, then wouldn't be able to connect
to ZK anyway due to the circular dependency.
*/
- final RemoteConfigurationRegistryClientService registryClientService =
- RemoteConfigurationRegistryClientServiceFactory.newInstance(config);
- registryClientService.setAliasService(defaultAlias);
- registryClientService.init(config, options);
- addService(ServiceType.REMOTE_REGISTRY_CLIENT_SERVICE, registryClientService);
+ addService(ServiceType.REMOTE_REGISTRY_CLIENT_SERVICE, gatewayServiceFactory.create(this, ServiceType.REMOTE_REGISTRY_CLIENT_SERVICE, config, options));
+ addService(ServiceType.ALIAS_SERVICE, gatewayServiceFactory.create(this, ServiceType.ALIAS_SERVICE, config, options));
- /* create an instance so that it can be passed to other services */
- final RemoteAliasService alias = new RemoteAliasService(defaultAlias, ms);
- /*
- * Setup and initialize remote Alias Service.
- * NOTE: registryClientService.init() needs to
- * be called before alias.start();
- */
- alias.init(config, options);
- addService(ServiceType.ALIAS_SERVICE, alias);
+ addService(ServiceType.CRYPTO_SERVICE, gatewayServiceFactory.create(this, ServiceType.CRYPTO_SERVICE, config, options));
- DefaultCryptoService crypto = new DefaultCryptoService();
- crypto.setKeystoreService(ks);
- crypto.setAliasService(alias);
- crypto.init(config, options);
- addService(ServiceType.CRYPTO_SERVICE, crypto);
-
- JettySSLService ssl = new JettySSLService();
- ssl.setAliasService(alias);
- ssl.setKeystoreService(ks);
- ssl.init(config, options);
- addService(ServiceType.SSL_SERVICE, ssl);
+ addService(ServiceType.SSL_SERVICE, gatewayServiceFactory.create(this, ServiceType.SSL_SERVICE, config, options));
// The DefaultTokenAuthorityService needs to be initialized after the JettySSLService to ensure
// that the signing keystore is available for it.
- DefaultTokenAuthorityService ts = new DefaultTokenAuthorityService();
- ts.setAliasService(alias);
- ts.setKeystoreService(ks);
- ts.init(config, options);
- // prolly should not allow the token service to be looked up?
- addService(ServiceType.TOKEN_SERVICE, ts);
+ // probably should not allow the token service to be looked up?
+ addService(ServiceType.TOKEN_SERVICE, gatewayServiceFactory.create(this, ServiceType.TOKEN_SERVICE, config, options));
- AliasBasedTokenStateService tss = new AliasBasedTokenStateService();
- tss.setAliasService(alias);
- tss.init(config, options);
- addService(ServiceType.TOKEN_STATE_SERVICE, tss);
+ addService(ServiceType.TOKEN_STATE_SERVICE, gatewayServiceFactory.create(this, ServiceType.TOKEN_STATE_SERVICE, config, options));
- DefaultServiceRegistryService sr = new DefaultServiceRegistryService();
- sr.setCryptoService( crypto );
- sr.init( config, options );
- addService(ServiceType.SERVICE_REGISTRY_SERVICE, sr);
+ addService(ServiceType.SERVICE_REGISTRY_SERVICE, gatewayServiceFactory.create(this, ServiceType.SERVICE_REGISTRY_SERVICE, config, options));
- DefaultHostMapperService hm = new DefaultHostMapperService();
- hm.init( config, options );
- addService(ServiceType.HOST_MAPPING_SERVICE, hm );
+ addService(ServiceType.HOST_MAPPING_SERVICE, gatewayServiceFactory.create(this, ServiceType.HOST_MAPPING_SERVICE, config, options));
- DefaultServerInfoService sis = new DefaultServerInfoService();
- sis.init( config, options );
- addService(ServiceType.SERVER_INFO_SERVICE, sis );
+ addService(ServiceType.SERVER_INFO_SERVICE, gatewayServiceFactory.create(this, ServiceType.SERVER_INFO_SERVICE, config, options));
- DefaultClusterConfigurationMonitorService ccs = new DefaultClusterConfigurationMonitorService();
- ccs.setAliasService(alias);
- ccs.setKeystoreService(ks);
- ccs.init(config, options);
- addService(ServiceType.CLUSTER_CONFIGURATION_MONITOR_SERVICE, ccs);
+ addService(ServiceType.CLUSTER_CONFIGURATION_MONITOR_SERVICE, gatewayServiceFactory.create(this, ServiceType.CLUSTER_CONFIGURATION_MONITOR_SERVICE, config, options));
- DefaultTopologyService tops = new DefaultTopologyService();
- tops.setAliasService(alias);
- tops.init( config, options );
- addService(ServiceType.TOPOLOGY_SERVICE, tops );
+ addService(ServiceType.TOPOLOGY_SERVICE, gatewayServiceFactory.create(this, ServiceType.TOPOLOGY_SERVICE, config, options));
- DefaultServiceDefinitionRegistry sdr = new DefaultServiceDefinitionRegistry();
- sdr.init( config, options );
- addService(ServiceType.SERVICE_DEFINITION_REGISTRY, sdr );
+ addService(ServiceType.SERVICE_DEFINITION_REGISTRY, gatewayServiceFactory.create(this, ServiceType.SERVICE_DEFINITION_REGISTRY, config, options));
- DefaultMetricsService metricsService = new DefaultMetricsService();
- metricsService.init( config, options );
- addService(ServiceType.METRICS_SERVICE, metricsService );
+ addService(ServiceType.METRICS_SERVICE, gatewayServiceFactory.create(this, ServiceType.METRICS_SERVICE, config, options));
}
@Override
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/GatewayServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/GatewayServiceFactory.java
new file mode 100644
index 0000000..3e43bc2
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/GatewayServiceFactory.java
@@ -0,0 +1,61 @@
+/*
+ * 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.knox.gateway.services;
+
+import java.util.Map;
+import java.util.ServiceLoader;
+
+import org.apache.knox.gateway.GatewayMessages;
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.i18n.messages.MessagesFactory;
+
+public class GatewayServiceFactory implements ServiceFactory {
+ private static final GatewayMessages LOG = MessagesFactory.get(GatewayMessages.class);
+ private ServiceLoader<ServiceFactory> serviceFactories;
+
+ @Override
+ public Service create(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options) throws ServiceLifecycleException {
+ return create(gatewayServices, serviceType, gatewayConfig, options, null);
+ }
+
+ @Override
+ public Service create(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ Service service = null;
+ for (ServiceFactory serviceFactory : getServiceFactories()) {
+ service = implementation == null ? serviceFactory.create(gatewayServices, serviceType, gatewayConfig, options)
+ : serviceFactory.create(gatewayServices, serviceType, gatewayConfig, options, implementation);
+ if (service != null) {
+ break;
+ }
+ }
+ if (service != null) {
+ service.init(gatewayConfig, options);
+ } else {
+ LOG.noServiceFound(serviceType.getServiceTypeName());
+ }
+ return service;
+ }
+
+ private ServiceLoader<ServiceFactory> getServiceFactories() {
+ if (serviceFactories == null) {
+ serviceFactories = ServiceLoader.load(ServiceFactory.class);
+ }
+ return serviceFactories;
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/AbstractServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/AbstractServiceFactory.java
new file mode 100644
index 0000000..ab02ec0
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/AbstractServiceFactory.java
@@ -0,0 +1,114 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.knox.gateway.GatewayMessages;
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.i18n.messages.MessagesFactory;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceFactory;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.KeystoreService;
+import org.apache.knox.gateway.services.security.MasterService;
+
+public abstract class AbstractServiceFactory implements ServiceFactory {
+
+ private static final GatewayMessages LOG = MessagesFactory.get(GatewayMessages.class);
+ private static final String IMPLEMENTATION_PARAM_NAME = "impl";
+ private static final String EMPTY_DEFAULT_IMPLEMENTATION = "";
+
+ @Override
+ public Service create(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options) throws ServiceLifecycleException {
+ return create(gatewayServices, serviceType, gatewayConfig, options, getImplementation(gatewayConfig));
+ }
+
+ @Override
+ public Service create(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ Service service = null;
+ if (getServiceType() == serviceType) {
+ service = createService(gatewayServices, serviceType, gatewayConfig, options, implementation);
+ if (service == null && StringUtils.isNotBlank(implementation)) {
+ // no known service implementation created, try to create the custom one
+ try {
+ service = Service.class.cast(Class.forName(implementation).newInstance());
+ logServiceUsage(implementation, serviceType);
+ } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
+ throw new ServiceLifecycleException("Errror while instantiating " + serviceType.getShortName() + " service implementation " + implementation, e);
+ }
+ }
+ }
+ return service;
+ }
+
+ protected String getImplementation(GatewayConfig gatewayConfig) {
+ return gatewayConfig.getServiceParameter(getServiceType().getShortName(), IMPLEMENTATION_PARAM_NAME);
+ }
+
+ protected boolean matchesImplementation(String implementation, Class<? extends Object> clazz) {
+ return matchesImplementation(implementation, clazz, false);
+ }
+
+ protected boolean matchesImplementation(String implementation, Class<? extends Object> clazz, boolean acceptEmptyImplementation) {
+ boolean match = clazz.getName().equals(implementation);
+ if (!match && acceptEmptyImplementation) {
+ match = isEmptyDefaultImplementation(implementation);
+ }
+ return match;
+ }
+
+ private boolean isEmptyDefaultImplementation(String implementation) {
+ return EMPTY_DEFAULT_IMPLEMENTATION.equals(implementation);
+ }
+
+ protected boolean shouldCreateService(String implementation) {
+ return implementation == null || isEmptyDefaultImplementation(implementation) || getKnownImplementations().contains(implementation);
+ }
+
+ protected MasterService getMasterService(GatewayServices gatewayServices) {
+ return gatewayServices.getService(ServiceType.MASTER_SERVICE);
+ }
+
+ protected KeystoreService getKeystoreService(GatewayServices gatewayServices) {
+ return gatewayServices.getService(ServiceType.KEYSTORE_SERVICE);
+ }
+
+ protected AliasService getAliasService(GatewayServices gatewayServices) {
+ return gatewayServices.getService(ServiceType.ALIAS_SERVICE);
+ }
+
+ protected void logServiceUsage(String implementation, ServiceType serviceType) {
+ LOG.usingServiceImplementation("".equals(implementation) ? "default" : implementation, serviceType.getServiceTypeName());
+ }
+
+ // abstract methods
+
+ protected abstract Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options,
+ String implementation) throws ServiceLifecycleException;
+
+ protected abstract ServiceType getServiceType();
+
+ protected abstract Collection<String> getKnownImplementations();
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/AliasServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/AliasServiceFactory.java
new file mode 100644
index 0000000..d3e3227
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/AliasServiceFactory.java
@@ -0,0 +1,75 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.unmodifiableList;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.knox.gateway.backend.hashicorp.vault.HashicorpVaultAliasService;
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.impl.DefaultAliasService;
+import org.apache.knox.gateway.services.security.impl.RemoteAliasService;
+import org.apache.knox.gateway.services.security.impl.ZookeeperRemoteAliasService;
+import org.apache.knox.gateway.services.security.impl.ZookeeperRemoteAliasServiceProvider;
+
+public class AliasServiceFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ Service service = null;
+ if (shouldCreateService(implementation)) {
+ final AliasService defaultAliasService = new DefaultAliasService();
+ ((DefaultAliasService) defaultAliasService).setMasterService(getMasterService(gatewayServices));
+ ((DefaultAliasService) defaultAliasService).setKeystoreService(getKeystoreService(gatewayServices));
+ defaultAliasService.init(gatewayConfig, options); // invoking init on DefaultAliasService twice is ok (in case implementation is set to 'default')
+
+ if (matchesImplementation(implementation, DefaultAliasService.class, true)) {
+ service = defaultAliasService;
+ } else if (matchesImplementation(implementation, HashicorpVaultAliasService.class)) {
+ service = new HashicorpVaultAliasService(defaultAliasService);
+ } else if (matchesImplementation(implementation, RemoteAliasService.class)) {
+ service = new RemoteAliasService(defaultAliasService, getMasterService(gatewayServices));
+ } else if (matchesImplementation(implementation, ZookeeperRemoteAliasService.class)) {
+ service = new ZookeeperRemoteAliasServiceProvider().newInstance(defaultAliasService, getMasterService(gatewayServices));
+ }
+
+ logServiceUsage(implementation, serviceType);
+ }
+ return service;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.ALIAS_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return unmodifiableList(
+ asList(DefaultAliasService.class.getName(), HashicorpVaultAliasService.class.getName(), RemoteAliasService.class.getName(), ZookeeperRemoteAliasService.class.getName()));
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/ClusterConfigurationMonitorServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/ClusterConfigurationMonitorServiceFactory.java
new file mode 100644
index 0000000..14fe584
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/ClusterConfigurationMonitorServiceFactory.java
@@ -0,0 +1,54 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.topology.impl.DefaultClusterConfigurationMonitorService;
+
+public class ClusterConfigurationMonitorServiceFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ Service service = null;
+ if (shouldCreateService(implementation)) {
+ service = new DefaultClusterConfigurationMonitorService();
+ ((DefaultClusterConfigurationMonitorService) service).setAliasService(getAliasService(gatewayServices));
+ ((DefaultClusterConfigurationMonitorService) service).setKeystoreService(getKeystoreService(gatewayServices));
+ }
+ return service;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.CLUSTER_CONFIGURATION_MONITOR_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return Collections.singleton(DefaultClusterConfigurationMonitorService.class.getName());
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/CryptoServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/CryptoServiceFactory.java
new file mode 100644
index 0000000..59daca1
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/CryptoServiceFactory.java
@@ -0,0 +1,54 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.security.impl.DefaultCryptoService;
+
+public class CryptoServiceFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ Service service = null;
+ if (shouldCreateService(implementation)) {
+ service = new DefaultCryptoService();
+ ((DefaultCryptoService) service).setKeystoreService(getKeystoreService(gatewayServices));
+ ((DefaultCryptoService) service).setAliasService(getAliasService(gatewayServices));
+ }
+ return service;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.CRYPTO_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return Collections.singleton(DefaultCryptoService.class.getName());
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/HostMappingServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/HostMappingServiceFactory.java
new file mode 100644
index 0000000..549abd2
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/HostMappingServiceFactory.java
@@ -0,0 +1,48 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.hostmap.impl.DefaultHostMapperService;
+
+public class HostMappingServiceFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ return shouldCreateService(implementation) ? new DefaultHostMapperService() : null;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.HOST_MAPPING_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return Collections.singleton(DefaultHostMapperService.class.getName());
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/KeystoreServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/KeystoreServiceFactory.java
new file mode 100644
index 0000000..ee83c22
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/KeystoreServiceFactory.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.knox.gateway.services.factory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.security.impl.DefaultKeystoreService;
+
+public class KeystoreServiceFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ Service service = null;
+ if (shouldCreateService(implementation)) {
+ service = new DefaultKeystoreService();
+ ((DefaultKeystoreService) service).setMasterService(getMasterService(gatewayServices));
+ }
+ return service;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.KEYSTORE_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return Collections.singleton(DefaultKeystoreService.class.getName());
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/MasterServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/MasterServiceFactory.java
new file mode 100644
index 0000000..4b7d167
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/MasterServiceFactory.java
@@ -0,0 +1,62 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.unmodifiableList;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.security.impl.CLIMasterService;
+import org.apache.knox.gateway.services.security.impl.DefaultMasterService;
+
+public class MasterServiceFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ Service service = null;
+ if (shouldCreateService(implementation)) {
+ if (matchesImplementation(implementation, DefaultMasterService.class, true)) {
+ service = new DefaultMasterService();
+ } else if (matchesImplementation(implementation, CLIMasterService.class)) {
+ service = new CLIMasterService();
+ }
+
+ logServiceUsage(implementation, serviceType);
+ }
+
+ return service;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.MASTER_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return unmodifiableList(asList(DefaultMasterService.class.getName(), CLIMasterService.class.getName()));
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/MetricsServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/MetricsServiceFactory.java
new file mode 100644
index 0000000..af200e1
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/MetricsServiceFactory.java
@@ -0,0 +1,48 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.metrics.impl.DefaultMetricsService;
+
+public class MetricsServiceFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ return shouldCreateService(implementation) ? new DefaultMetricsService() : null;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.METRICS_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return Collections.singleton(DefaultMetricsService.class.getName());
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/RemoteRegistryClientServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/RemoteRegistryClientServiceFactory.java
new file mode 100644
index 0000000..1ae7fe8
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/RemoteRegistryClientServiceFactory.java
@@ -0,0 +1,67 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceFactory;
+import org.apache.knox.gateway.service.config.remote.zk.ZooKeeperClientService;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.config.client.RemoteConfigurationRegistryClientService;
+import org.apache.knox.gateway.services.security.AliasService;
+
+// There are two implementations of 'RemoteConfigurationRegistryClientService':
+// - LocalFileSystemRemoteConfigurationRegistryClientService
+// - CuratorClientService
+// However, the first one - local - is for test-only purposes
+public class RemoteRegistryClientServiceFactory extends AbstractServiceFactory {
+
+ private final AliasServiceFactory aliasServiceFactory = new AliasServiceFactory();
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ Service service = null;
+ if (shouldCreateService(implementation)) {
+ service = RemoteConfigurationRegistryClientServiceFactory.newInstance(gatewayConfig);
+ // it should be the 'default' alias service
+ final AliasService localAliasService = (AliasService) aliasServiceFactory.create(gatewayServices, ServiceType.ALIAS_SERVICE, gatewayConfig, options, "");
+ localAliasService.init(gatewayConfig, options);
+ ((RemoteConfigurationRegistryClientService) service).setAliasService(localAliasService);
+ }
+ return service;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.REMOTE_REGISTRY_CLIENT_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return Collections.singleton(ZooKeeperClientService.class.getName());
+ }
+
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/ServerInfoServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/ServerInfoServiceFactory.java
new file mode 100644
index 0000000..b9605a0
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/ServerInfoServiceFactory.java
@@ -0,0 +1,48 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.DefaultServerInfoService;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+
+public class ServerInfoServiceFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ return shouldCreateService(implementation) ? new DefaultServerInfoService() : null;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.SERVER_INFO_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return Collections.singleton(DefaultServerInfoService.class.getName());
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/ServiceDefinitionRegistryFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/ServiceDefinitionRegistryFactory.java
new file mode 100644
index 0000000..7961f07
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/ServiceDefinitionRegistryFactory.java
@@ -0,0 +1,48 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.registry.impl.DefaultServiceDefinitionRegistry;
+
+public class ServiceDefinitionRegistryFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ return shouldCreateService(implementation) ? new DefaultServiceDefinitionRegistry() : null;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.SERVICE_DEFINITION_REGISTRY;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return Collections.singleton(DefaultServiceDefinitionRegistry.class.getName());
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/ServiceRegistryServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/ServiceRegistryServiceFactory.java
new file mode 100644
index 0000000..f1be4e3
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/ServiceRegistryServiceFactory.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.knox.gateway.services.factory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.registry.impl.DefaultServiceRegistryService;
+
+public class ServiceRegistryServiceFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ Service service = null;
+ if (shouldCreateService(implementation)) {
+ service = new DefaultServiceRegistryService();
+ ((DefaultServiceRegistryService) service).setCryptoService(gatewayServices.getService(ServiceType.CRYPTO_SERVICE));
+ }
+ return service;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.SERVICE_REGISTRY_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return Collections.singleton(DefaultServiceRegistryService.class.getName());
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/SslServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/SslServiceFactory.java
new file mode 100644
index 0000000..f1792f0
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/SslServiceFactory.java
@@ -0,0 +1,54 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.security.impl.JettySSLService;
+
+public class SslServiceFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ Service service = null;
+ if (shouldCreateService(implementation)) {
+ service = new JettySSLService();
+ ((JettySSLService) service).setKeystoreService(getKeystoreService(gatewayServices));
+ ((JettySSLService) service).setAliasService(getAliasService(gatewayServices));
+ }
+ return service;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.SSL_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return Collections.singleton(JettySSLService.class.getName());
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/TokenServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/TokenServiceFactory.java
new file mode 100644
index 0000000..f03deeb
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/TokenServiceFactory.java
@@ -0,0 +1,54 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.token.impl.DefaultTokenAuthorityService;
+
+public class TokenServiceFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ Service service = null;
+ if (shouldCreateService(implementation)) {
+ service = new DefaultTokenAuthorityService();
+ ((DefaultTokenAuthorityService) service).setKeystoreService(getKeystoreService(gatewayServices));
+ ((DefaultTokenAuthorityService) service).setAliasService(getAliasService(gatewayServices));
+ }
+ return service;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.TOKEN_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return Collections.singleton(DefaultTokenAuthorityService.class.getName());
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/TokenStateServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/TokenStateServiceFactory.java
new file mode 100644
index 0000000..800fcb2
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/TokenStateServiceFactory.java
@@ -0,0 +1,66 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.unmodifiableList;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.token.impl.AliasBasedTokenStateService;
+import org.apache.knox.gateway.services.token.impl.DefaultTokenStateService;
+import org.apache.knox.gateway.services.token.impl.JournalBasedTokenStateService;
+
+public class TokenStateServiceFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ Service service = null;
+ if (shouldCreateService(implementation)) {
+ if (matchesImplementation(implementation, DefaultTokenStateService.class, true)) {
+ service = new DefaultTokenStateService();
+ } else if (matchesImplementation(implementation, AliasBasedTokenStateService.class)) {
+ service = new AliasBasedTokenStateService();
+ ((AliasBasedTokenStateService) service).setAliasService(getAliasService(gatewayServices));
+ } else if (matchesImplementation(implementation, JournalBasedTokenStateService.class)) {
+ service = new JournalBasedTokenStateService();
+ }
+
+ logServiceUsage(implementation, serviceType);
+ }
+
+ return service;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.TOKEN_STATE_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return unmodifiableList(asList(DefaultTokenStateService.class.getName(), AliasBasedTokenStateService.class.getName(), JournalBasedTokenStateService.class.getName()));
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/TopologyServiceFactory.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/TopologyServiceFactory.java
new file mode 100644
index 0000000..74dffd5
--- /dev/null
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/factory/TopologyServiceFactory.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.knox.gateway.services.factory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.topology.impl.DefaultTopologyService;
+
+public class TopologyServiceFactory extends AbstractServiceFactory {
+
+ @Override
+ protected Service createService(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException {
+ Service service = null;
+ if (shouldCreateService(implementation)) {
+ service = new DefaultTopologyService();
+ ((DefaultTopologyService) service).setAliasService(getAliasService(gatewayServices));
+ }
+ return service;
+ }
+
+ @Override
+ protected ServiceType getServiceType() {
+ return ServiceType.TOPOLOGY_SERVICE;
+ }
+
+ @Override
+ protected Collection<String> getKnownImplementations() {
+ return Collections.singleton(DefaultTopologyService.class.getName());
+ }
+}
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/DefaultCryptoService.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/DefaultCryptoService.java
index 755eb60..788055f 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/DefaultCryptoService.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/DefaultCryptoService.java
@@ -43,23 +43,23 @@
private static final Map<String,ConfigurableEncryptor> ENCRYPTOR_CACHE = new HashMap<>();
- private AliasService as;
- private KeystoreService ks;
+ private AliasService aliasService;
+ private KeystoreService keystoreService;
private GatewayConfig config;
public void setKeystoreService(KeystoreService ks) {
- this.ks = ks;
+ this.keystoreService = ks;
}
public void setAliasService(AliasService as) {
- this.as = as;
+ this.aliasService = as;
}
@Override
public void init(GatewayConfig config, Map<String, String> options)
throws ServiceLifecycleException {
this.config = config;
- if (as == null) {
+ if (aliasService == null) {
throw new ServiceLifecycleException("Alias service is not set");
}
}
@@ -77,7 +77,7 @@
@Override
public void createAndStoreEncryptionKeyForCluster(String clusterName, String alias) {
try {
- as.generateAliasForCluster(clusterName, alias);
+ aliasService.generateAliasForCluster(clusterName, alias);
} catch (AliasServiceException e) {
e.printStackTrace();
}
@@ -87,7 +87,7 @@
public EncryptionResult encryptForCluster(String clusterName, String alias, byte[] clear) {
char[] password = null;
try {
- password = as.getPasswordFromAliasForCluster(clusterName, alias);
+ password = aliasService.getPasswordFromAliasForCluster(clusterName, alias);
} catch (AliasServiceException e2) {
e2.printStackTrace();
}
@@ -111,7 +111,7 @@
try {
char[] password;
ConfigurableEncryptor encryptor;
- password = as.getPasswordFromAliasForCluster(clusterName, alias);
+ password = aliasService.getPasswordFromAliasForCluster(clusterName, alias);
if (password != null) {
encryptor = getEncryptor(clusterName,password );
try {
@@ -134,7 +134,7 @@
boolean verified = false;
try {
Signature sig=Signature.getInstance(algorithm);
- sig.initVerify(ks.getCertificateForGateway().getPublicKey());
+ sig.initVerify(keystoreService.getCertificateForGateway().getPublicKey());
sig.update(signed.getBytes(StandardCharsets.UTF_8));
verified = sig.verify(signature);
} catch (SignatureException | KeystoreServiceException | InvalidKeyException | NoSuchAlgorithmException | KeyStoreException e) {
@@ -148,8 +148,8 @@
public byte[] sign(String algorithm, String payloadToSign) {
try {
char[] passphrase;
- passphrase = as.getGatewayIdentityPassphrase();
- PrivateKey privateKey = (PrivateKey) ks.getKeyForGateway(passphrase);
+ passphrase = aliasService.getGatewayIdentityPassphrase();
+ PrivateKey privateKey = (PrivateKey) keystoreService.getKeyForGateway(passphrase);
Signature signature = Signature.getInstance(algorithm);
signature.initSign(privateKey);
signature.update(payloadToSign.getBytes(StandardCharsets.UTF_8));
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/DefaultKeystoreService.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/DefaultKeystoreService.java
index 5a58029..546d53d 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/DefaultKeystoreService.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/DefaultKeystoreService.java
@@ -26,7 +26,6 @@
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.i18n.messages.MessagesFactory;
import org.apache.knox.gateway.i18n.resources.ResourcesFactory;
-import org.apache.knox.gateway.services.Service;
import org.apache.knox.gateway.services.ServiceLifecycleException;
import org.apache.knox.gateway.services.security.KeystoreService;
import org.apache.knox.gateway.services.security.KeystoreServiceException;
@@ -68,7 +67,7 @@
import javax.crypto.spec.SecretKeySpec;
-public class DefaultKeystoreService implements KeystoreService, Service {
+public class DefaultKeystoreService implements KeystoreService {
private static final String DN_TEMPLATE = "CN={0},OU=Test,O=Hadoop,L=Test,ST=Test,C=US";
private static final String CREDENTIALS_SUFFIX = "-credentials.jceks";
private static final String CREDENTIALS_STORE_TYPE = "JCEKS";
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/JettySSLService.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/JettySSLService.java
index 6e79f36..867e3df 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/JettySSLService.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/JettySSLService.java
@@ -43,15 +43,15 @@
private static final String GATEWAY_CREDENTIAL_STORE_NAME = "__gateway";
private static GatewayMessages log = MessagesFactory.get( GatewayMessages.class );
- private KeystoreService ks;
- private AliasService as;
+ private KeystoreService keystoreService;
+ private AliasService aliasService;
public void setAliasService(AliasService as) {
- this.as = as;
+ this.aliasService = as;
}
public void setKeystoreService(KeystoreService ks) {
- this.ks = ks;
+ this.keystoreService = ks;
}
@Override
@@ -60,9 +60,9 @@
// set any JSSE or security related system properties
System.setProperty(EPHEMERAL_DH_KEY_SIZE_PROPERTY, config.getEphemeralDHKeySize());
try {
- if (!ks.isCredentialStoreForClusterAvailable(GATEWAY_CREDENTIAL_STORE_NAME)) {
+ if (!keystoreService.isCredentialStoreForClusterAvailable(GATEWAY_CREDENTIAL_STORE_NAME)) {
log.creatingCredentialStoreForGateway();
- ks.createCredentialStoreForCluster(GATEWAY_CREDENTIAL_STORE_NAME);
+ keystoreService.createCredentialStoreForCluster(GATEWAY_CREDENTIAL_STORE_NAME);
// LET'S NOT GENERATE A DIFFERENT KEY PASSPHRASE BY DEFAULT ANYMORE
// IF A DEPLOYMENT WANTS TO CHANGE THE KEY PASSPHRASE TO MAKE IT MORE SECURE THEN
// THEY CAN ADD THE ALIAS EXPLICITLY WITH THE CLI
@@ -76,16 +76,16 @@
}
try {
- if (!ks.isKeystoreForGatewayAvailable()) {
+ if (!keystoreService.isKeystoreForGatewayAvailable()) {
log.creatingKeyStoreForGateway();
- ks.createKeystoreForGateway();
+ keystoreService.createKeystoreForGateway();
char[] passphrase;
try {
- passphrase = as.getGatewayIdentityPassphrase();
+ passphrase = aliasService.getGatewayIdentityPassphrase();
} catch (AliasServiceException e) {
throw new ServiceLifecycleException("Error accessing credential store for the gateway.", e);
}
- ks.addSelfSignedCertForGateway(config.getIdentityKeyAlias(), passphrase);
+ keystoreService.addSelfSignedCertForGateway(config.getIdentityKeyAlias(), passphrase);
}
else {
log.keyStoreForGatewayFoundNotCreating();
@@ -101,7 +101,7 @@
Certificate cert;
final String identityKeyAlias = config.getIdentityKeyAlias();
try {
- cert = as.getCertificateForGateway(identityKeyAlias);
+ cert = aliasService.getCertificateForGateway(identityKeyAlias);
} catch (AliasServiceException e) {
throw new ServiceLifecycleException("Cannot Retreive Gateway SSL Certificate. Server will not start.", e);
}
@@ -143,7 +143,7 @@
char[] keystorePasswordChars;
try {
- keystorePasswordChars = as.getGatewayIdentityKeystorePassword();
+ keystorePasswordChars = aliasService.getGatewayIdentityKeystorePassword();
} catch (AliasServiceException e) {
log.failedToGetPasswordForGatewayIdentityKeystore(e);
throw e;
@@ -154,7 +154,7 @@
char[] keypass;
try {
- keypass = as.getGatewayIdentityPassphrase();
+ keypass = aliasService.getGatewayIdentityPassphrase();
} catch (AliasServiceException e) {
log.failedToGetPassphraseForGatewayIdentityKey(e);
throw e;
@@ -175,7 +175,7 @@
trustStoreType = config.getTruststoreType();
try {
- truststorePassword = as.getPasswordFromAliasForGateway(trustStorePasswordAlias);
+ truststorePassword = aliasService.getPasswordFromAliasForGateway(trustStorePasswordAlias);
} catch (AliasServiceException e) {
log.failedToGetPasswordForGatewayTruststore(trustStorePasswordAlias, e);
throw e;
@@ -188,7 +188,7 @@
trustStoreType = identityKeystoreType;
try {
- truststorePassword = as.getGatewayIdentityKeystorePassword();
+ truststorePassword = aliasService.getGatewayIdentityKeystorePassword();
} catch (AliasServiceException e) {
log.failedToGetPasswordForGatewayTruststore(config.getIdentityKeystorePasswordAlias(), e);
throw e;
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/token/impl/DefaultTokenAuthorityService.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/token/impl/DefaultTokenAuthorityService.java
index 465e370..a6f83ea 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/services/token/impl/DefaultTokenAuthorityService.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/token/impl/DefaultTokenAuthorityService.java
@@ -73,8 +73,8 @@
private static final GatewayResources RESOURCES = ResourcesFactory.get(GatewayResources.class);
private static final Set<String> SUPPORTED_SIG_ALGS = new HashSet<>();
- private AliasService as;
- private KeystoreService ks;
+ private AliasService aliasService;
+ private KeystoreService keystoreService;
private GatewayConfig config;
private char[] cachedSigningKeyPassphrase;
@@ -92,11 +92,11 @@
}
public void setKeystoreService(KeystoreService ks) {
- this.ks = ks;
+ this.keystoreService = ks;
}
public void setAliasService(AliasService as) {
- this.as = as;
+ this.aliasService = as;
}
@Override
@@ -144,7 +144,7 @@
throws KeystoreServiceException, TokenServiceException {
if (signingKeystorePassphrase != null) {
- return (RSAPrivateKey) ks.getSigningKey(signingKeystoreName,
+ return (RSAPrivateKey) keystoreService.getSigningKey(signingKeystoreName,
getSigningKeyAlias(signingKeystoreAlias),
getSigningKeyPassphrase(signingKeystorePassphrase));
}
@@ -217,7 +217,7 @@
PublicKey key;
try {
if (publicKey == null) {
- key = ks.getSigningKeystore().getCertificate(getSigningKeyAlias()).getPublicKey();
+ key = keystoreService.getSigningKeystore().getCertificate(getSigningKeyAlias()).getPublicKey();
}
else {
key = publicKey;
@@ -261,7 +261,7 @@
@Override
public void init(GatewayConfig config, Map<String, String> options)
throws ServiceLifecycleException {
- if (as == null || ks == null) {
+ if (aliasService == null || keystoreService == null) {
throw new ServiceLifecycleException("Alias or Keystore service is not set");
}
this.config = config;
@@ -272,7 +272,7 @@
// Ensure that the default signing keystore is available
KeyStore keystore;
try {
- keystore = ks.getSigningKeystore();
+ keystore = keystoreService.getSigningKeystore();
if (keystore == null) {
throw new ServiceLifecycleException(RESOURCES.signingKeystoreNotAvailable(config.getSigningKeystorePath()));
}
@@ -282,7 +282,7 @@
// Ensure that the password for the signing key is available
try {
- cachedSigningKeyPassphrase = as.getSigningKeyPassphrase();
+ cachedSigningKeyPassphrase = aliasService.getSigningKeyPassphrase();
if (cachedSigningKeyPassphrase == null) {
throw new ServiceLifecycleException(RESOURCES.signingKeyPassphraseNotAvailable(config.getSigningKeyPassphraseAlias()));
}
diff --git a/gateway-server/src/main/resources/META-INF/services/org.apache.knox.gateway.services.ServiceFactory b/gateway-server/src/main/resources/META-INF/services/org.apache.knox.gateway.services.ServiceFactory
new file mode 100644
index 0000000..02275ea
--- /dev/null
+++ b/gateway-server/src/main/resources/META-INF/services/org.apache.knox.gateway.services.ServiceFactory
@@ -0,0 +1,33 @@
+##########################################################################
+# 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.
+##########################################################################
+
+org.apache.knox.gateway.services.factory.AliasServiceFactory
+org.apache.knox.gateway.services.factory.ClusterConfigurationMonitorServiceFactory
+org.apache.knox.gateway.services.factory.CryptoServiceFactory
+org.apache.knox.gateway.services.factory.HostMappingServiceFactory
+org.apache.knox.gateway.services.factory.KeystoreServiceFactory
+org.apache.knox.gateway.services.factory.MasterServiceFactory
+org.apache.knox.gateway.services.factory.MetricsServiceFactory
+org.apache.knox.gateway.services.factory.RemoteRegistryClientServiceFactory
+org.apache.knox.gateway.services.factory.ServerInfoServiceFactory
+org.apache.knox.gateway.services.factory.ServiceDefinitionRegistryFactory
+org.apache.knox.gateway.services.factory.ServiceRegistryServiceFactory
+org.apache.knox.gateway.services.factory.SslServiceFactory
+org.apache.knox.gateway.services.factory.TokenServiceFactory
+org.apache.knox.gateway.services.factory.TokenStateServiceFactory
+org.apache.knox.gateway.services.factory.TopologyServiceFactory
\ No newline at end of file
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/config/impl/GatewayConfigImplTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/config/impl/GatewayConfigImplTest.java
index 3e418b5..f449d05 100644
--- a/gateway-server/src/test/java/org/apache/knox/gateway/config/impl/GatewayConfigImplTest.java
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/config/impl/GatewayConfigImplTest.java
@@ -38,7 +38,7 @@
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+ import static org.junit.Assert.assertTrue;
public class GatewayConfigImplTest {
@@ -405,4 +405,22 @@
assertEquals(ZookeeperRemoteAliasService.TYPE, remoteAliasServiceConfiguration.get(REMOTE_ALIAS_SERVICE_TYPE));
}
+ @Test
+ public void testGetServiceParameter() throws Exception {
+ final GatewayConfigImpl gatewayConfig = new GatewayConfigImpl();
+
+ // should return an empty string if 'gateway.service.alias.impl' is not set
+ assertEquals("", gatewayConfig.getServiceParameter("alias", "impl"));
+
+ gatewayConfig.set("gateway.service.alias.impl", "myAliasService");
+ gatewayConfig.set("gateway.service.tokenstate.impl", "myTokenStateService");
+
+ // should return an empty string if the given service is not defined
+ assertEquals("", gatewayConfig.getServiceParameter("notListedService", "impl"));
+
+ //should return the declared implementations
+ assertEquals("myAliasService", gatewayConfig.getServiceParameter("alias", "impl"));
+ assertEquals("myTokenStateService", gatewayConfig.getServiceParameter("tokenstate", "impl"));
+ }
+
}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/TestService.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/TestService.java
new file mode 100644
index 0000000..cae8ad9
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/TestService.java
@@ -0,0 +1,38 @@
+/*
+ * 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.knox.gateway.services;
+
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+
+public class TestService implements Service {
+
+ @Override
+ public void init(GatewayConfig config, Map<String, String> options) throws ServiceLifecycleException {
+ }
+
+ @Override
+ public void start() throws ServiceLifecycleException {
+ }
+
+ @Override
+ public void stop() throws ServiceLifecycleException {
+ }
+
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/AliasServiceFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/AliasServiceFactoryTest.java
new file mode 100644
index 0000000..3dfdd14
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/AliasServiceFactoryTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.apache.knox.gateway.services.ServiceType.ALIAS_SERVICE;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.knox.gateway.backend.hashicorp.vault.HashicorpVaultAliasService;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.impl.DefaultAliasService;
+import org.apache.knox.gateway.services.security.impl.RemoteAliasService;
+import org.apache.knox.gateway.services.security.impl.ZookeeperRemoteAliasService;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AliasServiceFactoryTest extends ServiceFactoryTest {
+
+ private final AliasServiceFactory serviceFactory = new AliasServiceFactory();
+
+ @Before
+ public void setUp() throws Exception {
+ initConfig();
+ }
+
+ @Test
+ public void testBasics() throws Exception {
+ super.testBasics(serviceFactory, ServiceType.MASTER_SERVICE, ServiceType.ALIAS_SERVICE);
+ }
+
+ @Test
+ public void shouldReturnDefaultAliasService() throws Exception {
+ AliasService aliasService = (AliasService) serviceFactory.create(gatewayServices, ServiceType.ALIAS_SERVICE, gatewayConfig, options, DefaultAliasService.class.getName());
+ assertTrue(aliasService instanceof DefaultAliasService);
+ assertTrue(isMasterServiceSet(aliasService));
+ assertTrue(isKeystoreServiceSet(aliasService));
+
+ aliasService = (AliasService) serviceFactory.create(gatewayServices, ServiceType.ALIAS_SERVICE, gatewayConfig, options, "");
+ assertTrue(aliasService instanceof DefaultAliasService);
+ assertTrue(isMasterServiceSet(aliasService));
+ assertTrue(isKeystoreServiceSet(aliasService));
+ }
+
+ @Test
+ public void shouldReturnHashicorpVaultAliasService() throws Exception {
+ assertTrue(serviceFactory.create(gatewayServices, ALIAS_SERVICE, gatewayConfig, options, HashicorpVaultAliasService.class.getName()) instanceof HashicorpVaultAliasService);
+ }
+
+ @Test
+ public void shouldReturnRemoteAliasService() throws Exception {
+ assertTrue(serviceFactory.create(gatewayServices, ALIAS_SERVICE, gatewayConfig, options, RemoteAliasService.class.getName()) instanceof RemoteAliasService);
+ }
+
+ @Test
+ public void shouldReturnZookeeperAliasService() throws Exception {
+ assertTrue(serviceFactory.create(gatewayServices, ALIAS_SERVICE, gatewayConfig, options, ZookeeperRemoteAliasService.class.getName()) instanceof ZookeeperRemoteAliasService);
+ }
+
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/ClusterConfigurationMonitorServiceFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/ClusterConfigurationMonitorServiceFactoryTest.java
new file mode 100644
index 0000000..46e4ca7
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/ClusterConfigurationMonitorServiceFactoryTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.junit.Assert.assertTrue;
+
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.topology.impl.DefaultClusterConfigurationMonitorService;
+import org.apache.knox.gateway.topology.ClusterConfigurationMonitorService;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ClusterConfigurationMonitorServiceFactoryTest extends ServiceFactoryTest {
+
+ private final ClusterConfigurationMonitorServiceFactory serviceFactory = new ClusterConfigurationMonitorServiceFactory();
+
+ @Before
+ public void setUp() {
+ initConfig();
+ }
+
+ @Test
+ public void testBasics() throws Exception {
+ super.testBasics(serviceFactory, ServiceType.MASTER_SERVICE, ServiceType.CLUSTER_CONFIGURATION_MONITOR_SERVICE);
+ }
+
+ @Test
+ public void shouldReturnDefaultClusterConfigurationMonitorService() throws Exception {
+ final ClusterConfigurationMonitorService clusterConfigurationMonitorService = (ClusterConfigurationMonitorService) serviceFactory.create(gatewayServices,
+ ServiceType.CLUSTER_CONFIGURATION_MONITOR_SERVICE, gatewayConfig, options);
+ assertTrue(clusterConfigurationMonitorService instanceof DefaultClusterConfigurationMonitorService);
+ assertTrue(isAliasServiceSet(clusterConfigurationMonitorService));
+ assertTrue(isKeystoreServiceSet(clusterConfigurationMonitorService));
+ }
+
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/CryptoServiceFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/CryptoServiceFactoryTest.java
new file mode 100644
index 0000000..e8dad07
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/CryptoServiceFactoryTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.junit.Assert.assertTrue;
+
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.security.CryptoService;
+import org.apache.knox.gateway.services.security.impl.DefaultCryptoService;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CryptoServiceFactoryTest extends ServiceFactoryTest {
+ private final CryptoServiceFactory serviceFactory = new CryptoServiceFactory();
+
+ @Before
+ public void setUp() throws Exception {
+ initConfig();
+ }
+
+ @Test
+ public void testBasics() throws Exception {
+ super.testBasics(serviceFactory, ServiceType.MASTER_SERVICE, ServiceType.CRYPTO_SERVICE);
+ }
+
+ @Test
+ public void shouldReturnDefaultCryptoService() throws Exception {
+ final CryptoService cryptoService = (CryptoService) serviceFactory.create(gatewayServices, ServiceType.CRYPTO_SERVICE, gatewayConfig, options);
+ assertTrue(cryptoService instanceof DefaultCryptoService);
+ assertTrue(isKeystoreServiceSet(cryptoService));
+ assertTrue(isAliasServiceSet(cryptoService));
+ }
+
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/HostMappingServiceFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/HostMappingServiceFactoryTest.java
new file mode 100644
index 0000000..3205be1
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/HostMappingServiceFactoryTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.junit.Assert.assertTrue;
+
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.hostmap.HostMapperService;
+import org.apache.knox.gateway.services.hostmap.impl.DefaultHostMapperService;
+import org.junit.Before;
+import org.junit.Test;
+
+public class HostMappingServiceFactoryTest extends ServiceFactoryTest {
+
+ private final HostMappingServiceFactory serviceFactory = new HostMappingServiceFactory();
+
+ @Before
+ public void setUp() throws Exception {
+ initConfig();
+ }
+
+ @Test
+ public void testBasics() throws Exception {
+ super.testBasics(serviceFactory, ServiceType.MASTER_SERVICE, ServiceType.HOST_MAPPING_SERVICE);
+ }
+
+ @Test
+ public void shouldReturnDefaultHostMapperService() throws Exception {
+ final HostMapperService hostMapperService = (HostMapperService) serviceFactory.create(gatewayServices, ServiceType.HOST_MAPPING_SERVICE, gatewayConfig, options);
+ assertTrue(hostMapperService instanceof DefaultHostMapperService);
+ }
+
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/KeystoreServiceFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/KeystoreServiceFactoryTest.java
new file mode 100644
index 0000000..a19ff73
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/KeystoreServiceFactoryTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.junit.Assert.assertTrue;
+
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.security.KeystoreService;
+import org.apache.knox.gateway.services.security.impl.DefaultKeystoreService;
+import org.junit.Before;
+import org.junit.Test;
+
+public class KeystoreServiceFactoryTest extends ServiceFactoryTest {
+
+ private final KeystoreServiceFactory serviceFactory = new KeystoreServiceFactory();
+
+ @Before
+ public void setUp() throws Exception {
+ initConfig();
+ }
+
+ @Test
+ public void testBasics() throws Exception {
+ super.testBasics(serviceFactory, ServiceType.MASTER_SERVICE, ServiceType.KEYSTORE_SERVICE);
+ }
+
+ @Test
+ public void shouldReturnDefaultKeystoreService() throws Exception {
+ final KeystoreService keystoreService = (KeystoreService) serviceFactory.create(gatewayServices, ServiceType.KEYSTORE_SERVICE, gatewayConfig, options);
+ assertTrue(keystoreService instanceof DefaultKeystoreService);
+ assertTrue(isMasterServiceSet(keystoreService));
+ }
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/MasterServiceFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/MasterServiceFactoryTest.java
new file mode 100644
index 0000000..36beaca
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/MasterServiceFactoryTest.java
@@ -0,0 +1,57 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.junit.Assert.assertTrue;
+
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.security.MasterService;
+import org.apache.knox.gateway.services.security.impl.CLIMasterService;
+import org.apache.knox.gateway.services.security.impl.DefaultMasterService;
+import org.junit.Before;
+import org.junit.Test;
+
+public class MasterServiceFactoryTest extends ServiceFactoryTest {
+
+ private final MasterServiceFactory serviceFactory = new MasterServiceFactory();
+
+ @Before
+ public void setUp() throws Exception {
+ initConfig();
+ }
+
+ @Test
+ public void testBasics() throws Exception {
+ super.testBasics(serviceFactory, ServiceType.CLUSTER_CONFIGURATION_MONITOR_SERVICE, ServiceType.MASTER_SERVICE);
+ }
+
+ @Test
+ public void shouldReturnDefaultMasterService() throws Exception {
+ MasterService masterService = (MasterService) serviceFactory.create(gatewayServices, ServiceType.MASTER_SERVICE, null, null, DefaultMasterService.class.getName());
+ assertTrue(masterService instanceof DefaultMasterService);
+
+ masterService = (MasterService) serviceFactory.create(gatewayServices, ServiceType.MASTER_SERVICE, null, null, "");
+ assertTrue(masterService instanceof DefaultMasterService);
+ }
+
+ @Test
+ public void shouldReturnCliMasterService() throws Exception {
+ MasterService masterService = (MasterService) serviceFactory.create(gatewayServices, ServiceType.MASTER_SERVICE, null, null, CLIMasterService.class.getName());
+ assertTrue(masterService instanceof CLIMasterService);
+ }
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/MetricsServiceFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/MetricsServiceFactoryTest.java
new file mode 100644
index 0000000..95eaea6
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/MetricsServiceFactoryTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.junit.Assert.assertTrue;
+
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.metrics.MetricsService;
+import org.apache.knox.gateway.services.metrics.impl.DefaultMetricsService;
+import org.junit.Before;
+import org.junit.Test;
+
+public class MetricsServiceFactoryTest extends ServiceFactoryTest {
+
+ private final MetricsServiceFactory serviceFactory = new MetricsServiceFactory();
+
+ @Before
+ public void setUp() throws Exception {
+ initConfig();
+ }
+
+ @Test
+ public void testBasics() throws Exception {
+ super.testBasics(serviceFactory, ServiceType.MASTER_SERVICE, ServiceType.METRICS_SERVICE);
+ }
+
+ @Test
+ public void shouldReturnDefaultMetricsService() throws Exception {
+ final MetricsService metricsService = (MetricsService) serviceFactory.create(gatewayServices, ServiceType.METRICS_SERVICE, gatewayConfig, options);
+ assertTrue(metricsService instanceof DefaultMetricsService);
+ }
+
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/ServerInfoServiceFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/ServerInfoServiceFactoryTest.java
new file mode 100644
index 0000000..a97e490
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/ServerInfoServiceFactoryTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.junit.Assert.assertTrue;
+
+import org.apache.knox.gateway.services.DefaultServerInfoService;
+import org.apache.knox.gateway.services.ServerInfoService;
+import org.apache.knox.gateway.services.ServiceType;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ServerInfoServiceFactoryTest extends ServiceFactoryTest {
+
+ private final ServerInfoServiceFactory serviceFactory = new ServerInfoServiceFactory();
+
+ @Before
+ public void setUp() throws Exception {
+ initConfig();
+ }
+
+ @Test
+ public void testBasics() throws Exception {
+ super.testBasics(serviceFactory, ServiceType.MASTER_SERVICE, ServiceType.SERVER_INFO_SERVICE);
+ }
+
+ @Test
+ public void shouldReturnDefaultServerInfoService() throws Exception {
+ final ServerInfoService serverInfoService = (ServerInfoService) serviceFactory.create(gatewayServices, ServiceType.SERVER_INFO_SERVICE, gatewayConfig, options);
+ assertTrue(serverInfoService instanceof DefaultServerInfoService);
+ }
+
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/ServiceDefinitionRegistryFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/ServiceDefinitionRegistryFactoryTest.java
new file mode 100644
index 0000000..67e0a67
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/ServiceDefinitionRegistryFactoryTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.apache.knox.gateway.services.ServiceType.SERVICE_DEFINITION_REGISTRY;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.registry.ServiceDefinitionRegistry;
+import org.apache.knox.gateway.services.registry.impl.DefaultServiceDefinitionRegistry;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ServiceDefinitionRegistryFactoryTest extends ServiceFactoryTest {
+
+ private final ServiceDefinitionRegistryFactory serviceFactory = new ServiceDefinitionRegistryFactory();
+
+ @Before
+ public void setUp() throws Exception {
+ initConfig();
+ }
+
+ @Test
+ public void testBasics() throws Exception {
+ super.testBasics(serviceFactory, ServiceType.MASTER_SERVICE, SERVICE_DEFINITION_REGISTRY);
+ }
+
+ @Test
+ public void shouldReturnDefaultServiceDefinitionRegistry() throws Exception {
+ final ServiceDefinitionRegistry serviceDefinitionRegistry = (ServiceDefinitionRegistry) serviceFactory.create(gatewayServices, SERVICE_DEFINITION_REGISTRY, gatewayConfig,
+ options);
+ assertTrue(serviceDefinitionRegistry instanceof DefaultServiceDefinitionRegistry);
+ }
+
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/ServiceFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/ServiceFactoryTest.java
new file mode 100644
index 0000000..c7dbced
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/ServiceFactoryTest.java
@@ -0,0 +1,115 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.easymock.EasyMock.anyString;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.hamcrest.CoreMatchers.isA;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.reflect.Field;
+import java.util.Collections;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.Service;
+import org.apache.knox.gateway.services.ServiceLifecycleException;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.TestService;
+import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.KeystoreService;
+import org.apache.knox.gateway.services.security.MasterService;
+import org.easymock.EasyMock;
+import org.junit.Rule;
+import org.junit.rules.ExpectedException;
+
+class ServiceFactoryTest {
+
+ @SuppressWarnings("deprecation")
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+
+ protected final GatewayServices gatewayServices = EasyMock.createNiceMock(GatewayServices.class);
+ protected final GatewayConfig gatewayConfig = EasyMock.createNiceMock(GatewayConfig.class);
+ protected final Map<String, String> options = Collections.emptyMap();
+
+ protected void initConfig() {
+ final MasterService masterService = EasyMock.createNiceMock(MasterService.class);
+ expect(gatewayServices.getService(ServiceType.MASTER_SERVICE)).andReturn(masterService).anyTimes();
+ final KeystoreService keystoreservice = EasyMock.createNiceMock(KeystoreService.class);
+ expect(gatewayServices.getService(ServiceType.KEYSTORE_SERVICE)).andReturn(keystoreservice).anyTimes();
+ final AliasService aliasService = EasyMock.createNiceMock(AliasService.class);
+ expect(gatewayServices.getService(ServiceType.ALIAS_SERVICE)).andReturn(aliasService).anyTimes();
+ replay(gatewayServices);
+ expect(gatewayConfig.getServiceParameter(anyString(), anyString())).andReturn("").anyTimes();
+ replay(gatewayConfig);
+ }
+
+ protected void testBasics(AbstractServiceFactory serviceFactory, ServiceType nonMatchingServiceType, ServiceType matchingServiceType) throws Exception {
+ shouldReturnCorrectServiceType(serviceFactory, matchingServiceType);
+ shouldReturnNullForNonMatchingServiceType(serviceFactory, nonMatchingServiceType);
+ shouldReturnCustomImplementation(serviceFactory, matchingServiceType);
+ shouldFailWithClassNotFoundExceptionForUnknownImplementationWithClassNotOnClasspath(serviceFactory, matchingServiceType);
+ }
+
+ private void shouldReturnCorrectServiceType(AbstractServiceFactory serviceFactory, ServiceType serviceType) {
+ assertEquals(serviceType, serviceFactory.getServiceType());
+ }
+
+ private void shouldReturnNullForNonMatchingServiceType(AbstractServiceFactory serviceFactory, ServiceType serviceType) throws Exception {
+ assertNull(serviceFactory.create(gatewayServices, serviceType, gatewayConfig, options));
+ }
+
+ private void shouldFailWithClassNotFoundExceptionForUnknownImplementationWithClassNotOnClasspath(AbstractServiceFactory serviceFactory, ServiceType serviceType)
+ throws Exception {
+ expectedException.expect(ServiceLifecycleException.class);
+ final String implementation = "this.is.my.non.existing.Service";
+ expectedException.expectMessage(String.format(Locale.ROOT, "Errror while instantiating %s service implementation %s", serviceType.getShortName(), implementation));
+ expectedException.expectCause(isA(ClassNotFoundException.class));
+ serviceFactory.create(gatewayServices, serviceType, null, null, implementation);
+ }
+
+ private void shouldReturnCustomImplementation(AbstractServiceFactory serviceFactory, ServiceType matchingServiceType) throws Exception {
+ final Service service = serviceFactory.create(gatewayServices, matchingServiceType, null, null, "org.apache.knox.gateway.services.TestService");
+ assertTrue(service instanceof TestService);
+ }
+
+ protected boolean isMasterServiceSet(Service serviceToCheck) throws Exception {
+ return isServiceSet(serviceToCheck, "masterService");
+ }
+
+ protected boolean isKeystoreServiceSet(Service serviceToCheck) throws Exception {
+ return isServiceSet(serviceToCheck, "keystoreService");
+ }
+
+ protected boolean isAliasServiceSet(Service serviceToCheck) throws Exception {
+ return isServiceSet(serviceToCheck, "aliasService");
+ }
+
+ private boolean isServiceSet(Service serviceToCheck, String expectedServiceName) throws Exception {
+ final Field aliasServiceField = FieldUtils.getDeclaredField(serviceToCheck.getClass(), expectedServiceName, true);
+ final Object aliasServiceValue = aliasServiceField.get(serviceToCheck);
+ return aliasServiceValue != null;
+ }
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/SslServiceFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/SslServiceFactoryTest.java
new file mode 100644
index 0000000..76b15fd
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/SslServiceFactoryTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.junit.Assert.assertTrue;
+
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.security.SSLService;
+import org.apache.knox.gateway.services.security.impl.JettySSLService;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SslServiceFactoryTest extends ServiceFactoryTest {
+
+ private final SslServiceFactory serviceFactory = new SslServiceFactory();
+
+ @Before
+ public void setUp() throws Exception {
+ initConfig();
+ }
+
+ @Test
+ public void testBasics() throws Exception {
+ super.testBasics(serviceFactory, ServiceType.MASTER_SERVICE, ServiceType.SSL_SERVICE);
+ }
+
+ @Test
+ public void shouldReturnJettySslService() throws Exception {
+ final SSLService keystoreService = (SSLService) serviceFactory.create(gatewayServices, ServiceType.SSL_SERVICE, gatewayConfig, options);
+ assertTrue(keystoreService instanceof JettySSLService);
+ assertTrue(isKeystoreServiceSet(keystoreService));
+ assertTrue(isAliasServiceSet(keystoreService));
+ }
+
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/TokenServiceFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/TokenServiceFactoryTest.java
new file mode 100644
index 0000000..425a2a7
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/TokenServiceFactoryTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.junit.Assert.assertTrue;
+
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.token.impl.DefaultTokenAuthorityService;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TokenServiceFactoryTest extends ServiceFactoryTest {
+
+ private final TokenServiceFactory serviceFactory = new TokenServiceFactory();
+
+ @Before
+ public void setUp() throws Exception {
+ initConfig();
+ }
+
+ @Test
+ public void testBasics() throws Exception {
+ super.testBasics(serviceFactory, ServiceType.MASTER_SERVICE, ServiceType.TOKEN_SERVICE);
+ }
+
+ @Test
+ public void shouldReturnDefaultTokenService() throws Exception {
+ final DefaultTokenAuthorityService keystoreService = (DefaultTokenAuthorityService) serviceFactory.create(gatewayServices, ServiceType.TOKEN_SERVICE, gatewayConfig, options);
+ assertTrue(keystoreService instanceof DefaultTokenAuthorityService);
+ assertTrue(isKeystoreServiceSet(keystoreService));
+ assertTrue(isAliasServiceSet(keystoreService));
+ }
+
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/TokenStateServiceFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/TokenStateServiceFactoryTest.java
new file mode 100644
index 0000000..7625d50
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/TokenStateServiceFactoryTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.junit.Assert.assertTrue;
+
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.security.token.TokenStateService;
+import org.apache.knox.gateway.services.token.impl.AliasBasedTokenStateService;
+import org.apache.knox.gateway.services.token.impl.DefaultTokenStateService;
+import org.apache.knox.gateway.services.token.impl.JournalBasedTokenStateService;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TokenStateServiceFactoryTest extends ServiceFactoryTest {
+
+ private final TokenStateServiceFactory serviceFactory = new TokenStateServiceFactory();
+
+ @Before
+ public void setUp() throws Exception {
+ initConfig();
+ }
+
+ @Test
+ public void testBasics() throws Exception {
+ super.testBasics(serviceFactory, ServiceType.MASTER_SERVICE, ServiceType.TOKEN_STATE_SERVICE);
+ }
+
+ @Test
+ public void shouldReturnDefaultAliasService() throws Exception {
+ TokenStateService tokenStateService = (TokenStateService) serviceFactory.create(gatewayServices, ServiceType.TOKEN_STATE_SERVICE, null, null, DefaultTokenStateService.class.getName());
+ assertTrue(tokenStateService instanceof DefaultTokenStateService);
+
+ tokenStateService = (TokenStateService) serviceFactory.create(gatewayServices, ServiceType.TOKEN_STATE_SERVICE, null, null, "");
+ assertTrue(tokenStateService instanceof DefaultTokenStateService);
+ }
+
+ @Test
+ public void shouldReturnAliasBasedTokenStateService() throws Exception {
+ final TokenStateService tokenStateService = (TokenStateService) serviceFactory.create(gatewayServices, ServiceType.TOKEN_STATE_SERVICE, null, null, AliasBasedTokenStateService.class.getName());
+ assertTrue(tokenStateService instanceof AliasBasedTokenStateService);
+ assertTrue(isAliasServiceSet(tokenStateService));
+ }
+
+ @Test
+ public void shouldReturnHJournalTokenStateService() throws Exception {
+ assertTrue(serviceFactory.create(gatewayServices, ServiceType.TOKEN_STATE_SERVICE, null, null, JournalBasedTokenStateService.class.getName()) instanceof JournalBasedTokenStateService);
+ }
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/TopologyServiceFactoryTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/TopologyServiceFactoryTest.java
new file mode 100644
index 0000000..151d42d
--- /dev/null
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/factory/TopologyServiceFactoryTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.knox.gateway.services.factory;
+
+import static org.junit.Assert.assertTrue;
+
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.topology.TopologyService;
+import org.apache.knox.gateway.services.topology.impl.DefaultTopologyService;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TopologyServiceFactoryTest extends ServiceFactoryTest {
+
+ private final TopologyServiceFactory serviceFactory = new TopologyServiceFactory();
+
+ @Before
+ public void setUp() throws Exception {
+ initConfig();
+ }
+
+ @Test
+ public void testBasics() throws Exception {
+ super.testBasics(serviceFactory, ServiceType.MASTER_SERVICE, ServiceType.TOPOLOGY_SERVICE);
+ }
+
+ @Test
+ public void shouldReturnDefaultTopologyService() throws Exception {
+ TopologyService topologyService = (TopologyService) serviceFactory.create(gatewayServices, ServiceType.TOPOLOGY_SERVICE, gatewayConfig, null);
+ assertTrue(topologyService instanceof DefaultTopologyService);
+ assertTrue(isAliasServiceSet(topologyService));
+ }
+
+}
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/websockets/BadUrlTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/websockets/BadUrlTest.java
index 7e1105d..2fca3c5 100644
--- a/gateway-server/src/test/java/org/apache/knox/gateway/websockets/BadUrlTest.java
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/websockets/BadUrlTest.java
@@ -310,6 +310,8 @@
.andReturn(TEST_KEY_ALIAS)
.anyTimes();
+ EasyMock.expect(gatewayConfig.getServiceParameter(EasyMock.anyString(), EasyMock.anyString())).andReturn("").anyTimes();
+
EasyMock.replay(gatewayConfig);
try {
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/websockets/WebsocketEchoTestBase.java b/gateway-server/src/test/java/org/apache/knox/gateway/websockets/WebsocketEchoTestBase.java
index 86a580a..bf11748 100644
--- a/gateway-server/src/test/java/org/apache/knox/gateway/websockets/WebsocketEchoTestBase.java
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/websockets/WebsocketEchoTestBase.java
@@ -336,6 +336,7 @@
.andReturn(TEST_KEY_ALIAS)
.anyTimes();
+ EasyMock.expect(gatewayConfig.getServiceParameter(EasyMock.anyString(), EasyMock.anyString())).andReturn("").anyTimes();
EasyMock.replay(gatewayConfig);
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/websockets/WebsocketMultipleConnectionTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/websockets/WebsocketMultipleConnectionTest.java
index a2a4ae7..d7db608 100644
--- a/gateway-server/src/test/java/org/apache/knox/gateway/websockets/WebsocketMultipleConnectionTest.java
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/websockets/WebsocketMultipleConnectionTest.java
@@ -373,6 +373,8 @@
.andReturn(TEST_KEY_ALIAS)
.anyTimes();
+ EasyMock.expect(gatewayConfig.getServiceParameter(EasyMock.anyString(), EasyMock.anyString())).andReturn("").anyTimes();
+
EasyMock.replay(gatewayConfig);
try {
diff --git a/gateway-spi/src/main/java/org/apache/knox/gateway/config/GatewayConfig.java b/gateway-spi/src/main/java/org/apache/knox/gateway/config/GatewayConfig.java
index 7825e7b..4e533ad 100644
--- a/gateway-spi/src/main/java/org/apache/knox/gateway/config/GatewayConfig.java
+++ b/gateway-spi/src/main/java/org/apache/knox/gateway/config/GatewayConfig.java
@@ -693,4 +693,9 @@
* @return returns whether know token permissive validation is enabled
*/
boolean isKnoxTokenPermissiveValidationEnabled();
+
+ /**
+ * @return the value of the given parameter for the given service if declared; an empty String otherwise
+ */
+ String getServiceParameter(String service, String parameter);
}
diff --git a/gateway-spi/src/main/java/org/apache/knox/gateway/services/ServiceFactory.java b/gateway-spi/src/main/java/org/apache/knox/gateway/services/ServiceFactory.java
new file mode 100644
index 0000000..ca0301e
--- /dev/null
+++ b/gateway-spi/src/main/java/org/apache/knox/gateway/services/ServiceFactory.java
@@ -0,0 +1,31 @@
+/*
+ * 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.knox.gateway.services;
+
+import java.util.Map;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+
+public interface ServiceFactory {
+
+ Service create(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options) throws ServiceLifecycleException;
+
+ Service create(GatewayServices gatewayServices, ServiceType serviceType, GatewayConfig gatewayConfig, Map<String, String> options, String implementation)
+ throws ServiceLifecycleException;
+
+}
diff --git a/gateway-spi/src/main/java/org/apache/knox/gateway/services/ServiceType.java b/gateway-spi/src/main/java/org/apache/knox/gateway/services/ServiceType.java
index 736ecad..38767f8 100644
--- a/gateway-spi/src/main/java/org/apache/knox/gateway/services/ServiceType.java
+++ b/gateway-spi/src/main/java/org/apache/knox/gateway/services/ServiceType.java
@@ -18,6 +18,8 @@
package org.apache.knox.gateway.services;
+import java.util.Locale;
+
public enum ServiceType {
ALIAS_SERVICE("AliasService"),
CLUSTER_CONFIGURATION_MONITOR_SERVICE("ClusterConfigurationMonitorService"),
@@ -36,12 +38,18 @@
TOPOLOGY_SERVICE("TopologyService");
private final String serviceTypeName;
+ private final String shortName;
ServiceType(String serviceTypeName) {
this.serviceTypeName = serviceTypeName;
+ this.shortName = serviceTypeName.toLowerCase(Locale.ROOT).replace("service", "");
}
public String getServiceTypeName() {
return serviceTypeName;
}
+
+ public String getShortName() {
+ return shortName;
+ }
}
diff --git a/gateway-spi/src/main/java/org/apache/knox/gateway/services/security/KeystoreService.java b/gateway-spi/src/main/java/org/apache/knox/gateway/services/security/KeystoreService.java
index 95c1f71..68fb637 100644
--- a/gateway-spi/src/main/java/org/apache/knox/gateway/services/security/KeystoreService.java
+++ b/gateway-spi/src/main/java/org/apache/knox/gateway/services/security/KeystoreService.java
@@ -24,7 +24,9 @@
import java.util.Map;
import java.util.Set;
-public interface KeystoreService {
+import org.apache.knox.gateway.services.Service;
+
+public interface KeystoreService extends Service {
void createKeystoreForGateway() throws KeystoreServiceException;
diff --git a/gateway-test-release-utils/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java b/gateway-test-release-utils/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java
index e3dbeaa..499fe3f 100644
--- a/gateway-test-release-utils/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java
+++ b/gateway-test-release-utils/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java
@@ -812,4 +812,9 @@
public boolean isKnoxTokenPermissiveValidationEnabled() {
return false;
}
+
+ @Override
+ public String getServiceParameter(String service, String parameter) {
+ return "";
+ }
}