[ 
https://issues.apache.org/jira/browse/KNOX-2399?focusedWorklogId=458638&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-458638
 ]

ASF GitHub Bot logged work on KNOX-2399:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 14/Jul/20 14:12
            Start Date: 14/Jul/20 14:12
    Worklog Time Spent: 10m 
      Work Description: moresandeep commented on a change in pull request #361:
URL: https://github.com/apache/knox/pull/361#discussion_r454357167



##########
File path: 
gateway-server/src/main/java/org/apache/knox/gateway/services/factory/AbstractServiceFactory.java
##########
@@ -37,7 +41,8 @@
 
   private static final GatewayMessages LOG = 
MessagesFactory.get(GatewayMessages.class);
   private static final String IMPLEMENTATION_PARAM_NAME = "impl";
-  private static final String EMPTY_DEFAULT_IMPLEMENTATION = "";
+  protected static final String EMPTY_DEFAULT_IMPLEMENTATION = "";
+  private final Map<ServiceCacheKey, Service> serviceCache = new HashMap<>(); 
//to avoid creating the same service with the same implementation more than once

Review comment:
       This code runs during init right then what would be the scenario where 
there would be multiple implementation of same service?

##########
File path: 
gateway-server/src/main/java/org/apache/knox/gateway/services/factory/AbstractServiceFactory.java
##########
@@ -47,22 +52,38 @@ public Service create(GatewayServices gatewayServices, 
ServiceType serviceType,
   @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);
+    Service service = fetchFromCache(serviceType, implementation);
+    if (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());

Review comment:
       This looks awkward, this can be changed to `(Service) 
Class.forName(implementation).newInstance();`

##########
File path: 
gateway-server/src/main/java/org/apache/knox/gateway/services/factory/AbstractServiceFactory.java
##########
@@ -47,22 +52,38 @@ public Service create(GatewayServices gatewayServices, 
ServiceType serviceType,
   @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);
+    Service service = fetchFromCache(serviceType, implementation);
+    if (service == null) {
+      if (getServiceType() == serviceType) {
+        service = createService(gatewayServices, serviceType, gatewayConfig, 
options, implementation);
+        if (service == null && StringUtils.isNotBlank(implementation)) {

Review comment:
       I think we should have a fallback option in case `implementation` is 
missing - a meaningful default perhaps?

##########
File path: 
gateway-server/src/main/java/org/apache/knox/gateway/services/factory/AbstractServiceFactory.java
##########
@@ -37,7 +41,8 @@
 
   private static final GatewayMessages LOG = 
MessagesFactory.get(GatewayMessages.class);
   private static final String IMPLEMENTATION_PARAM_NAME = "impl";
-  private static final String EMPTY_DEFAULT_IMPLEMENTATION = "";
+  protected static final String EMPTY_DEFAULT_IMPLEMENTATION = "";
+  private final Map<ServiceCacheKey, Service> serviceCache = new HashMap<>(); 
//to avoid creating the same service with the same implementation more than once

Review comment:
       Might be better to use `ConcurrentHashMap` just because we are using it 
for Caching.

##########
File path: 
gateway-server/src/test/java/org/apache/knox/gateway/services/factory/ServiceFactoryTest.java
##########
@@ -52,7 +52,7 @@
 
   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 final Map<String, String> options = new HashMap<>();

Review comment:
       Any reason why we need a mutable map?

##########
File path: 
gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/ZookeeperRemoteAliasService.java
##########
@@ -190,13 +190,18 @@ private static void checkPathsExist(final 
RemoteConfigurationRegistryClient remo
      *
      * @param clusterName
      *            cluster name
-     * @return List of all the aliases
+     * @return List of all the aliases (an empty list, in case there is no 
alias for the given cluster)
      */
     @Override
     public List<String> getAliasesForCluster(final String clusterName) throws 
AliasServiceException {
-        final List<String> localAliases = 
localAliasService.getAliasesForCluster(clusterName);
+        final List<String> localAliases = localAliasService == null ? 
Collections.emptyList() : localAliasService.getAliasesForCluster(clusterName);
         if (localAliases == null || localAliases.isEmpty()) {
-          return remoteClient == null ? new ArrayList<>() : 
remoteClient.listChildEntries(buildClusterEntryName(clusterName));
+          if (remoteClient != null) {
+            final List<String> remoteAliases = 
remoteClient.listChildEntries(buildClusterEntryName(clusterName));
+            return remoteAliases == null ? new ArrayList<>() : remoteAliases;

Review comment:
       `Collections.emptyList() ` might be better here too like you did above.

##########
File path: 
gateway-server/src/main/java/org/apache/knox/gateway/services/factory/AbstractServiceFactory.java
##########
@@ -47,22 +52,38 @@ public Service create(GatewayServices gatewayServices, 
ServiceType serviceType,
   @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);
+    Service service = fetchFromCache(serviceType, implementation);
+    if (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);

Review comment:
       Typo in Error :)

##########
File path: 
gateway-server/src/main/java/org/apache/knox/gateway/services/factory/AliasServiceFactory.java
##########
@@ -54,7 +57,8 @@ protected Service createService(GatewayServices 
gatewayServices, ServiceType ser
       } 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));
+        final boolean useLocalAliasService = options == null ? true : 
Boolean.valueOf(options.getOrDefault(USE_LOCAL_ALIAS_IN_ZK_IMPL_PARAM_NAME, 
"true"));
+        service = new 
ZookeeperRemoteAliasServiceProvider().newInstance(useLocalAliasService ? 
defaultAliasService : null, getMasterService(gatewayServices));

Review comment:
       Does this mean the default behavior is to store tokens in ZK?

##########
File path: 
gateway-server/src/main/java/org/apache/knox/gateway/services/security/impl/ZookeeperRemoteAliasService.java
##########
@@ -190,13 +190,18 @@ private static void checkPathsExist(final 
RemoteConfigurationRegistryClient remo
      *
      * @param clusterName
      *            cluster name
-     * @return List of all the aliases
+     * @return List of all the aliases (an empty list, in case there is no 
alias for the given cluster)
      */
     @Override
     public List<String> getAliasesForCluster(final String clusterName) throws 
AliasServiceException {
-        final List<String> localAliases = 
localAliasService.getAliasesForCluster(clusterName);
+        final List<String> localAliases = localAliasService == null ? 
Collections.emptyList() : localAliasService.getAliasesForCluster(clusterName);
         if (localAliases == null || localAliases.isEmpty()) {
-          return remoteClient == null ? new ArrayList<>() : 
remoteClient.listChildEntries(buildClusterEntryName(clusterName));
+          if (remoteClient != null) {
+            final List<String> remoteAliases = 
remoteClient.listChildEntries(buildClusterEntryName(clusterName));
+            return remoteAliases == null ? new ArrayList<>() : remoteAliases;
+          } else {
+            return new ArrayList<>();

Review comment:
       `Collections.emptyList() ` might be better here too like you did above. 
Unless this is mutable list.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Issue Time Tracking
-------------------

    Worklog Id:     (was: 458638)
    Time Spent: 20m  (was: 10m)

> Implement ZK token state service
> --------------------------------
>
>                 Key: KNOX-2399
>                 URL: https://issues.apache.org/jira/browse/KNOX-2399
>             Project: Apache Knox
>          Issue Type: Task
>    Affects Versions: 1.4.0
>            Reporter: Sandor Molnar
>            Assignee: Sandor Molnar
>            Priority: Major
>             Fix For: 1.5.0
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> Implement a new {{TokenStateService}} implementation which stores/fetches 
> token related metadata in Zookeeper. The new service should be configurable 
> to directly go to Zookeeper or use some local cache (e.g. a local alias 
> service).



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to