You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2015/01/05 14:34:39 UTC

[34/53] [abbrv] syncope git commit: Fixes #4 - Route functionalities are displayed only with Camel PM

Fixes #4 - Route functionalities are displayed only with Camel PM


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/b19ff851
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/b19ff851
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/b19ff851

Branch: refs/heads/master
Commit: b19ff8512f082d7d74ff40b0a53f6380d0905771
Parents: d8ec8da
Author: giacomolm <gi...@hotmail.it>
Authored: Tue Dec 30 16:47:31 2014 +0100
Committer: giacomolm <gi...@hotmail.it>
Committed: Tue Dec 30 16:47:31 2014 +0100

----------------------------------------------------------------------
 .../apache/syncope/client/SyncopeClient.java    | 26 +++++++
 .../syncope/common/services/RouteService.java   | 44 ++++++++---
 .../syncope/common/types/RESTHeaders.java       | 11 +++
 .../apache/syncope/console/SyncopeSession.java  |  7 ++
 .../syncope/console/pages/Configuration.java    | 15 +++-
 .../syncope/console/rest/RouteRestClient.java   | 22 +++++-
 .../syncope/console/pages/Configuration.html    |  2 +-
 .../core/provisioning/camel/CamelDetector.java  | 77 ++++++++++++++++++++
 .../syncope/core/services/RouteServiceImpl.java | 31 +++++++-
 core/src/main/resources/provisioning.properties |  4 +-
 10 files changed, 218 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/b19ff851/client/src/main/java/org/apache/syncope/client/SyncopeClient.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/syncope/client/SyncopeClient.java b/client/src/main/java/org/apache/syncope/client/SyncopeClient.java
index a471d54..f955951 100644
--- a/client/src/main/java/org/apache/syncope/client/SyncopeClient.java
+++ b/client/src/main/java/org/apache/syncope/client/SyncopeClient.java
@@ -26,6 +26,7 @@ import org.apache.syncope.client.rest.RestClientFactoryBean;
 import org.apache.syncope.common.search.OrderByClauseBuilder;
 import org.apache.syncope.common.search.RoleFiqlSearchConditionBuilder;
 import org.apache.syncope.common.search.UserFiqlSearchConditionBuilder;
+import org.apache.syncope.common.services.RouteService;
 import org.apache.syncope.common.services.UserSelfService;
 import org.apache.syncope.common.services.WorkflowService;
 import org.apache.syncope.common.types.Preference;
@@ -265,6 +266,31 @@ public class SyncopeClient {
 
         return result;
     }
+    
+    /**
+     * Checks whether Camel is enabled for users / roles, by calling <tt>RouteService</tt>'s options.
+     *
+     * @param subjectType user / role
+     * @return whether Camel Provisioning is enabled for given attributable type
+     * @see RouteService#getOptions(org.apache.syncope.common.types.SubjectType)
+     */
+    public boolean isCamelEnabledFor(final SubjectType subjectType) {
+        Response options = getService(RouteService.class).getOptions(subjectType);
+
+        boolean result;
+        switch (subjectType) {
+            case ROLE:
+                result = Boolean.valueOf(options.getHeaderString(RESTHeaders.CAMEL_ROLE_PROVISIONING_MANAGER));
+                break;
+
+            case USER:
+            default:
+                result = Boolean.valueOf(options.getHeaderString(RESTHeaders.CAMEL_USER_PROVISIONING_MANAGER));
+                break;
+        }
+
+        return result;
+    }
 
     /**
      * Fetches <tt>ETag</tt> header value from latest service run (if available).

http://git-wip-us.apache.org/repos/asf/syncope/blob/b19ff851/common/src/main/java/org/apache/syncope/common/services/RouteService.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/syncope/common/services/RouteService.java b/common/src/main/java/org/apache/syncope/common/services/RouteService.java
index feb7db7..6e3090f 100644
--- a/common/src/main/java/org/apache/syncope/common/services/RouteService.java
+++ b/common/src/main/java/org/apache/syncope/common/services/RouteService.java
@@ -16,34 +16,56 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.syncope.common.services;
 
 import java.util.List;
+import javax.validation.constraints.NotNull;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
+import javax.ws.rs.OPTIONS;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.apache.cxf.jaxrs.model.wadl.Description;
+import org.apache.cxf.jaxrs.model.wadl.Descriptions;
+import org.apache.cxf.jaxrs.model.wadl.DocTarget;
 import org.apache.syncope.common.to.RouteTO;
+import org.apache.syncope.common.types.SubjectType;
+
+@Path("routes/{kind}")
+public interface RouteService extends JAXRSService {
+
+    /**
+     * Checks whether Camel is choosed as default provisioning engine.
+     *
+     * @param kind user or role
+     * @return <tt>Response</tt> contains special syncope HTTP header indicating if Camel is enabled for
+     * users / roles provisioning
+     * @see org.apache.syncope.common.types.RESTHeaders#CAMEL_USER_PROVISIONING_MANAGER
+     * @see org.apache.syncope.common.types.RESTHeaders#CAMEL_ROLE_PROVISIONING_MANAGER
+     *
+     * @Descriptions({
+     * @Description(target = DocTarget.RESPONSE,
+     * value = "Contains special syncope HTTP header indicating if Camel is the default provisioning manager")
+     * }) */
+    @OPTIONS
+    Response getOptions(@NotNull @PathParam("kind") SubjectType kind);
 
-@Path("routes")
-public interface RouteService extends JAXRSService{
-    
     @GET
     @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
-    List<RouteTO> getRoutes();
-    
+    List<RouteTO> getRoutes(@NotNull @PathParam("kind") SubjectType kind);
+
     @GET
     @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
     @Path("{id}")
-    public RouteTO getRoute(@PathParam("id") Long Id);
-    
+    public RouteTO getRoute(@NotNull @PathParam("kind") SubjectType kind, @PathParam("id") Long Id);
+
     @PUT
     @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
     @Path("{id}")
-    void importRoute(@PathParam("id") Long id, RouteTO route);
-    
-}
\ No newline at end of file
+    void importRoute(@NotNull @PathParam("kind") SubjectType kind,@PathParam("id") Long id, RouteTO route);
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/b19ff851/common/src/main/java/org/apache/syncope/common/types/RESTHeaders.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/syncope/common/types/RESTHeaders.java b/common/src/main/java/org/apache/syncope/common/types/RESTHeaders.java
index ddbfca2..3e7cdc3 100644
--- a/common/src/main/java/org/apache/syncope/common/types/RESTHeaders.java
+++ b/common/src/main/java/org/apache/syncope/common/types/RESTHeaders.java
@@ -57,6 +57,17 @@ public final class RESTHeaders {
      * Option key stating if Activiti workflow adapter is in use for roles.
      */
     public static final String ACTIVITI_ROLE_ENABLED = "Syncope.Activiti.Role.Enabled";
+    
+     /**
+     * Option key stating if Camel is the current provisioning manager engine.
+     */
+    public static final String CAMEL_USER_PROVISIONING_MANAGER ="Syncope.Provisioning.Camel.User.Enabled";
+    
+    /**
+     * Option key stating if Camel is the current provisioning manager engine.
+     */
+    public static final String CAMEL_ROLE_PROVISIONING_MANAGER ="Syncope.Provisioning.Camel.Role.Enabled";
+
 
     /**
      * HTTP header key for object ID assigned to an object after its creation.

http://git-wip-us.apache.org/repos/asf/syncope/blob/b19ff851/console/src/main/java/org/apache/syncope/console/SyncopeSession.java
----------------------------------------------------------------------
diff --git a/console/src/main/java/org/apache/syncope/console/SyncopeSession.java b/console/src/main/java/org/apache/syncope/console/SyncopeSession.java
index ae81852..53b03c0 100644
--- a/console/src/main/java/org/apache/syncope/console/SyncopeSession.java
+++ b/console/src/main/java/org/apache/syncope/console/SyncopeSession.java
@@ -114,6 +114,13 @@ public class SyncopeSession extends WebSession {
                 : clients.values().iterator().next();
         return client.isActivitiEnabledFor(type);
     }
+    
+    public boolean isCamelEnabledFor(final SubjectType type) {
+        SyncopeClient client = clients.isEmpty()
+                ? clientFactory.createAnonymous()
+                : clients.values().iterator().next();
+        return client.isCamelEnabledFor(type);
+    }
 
     public <T> T getService(final Class<T> service) {
         return getService(service, this.username, this.password);

http://git-wip-us.apache.org/repos/asf/syncope/blob/b19ff851/console/src/main/java/org/apache/syncope/console/pages/Configuration.java
----------------------------------------------------------------------
diff --git a/console/src/main/java/org/apache/syncope/console/pages/Configuration.java b/console/src/main/java/org/apache/syncope/console/pages/Configuration.java
index 10dcfc7..05316dd 100644
--- a/console/src/main/java/org/apache/syncope/console/pages/Configuration.java
+++ b/console/src/main/java/org/apache/syncope/console/pages/Configuration.java
@@ -52,6 +52,7 @@ import org.apache.syncope.console.wicket.extensions.markup.html.repeater.data.ta
 import org.apache.syncope.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.syncope.console.wicket.markup.html.link.VeilPopupSettings;
+import org.apache.wicket.Component;
 import org.apache.wicket.Page;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
@@ -278,7 +279,8 @@ public class Configuration extends BasePage {
         add(new LayoutsPanel("selfMembershipLayoutPanel", AttrLayoutType.SELF_MEMBERSHIP, feedbackPanel));
         
         //Route Management
-        add(editRouteWin = new ModalWindow("editRouteWin"));
+        editRouteWin = new ModalWindow("editRouteWin");
+        add(editRouteWin);
         setupRoutes();
     }
 
@@ -828,7 +830,18 @@ public class Configuration extends BasePage {
         WebMarkupContainer routeContainer = new WebMarkupContainer("routesContainer");
         routeContainer.add(routeTable);
         routeContainer.setOutputMarkupId(true);
+        
+        ListItem<Object> li = new ListItem<Object>("routeTab", 0);
+        if (routeRestClient.isCamelEnabledForUsers() == false) {
+            li.setVisible(false);
+            routeContainer.setVisible(false);   
+        }
+        else{
+            li.setVisible(true);
+            routeContainer.setVisible(true); 
+        }
 
+        add(li);
         add(routeContainer);
 
         editRouteWin.setCssClassName(ModalWindow.CSS_CLASS_GRAY);

http://git-wip-us.apache.org/repos/asf/syncope/blob/b19ff851/console/src/main/java/org/apache/syncope/console/rest/RouteRestClient.java
----------------------------------------------------------------------
diff --git a/console/src/main/java/org/apache/syncope/console/rest/RouteRestClient.java b/console/src/main/java/org/apache/syncope/console/rest/RouteRestClient.java
index 673652a..dcfb8c3 100644
--- a/console/src/main/java/org/apache/syncope/console/rest/RouteRestClient.java
+++ b/console/src/main/java/org/apache/syncope/console/rest/RouteRestClient.java
@@ -19,8 +19,11 @@
 package org.apache.syncope.console.rest;
 
 import java.util.List;
+import org.apache.syncope.common.SyncopeClientException;
 import org.apache.syncope.common.services.RouteService;
 import org.apache.syncope.common.to.RouteTO;
+import org.apache.syncope.common.types.SubjectType;
+import org.apache.syncope.console.SyncopeSession;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -31,17 +34,30 @@ public class RouteRestClient extends BaseRestClient{
     protected static final Logger LOG = LoggerFactory.getLogger(RouteRestClient.class);
     
     public List<RouteTO> readRoutes(){
-        return getService(RouteService.class).getRoutes();
+        return getService(RouteService.class).getRoutes(SubjectType.USER);
     }
     
     public RouteTO readRoute(Long id){
-        return getService(RouteService.class).getRoute(id);
+        return getService(RouteService.class).getRoute(SubjectType.USER, id);
     }
     
     public void updateRoute(Long id, String definition){
         RouteTO routeTO = readRoute(id);        
         routeTO.setRouteContent(definition);     
-        getService(RouteService.class).importRoute(routeTO.getId(), routeTO);
+        getService(RouteService.class).importRoute(SubjectType.USER, routeTO.getId(), routeTO);
+    }
+    
+    public boolean isCamelEnabledForUsers() {
+        Boolean result = null;
+        try {
+            result = SyncopeSession.get().isCamelEnabledFor(SubjectType.USER);
+        } catch (SyncopeClientException e) {
+            LOG.error("While seeking if Camel is enabled for users", e);
+        }
+
+        return result == null
+                ? false
+                : result.booleanValue();
     }
     
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/b19ff851/console/src/main/resources/org/apache/syncope/console/pages/Configuration.html
----------------------------------------------------------------------
diff --git a/console/src/main/resources/org/apache/syncope/console/pages/Configuration.html b/console/src/main/resources/org/apache/syncope/console/pages/Configuration.html
index 62f97a8..130c89a 100644
--- a/console/src/main/resources/org/apache/syncope/console/pages/Configuration.html
+++ b/console/src/main/resources/org/apache/syncope/console/pages/Configuration.html
@@ -38,7 +38,7 @@ under the License.
                 <li><a href="#notifications"><span><wicket:message key="notifications"/></span></a></li>
                 <li><a href="#securityQuestions"><span><wicket:message key="securityQuestions"/></span></a></li>
                 <li><a href="#workflow"><span><wicket:message key="workflow"/></span></a></li>
-                <li><a href="#routes"><span><wicket:message key="routes"/></span></a></li>
+                <li wicket:id="routeTab"><a href="#routes"><span><wicket:message key="routes"/></span></a></li>
                 <li><a href="#logs"><span><wicket:message key="logs"/></span></a></li>
             </ul>
             <div id="layouts">

http://git-wip-us.apache.org/repos/asf/syncope/blob/b19ff851/core/src/main/java/org/apache/syncope/core/provisioning/camel/CamelDetector.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/syncope/core/provisioning/camel/CamelDetector.java b/core/src/main/java/org/apache/syncope/core/provisioning/camel/CamelDetector.java
new file mode 100644
index 0000000..646c350
--- /dev/null
+++ b/core/src/main/java/org/apache/syncope/core/provisioning/camel/CamelDetector.java
@@ -0,0 +1,77 @@
+/*
+ * 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.syncope.core.provisioning.camel;
+
+import java.io.InputStream;
+import java.util.Properties;
+import org.apache.commons.io.IOUtils;
+import org.apache.syncope.core.persistence.dao.impl.ContentLoader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author giacomolm
+ */
+public class CamelDetector {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(CamelDetector.class);
+
+    private static final String PROVISIONING_PROPERTIES = "/provisioning.properties";
+     
+    private static String userPMClassName;
+
+    private static String rolePMClassName;
+    
+     /**
+     * Read classpath:/provisioning.properties in order to determine the configured provisioning adapter class name.
+     */
+    static {
+        Properties props = new Properties();
+        InputStream propStream = null;
+        try {
+            propStream = ContentLoader.class.getResourceAsStream(PROVISIONING_PROPERTIES);
+            props.load(propStream);
+            userPMClassName = props.getProperty("userProvisioningManager");
+            rolePMClassName = props.getProperty("roleProvisioningManager");
+        } catch (Exception e) {
+            LOG.error("Could not load workflow.properties", e);
+        } finally {
+            IOUtils.closeQuietly(propStream);
+        }
+    }
+    
+    /**
+     * Check if the configured user provisioning manager is Camel's.
+     *
+     * @return whether Activiti is configured for user workflow or not
+     */
+    public static boolean isCamelEnabledForUsers() {
+        return userPMClassName != null && userPMClassName.equals(CamelUserProvisioningManager.class.getName());
+    }
+
+    /**
+     * Check if the configured role provisioning manager is Camel's.
+     *
+     * @return whether Activiti is configured for role workflow or not
+     */
+    public static boolean isCamelEnabledForRoles() {
+        return rolePMClassName != null && rolePMClassName.equals(CamelRoleProvisioningManager.class.getName());
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/b19ff851/core/src/main/java/org/apache/syncope/core/services/RouteServiceImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/syncope/core/services/RouteServiceImpl.java b/core/src/main/java/org/apache/syncope/core/services/RouteServiceImpl.java
index ecc323e..29359f8 100644
--- a/core/src/main/java/org/apache/syncope/core/services/RouteServiceImpl.java
+++ b/core/src/main/java/org/apache/syncope/core/services/RouteServiceImpl.java
@@ -18,33 +18,58 @@
  */
 package org.apache.syncope.core.services;
 
+import static org.apache.syncope.core.services.AbstractServiceImpl.OPTIONS_ALLOW;
+
 import java.util.List;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.services.RouteService;
 import org.apache.syncope.common.to.RouteTO;
+import org.apache.syncope.common.types.RESTHeaders;
+import org.apache.syncope.common.types.SubjectType;
+import org.apache.syncope.core.provisioning.camel.CamelDetector;
 import org.apache.syncope.core.rest.controller.RouteController;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 @Service
 public class RouteServiceImpl extends AbstractServiceImpl implements RouteService {
+    
+    @Override
+    public Response getOptions(final SubjectType kind) {
+        String key;
+        String value;
+        if (kind == SubjectType.USER) {
+            key = RESTHeaders.CAMEL_USER_PROVISIONING_MANAGER;
+            value = Boolean.toString(CamelDetector.isCamelEnabledForUsers());
+        } else {
+            key = RESTHeaders.CAMEL_ROLE_PROVISIONING_MANAGER;
+            value = Boolean.toString(CamelDetector.isCamelEnabledForRoles());
+        }
+        Response.ResponseBuilder builder = Response.ok().header(HttpHeaders.ALLOW, OPTIONS_ALLOW);
+        if (key != null && value != null) {
+            builder.header(key, value);
+        }
+        return builder.build();
+    }
 
     @Autowired
     private RouteController controller;
 
     @Override
-    public List<RouteTO> getRoutes() {
+    public List<RouteTO> getRoutes(SubjectType kind) {
 
         return controller.listRoutes();
     }
 
     @Override
-    public RouteTO getRoute(Long id) {
+    public RouteTO getRoute(SubjectType kind, Long id) {
 
         return controller.readRoute(id);
     }
 
     @Override
-    public void importRoute(Long id, RouteTO route) {
+    public void importRoute(SubjectType kind,Long id, RouteTO route) {
         controller.updateRoute(route);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/b19ff851/core/src/main/resources/provisioning.properties
----------------------------------------------------------------------
diff --git a/core/src/main/resources/provisioning.properties b/core/src/main/resources/provisioning.properties
index a8e49bf..de6c3cd 100644
--- a/core/src/main/resources/provisioning.properties
+++ b/core/src/main/resources/provisioning.properties
@@ -15,5 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 
-userProvisioningManager=org.apache.syncope.core.provisioning.camel.CamelUserProvisioningManager
-roleProvisioningManager=org.apache.syncope.core.provisioning.camel.CamelRoleProvisioningManager
\ No newline at end of file
+userProvisioningManager=org.apache.syncope.core.provisioning.DefaultUserProvisioningManager
+roleProvisioningManager=org.apache.syncope.core.provisioning.DefaultRoleProvisioningManager
\ No newline at end of file