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/08/13 12:40:01 UTC

[1/5] syncope git commit: [SYNCOPE-156] providing ListView table view + Provision wizard functionalities

Repository: syncope
Updated Branches:
  refs/heads/SYNCOPE-652 f098a832e -> f03ffb300


http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionPanel.html
new file mode 100644
index 0000000..7df9317
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionPanel.html
@@ -0,0 +1,39 @@
+<!--
+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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+  <wicket:panel>
+
+    <div id="bean">
+      <div class="tablerow" wicket:id="fields">
+        <div class="tablecolumn_check">
+          <span wicket:id="check">[check]</span>
+        </div>
+        <div class="tablecolumn_label short_dynamicsize">
+          <label for="label">
+            <span wicket:id="label">[label]</span>
+          </label>
+        </div>
+        <div class="tablecolumn_field medium_dynamicsize">
+          <span wicket:id="field">[field]</span>
+        </div>
+      </div>
+    </div>
+
+  </wicket:panel>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.html
index b85acb6..a07a8dc 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.html
@@ -18,18 +18,15 @@ under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
   <wicket:extend>
-    <p class="ui-widget ui-corner-all ui-widget-header">
-        <span wicket:id="new"/>&nbsp;<wicket:message key="title"/>&nbsp;<span wicket:id="key"/>
-    </p>
-    <div style="margin: 5px;">
-      <form wicket:id="form">
-        <div id="tabs">
-          <ul>
-            <li class="tabs-selected"><a href="#tabs-1"><span><wicket:message key="tab1"/></span></a></li>
-            <li><a href="#tabs-2"><span><wicket:message key="tab2"/></span></a></li>
-            <li><a href="#tabs-3"><span><wicket:message key="tab3"/></span></a></li>
-          </ul>
-          <div id="tabs-1">
+    <form wicket:id="form">
+      <div class="tabbable tabs-left">
+        <ul class="nav nav-tabs">
+          <li class="active"><a  data-toggle="tab" href="#tabs-1"><span><wicket:message key="tab1"/></span></a></li>
+          <li><a  data-toggle="tab" href="#tabs-2"><span><wicket:message key="tab2"/></span></a></li>
+          <li><a  data-toggle="tab" href="#tabs-3"><span><wicket:message key="tab3"/></span></a></li>
+        </ul>
+        <div class="tab-content">
+          <div id="tabs-1" class="tab-pane active">
             <div id="formtable">
               <div class="tablerow alt">
                 <div class="tablecolumn_label short_dynamicsize">
@@ -112,7 +109,7 @@ under the License.
               </div>
             </div>
           </div>
-          <div id="tabs-2">
+          <div id="tabs-2" class="tab-pane">
             <div id="formtable">
               <span wicket:id="container">
                 <div style="border-bottom: 10px">
@@ -142,20 +139,16 @@ under the License.
               </span>
             </div>
           </div>
-          <div id="tabs-3">
+          <div id="tabs-3" class="tab-pane">
             <span wicket:id="capabilitiesPalette"/>
           </div>
         </div>
+      </div>
 
-        <div style="margin: 20px 10px 0">
-          <input type="submit"
-                 class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
-                 wicket:id="apply"/>
-          <input type="button"
-                 class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
-                 wicket:id="cancel"/>
-        </div>
-      </form>
-    </div>
+      <div class="modal-footer">
+        <input type="submit" class="btn btn-primary" wicket:id="apply"/>
+        <input type="button" class="btn btn-default" wicket:id="cancel"/>
+      </div>
+    </form>
   </wicket:extend>
 </html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ListViewPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ListViewPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ListViewPanel.html
new file mode 100644
index 0000000..ec4cc94
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ListViewPanel.html
@@ -0,0 +1,60 @@
+<!--
+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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+  <wicket:panel>
+    <span wicket:id="container">
+      <wicket:container wicket:id="content" />
+    </span>
+
+    <wicket:fragment wicket:id="wizard">
+      <span wicket:id="wizard"/>
+    </wicket:fragment>
+
+    <wicket:fragment wicket:id="table">
+      <div class="col-xs-12">
+        <div class="box">
+          <div class="box-header">
+            <h3 class="box-title">
+              <span wicket:id="caption"/>
+            </h3>
+          </div><!-- /.box-header -->
+          <div class="box-body table-responsive no-padding">
+            <table class="table table-hover">
+              <tbody>
+                <tr>
+                  <th wicket:id="names"><span wicket:id="name"/></th>
+                </tr>
+                <tr wicket:id="beans">
+                  <td wicket:id="fields"><span wicket:id="field"/></td>
+                  <td>
+                    <div class="listview-actions">
+                      <span wicket:id="actions">[actions]</span>
+                    </div>
+                  </td>
+                </tr>
+              </tbody></table>
+          </div><!-- /.box-body -->
+        </div><!-- /.box -->
+      </div>
+      <div class="modal-footer">
+        <input type="submit" class="btn btn-primary" value="Add" wicket:message="value:listview.add" wicket:id="add"/>
+      </div>
+    </wicket:fragment>
+  </wicket:panel>
+</html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.html
index 8cb22f0..2d4f7b4 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.html
@@ -22,8 +22,7 @@ under the License.
       <div class="tabbable tabs-left">
         <ul class="nav nav-tabs">
           <li class="active"><a  data-toggle="tab" href="#resource"><span><wicket:message key="resource"/></span></a></li>
-          <li><a  data-toggle="tab" href="#umapping"><span><wicket:message key="umapping"/></span></a></li>
-          <li><a  data-toggle="tab" href="#gmapping"><span><wicket:message key="gmapping"/></span></a></li>
+          <li><a  data-toggle="tab" href="#provisions"><span><wicket:message key="provisions"/></span></a></li>
           <li><a  data-toggle="tab" href="#connectorProperties"><span><wicket:message key="connectorProperties"/></span></a></li>
           <li><a  data-toggle="tab" href="#security"><span><wicket:message key="security"/></span></a></li>
         </ul>
@@ -32,11 +31,10 @@ under the License.
             <span wicket:id="details">[details]</span>
             <span wicket:id="systeminformation">[System Information]</span>
           </div>
-          <div id="umapping" class="tab-pane">
-            <span wicket:id="umapping">[umapping]</span>
-          </div>
-          <div id="gmapping" class="tab-pane">
-            <span wicket:id="gmapping">[gmapping]</span>
+          <div id="provisions" class="tab-pane">
+            <span wicket:id="pcontainer">
+              <span wicket:id="provisions">[provisions]</span>
+            </span>
           </div>
           <div id="connectorProperties" class="tab-pane">
             <span wicket:id="connconf">[connconf]</span>
@@ -50,7 +48,7 @@ under the License.
       <div class="modal-footer">
         <input type="submit" class="btn btn-primary" wicket:id="apply"/>
         <input type="button" class="btn btn-default" wicket:id="cancel"/>
-      </div> 
+      </div>
     </form>
   </wicket:extend>
 </html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
index 789919b..24827a6 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 resource=Resource details
+provisions=Provisioning
 umapping=User mapping
 connectorProperties=Connector properties
 security=Security
@@ -58,3 +59,9 @@ actionsClasses=Actions classes
 gmapping=Group mapping
 new=New resource
 randomPwdIfNotProvided=Generate random passwords when missing
+
+anyType=Object Type
+objectClass= Object Class
+__ACCOUNT__=ACCOUNT
+__GROUP__=GROUP
+listview.caption=Provisioning configuration instances

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties
index 54179a5..1bc3c04 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 resource=Dettagli Risorsa
+provisions=Provisioning
 umapping=Mapping utenti
 connectorProperties=Propriet\u00e0\u00a0 Connettore
 security=Sicurezza
@@ -58,3 +59,9 @@ actionsClasses=Classi azioni
 gmapping=Mapping gruppi
 new=Nuova risorsa
 randomPwdIfNotProvided=Genera password casuali se mancanti
+
+anyType=Oggetto
+objectClass=Classe
+__ACCOUNT__=ACCOUNT
+__GROUP__=GROUP
+listview.caption=Istanze di configurazione del provisioning

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties
index 45c3616..47f41b2 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 resource=Detalhes de Recursos
+provisions=Provisioning
 umapping=Mapeamento de usu\u00e1rios
 connectorProperties=Propriedades de Conectores
 security=Seguran\u00e7a
@@ -58,3 +59,9 @@ actionsClasses=Classes de a\u00e7\u00f5es
 gmapping=Mapeamento de grupos
 new=Novo recurso
 randomPwdIfNotProvided=Gerar senhas aleat\u00f3rias quando n\u00e3o houver
+
+anyType=Objeto
+objectClass=Classe
+__ACCOUNT__=ACCOUNT
+__GROUP__=GROUP
+listview.caption=Inst\u00e2ncias de provisionamento de recursos

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.html b/client/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.html
index 8df7df7..fe7677e 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.html
@@ -44,21 +44,28 @@ under the License.
     </div>
     <div id="topology">
       <div id="drawing">
-        <div class="window topology_root" wicket:id="syncope" onmouseup="refreshPosition(this)">[syncope]</div>
+        <div class="window" wicket:id="syncope" onmouseup="refreshPosition(this)">[syncope]</div>
         <span wicket:id="connectorServers">
-          <div class="window topology_cs" wicket:id="cs" onmouseup="refreshPosition(this)">[resource]</div>
+          <div class="window" wicket:id="cs" onmouseup="refreshPosition(this)">[connector server]</div>
         </span>
-        <span wicket:id="conn1">
-          <div class="window topology_conn" wicket:id="conn" onmouseup="refreshPosition(this)">[resource]</div>
+        <span wicket:id="filePaths">
+          <div class="window" wicket:id="fp" onmouseup="refreshPosition(this)">[file path]</div>
         </span>
-        <span wicket:id="conn2">
-          <div class="window topology_conn" wicket:id="conn" onmouseup="refreshPosition(this)">[resource]</div>
+        <span wicket:id="conns">
+          <span wicket:id="conns">
+            <div class="window" wicket:id="conn" onmouseup="refreshPosition(this)">[connector]</div>
+          </span>
         </span>
         <span wicket:id="resources">
           <span wicket:id="resources">
-            <div class="window topology_res" wicket:id="res" onmouseup="refreshPosition(this)">[resource]</div>
+            <div class="window" wicket:id="res" onmouseup="refreshPosition(this)">[resource]</div>
           </span>
         </span>
+        <div wicket:id="newlyCreatedContainer">
+          <span wicket:id="newlyCreated">
+            <div class="window" wicket:id="el" onmouseup="refreshPosition(this)">[resource]</div>
+          </span>
+        </div>
       </div>
       <span wicket:id="jsPlace"></span>
     </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyNodePanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyNodePanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyNodePanel.html
index ed238c7..6faea50 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyNodePanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyNodePanel.html
@@ -19,41 +19,44 @@ under the License.
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
   <wicket:panel>
-    <div class="node-action-link btn-group">
-      <a href="javascript:void(0);" data-toggle="dropdown">
-        <i class="fa fa-sliders"></i>
-      </a>
-      <wicket:container wicket:id="actions" />
-    </div>
-
+    <wicket:container wicket:id="actions" />
     <p class="text-center text-primary" wicket:id="label"/>
 
-    <wicket:fragment wicket:id="connectorWithResourceActions">
-      <ul role="menu" class="dropdown-menu">
-        <li><a href="#"><i class="fa fa-plus"></i></a></li>
-        <li><a href="#"><i class="fa fa-pencil"></i></a></li>
-      </ul>
-    </wicket:fragment>
-
-    <wicket:fragment wicket:id="connectorWithNoResourceActions">
-      <ul role="menu" class="dropdown-menu">
-        <li><a href="#" wicket:id="create"><i class="fa fa-plus"></i></a></li>
-        <li><a href="#" wicket:id="delete"><i class="fa fa-minus"></i></a></li>
-        <li><a href="#" wicket:id="edit"><i class="fa fa-pencil"></i></a></li>
-      </ul>
+    <wicket:fragment wicket:id="connectorActions">
+      <div class="node-action-link btn-group">
+        <a href="javascript:void(0);" data-toggle="dropdown">
+          <i class="fa fa-sliders"></i>
+        </a>
+        <ul role="menu" class="dropdown-menu">
+          <li><a href="#" wicket:id="create"><i class="fa fa-plus"></i></a></li>
+          <li><a href="#" wicket:id="delete"><i class="fa fa-minus"></i></a></li>
+          <li><a href="#" wicket:id="edit"><i class="fa fa-pencil"></i></a></li>
+        </ul>
+      </div>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="resourceActions">
-      <ul role="menu" class="dropdown-menu">
-        <li><a href="#" wicket:id="delete"><i class="fa fa-minus"></i></a></li>
-        <li><a href="#" wicket:id="edit"><i class="fa fa-pencil"></i></a></li>
-      </ul>
+      <div class="node-action-link btn-group">
+        <a href="javascript:void(0);" data-toggle="dropdown">
+          <i class="fa fa-sliders"></i>
+        </a>
+        <ul role="menu" class="dropdown-menu">
+          <li><a href="#" wicket:id="delete"><i class="fa fa-minus"></i></a></li>
+          <li><a href="#" wicket:id="edit"><i class="fa fa-pencil"></i></a></li>
+        </ul>
+      </div>
     </wicket:fragment>
 
-    <wicket:fragment wicket:id="syncopeActions">
-      <ul role="menu" class="dropdown-menu">
-        <li><a href="#"><i class="fa fa-plus"></i></a></li>
-      </ul>
+    <wicket:fragment wicket:id="locationActions">
+      <div class="node-action-link btn-group">
+        <a href="javascript:void(0);" data-toggle="dropdown">
+          <i class="fa fa-sliders"></i>
+        </a>
+        <ul role="menu" class="dropdown-menu">
+          <li><a href="#" wicket:id="create"><i class="fa fa-plus"></i></a></li>
+        </ul>
+      </div>
     </wicket:fragment>
+    <wicket:fragment wicket:id="syncopeActions" />
   </wicket:panel>
 </html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
index cf51170..0f9d637 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
@@ -34,6 +34,10 @@ under the License.
     <span wicket:id="panelExecute">[plus]</span>
     <span wicket:id="panelEnable">[plus]</span>
     <span wicket:id="panelSearch">[plus]</span>
+    <span wicket:id="panelMapping">[plus]</span>
+    <span wicket:id="panelAccountLink">[plus]</span>
+    <span wicket:id="panelResetTime">[plus]</span>
+    <span wicket:id="panelClone">[plus]</span>
     <span wicket:id="panelCreate">[plus]</span>
     <span wicket:id="panelUserTemplate">[plus]</span>
     <span wicket:id="panelGroupTemplate">[plus]</span>
@@ -71,8 +75,24 @@ under the License.
       <a href="#" wicket:id="manageGroupsLink"><img id="actionLink" src="img/actions/groups-icon.png" alt="manage groups icon" title="Manage groups"/></a>
     </wicket:fragment>
 
+    <wicket:fragment wicket:id="fragmentMapping">
+      <a href="#" wicket:id="mappingLink" title="Mapping"><i class="fa fa-exchange"></i></a>
+    </wicket:fragment>
+
+    <wicket:fragment wicket:id="fragmentAccountLink">
+      <a href="#" wicket:id="accountLinkLink" title="Account Link"><i class="fa fa-external-link"></i></a>
+    </wicket:fragment>
+
+    <wicket:fragment wicket:id="fragmentResetTime">
+      <a href="#" wicket:id="resetTimeLink" title="Reset Time"><i class="fa fa-hourglass-start"></i></a>
+    </wicket:fragment>
+
+    <wicket:fragment wicket:id="fragmentClone">
+      <a href="#" wicket:id="cloneLink" title="Clone"><i class="fa fa-clone"></i></a>
+    </wicket:fragment>
+
     <wicket:fragment wicket:id="fragmentCreate">
-      <a href="#" wicket:id="createLink"><img id="actionLink" src="img/actions/create.png" alt="create icon" title="Create"/></a>
+      <a href="#" wicket:id="createLink" title="Create"><i class="fa fa-create"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentSearch">
@@ -100,7 +120,7 @@ under the License.
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentDelete">
-      <a href="#" wicket:id="deleteLink"><img id="actionLink" src="img/actions/delete.png" alt="delete icon" title="Delete"/></a>
+      <a href="#" wicket:id="deleteLink" title="Delete"><i class="fa fa-minus"></i></a>
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentDryRun">
@@ -160,13 +180,13 @@ under the License.
     </wicket:fragment>
 
     <wicket:fragment wicket:id="fragmentZoomIn">
-      <a href="#" wicket:id="zoomInLink"><i class="fa fa-search-plus"></i></a>
+      <a href="#" wicket:id="zoomInLink" title="Zoom In"><i class="fa fa-search-plus"></i></a>
     </wicket:fragment>
-    
+
     <wicket:fragment wicket:id="fragmentZoomOut">
-      <a href="#" wicket:id="zoomOutLink"><i class="fa fa-search-minus"></i></a>
+      <a href="#" wicket:id="zoomOutLink" title="Zoom Out"><i class="fa fa-search-minus"></i></a>
     </wicket:fragment>
-    
+
     <wicket:fragment wicket:id="emptyFragment">
     </wicket:fragment>
   </wicket:panel>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.html
index 52f1da9..af85a84 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.html
@@ -17,7 +17,9 @@ specific language governing permissions and limitations
 under the License.
 -->
 <html>
-    <wicket:panel>
-        <span wicket:id="checkBoxMultipleChoice" />
-    </wicket:panel>
+  <wicket:panel>
+    <div class="form-group">
+      <span wicket:id="checkBoxMultipleChoice" />
+    </div>
+  </wicket:panel>
 </html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$AccountLink.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$AccountLink.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$AccountLink.html
new file mode 100644
index 0000000..aa2e5ab
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$AccountLink.html
@@ -0,0 +1,23 @@
+<!--
+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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" >
+  <wicket:panel>
+    Specify here the account link .... work in progress
+  </wicket:panel>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$Mapping.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$Mapping.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$Mapping.html
new file mode 100644
index 0000000..2147713
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$Mapping.html
@@ -0,0 +1,23 @@
+<!--
+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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <wicket:panel>
+    <span wicket:id="mapping" />
+  </wicket:panel>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$ObjectType.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$ObjectType.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$ObjectType.html
new file mode 100644
index 0000000..e36f66d
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$ObjectType.html
@@ -0,0 +1,30 @@
+<!--
+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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <wicket:panel >
+    <div class="form-group">
+      <label>Object Type</label>
+      <input type="text" placeholder="Object Type ..." class="form-control"  wicket:id="type">
+    </div>
+    <div class="form-group">
+      <label>Object Class</label>
+      <input type="text" placeholder="Object Class ..." class="form-control"  wicket:id="class">
+    </div>
+  </wicket:panel>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard.properties
new file mode 100644
index 0000000..535da53
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard.properties
@@ -0,0 +1,24 @@
+# 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.
+
+type.title=Specify the type of the provisioning object
+type.summary=
+mapping.title=Specify the maping about the provisioning  object
+mapping.summary=
+link.title=Specify the account link (if required)
+link.summary=
+

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_it.properties
new file mode 100644
index 0000000..535da53
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_it.properties
@@ -0,0 +1,24 @@
+# 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.
+
+type.title=Specify the type of the provisioning object
+type.summary=
+mapping.title=Specify the maping about the provisioning  object
+mapping.summary=
+link.title=Specify the account link (if required)
+link.summary=
+

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_pt_BR.properties
new file mode 100644
index 0000000..535da53
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_pt_BR.properties
@@ -0,0 +1,24 @@
+# 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.
+
+type.title=Specify the type of the provisioning object
+type.summary=
+mapping.title=Specify the maping about the provisioning  object
+mapping.summary=
+link.title=Specify the account link (if required)
+link.summary=
+

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index bea197f..26e5754 100644
--- a/pom.xml
+++ b/pom.xml
@@ -376,11 +376,11 @@ under the License.
     <jquery-cookie.version>1.4.1-1</jquery-cookie.version>
     <bootstrap.version>3.3.5</bootstrap.version>
     <bootstrap-select.version>1.6.3</bootstrap-select.version>
-    <font-awesome.version>4.3.0</font-awesome.version>
+    <font-awesome.version>4.4.0</font-awesome.version>
     <ionicons.version>2.0.1</ionicons.version>
     <highlightjs.version>8.4-4</highlightjs.version>
     <codemirror.version>5.5</codemirror.version>
-    <jsplumb.version>1.6.4</jsplumb.version>
+    <jsplumb.version>1.7.5</jsplumb.version>
     
     <wicket.version>7.0.0</wicket.version>
     <wicket-jqueryui.version>7.0.0</wicket-jqueryui.version>
@@ -1081,6 +1081,7 @@ under the License.
           <configuration>
             <source>${targetJdk}</source>
             <target>${targetJdk}</target>
+	    <useIncrementalCompilation>false</useIncrementalCompilation>
             <showWarnings>true</showWarnings>
             <showDeprecation>true</showDeprecation>
             <!--<compilerArgument>-Xlint:unchecked</compilerArgument>-->


[3/5] syncope git commit: [SYNCOPE-156] providing ListView table view + Provision wizard functionalities

Posted by il...@apache.org.
[SYNCOPE-156] providing ListView table view  + Provision wizard functionalities


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

Branch: refs/heads/SYNCOPE-652
Commit: ba7f1a5ce9f852e9783853b7397a64a66ac4826c
Parents: 6ad532a
Author: fmartelli <fa...@gmail.com>
Authored: Wed Aug 12 15:55:08 2015 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Wed Aug 12 15:55:08 2015 +0200

----------------------------------------------------------------------
 .../console/pages/BulkActionModalPage.java      |   9 +-
 .../console/pages/ProvisioningModalPage.java    |  13 +-
 .../console/panels/AbstractResourceModal.java   |  78 +++++
 .../console/panels/ActionDataTablePanel.java    |  14 +-
 .../console/panels/BeanReflectionModal.java     |  36 ++
 .../console/panels/BeanReflectionPanel.java     | 339 +++++++++++++++++++
 .../client/console/panels/ConnectorModal.java   |  50 +--
 .../client/console/panels/ListViewPanel.java    | 322 ++++++++++++++++++
 .../client/console/panels/ModalContent.java     |   8 +-
 .../console/panels/ResourceMappingPanel.java    |  66 ++--
 .../client/console/panels/ResourceModal.java    |  94 +++--
 .../client/console/topology/Topology.java       | 337 ++++++++++--------
 .../client/console/topology/TopologyNode.java   |   5 +-
 .../console/topology/TopologyNodePanel.java     |  47 ++-
 .../markup/html/form/AbstractFieldPanel.java    |   2 +-
 .../wicket/markup/html/form/ActionLink.java     |  23 +-
 .../markup/html/form/ActionLinksPanel.java      | 261 +++++++++++---
 .../form/CheckBoxMultipleChoiceFieldPanel.java  |  13 +-
 .../client/console/wizards/AjaxWizard.java      | 125 +++++++
 .../console/wizards/AjaxWizardButton.java       |  66 ++++
 .../console/wizards/AjaxWizardButtonBar.java    | 111 ++++++
 .../client/console/wizards/ProvisionWizard.java | 123 +++++++
 .../META-INF/resources/css/syncopeConsole.css   | 139 ++++----
 .../resources/META-INF/resources/js/topology.js |  90 ++---
 .../console/panels/BeanReflectionModal.html     |  30 ++
 .../console/panels/BeanReflectionPanel.html     |  39 +++
 .../client/console/panels/ConnectorModal.html   |  41 +--
 .../client/console/panels/ListViewPanel.html    |  60 ++++
 .../client/console/panels/ResourceModal.html    |  14 +-
 .../console/panels/ResourceModal.properties     |   7 +
 .../console/panels/ResourceModal_it.properties  |   7 +
 .../panels/ResourceModal_pt_BR.properties       |   7 +
 .../client/console/topology/Topology.html       |  21 +-
 .../console/topology/TopologyNodePanel.html     |  59 ++--
 .../markup/html/form/ActionLinksPanel.html      |  32 +-
 .../form/CheckBoxMultipleChoiceFieldPanel.html  |   8 +-
 .../wizards/ProvisionWizard$AccountLink.html    |  23 ++
 .../wizards/ProvisionWizard$Mapping.html        |  23 ++
 .../wizards/ProvisionWizard$ObjectType.html     |  30 ++
 .../console/wizards/ProvisionWizard.properties  |  24 ++
 .../wizards/ProvisionWizard_it.properties       |  24 ++
 .../wizards/ProvisionWizard_pt_BR.properties    |  24 ++
 pom.xml                                         |   5 +-
 43 files changed, 2350 insertions(+), 499 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
index 5567094..6172639 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.pages;
 
+import java.io.Serializable;
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -39,7 +40,6 @@ import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvid
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.springframework.beans.BeanUtils;
 
@@ -85,7 +85,8 @@ public class BulkActionModalPage<T, S> extends BaseModalPage {
                 Integer.MAX_VALUE).setVisible(items != null && !items.isEmpty()));
 
         @SuppressWarnings("rawtypes")
-        final ActionLinksPanel actionPanel = new ActionLinksPanel("actions", new Model(), getPageReference());
+        final ActionLinksPanel<Serializable> actionPanel
+                = ActionLinksPanel.builder(getPageReference()).build("actions");
         add(actionPanel);
 
         for (ActionLink.ActionType action : actions) {
@@ -118,12 +119,12 @@ public class BulkActionModalPage<T, S> extends BaseModalPage {
                     LOG.error("Bulk action type not supported");
             }
 
-            actionPanel.add(new ActionLink() {
+            actionPanel.add(new ActionLink<Serializable>() {
 
                 private static final long serialVersionUID = -3722207913631435501L;
 
                 @Override
-                public void onClick(final AjaxRequestTarget target) {
+                public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
                     try {
                         final BulkActionResult res = (BulkActionResult) bulkActionExecutor.getClass().
                                 getMethod("bulkAction", BulkAction.class).invoke(bulkActionExecutor, bulkAction);

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
index 9937e36..32a4921 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.pages;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.LinkedHashMap;
@@ -129,12 +130,12 @@ public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalP
 
         final String pageId = "Resources";
 
-        table.addAction(new ActionLink() {
+        table.addAction(new ActionLink<Serializable>() {
 
             private static final long serialVersionUID = -3722207913631435501L;
 
             @Override
-            public void onClick(final AjaxRequestTarget target) {
+            public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
                 try {
                     bulkAssociationAction(target, ResourceDeassociationActionType.UNLINK, table, columns);
                 } catch (Exception e) {
@@ -145,12 +146,12 @@ public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalP
             }
         }, ActionLink.ActionType.UNLINK, pageId);
 
-        table.addAction(new ActionLink() {
+        table.addAction(new ActionLink<Serializable>() {
 
             private static final long serialVersionUID = -3722207913631435501L;
 
             @Override
-            public void onClick(final AjaxRequestTarget target) {
+            public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
                 try {
                     bulkAssociationAction(target, ResourceDeassociationActionType.DEPROVISION, table, columns);
                 } catch (Exception e) {
@@ -161,12 +162,12 @@ public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalP
             }
         }, ActionLink.ActionType.DEPROVISION, pageId);
 
-        table.addAction(new ActionLink() {
+        table.addAction(new ActionLink<Serializable>() {
 
             private static final long serialVersionUID = -3722207913631435501L;
 
             @Override
-            public void onClick(final AjaxRequestTarget target) {
+            public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
                 try {
                     bulkAssociationAction(target, ResourceDeassociationActionType.UNASSIGN, table, columns);
                 } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
new file mode 100644
index 0000000..1ed9050
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
@@ -0,0 +1,78 @@
+/*
+ * 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.client.console.panels;
+
+import java.io.Serializable;
+import org.apache.syncope.client.console.topology.TopologyNode;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+
+/**
+ * Modal window with Resource form.
+ */
+public abstract class AbstractResourceModal extends ModalContent {
+
+    private static final long serialVersionUID = 1734415311027284221L;
+
+    public AbstractResourceModal(final ModalWindow window, final PageReference pageRef) {
+        super(window, pageRef);
+    }
+
+    public static class CreateEvent extends ModalEvent {
+
+        private final Serializable key;
+
+        private final String displayName;
+
+        private final Serializable parent;
+
+        private final TopologyNode.Kind kind;
+
+        public CreateEvent(
+                final Serializable key,
+                final String displayName,
+                final TopologyNode.Kind kind,
+                final Serializable parent,
+                final AjaxRequestTarget target) {
+            super(target);
+            this.key = key;
+            this.displayName = displayName;
+            this.kind = kind;
+            this.parent = parent;
+        }
+
+        public Serializable getKey() {
+            return key;
+        }
+
+        public String getDisplayName() {
+            return displayName;
+        }
+
+        public TopologyNode.Kind getKind() {
+            return kind;
+        }
+
+        public Serializable getParent() {
+            return parent;
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
index 80d05a1..837c89d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.client.console.panels;
 
+import java.io.Serializable;
 import java.util.Collection;
 import java.util.List;
 import org.apache.syncope.client.console.commons.ActionTableCheckGroup;
@@ -37,7 +38,6 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 
 public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
@@ -48,7 +48,7 @@ public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
 
     private final Form<T> bulkActionForm;
 
-    private final ActionLinksPanel actionPanel;
+    private final ActionLinksPanel<Serializable> actionPanel;
 
     private final PageReference pageRef;
 
@@ -93,7 +93,7 @@ public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
         final WebMarkupContainer actionPanelContainer = new WebMarkupContainer("actionPanelContainer");
         bulkActionForm.add(actionPanelContainer);
 
-        actionPanel = new ActionLinksPanel("actions", new Model(), pageRef);
+        actionPanel = ActionLinksPanel.builder(pageRef).build("actions");
         actionPanelContainer.add(actionPanel);
 
         if (dataTable.getRowCount() == 0) {
@@ -111,11 +111,13 @@ public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
         }.setVisible(false).setEnabled(false));
     }
 
-    public void addAction(final ActionLink action, final ActionType type, final String entitlements) {
-        actionPanel.add(action, type, entitlements);
+    public void addAction(
+            final ActionLink<Serializable> action, final ActionType type, final String entitlements) {
+        actionPanel.add(action, type, entitlements, true);
     }
 
-    public void addAction(final ActionLink action, final ActionType type, final String pageId, final boolean enabled) {
+    public void addAction(
+            final ActionLink<Serializable> action, final ActionType type, final String pageId, final boolean enabled) {
         actionPanel.add(action, type, pageId, enabled);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionModal.java
new file mode 100644
index 0000000..a6859e8
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionModal.java
@@ -0,0 +1,36 @@
+/*
+ * 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.client.console.panels;
+
+import java.io.Serializable;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+
+/**
+ * Modal window with Resource form.
+ */
+public abstract class BeanReflectionModal extends ModalContent {
+
+    private static final long serialVersionUID = 1734415311027284222L;
+
+    public BeanReflectionModal(final Serializable bean, final ModalWindow window, final PageReference pageRef) {
+        super(window, pageRef);
+        add(new BeanReflectionPanel("bean", bean));
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionPanel.java
new file mode 100644
index 0000000..4f3f1d5
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionPanel.java
@@ -0,0 +1,339 @@
+/*
+ * 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.client.console.panels;
+
+import java.beans.PropertyDescriptor;
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.rest.PolicyRestClient;
+import org.apache.syncope.client.console.rest.SchemaRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.form.AbstractFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.SpinnerFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.list.AltListView;
+import org.apache.syncope.common.lib.annotation.ClassList;
+import org.apache.syncope.common.lib.annotation.SchemaList;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.util.ListModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.ClassUtils;
+import org.springframework.util.ReflectionUtils;
+import org.springframework.util.ReflectionUtils.FieldCallback;
+import org.springframework.util.ReflectionUtils.FieldFilter;
+
+public class BeanReflectionPanel extends Panel {
+
+    private static final long serialVersionUID = -3035998190456928143L;
+
+    /**
+     * Logger.
+     */
+    private static final Logger LOG = LoggerFactory.getLogger(BeanReflectionPanel.class);
+
+    @SpringBean
+    private SchemaRestClient schemaRestClient;
+
+    @SpringBean
+    private PolicyRestClient policyRestClient;
+
+    private final IModel<List<String>> userSchemas = new LoadableDetachableModel<List<String>>() {
+
+        private static final long serialVersionUID = -2012833443695917883L;
+
+        @Override
+        protected List<String> load() {
+            return schemaRestClient.getPlainSchemaNames();
+        }
+    };
+
+    private final IModel<List<String>> groupSchemas = new LoadableDetachableModel<List<String>>() {
+
+        private static final long serialVersionUID = 5275935387613157437L;
+
+        @Override
+        protected List<String> load() {
+            return schemaRestClient.getPlainSchemaNames();
+        }
+    };
+
+    private final IModel<List<String>> correlationRules = new LoadableDetachableModel<List<String>>() {
+
+        private static final long serialVersionUID = 5275935387613157437L;
+
+        @Override
+        protected List<String> load() {
+            return policyRestClient.getCorrelationRuleClasses();
+        }
+    };
+
+    public BeanReflectionPanel(final String id, final Serializable bean) {
+        super(id);
+
+        final List<FieldWrapper> items = new ArrayList<>();
+        ReflectionUtils.doWithFields(bean.getClass(),
+                new FieldCallback() {
+
+                    @Override
+                    public void doWith(final Field field) throws IllegalArgumentException, IllegalAccessException {
+                        FieldWrapper fieldWrapper = new FieldWrapper();
+                        fieldWrapper.setName(field.getName());
+                        fieldWrapper.setType(field.getType());
+
+                        final SchemaList schemaList = field.getAnnotation(SchemaList.class);
+                        fieldWrapper.setSchemaList(schemaList);
+
+                        final ClassList classList = field.getAnnotation(ClassList.class);
+                        fieldWrapper.setClassList(classList);
+
+                        items.add(fieldWrapper);
+                    }
+                },
+                new FieldFilter() {
+
+                    @Override
+                    public boolean matches(final Field field) {
+                        return !Modifier.isStatic(field.getModifiers()) && !"serialVersionUID".equals(field.getName());
+                    }
+                });
+
+        final ListView<FieldWrapper> policies = new AltListView<FieldWrapper>("fields", items) {
+
+            private static final long serialVersionUID = 9101744072914090143L;
+
+            @Override
+            @SuppressWarnings({ "unchecked", "rawtypes" })
+            protected void populateItem(final ListItem<FieldWrapper> item) {
+                final FieldWrapper field = item.getModelObject();
+
+                final PropertyDescriptor propDesc = BeanUtils.getPropertyDescriptor(bean.getClass(), field.getName());
+
+                item.add(new Label("label", new ResourceModel(field.getName())));
+
+                AbstractFieldPanel component;
+                try {
+                    if (field.getClassList() != null) {
+                        component = new AjaxDropDownChoicePanel("field", field.getName(), new PropertyModel(bean,
+                                field.getName()));
+
+                        final List<String> rules = correlationRules.getObject();
+
+                        if (rules != null && !rules.isEmpty()) {
+                            ((AjaxDropDownChoicePanel) component).setChoices(correlationRules.getObject());
+                        }
+
+                        item.add(component);
+
+                        item.add(getActivationControl(
+                                component,
+                                propDesc.getReadMethod().invoke(bean, new Object[] {}) != null,
+                                null,
+                                null));
+
+                    } else if (field.getType().isEnum()) {
+                        component = new AjaxDropDownChoicePanel("field", field.getName(), new PropertyModel(bean,
+                                field.getName()));
+
+                        final Serializable[] values = (Serializable[]) field.getType().getEnumConstants();
+
+                        if (values != null && values.length > 0) {
+                            ((AjaxDropDownChoicePanel) component).setChoices(Arrays.asList(values));
+                        }
+
+                        item.add(component);
+
+                        item.add(getActivationControl(
+                                component,
+                                (Enum<?>) propDesc.getReadMethod().invoke(bean, new Object[] {}) != null,
+                                values[0],
+                                values[0]));
+
+                    } else if (ClassUtils.isAssignable(Boolean.class, field.getType())) {
+                        item.add(new AjaxCheckBoxPanel("check", field.getName(),
+                                new PropertyModel<Boolean>(bean, field.getName())));
+
+                        item.add(new Label("field", new Model(null)));
+                    } else if (Collection.class.isAssignableFrom(field.getType())) {
+                        if (field.getSchemaList() != null) {
+                            final List<String> values = new ArrayList<>();
+                            if (field.getName().charAt(0) == 'r') {
+                                values.addAll(groupSchemas.getObject());
+
+                                if (field.getSchemaList().extended()) {
+                                    values.add("name");
+                                }
+                            } else {
+                                values.addAll(userSchemas.getObject());
+
+                                if (field.getSchemaList().extended()) {
+                                    values.add("key");
+                                    values.add("username");
+                                }
+                            }
+
+                            component = new AjaxPalettePanel("field", new PropertyModel(bean, field.getName()),
+                                    new ListModel<>(values));
+                            item.add(component);
+
+                            Collection<?> collection = (Collection) propDesc.getReadMethod().invoke(bean);
+                            item.add(getActivationControl(component,
+                                    !collection.isEmpty(), new ArrayList<String>(), new ArrayList<String>()));
+                        } else {
+                            final FieldPanel panel = new AjaxTextFieldPanel("panel", field.getName(),
+                                    new Model<String>(null));
+                            panel.setRequired(true);
+
+                            component = new MultiFieldPanel<String>("field",
+                                    new PropertyModel(bean, field.getName()), panel);
+
+                            item.add(component);
+
+                            final List<String> reinitializedValue = new ArrayList<String>();
+
+                            reinitializedValue.add("");
+
+                            item.add(getActivationControl(component,
+                                    !((Collection) propDesc.getReadMethod().invoke(bean, new Object[] {})).isEmpty(),
+                                    new ArrayList<String>(), (Serializable) reinitializedValue));
+                        }
+                    } else if (ClassUtils.isAssignable(Number.class, field.getType())) {
+                        component = new SpinnerFieldPanel<Number>("field", field.getName(),
+                                (Class<Number>) field.getType(), new PropertyModel<Number>(bean, field.getName()),
+                                null, null);
+                        item.add(component);
+
+                        item.add(getActivationControl(component,
+                                (Integer) propDesc.getReadMethod().invoke(bean, new Object[] {}) > 0, 0, 0));
+                    } else if (field.getType().equals(String.class)) {
+                        component = new AjaxTextFieldPanel("field", field.getName(),
+                                new PropertyModel(bean, field.getName()));
+
+                        item.add(component);
+
+                        item.add(getActivationControl(component,
+                                propDesc.getReadMethod().invoke(bean, new Object[] {}) != null, null, null));
+                    } else {
+                        item.add(new AjaxCheckBoxPanel("check", field.getName(), new Model()));
+                        item.add(new Label("field", new Model(null)));
+                    }
+                } catch (Exception e) {
+                    LOG.error("Error retrieving bean fields", e);
+                }
+            }
+        };
+
+        add(policies);
+    }
+
+    private <T extends Serializable> AjaxCheckBoxPanel getActivationControl(final AbstractFieldPanel<T> panel,
+            final Boolean checked, final T defaultModelObject, final T reinitializedValue) {
+
+        final AjaxCheckBoxPanel check = new AjaxCheckBoxPanel("check", "check", new Model<Boolean>(checked));
+
+        panel.setEnabled(checked);
+
+        check.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+            private static final long serialVersionUID = -1107858522700306810L;
+
+            @Override
+            protected void onUpdate(final AjaxRequestTarget target) {
+                if (check.getModelObject()) {
+                    panel.setEnabled(true);
+                    panel.setModelObject(reinitializedValue);
+                } else {
+                    panel.setModelObject(defaultModelObject);
+                    panel.setEnabled(false);
+                }
+
+                target.add(panel);
+            }
+        });
+
+        return check;
+    }
+
+    private static class FieldWrapper implements Serializable {
+
+        private static final long serialVersionUID = -6770429509752964215L;
+
+        private Class<?> type;
+
+        private String name;
+
+        private transient SchemaList schemaList;
+
+        private transient ClassList classList;
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(final String name) {
+            this.name = name;
+        }
+
+        public Class<?> getType() {
+            return type;
+        }
+
+        public void setType(final Class<?> type) {
+            this.type = type;
+        }
+
+        public SchemaList getSchemaList() {
+            return schemaList;
+        }
+
+        public void setSchemaList(final SchemaList schemaList) {
+            this.schemaList = schemaList;
+        }
+
+        public ClassList getClassList() {
+            return classList;
+        }
+
+        public void setClassList(final ClassList classList) {
+            this.classList = classList;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
index 40aefce..9db9bd2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
@@ -30,8 +30,11 @@ import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.pages.BasePage;
+import org.apache.syncope.client.console.topology.Topology;
+import org.apache.syncope.client.console.topology.TopologyNode;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.CheckBoxMultipleChoiceFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.SpinnerFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.list.ConnConfPropertyListView;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -48,11 +51,11 @@ import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.list.ListView;
@@ -67,7 +70,7 @@ import org.apache.wicket.validation.validator.RangeValidator;
 /**
  * Modal window with Connector form.
  */
-public class ConnectorModal extends ModalContent {
+public class ConnectorModal extends AbstractResourceModal {
 
     private static final long serialVersionUID = -2025535531121434050L;
 
@@ -143,14 +146,14 @@ public class ConnectorModal extends ModalContent {
         connectorForm.add(displayName);
 
         final AjaxDropDownChoicePanel<String> location = new AjaxDropDownChoicePanel<>("location", "location",
-                new Model<>(bundleTO == null ? null : bundleTO.getLocation()));
+                new Model<>(bundleTO == null ? connInstanceTO.getLocation() : bundleTO.getLocation()));
         ((DropDownChoice<String>) location.getField()).setNullValid(true);
         location.setStyleSheet("long_dynamicsize");
         location.setChoices(new ArrayList<>(mapConnBundleTOs.keySet()));
         location.setRequired(true);
         location.addRequiredLabel();
         location.setOutputMarkupId(true);
-        location.setEnabled(connInstanceTO.getKey() == 0);
+        location.setEnabled(connInstanceTO.getKey() == 0 && StringUtils.isBlank(connInstanceTO.getLocation()));
         location.getField().setOutputMarkupId(true);
         connectorForm.add(location);
 
@@ -160,11 +163,12 @@ public class ConnectorModal extends ModalContent {
         ((DropDownChoice<String>) connectorName.getField()).setNullValid(true);
         connectorName.setStyleSheet("long_dynamicsize");
         connectorName.setChoices(bundleTO == null
-                ? new ArrayList<String>()
-                : new ArrayList<>(mapConnBundleTOs.get(connInstanceTO.getLocation()).keySet()));
+                ? StringUtils.isBlank(connInstanceTO.getLocation())
+                        ? new ArrayList<String>()
+                        : new ArrayList<>(mapConnBundleTOs.get(connInstanceTO.getLocation()).keySet())
+                : new ArrayList<>(mapConnBundleTOs.get(bundleTO.getLocation()).keySet()));
         connectorName.setRequired(true);
         connectorName.addRequiredLabel();
-        connectorName.setEnabled(connInstanceTO.getLocation() != null);
         connectorName.setOutputMarkupId(true);
         connectorName.setEnabled(connInstanceTO.getKey() == 0);
         connectorName.getField().setOutputMarkupId(true);
@@ -176,7 +180,7 @@ public class ConnectorModal extends ModalContent {
         version.setChoices(bundleTO == null
                 ? new ArrayList<String>()
                 : new ArrayList<>(mapConnBundleTOs.get(connInstanceTO.getLocation()).
-                get(connInstanceTO.getBundleName()).keySet()));
+                        get(connInstanceTO.getBundleName()).keySet()));
         version.setRequired(true);
         version.addRequiredLabel();
         version.setEnabled(connInstanceTO.getBundleName() != null);
@@ -313,19 +317,20 @@ public class ConnectorModal extends ModalContent {
         connectorPropForm.add(check);
 
         // form - third tab (capabilities)
-        final IModel<List<ConnectorCapability>> capabilities =
-                new LoadableDetachableModel<List<ConnectorCapability>>() {
+        final IModel<List<ConnectorCapability>> capabilities
+                = new LoadableDetachableModel<List<ConnectorCapability>>() {
 
-            private static final long serialVersionUID = 5275935387613157437L;
+                    private static final long serialVersionUID = 5275935387613157437L;
 
-            @Override
-            protected List<ConnectorCapability> load() {
-                return Arrays.asList(ConnectorCapability.values());
-            }
-        };
-        CheckBoxMultipleChoice<ConnectorCapability> capabilitiesPalette = new CheckBoxMultipleChoice<>(
-                "capabilitiesPalette",
-                new PropertyModel<List<ConnectorCapability>>(this, "selectedCapabilities"), capabilities);
+                    @Override
+                    protected List<ConnectorCapability> load() {
+                        return Arrays.asList(ConnectorCapability.values());
+                    }
+                };
+        CheckBoxMultipleChoiceFieldPanel<ConnectorCapability> capabilitiesPalette
+                = new CheckBoxMultipleChoiceFieldPanel<>(
+                        "capabilitiesPalette",
+                        new PropertyModel<List<ConnectorCapability>>(this, "selectedCapabilities"), capabilities);
 
         capabilitiesPalette.add(new AjaxFormChoiceComponentUpdatingBehavior() {
 
@@ -373,6 +378,13 @@ public class ConnectorModal extends ModalContent {
                 try {
                     if (connInstanceTO.getKey() == 0) {
                         connectorRestClient.create(conn);
+                        send(pageRef.getPage(), Broadcast.BREADTH, new CreateEvent(
+                                conn.getKey(),
+                                conn.getDisplayName(),
+                                TopologyNode.Kind.CONNECTOR,
+                                conn.getLocation().startsWith(Topology.CONNECTOR_SERVER_LOCATION_PREFIX)
+                                        ? conn.getLocation() : Topology.ROOT_NAME,
+                                target));
                     } else {
                         connectorRestClient.update(conn);
                     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
new file mode 100644
index 0000000..f89aa9b
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
@@ -0,0 +1,322 @@
+/*
+ * 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.client.console.panels;
+
+import java.beans.PropertyDescriptor;
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Fragment;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.ResourceModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class ListViewPanel<T extends Serializable> extends Panel {
+
+    private static final long serialVersionUID = -7982691107029848579L;
+
+    /**
+     * Logger.
+     */
+    private static final Logger LOG = LoggerFactory.getLogger(ListViewPanel.class);
+
+    private final ClearIndicatingAjaxButton addButton;
+
+    private AjaxWizard<T> newItemPanel;
+
+    private final WebMarkupContainer container;
+
+    private final Fragment initialFragment;
+
+    private final List<T> listOfItems;
+
+    /**
+     * Table view of a list of beans.
+     *
+     * @param id id.
+     * @param list list of item.
+     * @param reference list item reference class.
+     * @param includes Used to sort and restrict the set of bean's fields to be shown.
+     * @param actions item actions.
+     */
+    private ListViewPanel(
+            final String id,
+            final List<T> list,
+            final Class<T> reference,
+            final List<String> includes,
+            final ActionLinksPanel.Builder<T> actions,
+            final PageReference pageRef) {
+        super(id);
+        setOutputMarkupId(true);
+
+        container = new WebMarkupContainer("container");
+        add(container.setOutputMarkupId(true));
+
+        initialFragment = new Fragment("content", "table", this);
+        container.addOrReplace(initialFragment);
+
+        initialFragment.add(new Label("caption", new ResourceModel("listview.caption", StringUtils.EMPTY)));
+
+        final List<String> toBeIncluded;
+        if (includes == null || includes.isEmpty()) {
+            toBeIncluded = new ArrayList<String>();
+            for (Field field : Arrays.asList(reference.getDeclaredFields())) {
+                toBeIncluded.add(field.getName());
+            }
+        } else {
+            toBeIncluded = includes;
+        }
+
+        if (toBeIncluded.isEmpty()) {
+            LOG.warn("No field has been retrieved from {}", reference.getName());
+            listOfItems = Collections.<T>emptyList();
+        } else if (list == null || list.isEmpty()) {
+            LOG.info("No item to be shown");
+            listOfItems = Collections.<T>emptyList();
+        } else {
+            listOfItems = list;
+            if (LOG.isDebugEnabled()) {
+                for (String field : toBeIncluded) {
+                    LOG.debug("Show field {}", field);
+                }
+            }
+        }
+
+        final ListView<String> names = new ListView<String>("names", toBeIncluded) {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected void populateItem(final ListItem<String> item) {
+                item.add(new Label("name", new ResourceModel(item.getModelObject(), item.getModelObject())));
+            }
+        };
+        initialFragment.add(names);
+
+        final ListView<T> beans = new ListView<T>("beans", listOfItems) {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected void populateItem(final ListItem<T> beanItem) {
+                final T bean = beanItem.getModelObject();
+
+                final ListView<String> fields = new ListView<String>("fields", toBeIncluded) {
+
+                    private static final long serialVersionUID = 1L;
+
+                    @Override
+                    protected void populateItem(final ListItem<String> fieldItem) {
+                        try {
+                            LOG.error("Processing field {}", fieldItem.getModelObject());
+
+                            final Object value = new PropertyDescriptor(fieldItem.getModelObject(), bean.getClass()).
+                                    getReadMethod().invoke(bean);
+
+                            LOG.error("Field value {}", value);
+
+                            fieldItem.add(value == null
+                                    ? new Label("field", StringUtils.EMPTY)
+                                    : new Label("field", new ResourceModel(value.toString(), value.toString())));
+
+                        } catch (Exception e) {
+                            LOG.error("Error retrieving value for field {}", fieldItem.getModelObject(), e);
+                            fieldItem.add(new Label("field", StringUtils.EMPTY));
+                        }
+                    }
+                };
+                beanItem.add(fields);
+                beanItem.add(actions.build("actions", bean));
+            }
+        };
+        beans.setReuseItems(true);
+        initialFragment.add(beans);
+
+        addButton = new ClearIndicatingAjaxButton("add", pageRef) {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+                final Fragment fragment = new Fragment("content", "wizard", ListViewPanel.this);
+                fragment.add(newItemPanel.clone());
+                container.addOrReplace(fragment);
+                target.add(container);
+            }
+        };
+
+        addButton.setEnabled(false);
+        addButton.setVisible(false);
+
+        initialFragment.add(addButton);
+    }
+
+    @Override
+    public void onEvent(final IEvent<?> event) {
+        if (event.getPayload() instanceof AjaxWizard.NewItemEvent) {
+            final AjaxRequestTarget target = AjaxWizard.NewItemEvent.class.cast(event.getPayload()).getTarget();
+
+            @SuppressWarnings("unchecked")
+            final T item = ((AjaxWizard.NewItemEvent<T>) event.getPayload()).getItem();
+
+            if (event.getPayload() instanceof AjaxWizard.NewItemFinishEvent) {
+                this.listOfItems.add(item);
+            }
+
+            container.addOrReplace(initialFragment);
+            target.add(container);
+        }
+        super.onEvent(event);
+    }
+
+    private ListViewPanel<T> addNewItemPanel(final AjaxWizard<T> panel) {
+        this.newItemPanel = panel;
+
+        if (this.newItemPanel != null) {
+            addButton.setEnabled(true);
+            addButton.setVisible(true);
+        }
+
+        return this;
+    }
+
+    public static <T extends Serializable> Builder<T> builder(final Class<T> reference, final PageReference pageRef) {
+        return new Builder<T>(reference, pageRef);
+    }
+
+    /**
+     * ListViewPanel builder.
+     *
+     * @param <T> list item reference type.
+     */
+    public static final class Builder<T extends Serializable> implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        private final PageReference pageRef;
+
+        private final Class<T> reference;
+
+        private final List<String> includes = new ArrayList<>();
+
+        private final ActionLinksPanel.Builder<T> actions;
+
+        private List<T> items;
+
+        private AjaxWizard<T> newItemPanel;
+
+        private Builder(final Class<T> reference, final PageReference pageRef) {
+            this.pageRef = pageRef;
+            this.reference = reference;
+            this.items = null;
+            this.actions = ActionLinksPanel.<T>builder(pageRef);
+        }
+
+        /**
+         * Builds a list view.
+         *
+         * @param id component id.
+         * @return List view.
+         */
+        public ListViewPanel<T> build(final String id) {
+            return new ListViewPanel<T>(id, items, reference, includes, actions, pageRef).addNewItemPanel(newItemPanel);
+        }
+
+        /**
+         * Sets list of items.
+         *
+         * @param items list of items.
+         * @return current builder object.
+         */
+        public Builder<T> setItems(final List<T> items) {
+            this.items = items;
+            return this;
+        }
+
+        /**
+         * Adds item.
+         *
+         * @param item item.
+         * @return current builder object.
+         */
+        public Builder<T> addItem(final T item) {
+            if (item == null) {
+                return this;
+            }
+
+            if (this.items == null) {
+                this.items = new ArrayList<>();
+            }
+
+            this.items.add(item);
+            return this;
+        }
+
+        /**
+         * Gives fields to be shown. It could be used to give an order as well.
+         *
+         * @param includes field names to be shown.
+         * @return current builder object.
+         */
+        public Builder<T> includes(final String... includes) {
+            for (String include : includes) {
+                if (include != null && !this.includes.contains(include)) {
+                    this.includes.add(include);
+                }
+            }
+            return this;
+        }
+
+        /**
+         * Add item action (the given order is ignored.
+         *
+         * @param link action link.
+         * @param type action type.
+         * @param entitlements entitlements.
+         * @return current builder object.
+         */
+        public Builder<T> addAction(
+                final ActionLink<T> link, final ActionLink.ActionType type, final String entitlements) {
+            actions.add(link, type, entitlements);
+            return this;
+        }
+
+        public Builder<T> addNewItemPanel(final AjaxWizard<T> panel) {
+            this.newItemPanel = panel;
+            return this;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalContent.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalContent.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalContent.java
index fbf8802..6a123c0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalContent.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalContent.java
@@ -54,9 +54,9 @@ public class ModalContent extends Panel {
 
     protected NotificationPanel feedbackPanel;
 
-    private final PageReference pageRef;
+    protected final PageReference pageRef;
 
-    private final ModalWindow window;
+    protected final ModalWindow window;
 
     public ModalContent(final ModalWindow window, final PageReference pageRef) {
         super(window.getContentId());
@@ -68,6 +68,10 @@ public class ModalContent extends Panel {
         add(feedbackPanel);
     }
 
+    public NotificationPanel getFeedbackPanel() {
+        return feedbackPanel;
+    }
+
     /**
      * Generic modal event.
      */

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
index 17ae3bf..b210c86 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
@@ -120,9 +120,9 @@ public class ResourceMappingPanel extends Panel {
     private final ResourceTO resourceTO;
 
     /**
-     * User / group.
+     * External resource provisioning configuration instance to be updated.
      */
-    private final AnyTypeKind anyTypeKind;
+    private final ProvisionTO provisionTO;
 
     /**
      * Mapping container.
@@ -134,31 +134,26 @@ public class ResourceMappingPanel extends Panel {
     private final AjaxCheckBoxPanel connObjectLinkCheckbox;
 
     private MappingTO getMapping() {
-        ProvisionTO provision = resourceTO.getProvision(this.anyTypeKind.name());
-        if (provision == null) {
-            provision = new ProvisionTO();
-            resourceTO.getProvisions().add(provision);
-        }
-        if (provision.getMapping() == null) {
-            provision.setMapping(new MappingTO());
+        if (provisionTO.getMapping() == null) {
+            provisionTO.setMapping(new MappingTO());
         }
 
-        return provision.getMapping();
+        return provisionTO.getMapping();
     }
 
     /**
      * Attribute Mapping Panel.
      *
      * @param id panel id
-     * @param resourceTO external resource
-     * @param anyTypeKind USER / GROUP
+     * @param resourceTO external resource to be updated.
+     * @param provisionTO external resource provisioning configuration instance.
      */
-    public ResourceMappingPanel(final String id, final ResourceTO resourceTO, final AnyTypeKind anyTypeKind) {
+    public ResourceMappingPanel(final String id, final ResourceTO resourceTO, final ProvisionTO provisionTO) {
         super(id);
         setOutputMarkupId(true);
 
         this.resourceTO = resourceTO;
-        this.anyTypeKind = anyTypeKind;
+        this.provisionTO = provisionTO == null ? new ProvisionTO() : provisionTO;
 
         this.mappingContainer = new WebMarkupContainer("mappingContainer");
         this.mappingContainer.setOutputMarkupId(true);
@@ -168,9 +163,8 @@ public class ResourceMappingPanel extends Panel {
         this.connObjectLinkContainer.setOutputMarkupId(true);
         add(this.connObjectLinkContainer);
 
-        if (this.resourceTO.getConnector() != null && this.resourceTO.getConnector() > 0) {
-            schemaNames = getSchemaNames(this.resourceTO.getConnector(), this.resourceTO.getConnConfProperties());
-
+        if (resourceTO.getConnector() != null && resourceTO.getConnector() > 0) {
+            schemaNames = getSchemaNames(resourceTO.getConnector(), resourceTO.getConnConfProperties());
             setEnabled();
         } else {
             schemaNames = Collections.<String>emptyList();
@@ -184,7 +178,8 @@ public class ResourceMappingPanel extends Panel {
 
         final Label passwordLabel = new Label("passwordLabel", new ResourceModel("password"));
         mappingContainer.add(passwordLabel);
-        if (AnyTypeKind.USER != ResourceMappingPanel.this.anyTypeKind) {
+
+        if (!AnyTypeKind.USER.name().equals(this.provisionTO.getAnyType())) {
             passwordLabel.setVisible(false);
         }
 
@@ -284,9 +279,9 @@ public class ResourceMappingPanel extends Panel {
                     }
                 });
 
-                final AjaxDropDownChoicePanel<String> intAttrNames =
-                        new AjaxDropDownChoicePanel<>("intAttrNames", getString("intAttrNames"),
-                                new PropertyModel<String>(mapItem, "intAttrName"), false);
+                final AjaxDropDownChoicePanel<String> intAttrNames = new AjaxDropDownChoicePanel<>("intAttrNames",
+                        getString("intAttrNames"),
+                        new PropertyModel<String>(mapItem, "intAttrName"), false);
                 intAttrNames.setChoices(schemaNames);
                 intAttrNames.setRequired(true);
                 intAttrNames.setStyleSheet(FIELD_STYLE);
@@ -301,22 +296,23 @@ public class ResourceMappingPanel extends Panel {
                 item.add(intAttrNames);
 
                 final List<IntMappingType> attrTypes = new ArrayList<>(getAttributeTypes(entity));
-                final AjaxDropDownChoicePanel<IntMappingType> intMappingTypes =
-                        new AjaxDropDownChoicePanel<>("intMappingTypes",
-                                new ResourceModel("intMappingTypes", "intMappingTypes").getObject(),
-                                new PropertyModel<IntMappingType>(mapItem, "intMappingType"));
+                final AjaxDropDownChoicePanel<IntMappingType> intMappingTypes = new AjaxDropDownChoicePanel<>(
+                        "intMappingTypes",
+                        new ResourceModel("intMappingTypes", "intMappingTypes").getObject(),
+                        new PropertyModel<IntMappingType>(mapItem, "intMappingType"));
                 intMappingTypes.setRequired(true);
                 intMappingTypes.setChoices(attrTypes);
                 intMappingTypes.setStyleSheet(FIELD_STYLE);
                 item.add(intMappingTypes);
 
-                final AjaxDropDownChoicePanel<AnyTypeKind> entitiesPanel =
-                        new AjaxDropDownChoicePanel<>("entities",
-                                new ResourceModel("entities", "entities").getObject(),
-                                new Model<>(entity));
-                entitiesPanel.setChoices(anyTypeKind == AnyTypeKind.GROUP
+                final AjaxDropDownChoicePanel<AnyTypeKind> entitiesPanel = new AjaxDropDownChoicePanel<>("entities",
+                        new ResourceModel("entities", "entities").getObject(),
+                        new Model<>(entity));
+
+                entitiesPanel.setChoices(provisionTO.getAnyType().equals(AnyTypeKind.GROUP.name())
                         ? Collections.<AnyTypeKind>singletonList(AnyTypeKind.GROUP)
                         : Arrays.asList(AnyTypeKind.values()));
+
                 entitiesPanel.setStyleSheet(DEF_FIELD_STYLE);
                 entitiesPanel.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
 
@@ -399,7 +395,7 @@ public class ResourceMappingPanel extends Panel {
                     }
                 });
                 item.add(password);
-                if (AnyTypeKind.USER != ResourceMappingPanel.this.anyTypeKind) {
+                if (!AnyTypeKind.USER.name().equals(provisionTO.getAnyType())) {
                     password.setVisible(false);
                 }
 
@@ -446,7 +442,7 @@ public class ResourceMappingPanel extends Panel {
             }
         };
         addMappingBtn.setDefaultFormProcessing(false);
-        addMappingBtn.setEnabled(this.resourceTO.getConnector() != null && this.resourceTO.getConnector() > 0);
+        addMappingBtn.setEnabled(resourceTO.getConnector() != null && resourceTO.getConnector() > 0);
         mappingContainer.add(addMappingBtn);
 
         boolean connObjectLinkEnabled = false;
@@ -495,10 +491,10 @@ public class ResourceMappingPanel extends Panel {
 
     private void setEnabled() {
         ConnInstanceTO connInstanceTO = new ConnInstanceTO();
-        connInstanceTO.setKey(this.resourceTO.getConnector());
-        connInstanceTO.getConfiguration().addAll(this.resourceTO.getConnConfProperties());
+        connInstanceTO.setKey(resourceTO.getConnector());
+        connInstanceTO.getConfiguration().addAll(resourceTO.getConnConfProperties());
 
-        boolean enabled = resourceTO.getProvision(anyTypeKind.name()) != null;
+        boolean enabled = provisionTO != null;
 
         this.mappingContainer.setEnabled(enabled);
         this.mappingContainer.setVisible(enabled);

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
index 8627998..6390f01 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
@@ -26,10 +26,12 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.pages.AbstractBasePage;
+import org.apache.syncope.client.console.topology.TopologyNode;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wizards.ProvisionWizard;
 import org.apache.syncope.common.lib.to.MappingItemTO;
 import org.apache.syncope.common.lib.to.ProvisionTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.Entitlement;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -38,6 +40,7 @@ import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDa
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.ResourceModel;
@@ -45,7 +48,7 @@ import org.apache.wicket.model.ResourceModel;
 /**
  * Modal window with Resource form.
  */
-public class ResourceModal extends ModalContent {
+public class ResourceModal extends AbstractResourceModal {
 
     private static final long serialVersionUID = 1734415311027284221L;
 
@@ -71,10 +74,61 @@ public class ResourceModal extends ModalContent {
         //--------------------------------
 
         //--------------------------------
-        // Resource mapping panels
+        // Resource provision panels
         //--------------------------------
-        form.add(new ResourceMappingPanel("umapping", resourceTO, AnyTypeKind.USER));
-        form.add(new ResourceMappingPanel("gmapping", resourceTO, AnyTypeKind.GROUP));
+        final WebMarkupContainer provisions = new WebMarkupContainer("pcontainer");
+        form.add(provisions.setOutputMarkupId(true));
+
+        final ListViewPanel.Builder<ProvisionTO> builder = ListViewPanel.builder(ProvisionTO.class, pageRef);
+        builder.setItems(resourceTO.getProvisions());
+        builder.includes("anyType", "objectClass");
+
+        builder.addAction(new ActionLink<ProvisionTO>() {
+
+            private static final long serialVersionUID = -3722207913631435504L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+
+            }
+        }, ActionLink.ActionType.MAPPING, Entitlement.RESOURCE_UPDATE).addAction(new ActionLink<ProvisionTO>() {
+
+            private static final long serialVersionUID = -3722207913631435514L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+
+            }
+        }, ActionLink.ActionType.ACCOUNT_LINK, Entitlement.RESOURCE_UPDATE).addAction(new ActionLink<ProvisionTO>() {
+
+            private static final long serialVersionUID = -3722207913631435524L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+
+            }
+        }, ActionLink.ActionType.RESET_TIME, Entitlement.RESOURCE_UPDATE).addAction(new ActionLink<ProvisionTO>() {
+
+            private static final long serialVersionUID = -3722207913631435534L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+
+            }
+        }, ActionLink.ActionType.CLONE, Entitlement.RESOURCE_CREATE).addAction(new ActionLink<ProvisionTO>() {
+
+            private static final long serialVersionUID = -3722207913631435544L;
+
+            @Override
+            public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+                resourceTO.getProvisions().remove(provisionTO);
+                target.add(provisions);
+
+            }
+        }, ActionLink.ActionType.DELETE, Entitlement.RESOURCE_DELETE);
+
+        builder.addNewItemPanel(new ProvisionWizard("wizard", resourceTO, pageRef));
+        provisions.add(builder.build("provisions"));
         //--------------------------------
 
         //--------------------------------
@@ -129,7 +183,12 @@ public class ResourceModal extends ModalContent {
                     try {
                         if (createFlag) {
                             resourceRestClient.create(resourceTO);
-                            send(pageRef.getPage(), Broadcast.BREADTH, new ResourceCreateEvent(target, resourceTO));
+                            send(pageRef.getPage(), Broadcast.BREADTH, new CreateEvent(
+                                    resourceTO.getKey(),
+                                    resourceTO.getKey(),
+                                    TopologyNode.Kind.RESOURCE,
+                                    resourceTO.getConnector(),
+                                    target));
                         } else {
                             resourceRestClient.update(resourceTO);
                         }
@@ -178,27 +237,4 @@ public class ResourceModal extends ModalContent {
         MetaDataRoleAuthorizationStrategy.authorize(
                 submit, ENABLE, createFlag ? Entitlement.RESOURCE_CREATE : Entitlement.RESOURCE_UPDATE);
     }
-
-    public NotificationPanel getFeedbackPanel() {
-        return feedbackPanel;
-    }
-
-    public static class ResourceCreateEvent extends ModalEvent {
-
-        private final ResourceTO resourceTO;
-
-        public ResourceCreateEvent(final AjaxRequestTarget target, final ResourceTO resourceTO) {
-            super(target);
-            this.resourceTO = resourceTO;
-        }
-
-        /**
-         * Create resource getter.
-         *
-         * @return created resource.
-         */
-        public ResourceTO getResourceTO() {
-            return resourceTO;
-        }
-    }
 }


[2/5] syncope git commit: [SYNCOPE-156] providing ListView table view + Provision wizard functionalities

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
index 5ec882c..4fc5a86 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
@@ -39,7 +39,7 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.pages.BasePage;
-import org.apache.syncope.client.console.panels.ResourceModal.ResourceCreateEvent;
+import org.apache.syncope.client.console.panels.AbstractResourceModal.CreateEvent;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
@@ -49,6 +49,7 @@ import org.apache.syncope.common.rest.api.service.SyncopeService;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.IAjaxIndicatorAware;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.event.IEvent;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
@@ -57,9 +58,7 @@ import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
-import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.LoadableDetachableModel;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
 import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
 import org.apache.wicket.protocol.ws.api.message.TextMessage;
@@ -69,7 +68,9 @@ public class Topology extends BasePage {
 
     private static final long serialVersionUID = -1100228004207271272L;
 
-    private static final String CONNECTOR_SERVER_LOCATION_PREFIX = "connid://";
+    public static final String CONNECTOR_SERVER_LOCATION_PREFIX = "connid://";
+
+    public static final String ROOT_NAME = "Syncope";
 
     private final int origX = 3100;
 
@@ -81,6 +82,10 @@ public class Topology extends BasePage {
 
     private final ModalWindow modal;
 
+    private final WebMarkupContainer newlyCreatedContainer;
+
+    private final ListView<TopologyNode> newlyCreated;
+
     private final LoadableDetachableModel<List<ResourceTO>> resModel = new LoadableDetachableModel<List<ResourceTO>>() {
 
         private static final long serialVersionUID = 5275935387613157431L;
@@ -92,45 +97,51 @@ public class Topology extends BasePage {
         }
     };
 
-    private final LoadableDetachableModel<Pair<List<ConnInstanceTO>, List<ConnInstanceTO>>> connModel =
-            new LoadableDetachableModel<Pair<List<ConnInstanceTO>, List<ConnInstanceTO>>>() {
+    private final LoadableDetachableModel<Map<String, List<ConnInstanceTO>>> connModel
+            = new LoadableDetachableModel<Map<String, List<ConnInstanceTO>>>() {
 
-        private static final long serialVersionUID = 5275935387613157432L;
+                private static final long serialVersionUID = 5275935387613157432L;
 
-        @Override
-        protected Pair<List<ConnInstanceTO>, List<ConnInstanceTO>> load() {
-            final List<ConnInstanceTO> level1 = new ArrayList<>();
-            final List<ConnInstanceTO> level2 = new ArrayList<>();
-
-            for (ConnInstanceTO conn : connectorRestClient.getAllConnectors()) {
-                if (conn.getLocation().startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
-                    level2.add(conn);
-                } else {
-                    level1.add(conn);
+                @Override
+                protected Map<String, List<ConnInstanceTO>> load() {
+                    final Map<String, List<ConnInstanceTO>> res = new HashMap<>();
+
+                    for (ConnInstanceTO conn : connectorRestClient.getAllConnectors()) {
+                        final List<ConnInstanceTO> conns;
+                        if (res.containsKey(conn.getLocation())) {
+                            conns = res.get(conn.getLocation());
+                        } else {
+                            conns = new ArrayList<>();
+                            res.put(conn.getLocation(), conns);
+                        }
+                        conns.add(conn);
+                    }
+
+                    return res;
                 }
-            }
+            };
 
-            return Pair.of(level1, level2);
-        }
-    };
+    private final LoadableDetachableModel<Pair<List<URI>, List<URI>>> csModel
+            = new LoadableDetachableModel<Pair<List<URI>, List<URI>>>() {
 
-    private final LoadableDetachableModel<List<URI>> csModel = new LoadableDetachableModel<List<URI>>() {
+                private static final long serialVersionUID = 5275935387613157433L;
 
-        private static final long serialVersionUID = 5275935387613157433L;
+                @Override
+                protected Pair<List<URI>, List<URI>> load() {
+                    final List<URI> connectorServers = new ArrayList<>();
+                    final List<URI> filePaths = new ArrayList<>();
 
-        @Override
-        protected List<URI> load() {
-            final List<URI> locations = new ArrayList<>();
+                    for (String location : SyncopeConsoleSession.get().getSyncopeTO().getConnIdLocations()) {
+                        if (location.startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
+                            connectorServers.add(URI.create(location));
+                        } else {
+                            filePaths.add(URI.create(location));
+                        }
+                    }
 
-            for (String location : SyncopeConsoleSession.get().getSyncopeTO().getConnIdLocations()) {
-                if (location.startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
-                    locations.add(URI.create(location));
+                    return Pair.of(connectorServers, filePaths);
                 }
-            }
-
-            return locations;
-        }
-    };
+            };
 
     private enum SupportedOperation {
 
@@ -203,32 +214,33 @@ public class Topology extends BasePage {
         // -----------------------------------------
         // Add Zoom panel
         // -----------------------------------------
-        final ActionLinksPanel zoomActionPanel = new ActionLinksPanel("zoom", new Model<String>(), getPageReference());
-        add(zoomActionPanel);
+        final ActionLinksPanel.Builder<Serializable> zoomActionPanel = ActionLinksPanel.builder(getPageReference());
 
-        zoomActionPanel.add(new ActionLink() {
+        zoomActionPanel.add(new ActionLink<Serializable>() {
 
             private static final long serialVersionUID = -3722207913631435501L;
 
             @Override
-            public void onClick(final AjaxRequestTarget target) {
+            public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
                 target.appendJavaScript("zoomIn($('#drawing')[0]);");
             }
-        }, ActionLink.ActionType.ZOOM_IN, Entitlement.RESOURCE_LIST).add(new ActionLink() {
+        }, ActionLink.ActionType.ZOOM_IN, Entitlement.RESOURCE_LIST).add(new ActionLink<Serializable>() {
 
             private static final long serialVersionUID = -3722207913631435501L;
 
             @Override
-            public void onClick(final AjaxRequestTarget target) {
+            public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
                 target.appendJavaScript("zoomOut($('#drawing')[0]);");
             }
         }, ActionLink.ActionType.ZOOM_OUT, Entitlement.RESOURCE_LIST);
+
+        add(zoomActionPanel.build("zoom"));
         // -----------------------------------------
 
         // -----------------------------------------
         // Add Syncope (root topologynode)
         // -----------------------------------------
-        final TopologyNode syncopeTopologyNode = new TopologyNode("Syncope", "Syncope", TopologyNode.Kind.SYNCOPE);
+        final TopologyNode syncopeTopologyNode = new TopologyNode(ROOT_NAME, ROOT_NAME, TopologyNode.Kind.SYNCOPE);
         syncopeTopologyNode.setX(origX);
         syncopeTopologyNode.setY(origY);
 
@@ -250,11 +262,11 @@ public class Topology extends BasePage {
         // -----------------------------------------
         // Add Connector Servers
         // -----------------------------------------
-        final ListView<URI> connectorServers = new ListView<URI>("connectorServers", csModel) {
+        final ListView<URI> connectorServers = new ListView<URI>("connectorServers", csModel.getObject().getLeft()) {
 
             private static final long serialVersionUID = 6978621871488360380L;
 
-            private final int size = csModel.getObject().size() + 1;
+            private final int size = csModel.getObject().getLeft().size() + 1;
 
             @Override
             protected void populateItem(final ListItem<URI> item) {
@@ -287,102 +299,114 @@ public class Topology extends BasePage {
         // -----------------------------------------
 
         // -----------------------------------------
-        // Add Connector Intances (first level)
+        // Add File Paths
         // -----------------------------------------
-        final ListView<ConnInstanceTO> conn1 = new ListView<ConnInstanceTO>("conn1", connModel.getObject().getLeft()) {
+        final ListView<URI> filePaths = new ListView<URI>("filePaths", csModel.getObject().getRight()) {
 
-            private static final long serialVersionUID = 6978621871488360381L;
+            private static final long serialVersionUID = 6978621871488360380L;
 
-            private final int size = connModel.getObject().getLeft().size() + 1;
+            private final int size = csModel.getObject().getRight().size() + 1;
 
             @Override
-            protected void populateItem(final ListItem<ConnInstanceTO> item) {
-                int kx = size >= 6 ? 800 : (130 * size);
+            protected void populateItem(final ListItem<URI> item) {
+                int kx = size >= 4 ? 800 : (200 * size);
 
                 int x = (int) Math.round(origX + kx * Math.cos(Math.PI * (item.getIndex() + 1) / size));
                 int y = (int) Math.round(origY + 100 * Math.sin(Math.PI * (item.getIndex() + 1) / size));
 
-                final ConnInstanceTO conn = item.getModelObject();
-                final TopologyNode topologynode = new TopologyNode(
-                        Long.valueOf(conn.getKey()), conn.getDisplayName(), TopologyNode.Kind.CONNECTOR);
-                topologynode.setConnectinDisplayName(conn.getBundleName());
+                final URI location = item.getModelObject();
+                final String url = location.toASCIIString();
+
+                final TopologyNode topologynode = new TopologyNode(url, url, TopologyNode.Kind.FS_PATH);
+
+                topologynode.setHost(location.getHost());
+                topologynode.setPort(location.getPort());
                 topologynode.setX(x);
                 topologynode.setY(y);
 
-                connectors.put(Long.class.cast(topologynode.getKey()), topologynode);
-
-                item.add(topologyNodePanel("conn", topologynode));
+                servers.put(String.class.cast(topologynode.getKey()), topologynode);
 
-                if (conn.getLocation().startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
-                    final Map<Serializable, TopologyNode> remoteConnections;
+                item.add(topologyNodePanel("fp", topologynode));
 
-                    if (connections.containsKey(conn.getLocation())) {
-                        remoteConnections = connections.get(conn.getLocation());
-                    } else {
-                        remoteConnections = new HashMap<>();
-                        connections.put(conn.getLocation(), remoteConnections);
-                    }
-                    remoteConnections.put(conn.getKey(), topologynode);
-                } else {
-                    syncopeConnections.put(conn.getKey(), topologynode);
-                }
+                syncopeConnections.put(url, topologynode);
+                connections.put(url, new HashMap<Serializable, TopologyNode>());
             }
         };
 
-        conn1.setOutputMarkupId(true);
-        add(conn1);
+        filePaths.setOutputMarkupId(true);
+        add(filePaths);
         // -----------------------------------------
 
         // -----------------------------------------
-        // Add Connector Intances (second level)
+        // Add Connector Intances
         // -----------------------------------------
-        final ListView<ConnInstanceTO> conn2 = new ListView<ConnInstanceTO>("conn2", connModel.getObject().getRight()) {
+        final List<List<ConnInstanceTO>> allConns = new ArrayList<>(connModel.getObject().values());
 
-            private static final long serialVersionUID = 6978621871488360381L;
+        final ListView<List<ConnInstanceTO>> conns = new ListView<List<ConnInstanceTO>>("conns", allConns) {
 
-            private final int size = connModel.getObject().getRight().size() + 1;
+            private static final long serialVersionUID = 697862187148836036L;
 
             @Override
-            protected void populateItem(final ListItem<ConnInstanceTO> item) {
-                final ConnInstanceTO conn = item.getModelObject();
+            protected void populateItem(final ListItem<List<ConnInstanceTO>> item) {
 
-                final TopologyNode parent = servers.get(conn.getLocation());
+                final int size = item.getModelObject().size() + 1;
 
-                int kx = size >= 6 ? 800 : (130 * size);
+                final ListView<ConnInstanceTO> conns = new ListView<ConnInstanceTO>("conns", item.getModelObject()) {
 
-                int x = (int) Math.round((parent == null ? origX : parent.getX())
-                        + kx * Math.cos(Math.PI + Math.PI * (item.getIndex() + 1) / size));
-                int y = (int) Math.round((parent == null ? origY : parent.getY())
-                        + 100 * Math.sin(Math.PI + Math.PI * (item.getIndex() + 1) / size));
+                    private static final long serialVersionUID = 6978621871488360381L;
 
-                final TopologyNode topologynode = new TopologyNode(
-                        Long.valueOf(conn.getKey()), conn.getDisplayName(), TopologyNode.Kind.CONNECTOR);
-                topologynode.setConnectinDisplayName(conn.getBundleName());
-                topologynode.setX(x);
-                topologynode.setY(y);
+                    @Override
+                    protected void populateItem(final ListItem<ConnInstanceTO> item) {
+                        final ConnInstanceTO conn = item.getModelObject();
 
-                connectors.put(Long.class.cast(topologynode.getKey()), topologynode);
+                        final TopologyNode topologynode = new TopologyNode(
+                                Long.valueOf(conn.getKey()), conn.getDisplayName(), TopologyNode.Kind.CONNECTOR);
 
-                item.add(topologyNodePanel("conn", topologynode));
+                        // Define the parent note
+                        final TopologyNode parent = servers.get(conn.getLocation());
 
-                if (conn.getLocation().startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
-                    final Map<Serializable, TopologyNode> remoteConnections;
+                        // Set the position
+                        int kx = size >= 6 ? 800 : (130 * size);
 
-                    if (connections.containsKey(conn.getLocation())) {
-                        remoteConnections = connections.get(conn.getLocation());
-                    } else {
-                        remoteConnections = new HashMap<>();
-                        connections.put(conn.getLocation(), remoteConnections);
+                        final double hpos;
+                        if (conn.getLocation().startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
+                            hpos = Math.PI;
+                        } else {
+                            hpos = 0.0;
+                        }
+
+                        int x = (int) Math.round((parent == null ? origX : parent.getX())
+                                + kx * Math.cos(hpos + Math.PI * (item.getIndex() + 1) / size));
+                        int y = (int) Math.round((parent == null ? origY : parent.getY())
+                                + 100 * Math.sin(hpos + Math.PI * (item.getIndex() + 1) / size));
+
+                        topologynode.setConnectionDisplayName(conn.getBundleName());
+                        topologynode.setX(x);
+                        topologynode.setY(y);
+
+                        connectors.put(Long.class.cast(topologynode.getKey()), topologynode);
+                        item.add(topologyNodePanel("conn", topologynode));
+
+                        // Update connections
+                        final Map<Serializable, TopologyNode> remoteConnections;
+
+                        if (connections.containsKey(conn.getLocation())) {
+                            remoteConnections = connections.get(conn.getLocation());
+                        } else {
+                            remoteConnections = new HashMap<>();
+                            connections.put(conn.getLocation(), remoteConnections);
+                        }
+                        remoteConnections.put(conn.getKey(), topologynode);
                     }
-                    remoteConnections.put(conn.getKey(), topologynode);
-                } else {
-                    syncopeConnections.put(conn.getKey(), topologynode);
-                }
+                };
+
+                conns.setOutputMarkupId(true);
+                item.add(conns);
             }
         };
 
-        conn2.setOutputMarkupId(true);
-        add(conn2);
+        conns.setOutputMarkupId(true);
+        add(conns);
         // -----------------------------------------
 
         // -----------------------------------------
@@ -392,8 +416,6 @@ public class Topology extends BasePage {
         for (ResourceTO resourceTO : resModel.getObject()) {
             final TopologyNode topologynode = new TopologyNode(
                     resourceTO.getKey(), resourceTO.getKey(), TopologyNode.Kind.RESOURCE);
-            topologynode.setX(origX);
-            topologynode.setY(origY);
 
             final Map<Serializable, TopologyNode> remoteConnections;
 
@@ -422,37 +444,37 @@ public class Topology extends BasePage {
                 final ListView<TopologyNode> innerListView = new ListView<TopologyNode>("resources",
                         new ArrayList<>(connections.get(connectorId).values())) {
 
-                    private static final long serialVersionUID = 1L;
-
-                    private final int size = getModelObject().size() + 1;
+                            private static final long serialVersionUID = 1L;
 
-                    @Override
-                    protected void populateItem(final ListItem<TopologyNode> item) {
-                        final TopologyNode topologynode = item.getModelObject();
-                        final TopologyNode parent = connectors.get(connectorId);
+                            private final int size = getModelObject().size() + 1;
 
-                        final double k;
+                            @Override
+                            protected void populateItem(final ListItem<TopologyNode> item) {
+                                final TopologyNode topologynode = item.getModelObject();
+                                final TopologyNode parent = connectors.get(connectorId);
 
-                        if (parent == null || parent.getY() < syncopeTopologyNode.getY()) {
-                            k = Math.PI;
-                        } else {
-                            k = 0.0;
-                        }
+                                // Set position
+                                int kx = size >= 16 ? 800 : (48 * size);
+                                int ky = size < 4 ? 100 : size < 6 ? 350 : 750;
 
-                        int kx = size >= 16 ? 800 : (48 * size);
-                        int ky = size < 4 ? 100 : size < 6 ? 350 : 750;
+                                final double hpos;
+                                if (parent == null || parent.getY() < syncopeTopologyNode.getY()) {
+                                    hpos = Math.PI;
+                                } else {
+                                    hpos = 0.0;
+                                }
 
-                        int x = (int) Math.round((parent == null ? origX : parent.getX())
-                                + kx * Math.cos(k + Math.PI * (item.getIndex() + 1) / size));
-                        int y = (int) Math.round((parent == null ? origY : parent.getY())
-                                + ky * Math.sin(k + Math.PI * (item.getIndex() + 1) / size));
+                                int x = (int) Math.round((parent == null ? origX : parent.getX())
+                                        + kx * Math.cos(hpos + Math.PI * (item.getIndex() + 1) / size));
+                                int y = (int) Math.round((parent == null ? origY : parent.getY())
+                                        + ky * Math.sin(hpos + Math.PI * (item.getIndex() + 1) / size));
 
-                        topologynode.setX(x);
-                        topologynode.setY(y);
+                                topologynode.setX(x);
+                                topologynode.setY(y);
 
-                        item.add(topologyNodePanel("res", topologynode));
-                    }
-                };
+                                item.add(topologyNodePanel("res", topologynode));
+                            }
+                        };
 
                 innerListView.setOutputMarkupId(true);
                 item.add(innerListView);
@@ -466,7 +488,7 @@ public class Topology extends BasePage {
         // -----------------------------------------
         // Create connections
         // -----------------------------------------
-        final WebMarkupContainer jsPlace = new WebMarkupContainer("jsPlace");
+        final WebMarkupContainer jsPlace = new WebMarkupContainerNoVeil("jsPlace");
         jsPlace.setOutputMarkupId(true);
         add(jsPlace);
 
@@ -501,6 +523,24 @@ public class Topology extends BasePage {
             }
         });
         // -----------------------------------------
+
+        newlyCreatedContainer = new WebMarkupContainer("newlyCreatedContainer");
+        newlyCreatedContainer.setOutputMarkupId(true);
+        add(newlyCreatedContainer);
+
+        newlyCreated = new ListView<TopologyNode>("newlyCreated", new ArrayList<TopologyNode>()) {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected void populateItem(final ListItem<TopologyNode> item) {
+                item.add(topologyNodePanel("el", item.getModelObject()));
+            }
+        };
+        newlyCreated.setOutputMarkupId(true);
+        newlyCreated.setReuseItems(true);
+
+        newlyCreatedContainer.add(newlyCreated);
     }
 
     private List<String> createConnections(final Map<Serializable, Map<Serializable, TopologyNode>> targets) {
@@ -517,9 +557,9 @@ public class Topology extends BasePage {
         return list;
     }
 
-    private Panel topologyNodePanel(final String id, final TopologyNode node) {
+    private TopologyNodePanel topologyNodePanel(final String id, final TopologyNode node) {
 
-        final Panel panel = new TopologyNodePanel(id, node, getPageReference(), modal);
+        final TopologyNodePanel panel = new TopologyNodePanel(id, node, getPageReference(), modal);
         panel.setMarkupId(String.valueOf(node.getKey()));
         panel.setOutputMarkupId(true);
 
@@ -538,24 +578,43 @@ public class Topology extends BasePage {
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public void onEvent(final IEvent<?> event) {
         super.onEvent(event);
 
-        if (event.getPayload() instanceof ResourceCreateEvent) {
-            final ResourceCreateEvent resourceCreateEvent = ResourceCreateEvent.class.cast(event.getPayload());
+        if (event.getPayload() instanceof CreateEvent) {
+            final CreateEvent resourceCreateEvent = CreateEvent.class.cast(event.getPayload());
+
+            final TopologyNode node = new TopologyNode(
+                    resourceCreateEvent.getKey(),
+                    resourceCreateEvent.getDisplayName(),
+                    resourceCreateEvent.getKind());
+
+            ((List<TopologyNode>) newlyCreated.getModelObject()).add(node);
+            resourceCreateEvent.getTarget().add(newlyCreatedContainer);
+
             resourceCreateEvent.getTarget().appendJavaScript(String.format(
                     "window.Wicket.WebSocket.send('"
                     + "{\"kind\":\"%s\",\"target\":\"%s\",\"source\":\"%s\",\"scope\":\"%s\"}"
                     + "');",
                     SupportedOperation.ADD_ENDPOINT,
-                    resourceCreateEvent.getResourceTO().getKey(),
-                    resourceCreateEvent.getResourceTO().getConnector(),
-                    TopologyNode.Kind.RESOURCE));
+                    resourceCreateEvent.getKey(),
+                    resourceCreateEvent.getParent(),
+                    resourceCreateEvent.getKind()));
         }
     }
 
-    @Override
-    public String getAjaxIndicatorMarkupId() {
-        return StringUtils.EMPTY;
+    private static class WebMarkupContainerNoVeil extends WebMarkupContainer implements IAjaxIndicatorAware {
+
+        private static final long serialVersionUID = 1L;
+
+        public WebMarkupContainerNoVeil(final String id) {
+            super(id);
+        }
+
+        @Override
+        public String getAjaxIndicatorMarkupId() {
+            return StringUtils.EMPTY;
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNode.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNode.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNode.java
index f7c8aaa..ab727a0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNode.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNode.java
@@ -27,6 +27,7 @@ public class TopologyNode implements Serializable {
         RESOURCE,
         CONNECTOR,
         CONNECTOR_SERVER,
+        FS_PATH,
         SYNCOPE
 
     }
@@ -76,8 +77,8 @@ public class TopologyNode implements Serializable {
         return connectionDisplayName;
     }
 
-    public void setConnectinDisplayName(final String connectinDisplayName) {
-        this.connectionDisplayName = connectinDisplayName;
+    public void setConnectionDisplayName(final String connectionDisplayName) {
+        this.connectionDisplayName = connectionDisplayName;
     }
 
     public Kind getKind() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java
index 478260e..3dc7c48 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java
@@ -27,11 +27,13 @@ import org.apache.syncope.client.console.rest.ConnectorRestClient;
 import org.apache.syncope.client.console.rest.ResourceRestClient;
 import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxLink;
 import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.behavior.AttributeAppender;
 import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Fragment;
@@ -72,20 +74,29 @@ public class TopologyNodePanel extends Panel {
         switch (node.getKind()) {
             case SYNCOPE:
                 title = "";
-                add(getSyncopeFragment(node, pageRef));
+                add(getSyncopeFragment());
+                add(new AttributeAppender("class", "topology_root", " "));
                 break;
             case CONNECTOR_SERVER:
                 title = node.getDisplayName();
-                add(getConnectorServerFragment(node, pageRef));
+                add(getLocationFragment(node, pageRef));
+                add(new AttributeAppender("class", "topology_cs", " "));
+                break;
+            case FS_PATH:
+                title = node.getDisplayName();
+                add(getLocationFragment(node, pageRef));
+                add(new AttributeAppender("class", "topology_cs", " "));
                 break;
             case CONNECTOR:
                 title = (StringUtils.isBlank(node.getConnectionDisplayName())
                         ? "" : node.getConnectionDisplayName() + ":") + node.getDisplayName();
                 add(getConnectorFragment(node, pageRef));
+                add(new AttributeAppender("class", "topology_conn", " "));
                 break;
             default:
                 title = node.getDisplayName().length() > 20 ? node.getDisplayName() : "";
                 add(getResurceFragment(node, pageRef));
+                add(new AttributeAppender("class", "topology_res", " "));
         }
 
         if (StringUtils.isNotEmpty(title)) {
@@ -97,20 +108,34 @@ public class TopologyNodePanel extends Panel {
         this.modal = modal;
     }
 
-    private Fragment getSyncopeFragment(final TopologyNode node, final PageReference pageRef) {
-        final Fragment fragment = new Fragment("actions", "syncopeActions", this);
-        fragment.setOutputMarkupId(true);
-        return fragment;
+    private Fragment getSyncopeFragment() {
+        return new Fragment("actions", "syncopeActions", this);
     }
 
-    private Fragment getConnectorServerFragment(final TopologyNode node, final PageReference pageRef) {
-        final Fragment fragment = new Fragment("actions", "syncopeActions", this);
+    private Fragment getLocationFragment(final TopologyNode node, final PageReference pageRef) {
+        final Fragment fragment = new Fragment("actions", "locationActions", this);
+
+        final AjaxLink<String> create = new ClearIndicatingAjaxLink<String>("create", pageRef) {
+
+            private static final long serialVersionUID = 3776750333491622263L;
+
+            @Override
+            public void onClickInternal(final AjaxRequestTarget target) {
+
+                final ConnInstanceTO connectorTO = new ConnInstanceTO();
+                connectorTO.setLocation(node.getKey().toString());
+                modal.setContent(new ConnectorModal(modal, pageRef, connectorTO));
+                modal.setTitle(MessageFormat.format(getString("connector.new"), node.getKey()));
+                modal.show(target);
+            }
+        };
+        fragment.add(create);
+
         return fragment;
     }
 
     private Fragment getConnectorFragment(final TopologyNode node, final PageReference pageRef) {
-        final Fragment fragment = new Fragment("actions", "connectorWithNoResourceActions", this);
-        fragment.setOutputMarkupId(true);
+        final Fragment fragment = new Fragment("actions", "connectorActions", this);
 
         final AjaxLink<String> delete = new ClearIndicatingAjaxLink<String>("delete", pageRef) {
 
@@ -139,9 +164,7 @@ public class TopologyNodePanel extends Panel {
                 final ResourceTO resourceTO = new ResourceTO();
                 resourceTO.setConnector(Long.class.cast(node.getKey()));
                 resourceTO.setConnectorDisplayName(node.getDisplayName());
-
                 modal.setContent(new ResourceModal(modal, pageRef, resourceTO, true));
-
                 modal.setTitle(getString("resource.new"));
                 modal.show(target);
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractFieldPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractFieldPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractFieldPanel.java
index 30bb47c..41643ea 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractFieldPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractFieldPanel.java
@@ -36,5 +36,5 @@ public abstract class AbstractFieldPanel<T> extends Panel {
         super(id, model);
     }
 
-    public abstract AbstractFieldPanel setModelObject(T object);
+    public abstract AbstractFieldPanel<T> setModelObject(T object);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
index 71bcc0f..ec405a2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
@@ -21,14 +21,27 @@ package org.apache.syncope.client.console.wicket.markup.html.form;
 import java.io.Serializable;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 
-public abstract class ActionLink implements Serializable {
+public abstract class ActionLink<T> implements Serializable {
 
     private static final long serialVersionUID = 7031329706998320639L;
 
     private boolean reloadFeedbackPanel = true;
 
+    private T modelObject;
+
+    public ActionLink() {
+    }
+
+    public ActionLink(final T modelObject) {
+        this.modelObject = modelObject;
+    }
+
     public enum ActionType {
 
+        MAPPING("update"),
+        ACCOUNT_LINK("update"),
+        RESET_TIME("update"),
+        CLONE("create"),
         CREATE("create"),
         EDIT("read"),
         USER_TEMPLATE("read"),
@@ -69,7 +82,11 @@ public abstract class ActionLink implements Serializable {
         }
     }
 
-    public abstract void onClick(final AjaxRequestTarget target);
+    public T getModelObject() {
+        return modelObject;
+    }
+
+    public abstract void onClick(final AjaxRequestTarget target, final T modelObject);
 
     public void postClick() {
     }
@@ -78,7 +95,7 @@ public abstract class ActionLink implements Serializable {
         return reloadFeedbackPanel;
     }
 
-    public ActionLink feedbackPanelAutomaticReload(final boolean reloadFeedbackPanel) {
+    public ActionLink<T> feedbackPanelAutomaticReload(final boolean reloadFeedbackPanel) {
         this.reloadFeedbackPanel = reloadFeedbackPanel;
         return this;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
index 433f9f5..868f6a2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
@@ -18,6 +18,11 @@
  */
 package org.apache.syncope.client.console.wicket.markup.html.form;
 
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.apache.commons.lang3.tuple.Triple;
 import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxLink;
 import org.apache.syncope.client.console.wicket.ajax.markup.html.IndicatingOnConfirmAjaxLink;
 import org.apache.wicket.PageReference;
@@ -26,24 +31,34 @@ import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDa
 import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
 
 /**
  * This empty class must exist because there not seems to be alternative to provide specialized HTML for edit links.
+ *
+ * @param <T> model object type.
  */
-public class ActionLinksPanel extends Panel {
+public final class ActionLinksPanel<T extends Serializable> extends Panel {
 
     private static final long serialVersionUID = 322966537010107771L;
 
     private final PageReference pageRef;
 
-    public ActionLinksPanel(final String componentId, final IModel<?> model, final PageReference pageRef) {
+    private final IModel<T> model;
+
+    private ActionLinksPanel(final String componentId, final IModel<T> model, final PageReference pageRef) {
         super(componentId, model);
+        this.model = model;
         this.pageRef = pageRef;
 
         super.add(new Fragment("panelClaim", "emptyFragment", this));
         super.add(new Fragment("panelManageResources", "emptyFragment", this));
         super.add(new Fragment("panelManageUsers", "emptyFragment", this));
         super.add(new Fragment("panelManageGroups", "emptyFragment", this));
+        super.add(new Fragment("panelMapping", "emptyFragment", this));
+        super.add(new Fragment("panelAccountLink", "emptyFragment", this));
+        super.add(new Fragment("panelResetTime", "emptyFragment", this));
+        super.add(new Fragment("panelClone", "emptyFragment", this));
         super.add(new Fragment("panelCreate", "emptyFragment", this));
         super.add(new Fragment("panelEdit", "emptyFragment", this));
         super.add(new Fragment("panelReset", "emptyFragment", this));
@@ -68,29 +83,13 @@ public class ActionLinksPanel extends Panel {
         super.add(new Fragment("panelProvision", "emptyFragment", this));
         super.add(new Fragment("panelZoomIn", "emptyFragment", this));
         super.add(new Fragment("panelZoomOut", "emptyFragment", this));
-
-    }
-
-    public ActionLinksPanel add(
-            final ActionLink link, final ActionLink.ActionType type, final String entitlements) {
-
-        return addWithRoles(link, type, entitlements, true);
     }
 
-    public ActionLinksPanel add(
-            final ActionLink link, final ActionLink.ActionType type, final String entitlement, final boolean enabled) {
-
-        return addWithRoles(link, type, entitlement, enabled);
-    }
-
-    public ActionLinksPanel addWithRoles(
-            final ActionLink link, final ActionLink.ActionType type, final String entitlements) {
-
-        return addWithRoles(link, type, entitlements, true);
-    }
-
-    public ActionLinksPanel addWithRoles(
-            final ActionLink link, final ActionLink.ActionType type, final String entitlements, final boolean enabled) {
+    public ActionLinksPanel<T> add(
+            final ActionLink<T> link,
+            final ActionLink.ActionType type,
+            final String entitlements,
+            final boolean enabled) {
 
         Fragment fragment = null;
 
@@ -105,7 +104,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -119,7 +118,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -133,7 +132,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -147,7 +146,63 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
+                    }
+                }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
+                break;
+
+            case MAPPING:
+                fragment = new Fragment("panelMapping", "fragmentMapping", this);
+
+                fragment.addOrReplace(new ClearIndicatingAjaxLink<Void>("mappingLink", pageRef) {
+
+                    private static final long serialVersionUID = -7978723352517770644L;
+
+                    @Override
+                    protected void onClickInternal(final AjaxRequestTarget target) {
+                        link.onClick(target, model.getObject());
+                    }
+                }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
+                break;
+
+            case ACCOUNT_LINK:
+                fragment = new Fragment("panelAccountLink", "fragmentAccountLink", this);
+
+                fragment.addOrReplace(new ClearIndicatingAjaxLink<Void>("accountLinkLink", pageRef) {
+
+                    private static final long serialVersionUID = -7978723352517770644L;
+
+                    @Override
+                    protected void onClickInternal(final AjaxRequestTarget target) {
+                        link.onClick(target, model.getObject());
+                    }
+                }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
+                break;
+
+            case RESET_TIME:
+                fragment = new Fragment("panelResetTime", "fragmentResetTime", this);
+
+                fragment.addOrReplace(new ClearIndicatingAjaxLink<Void>("resetTimeLink", pageRef) {
+
+                    private static final long serialVersionUID = -7978723352517770644L;
+
+                    @Override
+                    protected void onClickInternal(final AjaxRequestTarget target) {
+                        link.onClick(target, model.getObject());
+                    }
+                }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
+                break;
+
+            case CLONE:
+                fragment = new Fragment("panelClone", "fragmentClone", this);
+
+                fragment.addOrReplace(new ClearIndicatingAjaxLink<Void>("cloneLink", pageRef) {
+
+                    private static final long serialVersionUID = -7978723352517770644L;
+
+                    @Override
+                    protected void onClickInternal(final AjaxRequestTarget target) {
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -161,7 +216,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -175,7 +230,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 });
                 break;
@@ -189,7 +244,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -203,7 +258,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -217,7 +272,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -231,7 +286,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -245,7 +300,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -259,7 +314,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -273,7 +328,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -287,7 +342,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
 
@@ -302,7 +357,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
 
@@ -317,7 +372,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -331,7 +386,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -345,7 +400,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -359,7 +414,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -373,7 +428,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -388,7 +443,7 @@ public class ActionLinksPanel extends Panel {
 
                             @Override
                             protected void onClickInternal(final AjaxRequestTarget target) {
-                                link.onClick(target);
+                                link.onClick(target, model.getObject());
                             }
                         }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -402,7 +457,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -417,7 +472,7 @@ public class ActionLinksPanel extends Panel {
 
                             @Override
                             protected void onClickInternal(final AjaxRequestTarget target) {
-                                link.onClick(target);
+                                link.onClick(target, model.getObject());
                             }
                         }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -431,7 +486,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -446,7 +501,7 @@ public class ActionLinksPanel extends Panel {
 
                             @Override
                             protected void onClickInternal(final AjaxRequestTarget target) {
-                                link.onClick(target);
+                                link.onClick(target, model.getObject());
                             }
                         }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -460,7 +515,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -473,7 +528,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -486,7 +541,7 @@ public class ActionLinksPanel extends Panel {
 
                     @Override
                     protected void onClickInternal(final AjaxRequestTarget target) {
-                        link.onClick(target);
+                        link.onClick(target, model.getObject());
                     }
                 }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
                 break;
@@ -521,6 +576,22 @@ public class ActionLinksPanel extends Panel {
                 super.addOrReplace(new Fragment("panelManageGroups", "emptyFragment", this));
                 break;
 
+            case MAPPING:
+                super.addOrReplace(new Fragment("panelMapping", "emptyFragment", this));
+                break;
+
+            case ACCOUNT_LINK:
+                super.addOrReplace(new Fragment("panelAccountLink", "emptyFragment", this));
+                break;
+
+            case RESET_TIME:
+                super.addOrReplace(new Fragment("panelResetTime", "emptyFragment", this));
+                break;
+
+            case CLONE:
+                super.addOrReplace(new Fragment("panelClone", "emptyFragment", this));
+                break;
+
             case CREATE:
                 super.addOrReplace(new Fragment("panelCreate", "emptyFragment", this));
                 break;
@@ -606,4 +677,92 @@ public class ActionLinksPanel extends Panel {
             // do nothing
         }
     }
+
+    public static <T extends Serializable> Builder<T> builder(final PageReference pageRef) {
+        return new Builder<T>(pageRef);
+    }
+
+    /**
+     * ActionLinksPanel builder.
+     *
+     * @param <T> model object type.
+     */
+    public static final class Builder<T extends Serializable> implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        private final Map<ActionLink.ActionType, Triple<ActionLink<T>, String, Boolean>> actions = new HashMap<>();
+
+        private final PageReference pageRef;
+
+        private Builder(final PageReference pageRef) {
+            this.pageRef = pageRef;
+        }
+
+        public Builder<T> add(
+                final ActionLink<T> link,
+                final ActionLink.ActionType type,
+                final String entitlements) {
+
+            return addWithRoles(link, type, entitlements, true);
+        }
+
+        public Builder<T> add(
+                final ActionLink<T> link,
+                final ActionLink.ActionType type,
+                final String entitlement,
+                final boolean enabled) {
+
+            return addWithRoles(link, type, entitlement, enabled);
+        }
+
+        public Builder<T> addWithRoles(
+                final ActionLink<T> link,
+                final ActionLink.ActionType type,
+                final String entitlements) {
+
+            return addWithRoles(link, type, entitlements, true);
+        }
+
+        public Builder<T> addWithRoles(
+                final ActionLink<T> link,
+                final ActionLink.ActionType type,
+                final String entitlements,
+                final boolean enabled) {
+            actions.put(type, Triple.of(link, entitlements, enabled));
+            return this;
+        }
+
+        /**
+         * Use this method to build an ation panel without any model reference.
+         *
+         * @param id Component id.
+         * @return Action link panel.
+         */
+        public ActionLinksPanel<T> build(final String id) {
+            return build(id, null);
+        }
+
+        /**
+         * Use this methos to build an action panel including a model reference.
+         *
+         * @param id Component id.
+         * @param modelObject model object.
+         * @return Action link panel.
+         */
+        public ActionLinksPanel<T> build(final String id, final T modelObject) {
+            final ActionLinksPanel<T> panel = modelObject == null
+                    ? new ActionLinksPanel<T>(id, new Model<T>(), this.pageRef)
+                    : new ActionLinksPanel<T>(id, new Model<T>(modelObject), this.pageRef);
+
+            for (Entry<ActionLink.ActionType, Triple<ActionLink<T>, String, Boolean>> action : actions.entrySet()) {
+                panel.add(
+                        action.getValue().getLeft(),
+                        action.getKey(),
+                        action.getValue().getMiddle(),
+                        action.getValue().getRight());
+            }
+            return panel;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.java
index 3c5119b..dc7bfec 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.java
@@ -19,6 +19,9 @@
 package org.apache.syncope.client.console.wicket.markup.html.form;
 
 import java.util.List;
+import org.apache.wicket.Component;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.html.form.AbstractChoice;
 
 import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice;
 import org.apache.wicket.model.IModel;
@@ -35,7 +38,10 @@ public class CheckBoxMultipleChoiceFieldPanel<E> extends AbstractFieldPanel<List
         super(id, model);
 
         field = new CheckBoxMultipleChoice<E>("checkBoxMultipleChoice", model, choices);
-        add(field);
+        add(field.
+                setPrefix("<div class=\"checkbox\">").
+                setSuffix("</div>").
+                setLabelPosition(AbstractChoice.LabelPosition.WRAP_AFTER));
     }
 
     @Override
@@ -43,4 +49,9 @@ public class CheckBoxMultipleChoiceFieldPanel<E> extends AbstractFieldPanel<List
         field.setModelObject(object);
         return this;
     }
+
+    @Override
+    public Component add(final Behavior... behaviors) {
+        return field.add(behaviors);
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
new file mode 100644
index 0000000..d9a42c1
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2015 The Apache Software Foundation.
+ *
+ * Licensed 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.client.console.wizards;
+
+import java.io.Serializable;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.wicket.Component;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.extensions.wizard.Wizard;
+import org.apache.wicket.request.cycle.RequestCycle;
+
+public abstract class AjaxWizard<T extends Serializable> extends Wizard {
+
+    private static final long serialVersionUID = 1L;
+
+    private final PageReference pageRef;
+
+    private final T item;
+
+    /**
+     * Construct.
+     *
+     * @param id The component id
+     * @param item
+     * @param pageRef Caller page reference.
+     */
+    public AjaxWizard(final String id, final T item, final PageReference pageRef) {
+        super(id);
+        this.item = item;
+        this.pageRef = pageRef;
+        setOutputMarkupId(true);
+    }
+
+    @Override
+    protected Component newButtonBar(final String id) {
+        return new AjaxWizardButtonBar(id, this);
+    }
+
+    protected abstract void onCancelInternal();
+
+    protected abstract void onApplyInternal();
+
+    /**
+     * @see org.apache.wicket.extensions.wizard.Wizard#onCancel()
+     */
+    @Override
+    public final void onCancel() {
+        onCancelInternal();
+        send(pageRef.getPage(), Broadcast.DEPTH,
+                new NewItemCancelEvent<T>(item, RequestCycle.get().find(AjaxRequestTarget.class)));
+    }
+
+    /**
+     * @see org.apache.wicket.extensions.wizard.Wizard#onFinish()
+     */
+    @Override
+    public final void onFinish() {
+        onApplyInternal();
+        send(pageRef.getPage(), Broadcast.DEPTH,
+                new NewItemFinishEvent<T>(item, RequestCycle.get().find(AjaxRequestTarget.class)));
+    }
+
+    public T getItem() {
+        return item;
+    }
+
+    public abstract static class NewItemEvent<T> {
+        private final T item;
+
+        private final AjaxRequestTarget target;
+
+        public NewItemEvent(final T item, final AjaxRequestTarget target) {
+            this.item = item;
+            this.target = target;
+        }
+
+        public T getItem() {
+            return item;
+        }
+
+        public AjaxRequestTarget getTarget() {
+            return target;
+        }
+    }
+
+    public static class NewItemCancelEvent<T> extends NewItemEvent<T> {
+
+        public NewItemCancelEvent(final T item, final AjaxRequestTarget target) {
+            super(item, target);
+        }
+
+    }
+
+    public static class NewItemFinishEvent<T> extends NewItemEvent<T> {
+
+        public NewItemFinishEvent(final T item, final AjaxRequestTarget target) {
+            super(item, target);
+        }
+
+    }
+
+    /**
+     *
+     * @return
+     */
+    @Override
+    public AjaxWizard<T> clone() {
+        return SerializationUtils.clone(this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButton.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButton.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButton.java
new file mode 100644
index 0000000..a581954
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButton.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2015 The Apache Software Foundation.
+ *
+ * Licensed 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.client.console.wizards;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.extensions.wizard.IWizard;
+import org.apache.wicket.extensions.wizard.IWizardModel;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.ResourceModel;
+
+public abstract class AjaxWizardButton extends AjaxButton {
+
+    private static final long serialVersionUID = 1L;
+
+    private final IWizard wizard;
+
+    public AjaxWizardButton(
+            final String id,
+            final IWizard wizard,
+            final Form<?> form,
+            final String labelResourceKey,
+            final boolean formprocessing) {
+        super(id, form);
+        this.setLabel(new ResourceModel(labelResourceKey));
+        this.wizard = wizard;
+        setDefaultFormProcessing(formprocessing);
+    }
+
+    public AjaxWizardButton(final String id, final IWizard wizard, final String labelResourceKey) {
+        this(id, wizard, null, labelResourceKey, true);
+    }
+
+    public AjaxWizardButton(
+            final String id, final IWizard wizard, final String labelResourceKey, final boolean formprocessing) {
+        this(id, wizard, null, labelResourceKey, formprocessing);
+    }
+
+    protected final IWizard getWizard() {
+        return wizard;
+    }
+
+    protected final IWizardModel getWizardModel() {
+        return getWizard().getWizardModel();
+    }
+
+    @Override
+    protected final void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+        onClick(target, form);
+    }
+
+    protected abstract void onClick(final AjaxRequestTarget target, final Form<?> form);
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButtonBar.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButtonBar.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButtonBar.java
new file mode 100644
index 0000000..4f31a26
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButtonBar.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2015 The Apache Software Foundation.
+ *
+ * Licensed 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.client.console.wizards;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.wizard.IWizardModel;
+import org.apache.wicket.extensions.wizard.IWizardStep;
+import org.apache.wicket.extensions.wizard.Wizard;
+import org.apache.wicket.extensions.wizard.WizardButtonBar;
+import org.apache.wicket.markup.html.form.Form;
+
+public class AjaxWizardButtonBar extends WizardButtonBar {
+
+    private static final long serialVersionUID = 1L;
+
+    public AjaxWizardButtonBar(final String id, final Wizard wizard) {
+        super(id, wizard);
+
+        addOrReplace(new AjaxWizardButton("next", wizard, "next") {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected void onClick(final AjaxRequestTarget target, final Form<?> form) {
+                IWizardModel wizardModel = getWizardModel();
+                IWizardStep step = wizardModel.getActiveStep();
+
+                // let the step apply any state
+                step.applyState();
+
+                // if the step completed after applying the state, move the model onward
+                if (step.isComplete()) {
+                    wizardModel.next();
+                } else {
+                    error(getLocalizer().getString(
+                            "org.apache.wicket.extensions.wizard.NextButton.step.did.not.complete", this));
+                }
+
+                target.add(wizard);
+            }
+
+            @Override
+            public final boolean isEnabled() {
+                return super.isEnabled() && getWizardModel().isNextAvailable();
+            }
+        });
+
+        addOrReplace(new AjaxWizardButton("previous", wizard, "prev", false) {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected void onClick(final AjaxRequestTarget target, final Form<?> form) {
+                getWizardModel().previous();
+                target.add(wizard);
+            }
+
+            @Override
+            public final boolean isEnabled() {
+                return super.isEnabled() && getWizardModel().isPreviousAvailable();
+            }
+        });
+
+        addOrReplace(new AjaxWizardButton("cancel", wizard, "cancel", false) {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected void onClick(final AjaxRequestTarget target, final Form<?> form) {
+                getWizardModel().cancel();
+                target.add(wizard);
+            }
+
+            @Override
+            public final boolean isEnabled() {
+                return true;
+            }
+        });
+
+        addOrReplace(new AjaxWizardButton("finish", wizard, "finish") {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected void onClick(final AjaxRequestTarget target, final Form<?> form) {
+                getWizardModel().finish();
+                target.add(wizard);
+            }
+
+            @Override
+            public final boolean isEnabled() {
+                final IWizardStep activeStep = getWizardModel().getActiveStep();
+                return (activeStep != null) && getWizardModel().isLastStep(activeStep) && super.isEnabled();
+            }
+        });
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wizards/ProvisionWizard.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/ProvisionWizard.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/ProvisionWizard.java
new file mode 100644
index 0000000..6c3c8e0
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/ProvisionWizard.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2015 The Apache Software Foundation.
+ *
+ * Licensed 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.client.console.wizards;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.panels.ResourceMappingPanel;
+import org.apache.syncope.common.lib.to.ProvisionTO;
+import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.extensions.wizard.WizardModel;
+import org.apache.wicket.extensions.wizard.WizardStep;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
+
+public class ProvisionWizard extends AjaxWizard<ProvisionTO> {
+
+    private static final long serialVersionUID = 1L;
+
+    private final ResourceTO resourceTO;
+
+    /**
+     * The object type specification step.
+     */
+    private final class ObjectType extends WizardStep {
+
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Construct.
+         */
+        public ObjectType() {
+            super(new ResourceModel("type.title", StringUtils.EMPTY),
+                    new ResourceModel("type.summary", StringUtils.EMPTY), new Model<ProvisionTO>(getItem()));
+
+            add(new TextField<String>(
+                    "type", new PropertyModel<String>(getItem(), "anyType")).setRequired(true));
+            add(new TextField<String>(
+                    "class", new PropertyModel<String>(getItem(), "objectClass")).setRequired(true));
+        }
+    }
+
+    /**
+     * Mapping definition step.
+     */
+    private final class Mapping extends WizardStep {
+
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Construct.
+         */
+        public Mapping() {
+            setTitleModel(new ResourceModel("mapping.title", "Mapping"));
+            setSummaryModel(new StringResourceModel("mapping.summary", this, new Model<ProvisionTO>(getItem())));
+
+            add(new ResourceMappingPanel("mapping", resourceTO, getItem()));
+        }
+    }
+
+    /**
+     * AccountLink specification step.
+     */
+    private final class AccountLink extends WizardStep {
+
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Construct.
+         */
+        public AccountLink() {
+            super(new ResourceModel("link.title", StringUtils.EMPTY),
+                    new ResourceModel("link.summary", StringUtils.EMPTY));
+        }
+    }
+
+    /**
+     * Construct.
+     *
+     * @param id The component id
+     * @param resourceTO external resource to be updated.
+     * @param pageRef Caller page reference.
+     */
+    public ProvisionWizard(final String id, final ResourceTO resourceTO, final PageReference pageRef) {
+        super(id, new ProvisionTO(), pageRef);
+        this.resourceTO = resourceTO;
+
+        setDefaultModel(new CompoundPropertyModel<ProvisionWizard>(this));
+
+        final WizardModel model = new WizardModel();
+        model.add(new ObjectType());
+        model.add(new Mapping());
+        model.add(new AccountLink());
+
+        init(model);
+    }
+
+    @Override
+    protected void onCancelInternal() {
+        // d nothing
+    }
+
+    @Override
+    protected void onApplyInternal() {
+        // do nothing
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
index 1b8e565..484382e 100644
--- a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
+++ b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
@@ -17,129 +17,134 @@
  * under the License.
  */
 .feedbackPanel {
-    padding-left: 0px;
-    text-align: center;
+  padding-left: 0px;
+  text-align: center;
 }
 
 .notificationpanel_row {  
-    list-style-type: none;
+  list-style-type: none;
 }  
 
 .notificationpanel_row span {  
-    border:0 none;
+  border:0 none;
 }    
 pre {
-    white-space: -moz-pre-wrap; /* Mozilla, supported since 1999 */
-    white-space: -pre-wrap; /* Opera */
-    white-space: -o-pre-wrap; /* Opera */
-    white-space: pre-wrap; /* CSS3 - Text module (Candidate Recommendation) http://www.w3.org/TR/css3-text/#white-space */
-    word-wrap: break-word; /* IE 5.5+ */
+  white-space: -moz-pre-wrap; /* Mozilla, supported since 1999 */
+  white-space: -pre-wrap; /* Opera */
+  white-space: -o-pre-wrap; /* Opera */
+  white-space: pre-wrap; /* CSS3 - Text module (Candidate Recommendation) http://www.w3.org/TR/css3-text/#white-space */
+  word-wrap: break-word; /* IE 5.5+ */
 }
 
 #veil {
-    display:none;
-    position:absolute;
-    top:0;
-    left:0;
-    z-index:99999;
-    background-color:black;
-    width:100%;
-    height:20000px;
-    color:white;
-    opacity:0.3;
-    filter:alpha(opacity=30);
+  display:none;
+  position:absolute;
+  top:0;
+  left:0;
+  z-index:99999;
+  background-color:black;
+  width:100%;
+  height:20000px;
+  color:white;
+  opacity:0.3;
+  filter:alpha(opacity=30);
 }
 
 #veil img {
-    position:absolute;
-    top:300px;
-    left:50%;
-    margin-left:-75px;
-    width:150px;
+  position:absolute;
+  top:300px;
+  left:50%;
+  margin-left:-75px;
+  width:150px;
 }
 
 .block-sidebar {
-    max-height: 100%; 
-    overflow: auto; 
-    padding-top: 90px; 
-    padding-bottom: 50px; 
-    position: fixed;
+  max-height: 100%; 
+  overflow: auto; 
+  padding-top: 90px; 
+  padding-bottom: 50px; 
+  position: fixed;
 }
 
 .inner-control-sidebar {
-    position: fixed; 
-    height: auto;
+  position: fixed; 
+  height: auto;
 }
 
 .content-margin-layout {
-    margin: 0px 230px 0px 0px !important;
-    padding: 20px !important;
+  margin: 0px 230px 0px 0px !important;
+  padding: 20px !important;
 }
 
 .admin-content-page {
-    padding: 20px;
-    background: #ecf0f5
+  padding: 20px;
+  background: #ecf0f5
 }
 
 .realms {
-    min-height: 554px
+  min-height: 554px
 }
 
 .actions > li > a {
-    padding-top: 5px !important;
-    padding-bottom: 5px !important;
+  padding-top: 5px !important;
+  padding-bottom: 5px !important;
+}
+
+div.listview-actions a{
+  float:left; 
+  padding-right:8px
 }
 
 .block-header {
-    position: fixed;
-    width: 100%;
-    top: 0;
+  position: fixed;
+  width: 100%;
+  top: 0;
 }
 
 .block-footer {
-    position: fixed;
-    width: 100%;
-    bottom: 0px;
+  position: fixed;
+  width: 100%;
+  bottom: 0px;
 }
 
 .logo-pos {
-    padding-top: 4px !important;
-    overflow: visible !important;
+  padding-top: 4px !important;
+  overflow: visible !important;
 }
 
 .angle {
-    border: medium none !important;
-    cursor: pointer;
-    display: inline-table !important;
-    float: right;
-    height: 30px;
-    overflow: hidden;
-    position: relative !important;
-    right: 0;
-    top: -30px;
-    width: 25%;
-    z-index: 3;
+  border: medium none !important;
+  cursor: pointer;
+  display: inline-table !important;
+  float: right;
+  height: 30px;
+  overflow: hidden;
+  position: relative !important;
+  right: 0;
+  top: -30px;
+  width: 25%;
+  z-index: 3;
 }
 
 @media (min-width: 768px) {
-    .main-header .logo {
-	height: 54px;
-    }
+  .main-header .logo {
+    height: 54px;
+  }
 }
 
 .w_caption h3 {
-    font-size: 16px;
+  font-size: 16px;
 }
 
 div.wicket-modal div.w_content_3 {
-    border: 1px solid #eee;
-    border-radius: 20px;
-    padding: 5px;
+  border: 1px solid #eee;
+  border-radius: 20px;
+  padding: 5px;
 }
 
 .tab-content {
-    margin-bottom: 10px;
-    margin-top: 10px;
+  margin-bottom: 10px;
+  margin-top: 10px;
 }
 
 a.help {

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/META-INF/resources/js/topology.js
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/js/topology.js b/client/console/src/main/resources/META-INF/resources/js/topology.js
index f2a7ac3..9327b01 100644
--- a/client/console/src/main/resources/META-INF/resources/js/topology.js
+++ b/client/console/src/main/resources/META-INF/resources/js/topology.js
@@ -107,18 +107,24 @@ var enabledEndpointStyle = {
 };
 
 window.disable = function(targetName){
-    jsPlumb.select({target:targetName}).setPaintStyle(disabledConnectorStyle).setHoverPaintStyle(disabledConnectorHoverStyle);
-    jsPlumb.selectEndpoints({element: [targetName]}).setPaintStyle(disabledEndpointStyle);
+    jsPlumb.ready(function(){
+	jsPlumb.select({target:targetName}).setPaintStyle(disabledConnectorStyle).setHoverPaintStyle(disabledConnectorHoverStyle);
+	jsPlumb.selectEndpoints({element: [targetName]}).setPaintStyle(disabledEndpointStyle);
+    });
 }
 
 window.enable = function(targetName){
-    jsPlumb.select({target:targetName}).setPaintStyle(enabledConnectorStyle).setHoverPaintStyle(enabledConnectorHoverStyle);
-    jsPlumb.selectEndpoints({element: [targetName]}).setPaintStyle(enabledEndpointStyle);
+    jsPlumb.ready(function(){
+	jsPlumb.select({target:targetName}).setPaintStyle(enabledConnectorStyle).setHoverPaintStyle(enabledConnectorHoverStyle);
+	jsPlumb.selectEndpoints({element: [targetName]}).setPaintStyle(enabledEndpointStyle);
+    });
 }
 
 window.failure = function(targetName){
-    jsPlumb.select({target:targetName}).setPaintStyle(failedConnectorStyle).setHoverPaintStyle(failedConnectorHoverStyle);
-    jsPlumb.selectEndpoints({element: [targetName]}).setPaintStyle(failedEndpointStyle);
+    jsPlumb.ready(function(){
+	jsPlumb.select({target:targetName}).setPaintStyle(failedConnectorStyle).setHoverPaintStyle(failedConnectorHoverStyle);
+	jsPlumb.selectEndpoints({element: [targetName]}).setPaintStyle(failedEndpointStyle);
+    });
 }
 
 window.unknown = function(targetName){
@@ -221,61 +227,57 @@ window.zoomOut = function(el, instance, transformOrigin) {
 };
 
 window.connect = function(source, target, scope){
-    if(jsPlumb.select({source:source, target:target, scope: scope}) !=null){
-	jsPlumb.connect({source:source, target:target, scope: scope}, def);
-    }
+    jsPlumb.ready(function(){
+	if(jsPlumb.select({source:source, target:target, scope: scope}) != null){
+	    jsPlumb.connect({source:source, target:target, scope: scope}, def);
+	}
+    });
 }
 
 window.activate = function(zoom){
-    jsPlumb.draggable(jsPlumb.getSelector(".window"));
-    jsPlumb.setContainer("drawing");
-
-    $("#drawing").draggable({
-	containment: 'topology',
-	cursor: 'move'
+    jsPlumb.ready(function(){
+	jsPlumb.draggable(jsPlumb.getSelector(".window"));
+	jsPlumb.setContainer("drawing");
+	
+	jsPlumb.Defaults.MaxConnections = 1000;
+	
+	$("#drawing").draggable({
+	    containment: 'topology',
+	    cursor: 'move'
+	});
+	
+	var val = getTopology();
+	if(val.__zoom__ == null){
+	    setZoom($("#drawing")[0], zoom);
+	} else {
+	    setZoom($("#drawing")[0], val.__zoom__);
+	}
     });
-
-    var val = getTopology();
-    if(val.__zoom__ == null){
-	setZoom($("#drawing")[0], zoom);
-    } else {
-	setZoom($("#drawing")[0], val.__zoom__);
-    }
 }
 
 window.checkConnection = function() {
-    jsPlumb.select({scope:"CONNECTOR"}).each(function(connection) {
-        Wicket.WebSocket.send("{ \"kind\":\"CHECK_CONNECTOR\", \"target\":\"" + connection.target.id + "\" }");
-    });
-    jsPlumb.select({scope:"RESOURCE"}).each(function(connection) {
-        Wicket.WebSocket.send("{ \"kind\":\"CHECK_RESOURCE\", \"target\":\"" + connection.target.id + "\" }");
+    jsPlumb.ready(function(){
+	jsPlumb.select({scope:"CONNECTOR"}).each(function(connection) {
+            Wicket.WebSocket.send("{ \"kind\":\"CHECK_CONNECTOR\", \"target\":\"" + connection.target.id + "\" }");
+	});
+	jsPlumb.select({scope:"RESOURCE"}).each(function(connection) {
+            Wicket.WebSocket.send("{ \"kind\":\"CHECK_RESOURCE\", \"target\":\"" + connection.target.id + "\" }");
+	});
     });
 }
 
 window.addEndpoint = function(source, target, scope) {
     var sourceElement = $('#' + source);
-    var element = sourceElement.clone();
-    element.attr('id', target);
-    element.removeAttr('data-original-title');
     
     var top = parseFloat(sourceElement.css("top")) + 10;
     var left = parseFloat(sourceElement.css("left")) - 150;
 
-    if(scope == 'RESOURCE'){
-	var style = 'topology_res';
-    }else{
-	var style = 'topology_conn';
-    }
-    
-    element.attr('class', 'window jsplumb-draggable _jsPlumb_endpoint_anchor_ ' + style);
-    
-    element.find('p').text(target);
-    
-    $('#drawing').append(element);
     setPosition(target, left, top);
-    
-    jsPlumb.draggable(element);
-    jsPlumb.connect({ source:source, target:target, scope:scope }, def);
+
+    jsPlumb.ready(function(){
+	jsPlumb.draggable(jsPlumb.getSelector("#" + target));
+	jsPlumb.connect({ source:source, target:target, scope:scope }, def);
+    });
 }
 
 jsPlumb.importDefaults({

http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionModal.html
new file mode 100644
index 0000000..99693e7
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionModal.html
@@ -0,0 +1,30 @@
+<!--
+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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+  <wicket:extend>
+    <form wicket:id="form">
+      <div class="bean">
+        <span wicket:id="bean">[Complex]</span>
+        <div class="modal-footer">
+          <input type="submit" class="btn btn-primary" wicket:id="apply"/>
+          <input type="button" class="btn btn-default" wicket:id="cancel"/>
+        </div>
+    </form>
+  </wicket:extend>
+</html>


[5/5] syncope git commit: [SYNCOPE-652] More tests and console support

Posted by il...@apache.org.
[SYNCOPE-652] More tests and console support


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

Branch: refs/heads/SYNCOPE-652
Commit: f03ffb300219d4f575c983e6aabd8d84c8c3856d
Parents: 2cb3f47
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Thu Aug 13 12:30:38 2015 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Thu Aug 13 12:30:38 2015 +0200

----------------------------------------------------------------------
 .../client/console/SyncopeConsoleSession.java   |  43 +++-
 .../syncope/client/console/pages/BasePage.java  |   5 +-
 .../syncope/client/console/pages/Login.java     |  49 +++++
 .../syncope/client/console/pages/Realms.java    |   4 -
 .../client/console/rest/BaseRestClient.java     |   3 -
 .../client/console/rest/RealmRestClient.java    |   2 +-
 .../syncope/client/console/pages/BasePage.html  |   7 +
 .../syncope/client/console/pages/Login.html     |   1 +
 .../syncope/common/lib/types/Entitlement.java   |   2 -
 .../apache/syncope/core/logic/DomainLogic.java  |  11 +-
 .../apache/syncope/core/logic/LoggerLogic.java  |   9 +-
 .../syncope/core/logic/ResourceLogic.java       |   4 -
 .../core/misc/security/AuthDataAccessor.java    |   4 +-
 .../core/misc/security/PasswordGenerator.java   |   4 +-
 .../core/persistence/jpa/inner/DomainTest.java  |  88 ++++++++
 .../src/test/resources/domains/TwoContent.xml   |  10 +
 fit/core-reference/src/main/webapp/db.jsp       |   3 +-
 .../fit/core/reference/AbstractITCase.java      |  19 +-
 .../fit/core/reference/AbstractTaskITCase.java  |  18 +-
 .../fit/core/reference/ConnectorITCase.java     |   7 +-
 .../fit/core/reference/DomainITCase.java        | 115 ++++++++++
 .../fit/core/reference/MultitenancyITCase.java  | 214 +++++++++++++++++++
 .../fit/core/reference/PushTaskITCase.java      |  20 +-
 .../fit/core/reference/SyncTaskITCase.java      |  35 +--
 24 files changed, 600 insertions(+), 77 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
index 25394c7..8d71645 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
@@ -19,19 +19,27 @@
 package org.apache.syncope.client.console;
 
 import java.text.DateFormat;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import javax.ws.rs.core.EntityTag;
 import javax.ws.rs.core.MediaType;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
+import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.lib.to.DomainTO;
 import org.apache.syncope.common.lib.to.SyncopeTO;
 import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.syncope.common.rest.api.service.DomainService;
 import org.apache.syncope.common.rest.api.service.SyncopeService;
 import org.apache.wicket.Session;
 import org.apache.wicket.authroles.authentication.AuthenticatedWebSession;
@@ -51,12 +59,16 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession {
 
     private static final Logger LOG = LoggerFactory.getLogger(SyncopeConsoleSession.class);
 
-    private final SyncopeClientFactoryBean clientFactory;
-
     private final String version;
 
     private final SyncopeTO syncopeTO;
 
+    private final List<String> domains;
+
+    private String domain;
+
+    private final SyncopeClientFactoryBean clientFactory;
+
     private final Map<Class<?>, Object> services = Collections.synchronizedMap(new HashMap<Class<?>, Object>());
 
     private SyncopeClient client;
@@ -88,7 +100,18 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession {
 
         version = ctx.getBean("version", String.class);
 
-        syncopeTO = clientFactory.create(anonymousUser, anonymousKey).getService(SyncopeService.class).info();
+        SyncopeClient anonymousClient = clientFactory.create(anonymousUser, anonymousKey);
+        syncopeTO = anonymousClient.getService(SyncopeService.class).info();
+        domains = new ArrayList<>();
+        domains.add(SyncopeConstants.MASTER_DOMAIN);
+        CollectionUtils.collect(anonymousClient.getService(DomainService.class).list(),
+                new Transformer<DomainTO, String>() {
+
+                    @Override
+                    public String transform(final DomainTO domain) {
+                        return domain.getKey();
+                    }
+                }, domains);
     }
 
     public String getVersion() {
@@ -99,12 +122,24 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession {
         return syncopeTO;
     }
 
+    public List<String> getDomains() {
+        return domains;
+    }
+
+    public void setDomain(final String domain) {
+        this.domain = domain;
+    }
+
+    public String getDomain() {
+        return StringUtils.isBlank(domain) ? SyncopeConstants.MASTER_DOMAIN : domain;
+    }
+
     @Override
     public boolean authenticate(final String username, final String password) {
         boolean authenticated = false;
 
         try {
-            client = clientFactory.create(username, password);
+            client = clientFactory.setDomain(getDomain()).create(username, password);
 
             Pair<Map<String, Set<String>>, UserTO> self = client.self();
             auth = self.getKey();

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
index 20c3458..a6e737b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
@@ -92,11 +92,12 @@ public class BasePage extends AbstractBasePage implements IAjaxIndicatorAware {
         liContainer = new WebMarkupContainer(getLIContainerId("realms"));
         add(liContainer);
         liContainer.add(new BookmarkablePageLink<>("realms", Realms.class));
-        
+
         liContainer = new WebMarkupContainer(getLIContainerId("topology"));
         add(liContainer);
         liContainer.add(new BookmarkablePageLink<>("topology", Topology.class));
-        
+
+        add(new Label("domain", SyncopeConsoleSession.get().getDomain()));
         add(new BookmarkablePageLink<Page>("logout", Logout.class));
 
         // set 'active' menu item

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/client/console/src/main/java/org/apache/syncope/client/console/pages/Login.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Login.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Login.java
index 8421b00..8d9d5ff 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Login.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Login.java
@@ -21,8 +21,10 @@ package org.apache.syncope.client.console.pages;
 import java.security.AccessControlException;
 import java.util.Locale;
 import org.apache.syncope.client.console.SyncopeConsoleApplication;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.panels.NotificationPanel;
+import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.authentication.IAuthenticationStrategy;
@@ -56,6 +58,8 @@ public class Login extends WebPage {
 
     private final DropDownChoice<Locale> languageSelect;
 
+    private final DropDownChoice<String> domainSelect;
+
     public Login(final PageParameters parameters) {
         super(parameters);
         setStatelessHint(true);
@@ -76,6 +80,12 @@ public class Login extends WebPage {
         languageSelect = new LocaleDropDown("language");
         form.add(languageSelect);
 
+        domainSelect = new DomainDropDown("domain");
+        if (SyncopeConsoleSession.get().getDomains().size() == 1) {
+            domainSelect.setOutputMarkupPlaceholderTag(true);
+        }
+        form.add(domainSelect);
+
         AjaxButton submitButton = new AjaxButton("submit", new Model<>(getString("submit"))) {
 
             private static final long serialVersionUID = 429178684321093953L;
@@ -157,4 +167,43 @@ public class Login extends WebPage {
         }
     }
 
+    /**
+     * Inner class which implements (custom) Domain DropDownChoice component.
+     */
+    private class DomainDropDown extends DropDownChoice<String> {
+
+        private static final long serialVersionUID = -7401167913360133325L;
+
+        public DomainDropDown(final String id) {
+            super(id, SyncopeConsoleSession.get().getDomains());
+
+            setModel(new IModel<String>() {
+
+                private static final long serialVersionUID = -1124206668056084806L;
+
+                @Override
+                public String getObject() {
+                    return SyncopeConsoleSession.get().getDomain();
+                }
+
+                @Override
+                public void setObject(final String object) {
+                    SyncopeConsoleSession.get().setDomain(object);
+                }
+
+                @Override
+                public void detach() {
+                    // Empty.
+                }
+            });
+
+            // set default value to Master Domain
+            getModel().setObject(SyncopeConstants.MASTER_DOMAIN);
+        }
+
+        @Override
+        protected boolean wantOnSelectionChangedNotifications() {
+            return true;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
index daee99c..011d519 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
@@ -40,15 +40,11 @@ import org.apache.wicket.markup.repeater.RepeatingView;
 import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class Realms extends BasePage {
 
     private static final long serialVersionUID = -1100228004207271270L;
 
-    protected static final Logger LOG = LoggerFactory.getLogger(Realms.class);
-
     @SpringBean
     private RealmRestClient realmRestClient;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java
index 17b2d4f..0e6fe2c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/BaseRestClient.java
@@ -28,9 +28,6 @@ import org.slf4j.LoggerFactory;
 
 public abstract class BaseRestClient implements Serializable {
 
-    /**
-     * Logger.
-     */
     protected static final Logger LOG = LoggerFactory.getLogger(BaseRestClient.class);
 
     private static final long serialVersionUID = 1523999867826481989L;

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
index 06cba4d..6ea095d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
@@ -25,7 +25,7 @@ import org.apache.syncope.common.rest.api.service.RealmService;
 import org.springframework.stereotype.Component;
 
 /**
- * Console client for invoking Rest Group's services.
+ * Console client for invoking REST Realm's services.
  */
 @Component
 public class RealmRestClient extends BaseRestClient {

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
index b01e9d9..3a874b8 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
@@ -63,6 +63,13 @@ under the License.
           <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button">
             <span class="sr-only">Toggle navigation</span>
           </a>
+          <ul class="nav navbar-nav">
+            <li>
+              <a href="#" class="dropdown-toggle">
+                <span class="hidden-xs"><label wicket:id="domain"/></span>
+              </a>
+            </li>
+          </ul>
           <div class="navbar-custom-menu">
             <ul class="nav navbar-nav">
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/client/console/src/main/resources/org/apache/syncope/client/console/pages/Login.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Login.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Login.html
index 8eb150b..e6230db 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Login.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Login.html
@@ -51,6 +51,7 @@ under the License.
           <input type="password" wicket:id="password" id="password" class="form-control" 
                  wicket:message="placeholder:password" required="required" />
           <select wicket:id="language" id="language" class="selectpicker"/>
+          <select wicket:id="domain" id="domain" class="selectpicker"/>
           <button wicket:id="submit" type="submit" 
                   class="btn btn-lg btn-primary btn-block btn-signin"><wicket:message key="submit"/></button>
         </form>

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/common/lib/src/main/java/org/apache/syncope/common/lib/types/Entitlement.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/Entitlement.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/Entitlement.java
index bf87c89..ccb4fce 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/Entitlement.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/Entitlement.java
@@ -28,8 +28,6 @@ public final class Entitlement {
 
     public static final String ANONYMOUS = "ANONYMOUS";
 
-    public static final String DOMAIN_LIST = "DOMAIN_LIST";
-
     public static final String DOMAIN_CREATE = "DOMAIN_CREATE";
 
     public static final String DOMAIN_READ = "DOMAIN_READ";

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
index 58f717d..c946fb1 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
@@ -27,6 +27,7 @@ import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.to.DomainTO;
 import org.apache.syncope.common.lib.types.Entitlement;
+import org.apache.syncope.core.persistence.api.DomainsHolder;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.DomainDAO;
 import org.apache.syncope.core.persistence.api.entity.Domain;
@@ -39,6 +40,9 @@ import org.springframework.stereotype.Component;
 public class DomainLogic extends AbstractTransactionalLogic<DomainTO> {
 
     @Autowired
+    private DomainsHolder domainsHolder;
+
+    @Autowired
     private DomainDataBinder binder;
 
     @Autowired
@@ -57,8 +61,7 @@ public class DomainLogic extends AbstractTransactionalLogic<DomainTO> {
         return binder.getDomainTO(domain);
     }
 
-    @PreAuthorize("hasRole('" + Entitlement.DOMAIN_LIST + "') and authentication.details.domain == "
-            + "T(org.apache.syncope.common.lib.SyncopeConstants).MASTER_DOMAIN")
+    @PreAuthorize("isAuthenticated()")
     public List<DomainTO> list() {
         return CollectionUtils.collect(domainDAO.findAll(), new Transformer<Domain, DomainTO>() {
 
@@ -72,6 +75,10 @@ public class DomainLogic extends AbstractTransactionalLogic<DomainTO> {
     @PreAuthorize("hasRole('" + Entitlement.DOMAIN_CREATE + "') and authentication.details.domain == "
             + "T(org.apache.syncope.common.lib.SyncopeConstants).MASTER_DOMAIN")
     public DomainTO create(final DomainTO domainTO) {
+        if (!domainsHolder.getDomains().keySet().contains(domainTO.getKey())) {
+            throw new NotFoundException("No configuration is available for domain '" + domainTO.getKey());
+        }
+
         return binder.getDomainTO(domainDAO.save(binder.create(domainTO)));
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
index d407dba..d7a4dd7 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
@@ -99,7 +99,8 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
         }, new ArrayList<LoggerTO>());
     }
 
-    @PreAuthorize("hasRole('" + Entitlement.LOG_LIST + "')")
+    @PreAuthorize("hasRole('" + Entitlement.LOG_LIST + "') and authentication.details.domain == "
+            + "T(org.apache.syncope.common.lib.SyncopeConstants).MASTER_DOMAIN")
     @Transactional(readOnly = true)
     public List<LoggerTO> listLogs() {
         return list(LoggerType.LOG);
@@ -165,7 +166,8 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
         return result;
     }
 
-    @PreAuthorize("hasRole('" + Entitlement.LOG_SET_LEVEL + "')")
+    @PreAuthorize("hasRole('" + Entitlement.LOG_SET_LEVEL + "') and authentication.details.domain == "
+            + "T(org.apache.syncope.common.lib.SyncopeConstants).MASTER_DOMAIN")
     public LoggerTO setLogLevel(final String name, final Level level) {
         return setLevel(name, level, LoggerType.LOG);
     }
@@ -206,7 +208,8 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
         return loggerToDelete;
     }
 
-    @PreAuthorize("hasRole('" + Entitlement.LOG_DELETE + "')")
+    @PreAuthorize("hasRole('" + Entitlement.LOG_DELETE + "') and authentication.details.domain == "
+            + "T(org.apache.syncope.common.lib.SyncopeConstants).MASTER_DOMAIN")
     public LoggerTO deleteLog(final String name) {
         return delete(name, LoggerType.LOG);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
index df09b5f..f95f7ed 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
@@ -50,7 +50,6 @@ import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
-import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.identityconnectors.framework.common.objects.Attribute;
 import org.identityconnectors.framework.common.objects.AttributeUtil;
@@ -89,9 +88,6 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
     @Autowired
     private ConnectorFactory connFactory;
 
-    @Autowired
-    private AnyUtilsFactory anyUtilsFactory;
-
     @PreAuthorize("hasRole('" + Entitlement.RESOURCE_CREATE + "')")
     public ResourceTO create(final ResourceTO resourceTO) {
         if (StringUtils.isBlank(resourceTO.getKey())) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java
----------------------------------------------------------------------
diff --git a/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java b/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java
index 052cc30..f6324a1 100644
--- a/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java
+++ b/core/misc/src/main/java/org/apache/syncope/core/misc/security/AuthDataAccessor.java
@@ -44,7 +44,6 @@ import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.ConfDAO;
 import org.apache.syncope.core.persistence.api.dao.DomainDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
-import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.Domain;
@@ -59,6 +58,7 @@ import org.identityconnectors.framework.common.objects.Uid;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationServiceException;
 import org.springframework.security.authentication.DisabledException;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
@@ -110,7 +110,7 @@ public class AuthDataAccessor {
     public Domain findDomain(final String key) {
         Domain domain = domainDAO.find(key);
         if (domain == null) {
-            throw new NotFoundException("Could not find domain " + key);
+            throw new AuthenticationServiceException("Could not find domain " + key);
         }
         return domain;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/core/misc/src/main/java/org/apache/syncope/core/misc/security/PasswordGenerator.java
----------------------------------------------------------------------
diff --git a/core/misc/src/main/java/org/apache/syncope/core/misc/security/PasswordGenerator.java b/core/misc/src/main/java/org/apache/syncope/core/misc/security/PasswordGenerator.java
index 44635be..9514f27 100644
--- a/core/misc/src/main/java/org/apache/syncope/core/misc/security/PasswordGenerator.java
+++ b/core/misc/src/main/java/org/apache/syncope/core/misc/security/PasswordGenerator.java
@@ -56,9 +56,7 @@ public class PasswordGenerator {
     @Autowired
     private RealmDAO realmDAO;
 
-    public String generate(final List<PasswordPolicySpec> ppSpecs)
-            throws InvalidPasswordPolicySpecException {
-
+    public String generate(final List<PasswordPolicySpec> ppSpecs) throws InvalidPasswordPolicySpecException {
         PasswordPolicySpec policySpec = merge(ppSpecs);
 
         check(policySpec);

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DomainTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DomainTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DomainTest.java
new file mode 100644
index 0000000..a447f29
--- /dev/null
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DomainTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.persistence.jpa.inner;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.util.List;
+import org.apache.syncope.common.lib.types.CipherAlgorithm;
+import org.apache.syncope.core.persistence.api.dao.DomainDAO;
+import org.apache.syncope.core.persistence.api.entity.Domain;
+import org.apache.syncope.core.persistence.jpa.AbstractTest;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+@Transactional
+public class DomainTest extends AbstractTest {
+
+    @Autowired
+    private DomainDAO domainDAO;
+
+    @Test
+    public void find() {
+        Domain two = domainDAO.find("Two");
+        assertNotNull(two);
+        assertEquals(CipherAlgorithm.SHA, two.getAdminCipherAlgorithm());
+
+        assertNull(domainDAO.find("none"));
+    }
+
+    @Test
+    public void findAll() {
+        List<Domain> list = domainDAO.findAll();
+        assertNotNull(list);
+        assertFalse(list.isEmpty());
+        for (Domain domain : list) {
+            assertNotNull(domain);
+        }
+    }
+
+    @Test
+    public void save() {
+        Domain domain = entityFactory.newEntity(Domain.class);
+        domain.setKey("new");
+        domain.setPassword("password", CipherAlgorithm.SSHA512);
+
+        Domain actual = domainDAO.save(domain);
+        assertNotNull(actual);
+        assertEquals(CipherAlgorithm.SSHA512, actual.getAdminCipherAlgorithm());
+        assertNotEquals("password", actual.getAdminPwd());
+    }
+
+    @Test
+    public void delete() {
+        Domain domain = entityFactory.newEntity(Domain.class);
+        domain.setKey("todelete");
+        domain.setPassword("password", CipherAlgorithm.SSHA512);
+
+        Domain actual = domainDAO.save(domain);
+        assertNotNull(actual);
+
+        String key = actual.getKey();
+        assertNotNull(domainDAO.find(key));
+
+        domainDAO.delete(key);
+        assertNull(domainDAO.find(key));
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/core/persistence-jpa/src/test/resources/domains/TwoContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/TwoContent.xml b/core/persistence-jpa/src/test/resources/domains/TwoContent.xml
index 92216fd..39cdae2 100644
--- a/core/persistence-jpa/src/test/resources/domains/TwoContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/TwoContent.xml
@@ -121,4 +121,14 @@ under the License.
                 traceLevel="FAILURES"/> 
   <Notification_events Notification_id="2" event="[CUSTOM]:[]:[]:[confirmPasswordReset]:[SUCCESS]"/>
 
+  <ConnInstance id="100" bundleName="net.tirasa.connid.bundles.ldap" displayName="LDAP"
+                location="${connid.location}"
+                connectorName="net.tirasa.connid.bundles.ldap.LdapConnector"
+                version="${connid.ldap.version}" 
+                jsonConf='[{"schema":{"name":"synchronizePasswords","displayName":"Enable Password Synchronization","helpMessage":"If true, the connector will synchronize passwords. The Password Capture Plugin needs to be installed for password synchronization to work.","type":"boolean","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["false"]},{"schema":{"name":"maintainLdapGroupMembership","displayName":"Maintain LDAP Group Membership","helpMessage":"When enabled and a user is renamed or deleted, update any LDAP groups to which the user belongs to reflect the new name. Otherwise, the LDAP resource must maintain referential integrity with respect to group membership.","type":"boolean","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["true"]},{"schema":{"name":"host","displayName":"Host","helpMessage":"The name or IP address of the host where the LDAP server is running.","type":"jav
 a.lang.String","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["localhost"]},{"schema":{"name":"passwordHashAlgorithm","displayName":"Password Hash Algorithm","helpMessage":"Indicates the algorithm that the Identity system should use to hash the password. Currently supported values are SSHA, SHA, SSHA1, and SHA1. A blank value indicates that the system will not hash passwords. This will cause cleartext passwords to be stored in LDAP unless the LDAP server performs the hash (Netscape Directory Server and iPlanet Directory Server do).","type":"java.lang.String","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["SHA"]},{"schema":{"name":"blockSize","displayName":"Block Size","helpMessage":"The maximum number of accounts that can be in a block when retrieving accounts in blocks.","type":"int","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"valu
 es":[]},{"schema":{"name":"useBlocks","displayName":"Use Blocks","helpMessage":"When performing operations on large numbers of accounts, the accounts are processed in blocks to reduce the amount of memory used by the operation. Select this option to process accounts in blocks.","type":"boolean","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":[false]},{"schema":{"name":"usePagedResultControl","displayName":"Use Paged Result Control","helpMessage":"When enabled, the LDAP Paged Results control is preferred over the VLV control when retrieving accounts.","type":"boolean","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["false"]},{"schema":{"name":"port","displayName":"TCP Port","helpMessage":"TCP/IP port number used to communicate with the LDAP server.","type":"int","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":[1389]},{"schema":{"nam
 e":"vlvSortAttribute","displayName":"VLV Sort Attribute","helpMessage":"Specify the sort attribute to use for VLV indexes on the resource.","type":"java.lang.String","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":[]},{"schema":{"name":"statusManagementClass","displayName":"Status management class ","helpMessage":"Class to be used to manage enabled/disabled status. If no class is specified then identity status management wont be possible.","type":"java.lang.String","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["net.tirasa.connid.bundles.ldap.commons.AttributeStatusManagement"]},{"schema":{"name":"accountObjectClasses","displayName":"Account Object Classes","helpMessage":"The object class or classes that will be used when creating new user objects in the LDAP tree. When entering more than one object class, each entry should be on its own line; do not use commas or semi-colons to s
 eparate multiple object classes. Some object classes may require that you specify all object classes in the class hierarchy.","type":"[Ljava.lang.String;","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["inetOrgPerson"]},{"schema":{"name":"accountUserNameAttributes","displayName":"Account User Name Attributes","helpMessage":"Attribute or attributes which holds the account user name. They will be used when authenticating to find the LDAP entry for the user name to authenticate.","type":"[Ljava.lang.String;","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["uid"]},{"schema":{"name":"baseContextsToSynchronize","displayName":"Base Contexts to Synchronize","helpMessage":"One or more starting points in the LDAP tree that will be used to determine if a change should be synchronized. The base contexts attribute will be used to synchronize a change if this property is not set.","type":"[Lja
 va.lang.String;","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["ou=people,o=isp","ou=groups,o=isp"]},{"schema":{"name":"accountSynchronizationFilter","displayName":"LDAP Filter for Accounts to Synchronize","helpMessage":"An optional LDAP filter for the objects to synchronize. Because the change log is for all objects, this filter updates only objects that match the specified filter. If you specify a filter, an object will be synchronized only if it matches the filter and includes a synchronized object class.","type":"java.lang.String","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":[]},{"schema":{"name":"removeLogEntryObjectClassFromFilter","displayName":"Remove Log Entry Object Class from Filter","helpMessage":"If this property is set (the default), the filter used to fetch change log entries does not contain the \"changeLogEntry\" object class, expecting that there are no entri
 es of other object types in the change log.","type":"boolean","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["false"]},{"schema":{"name":"passwordDecryptionKey","displayName":"Password Decryption Key","helpMessage":"The key to decrypt passwords with when performing password synchronization.","type":"org.identityconnectors.common.security.GuardedByteArray","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":[]},{"schema":{"name":"readSchema","displayName":"Read Schema","helpMessage":"If true, the connector will read the schema from the server. If false, the connector will provide a default schema based on the object classes in the configuration. This property must be true in order to use extended object classes.","type":"boolean","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["false"]},{"schema":{"name":"ssl","displayName":"SSL","hel
 pMessage":"Select the check box to connect to the LDAP server using SSL.","type":"boolean","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["false"]},{"schema":{"name":"passwordAttributeToSynchronize","displayName":"Password Attribute to Synchronize","helpMessage":"The name of the password attribute to synchronize when performing password synchronization.","type":"java.lang.String","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":[]},{"schema":{"name":"accountSearchFilter","displayName":"LDAP Filter for Retrieving Accounts","helpMessage":"An optional LDAP filter to control which accounts are returned from the LDAP resource. If no filter is specified, only accounts that include all specified object classes are returned.","type":"java.lang.String","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["uid=*"]},{"schema":{"name":"passwordDec
 ryptionInitializationVector","displayName":"Password Decryption Initialization Vector","helpMessage":"The initialization vector to decrypt passwords with when performing password synchronization.","type":"org.identityconnectors.common.security.GuardedByteArray","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":[]},{"schema":{"name":"groupMemberAttribute","displayName":"Group Member Attribute","helpMessage":"The name of the group attribute that will be updated with the distinguished name of the user when the user is added to the group.","type":"java.lang.String","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":[]},{"schema":{"name":"failover","displayName":"Failover Servers","helpMessage":"List all servers that should be used for failover in case the preferred server fails. If the preferred server fails, JNDI will connect to the next available server in the list. List all servers in the
  form of \"ldap://ldap.example.com:389/\", which follows the standard LDAP v3 URLs described in RFC 2255. Only the host and port parts of the URL are relevant in this setting.","type":"[Ljava.lang.String;","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":[]},{"schema":{"name":"modifiersNamesToFilterOut","displayName":"Filter Out Changes By","helpMessage":"The names (DNs) of directory administrators to filter from the changes. Changes with the attribute \"modifiersName\" that match entries in this list will be filtered out. The standard value is the administrator name used by this adapter, to prevent loops. Entries should be of the format \"cn=Directory Manager\".","type":"[Ljava.lang.String;","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":[]},{"schema":{"name":"groupNameAttributes","displayName":"Group Name Attributes","helpMessage":"Attribute or attributes which holds the group nam
 e.","type":"[Ljava.lang.String;","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["cn"]},{"schema":{"name":"uidAttribute","displayName":"Uid Attribute","helpMessage":"The name of the LDAP attribute which is mapped to the Uid attribute.","type":"java.lang.String","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["cn"]},{"schema":{"name":"respectResourcePasswordPolicyChangeAfterReset","displayName":"Respect Resource Password Policy Change-After-Reset","helpMessage":"When this resource is specified in a Login Module (i.e., this resource is a pass-through authentication target) and the resource password policy is configured for change-after-reset, a user whose resource account password has been administratively reset will be required to change that password after successfully authenticating.","type":"boolean","required":false,"order":0,"confidential":false,"defaultValues":null},"overrida
 ble":false,"values":["false"]},{"schema":{"name":"filterWithOrInsteadOfAnd","displayName":"Filter with Or Instead of And","helpMessage":"Normally the the filter used to fetch change log entries is an and-based filter retrieving an interval of change entries. If this property is set, the filter will or together the required change numbers instead.","type":"boolean","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["false"]},{"schema":{"name":"principal","displayName":"Principal","helpMessage":"The distinguished name with which to authenticate to the LDAP server.","type":"java.lang.String","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["uid=admin,ou=system"]},{"schema":{"name":"changeLogBlockSize","displayName":"Change Log Block Size","helpMessage":"The number of change log entries to fetch per query.","type":"int","required":true,"order":0,"confidential":false,"defaultValues":null},
 "overridable":false,"values":[100]},{"schema":{"name":"baseContexts","displayName":"Base Contexts","helpMessage":"One or more starting points in the LDAP tree that will be used when searching the tree. Searches are performed when discovering users from the LDAP server or when looking for the groups of which a user is a member.","type":"[Ljava.lang.String;","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["ou=people,o=isp","ou=groups,o=isp"]},{"schema":{"name":"passwordAttribute","displayName":"Password Attribute","helpMessage":"The name of the LDAP attribute which holds the password. When changing an user password, the new password is set to this attribute.","type":"java.lang.String","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["userpassword"]},{"schema":{"name":"changeNumberAttribute","displayName":"Change Number Attribute","helpMessage":"The name of the change number attribute
  in the change log entry.","type":"java.lang.String","required":true,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["changeNumber"]},{"schema":{"name":"objectClassesToSynchronize","displayName":"Object Classes to Synchronize","helpMessage":"The object classes to synchronize. The change log is for all objects; this filters updates to just the listed object classes. You should not list the superclasses of an object class unless you intend to synchronize objects with any of the superclass values. For example, if only \"inetOrgPerson\" objects should be synchronized, but the superclasses of \"inetOrgPerson\" (\"person\", \"organizationalperson\" and \"top\") should be filtered out, then list only \"inetOrgPerson\" here. All objects in LDAP are subclassed from \"top\". For this reason, you should never list \"top\", otherwise no object would be filtered.","type":"[Ljava.lang.String;","required":true,"order":0,"confidential":false,"defaultValues":null},
 "overridable":false,"values":["inetOrgPerson","groupOfUniqueNames"]},{"schema":{"name":"credentials","displayName":"Password","helpMessage":"Password for the principal.","type":"org.identityconnectors.common.security.GuardedString","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["secret"]},{"schema":{"name":"attributesToSynchronize","displayName":"Attributes to Synchronize","helpMessage":"The names of the attributes to synchronize. This ignores updates from the change log if they do not update any of the named attributes. For example, if only \"department\" is listed, then only changes that affect \"department\" will be processed. All other updates are ignored. If blank (the default), then all changes are processed.","type":"[Ljava.lang.String;","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":[]},{"schema":{"name":"maintainPosixGroupMembership","displayName":"Maintain POSIX Group M
 embership","helpMessage":"When enabled and a user is renamed or deleted, update any POSIX groups to which the user belongs to reflect the new name. Otherwise, the LDAP resource must maintain referential integrity with respect to group membership.","type":"boolean","required":false,"order":0,"confidential":false,"defaultValues":null},"overridable":false,"values":["truemaintainLdapGroupMembership"]}]'/>
+  <ConnInstance_capabilities ConnInstance_id="100" capability="ONE_PHASE_CREATE"/>
+  <ConnInstance_capabilities ConnInstance_id="100" capability="ONE_PHASE_UPDATE"/>
+  <ConnInstance_capabilities ConnInstance_id="100" capability="ONE_PHASE_DELETE"/>
+  <ConnInstance_capabilities ConnInstance_id="100" capability="SEARCH"/>
+  
 </dataset>

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/fit/core-reference/src/main/webapp/db.jsp
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/webapp/db.jsp b/fit/core-reference/src/main/webapp/db.jsp
index 2a4c6ac..e54d33e 100644
--- a/fit/core-reference/src/main/webapp/db.jsp
+++ b/fit/core-reference/src/main/webapp/db.jsp
@@ -30,7 +30,6 @@ under the License.
         } catch (SQLException e) {
             getServletConfig().getServletContext().log("Could not start H2 web console (datastore)", e);
         }
-
-        response.sendRedirect("http://localhost:8082");
     }
+    response.sendRedirect("http://localhost:8082");
 %>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
index 7c36611..871155a 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractITCase.java
@@ -56,6 +56,7 @@ import org.apache.syncope.common.rest.api.service.AnyTypeService;
 import org.apache.syncope.common.rest.api.service.CamelRouteService;
 import org.apache.syncope.common.rest.api.service.ConfigurationService;
 import org.apache.syncope.common.rest.api.service.ConnectorService;
+import org.apache.syncope.common.rest.api.service.DomainService;
 import org.apache.syncope.common.rest.api.service.LoggerService;
 import org.apache.syncope.common.rest.api.service.NotificationService;
 import org.apache.syncope.common.rest.api.service.PolicyService;
@@ -86,20 +87,15 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 @ContextConfiguration(locations = { "classpath:testJDBCContext.xml" })
 public abstract class AbstractITCase {
 
-    /**
-     * Logger.
-     */
     protected static final Logger LOG = LoggerFactory.getLogger(AbstractITCase.class);
 
     protected static final String ADMIN_UNAME = "admin";
 
     protected static final String ADMIN_PWD = "password";
 
-    private static final String ADDRESS = "http://localhost:9080/syncope/rest";
+    protected static final String ADDRESS = "http://localhost:9080/syncope/rest";
 
-    private static final String ENV_KEY_CONTENT_TYPE = "jaxrsContentType";
-
-    protected static final SyncopeClientFactoryBean clientFactory = new SyncopeClientFactoryBean().setAddress(ADDRESS);
+    protected static final String ENV_KEY_CONTENT_TYPE = "jaxrsContentType";
 
     protected static final String RESOURCE_NAME_WS1 = "ws-target-resource-1";
 
@@ -151,10 +147,14 @@ public abstract class AbstractITCase {
 
     protected static String ANONYMOUS_KEY;
 
+    protected static SyncopeClientFactoryBean clientFactory;
+
     protected static SyncopeClient adminClient;
 
     protected static SyncopeService syncopeService;
 
+    protected static DomainService domainService;
+
     protected static AnyTypeClassService anyTypeClassService;
 
     protected static AnyTypeService anyTypeService;
@@ -224,7 +224,9 @@ public abstract class AbstractITCase {
 
     @BeforeClass
     public static void restSetup() {
-        final String envContentType = System.getProperty(ENV_KEY_CONTENT_TYPE);
+        clientFactory = new SyncopeClientFactoryBean().setAddress(ADDRESS);
+
+        String envContentType = System.getProperty(ENV_KEY_CONTENT_TYPE);
         if (StringUtils.isNotBlank(envContentType)) {
             clientFactory.setContentType(envContentType);
         }
@@ -233,6 +235,7 @@ public abstract class AbstractITCase {
         adminClient = clientFactory.create(ADMIN_UNAME, ADMIN_PWD);
 
         syncopeService = adminClient.getService(SyncopeService.class);
+        domainService = adminClient.getService(DomainService.class);
         anyTypeClassService = adminClient.getService(AnyTypeClassService.class);
         anyTypeService = adminClient.getService(AnyTypeService.class);
         relationshipTypeService = adminClient.getService(RelationshipTypeService.class);

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java
index 37bf12c..2d9dae1 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AbstractTaskITCase.java
@@ -40,6 +40,7 @@ import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.to.TaskExecTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.TaskType;
+import org.apache.syncope.common.rest.api.service.TaskService;
 
 public abstract class AbstractTaskITCase extends AbstractITCase {
 
@@ -51,16 +52,19 @@ public abstract class AbstractTaskITCase extends AbstractITCase {
 
         private final AbstractTaskITCase test;
 
+        private final TaskService taskService;
+
         private final Long taskKey;
 
         private final int maxWaitSeconds;
 
         private final boolean dryRun;
 
-        public ThreadExec(
-                final AbstractTaskITCase test, final Long taskKey, final int maxWaitSeconds, final boolean dryRun) {
+        public ThreadExec(final AbstractTaskITCase test, final TaskService taskService, final Long taskKey,
+                final int maxWaitSeconds, final boolean dryRun) {
 
             this.test = test;
+            this.taskService = taskService;
             this.taskKey = taskKey;
             this.maxWaitSeconds = maxWaitSeconds;
             this.dryRun = dryRun;
@@ -68,7 +72,7 @@ public abstract class AbstractTaskITCase extends AbstractITCase {
 
         @Override
         public TaskExecTO call() throws Exception {
-            return test.execProvisioningTask(taskKey, maxWaitSeconds, dryRun);
+            return test.execProvisioningTask(taskService, taskKey, maxWaitSeconds, dryRun);
         }
     }
 
@@ -87,7 +91,9 @@ public abstract class AbstractTaskITCase extends AbstractITCase {
         }
     }
 
-    protected TaskExecTO execProvisioningTask(final Long taskKey, final int maxWaitSeconds, final boolean dryRun) {
+    public static TaskExecTO execProvisioningTask(
+            final TaskService taskService, final Long taskKey, final int maxWaitSeconds, final boolean dryRun) {
+
         AbstractTaskTO taskTO = taskService.read(taskKey);
         assertNotNull(taskTO);
         assertNotNull(taskTO.getExecutions());
@@ -119,14 +125,14 @@ public abstract class AbstractTaskITCase extends AbstractITCase {
         return taskTO.getExecutions().get(taskTO.getExecutions().size() - 1);
     }
 
-    protected Map<Long, TaskExecTO> execProvisioningTasks(
+    protected Map<Long, TaskExecTO> execProvisioningTasks(final TaskService taskService,
             final Set<Long> taskKeys, final int maxWaitSeconds, final boolean dryRun) throws Exception {
 
         ExecutorService service = Executors.newFixedThreadPool(taskKeys.size());
         List<Future<TaskExecTO>> futures = new ArrayList<>();
 
         for (Long key : taskKeys) {
-            futures.add(service.submit(new ThreadExec(this, key, maxWaitSeconds, dryRun)));
+            futures.add(service.submit(new ThreadExec(this, taskService, key, maxWaitSeconds, dryRun)));
         }
 
         Map<Long, TaskExecTO> res = new HashMap<>();

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java
index 583e3d9..44ebf33 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConnectorITCase.java
@@ -193,7 +193,7 @@ public class ConnectorITCase extends AbstractITCase {
         assertNotNull(actual);
         assertEquals(EnumSet.of(ConnectorCapability.ONE_PHASE_CREATE, ConnectorCapability.TWO_PHASES_CREATE),
                 actual.getCapabilities());
-        assertEquals(10, actual.getPoolConf().getMaxObjects().intValue());
+        assertEquals(10, actual.getPoolConf().getMaxObjects(), 0);
 
         // check also for the deletion of the created object
         try {
@@ -232,7 +232,7 @@ public class ConnectorITCase extends AbstractITCase {
         connectorTO.setConnRequestTimeout(20);
 
         // set the connector configuration using PropertyTO
-        Set<ConnConfProperty> conf = new HashSet<ConnConfProperty>();
+        Set<ConnConfProperty> conf = new HashSet<>();
 
         ConnConfPropSchema endpointSchema = new ConnConfPropSchema();
         endpointSchema.setName("endpoint");
@@ -685,7 +685,7 @@ public class ConnectorITCase extends AbstractITCase {
 
     @Test
     public void bulkAction() {
-        final BulkAction bulkAction = new BulkAction();
+        BulkAction bulkAction = new BulkAction();
         bulkAction.setType(BulkAction.Type.DELETE);
 
         ConnInstanceTO conn = connectorService.read(101L);
@@ -727,7 +727,6 @@ public class ConnectorITCase extends AbstractITCase {
 
     @Test
     public void issueSYNCOPE605() {
-
         ConnInstanceTO connectorInstanceTO = connectorService.read(103L);
         assertTrue(connectorInstanceTO.getCapabilities().isEmpty());
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/DomainITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/DomainITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/DomainITCase.java
new file mode 100644
index 0000000..e6b1984
--- /dev/null
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/DomainITCase.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.syncope.fit.core.reference;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.security.AccessControlException;
+import java.util.List;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
+import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.to.DomainTO;
+import org.apache.syncope.common.lib.types.CipherAlgorithm;
+import org.apache.syncope.common.lib.types.ClientExceptionType;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.JVM)
+public class DomainITCase extends AbstractITCase {
+
+    @Test
+    public void list() {
+        List<DomainTO> domains = domainService.list();
+        assertNotNull(domains);
+        assertFalse(domains.isEmpty());
+        for (DomainTO domain : domains) {
+            assertNotNull(domain);
+        }
+    }
+
+    @Test
+    public void create() {
+        DomainTO domain = new DomainTO();
+        domain.setKey("last");
+        domain.setAdminCipherAlgorithm(CipherAlgorithm.SSHA512);
+        domain.setAdminPwd("password");
+
+        try {
+            domainService.create(domain);
+            fail();
+        } catch (SyncopeClientException e) {
+            assertEquals(ClientExceptionType.NotFound, e.getType());
+        }
+    }
+
+    @Test
+    public void update() {
+        DomainTO two = domainService.read("Two");
+        assertNotNull(two);
+        DomainTO origTwo = SerializationUtils.clone(two);
+
+        try {
+            // 1. change admin pwd for domain Two
+            two.setAdminCipherAlgorithm(CipherAlgorithm.AES);
+            two.setAdminPwd("password3");
+            domainService.update(two);
+
+            // 2. attempt to access with old pwd -> fail
+            try {
+                new SyncopeClientFactoryBean().setAddress(ADDRESS).setDomain("Two").
+                        create(ADMIN_UNAME, "password2").self();
+            } catch (AccessControlException e) {
+                assertNotNull(e);
+            }
+
+            // 3. access with new pwd -> succeed
+            new SyncopeClientFactoryBean().setAddress(ADDRESS).setDomain("Two").
+                    create(ADMIN_UNAME, "password3").self();
+        } finally {
+            // restore old password
+            domainService.create(origTwo);
+        }
+    }
+
+    @Test
+    public void delete() {
+        DomainTO two = domainService.read("Two");
+        assertNotNull(two);
+
+        try {
+            domainService.delete(two.getKey());
+
+            try {
+                domainService.read(two.getKey());
+                fail();
+            } catch (SyncopeClientException e) {
+                assertEquals(ClientExceptionType.NotFound, e.getType());
+            }
+        } finally {
+            // restore old password
+            two.setAdminPwd("password2");
+            domainService.create(two);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/MultitenancyITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/MultitenancyITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/MultitenancyITCase.java
new file mode 100644
index 0000000..dda5f52
--- /dev/null
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/MultitenancyITCase.java
@@ -0,0 +1,214 @@
+/*
+ * 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.fit.core.reference;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.security.AccessControlException;
+import java.util.List;
+import javax.ws.rs.core.Response;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.lib.SyncopeClient;
+import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
+import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.lib.to.ConnInstanceTO;
+import org.apache.syncope.common.lib.to.MappingItemTO;
+import org.apache.syncope.common.lib.to.MappingTO;
+import org.apache.syncope.common.lib.to.PagedResult;
+import org.apache.syncope.common.lib.to.ProvisionTO;
+import org.apache.syncope.common.lib.to.RealmTO;
+import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.syncope.common.lib.to.SyncTaskTO;
+import org.apache.syncope.common.lib.to.TaskExecTO;
+import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.common.lib.types.IntMappingType;
+import org.apache.syncope.common.lib.types.LoggerType;
+import org.apache.syncope.common.lib.types.MappingPurpose;
+import org.apache.syncope.common.lib.types.PropagationTaskExecStatus;
+import org.apache.syncope.common.lib.types.SchemaType;
+import org.apache.syncope.common.rest.api.service.ConnectorService;
+import org.apache.syncope.common.rest.api.service.DomainService;
+import org.apache.syncope.common.rest.api.service.LoggerService;
+import org.apache.syncope.common.rest.api.service.RealmService;
+import org.apache.syncope.common.rest.api.service.ResourceService;
+import org.apache.syncope.common.rest.api.service.SchemaService;
+import org.apache.syncope.common.rest.api.service.TaskService;
+import org.apache.syncope.common.rest.api.service.UserService;
+import org.identityconnectors.framework.common.objects.ObjectClass;
+import org.junit.BeforeClass;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.JVM)
+public class MultitenancyITCase extends AbstractITCase {
+
+    @BeforeClass
+    public static void restSetup() {
+        clientFactory = new SyncopeClientFactoryBean().setAddress(ADDRESS).setDomain("Two");
+
+        String envContentType = System.getProperty(ENV_KEY_CONTENT_TYPE);
+        if (StringUtils.isNotBlank(envContentType)) {
+            clientFactory.setContentType(envContentType);
+        }
+        LOG.info("Performing IT with content type {}", clientFactory.getContentType().getMediaType());
+
+        adminClient = clientFactory.create(ADMIN_UNAME, "password2");
+    }
+
+    @Test
+    public void masterOnly() {
+        try {
+            adminClient.getService(DomainService.class).read("Two");
+            fail();
+        } catch (AccessControlException e) {
+            assertNotNull(e);
+        }
+
+        try {
+            adminClient.getService(LoggerService.class).list(LoggerType.LOG);
+            fail();
+        } catch (AccessControlException e) {
+            assertNotNull(e);
+        }
+
+        adminClient.getService(LoggerService.class).list(LoggerType.AUDIT);
+    }
+
+    @Test
+    public void readPlainSchemas() {
+        assertEquals(18, adminClient.getService(SchemaService.class).list(SchemaType.PLAIN).size());
+    }
+
+    @Test
+    public void readRealm() {
+        List<RealmTO> realms = adminClient.getService(RealmService.class).list();
+        assertEquals(1, realms.size());
+        assertEquals(SyncopeConstants.ROOT_REALM, realms.get(0).getName());
+    }
+
+    @Test
+    public void createUser() {
+        assertNull(adminClient.getService(RealmService.class).list().get(0).getPasswordPolicy());
+
+        UserTO user = new UserTO();
+        user.setRealm(SyncopeConstants.ROOT_REALM);
+        user.setUsername(getUUIDString());
+        user.setPassword("password");
+
+        Response response = adminClient.getService(UserService.class).create(user);
+        assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus());
+
+        user = response.readEntity(UserTO.class);
+        assertNotNull(user);
+    }
+
+    @Test
+    public void createResourceAndSync() {
+        // read connector
+        ConnInstanceTO conn = adminClient.getService(ConnectorService.class).read(100L);
+        assertNotNull(conn);
+        assertEquals("LDAP", conn.getDisplayName());
+
+        // prepare resource
+        ResourceTO resource = new ResourceTO();
+        resource.setKey("new-ldap-resource");
+        resource.setConnector(conn.getKey());
+
+        ProvisionTO provisionTO = new ProvisionTO();
+        provisionTO.setAnyType(AnyTypeKind.USER.name());
+        provisionTO.setObjectClass(ObjectClass.ACCOUNT_NAME);
+        resource.getProvisions().add(provisionTO);
+
+        MappingTO mapping = new MappingTO();
+        mapping.setConnObjectLink("'uid=' + username + ',ou=people,o=isp'");
+        provisionTO.setMapping(mapping);
+
+        MappingItemTO item = new MappingItemTO();
+        item.setIntAttrName("username");
+        item.setIntMappingType(IntMappingType.Username);
+        item.setExtAttrName("cn");
+        item.setPurpose(MappingPurpose.BOTH);
+        mapping.setConnObjectKeyItem(item);
+
+        item = new MappingItemTO();
+        item.setPassword(true);
+        item.setIntMappingType(IntMappingType.Password);
+        item.setExtAttrName("userPassword");
+        item.setPurpose(MappingPurpose.BOTH);
+        item.setMandatoryCondition("true");
+        mapping.add(item);
+
+        item = new MappingItemTO();
+        item.setIntMappingType(IntMappingType.UserKey);
+        item.setPurpose(MappingPurpose.BOTH);
+        item.setExtAttrName("sn");
+        item.setMandatoryCondition("true");
+        mapping.add(item);
+
+        item = new MappingItemTO();
+        item.setIntAttrName("email");
+        item.setIntMappingType(IntMappingType.UserPlainSchema);
+        item.setPurpose(MappingPurpose.BOTH);
+        item.setExtAttrName("mail");
+        mapping.add(item);
+
+        // create resource
+        Response response = adminClient.getService(ResourceService.class).create(resource);
+        assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus());
+        resource = adminClient.getService(ResourceService.class).read(resource.getKey());
+        assertNotNull(resource);
+
+        // create sync task
+        SyncTaskTO task = new SyncTaskTO();
+        task.setName("LDAP Sync Task");
+        task.setDestinationRealm("/");
+        task.setResource(resource.getKey());
+        task.setFullReconciliation(true);
+        task.setPerformCreate(true);
+
+        response = adminClient.getService(TaskService.class).create(task);
+        assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus());
+        task = adminClient.getService(TaskService.class).read(
+                Long.valueOf(StringUtils.substringAfterLast(response.getLocation().toASCIIString(), "/")));
+        assertNotNull(resource);
+
+        // synchronize
+        TaskExecTO execution = AbstractTaskITCase.execProvisioningTask(
+                adminClient.getService(TaskService.class), task.getKey(), 50, false);
+
+        // verify execution status
+        String status = execution.getStatus();
+        assertNotNull(status);
+        assertTrue(PropagationTaskExecStatus.valueOf(status).isSuccessful());
+
+        // verify that synchronized user is found
+        PagedResult<UserTO> matchingUsers = adminClient.getService(UserService.class).search(
+                SyncopeClient.getAnySearchQueryBuilder().realm(SyncopeConstants.ROOT_REALM).
+                fiql(SyncopeClient.getUserSearchConditionBuilder().is("username").equalTo("syncFromLDAP").query()).
+                build());
+        assertNotNull(matchingUsers);
+        assertEquals(1, matchingUsers.getResult().size());
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/PushTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/PushTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/PushTaskITCase.java
index ca9d8a4..dff129e 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/PushTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/PushTaskITCase.java
@@ -121,12 +121,12 @@ public class PushTaskITCase extends AbstractTaskITCase {
     public void pushMatchingUnmatchingGroups() {
         assertFalse(groupService.read(3L).getResources().contains(RESOURCE_NAME_LDAP));
 
-        execProvisioningTask(23L, 50, false);
+        execProvisioningTask(taskService, 23L, 50, false);
 
         assertNotNull(resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.GROUP.name(), 3L));
         assertTrue(groupService.read(3L).getResources().contains(RESOURCE_NAME_LDAP));
 
-        execProvisioningTask(23L, 50, false);
+        execProvisioningTask(taskService, 23L, 50, false);
 
         assertNotNull(resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.GROUP.name(), 3L));
         assertFalse(groupService.read(3L).getResources().contains(RESOURCE_NAME_LDAP));
@@ -145,7 +145,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         // ------------------------------------------
         // Unmatching --> Assign --> dryRuyn
         // ------------------------------------------
-        execProvisioningTask(13L, 50, true);
+        execProvisioningTask(taskService, 13L, 50, true);
         assertEquals(0, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='vivaldi'").size());
         assertFalse(userService.read(3L).getResources().contains(RESOURCE_NAME_TESTDB2));
         // ------------------------------------------
@@ -155,7 +155,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         pushTaskIds.add(14L);
         pushTaskIds.add(15L);
         pushTaskIds.add(16L);
-        execProvisioningTasks(pushTaskIds, 50, false);
+        execProvisioningTasks(taskService, pushTaskIds, 50, false);
 
         // ------------------------------------------
         // Unatching --> Ignore
@@ -200,7 +200,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         // ------------------------------------------
         // Matching --> Deprovision --> dryRuyn
         // ------------------------------------------
-        execProvisioningTask(19L, 50, true);
+        execProvisioningTask(taskService, 19L, 50, true);
         assertTrue(userService.read(1L).getResources().contains(RESOURCE_NAME_TESTDB2));
         assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='rossini'").size());
         // ------------------------------------------
@@ -210,7 +210,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         pushTaskKeys.add(19L);
         pushTaskKeys.add(16L);
 
-        execProvisioningTasks(pushTaskKeys, 50, false);
+        execProvisioningTasks(taskService, pushTaskKeys, 50, false);
 
         // ------------------------------------------
         // Matching --> Deprovision && Ignore
@@ -231,7 +231,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         // ------------------------------------------
         // Matching --> Link
         // ------------------------------------------
-        execProvisioningTask(20L, 50, false);
+        execProvisioningTask(taskService, 20L, 50, false);
         assertTrue(userService.read(2L).getResources().contains(RESOURCE_NAME_TESTDB2));
         assertEquals(1, jdbcTemplate.queryForList("SELECT ID FROM test2 WHERE ID='verdi'").size());
         // ------------------------------------------
@@ -240,7 +240,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         pushTaskKeys.add(21L);
         pushTaskKeys.add(22L);
 
-        execProvisioningTasks(pushTaskKeys, 50, false);
+        execProvisioningTasks(taskService, pushTaskKeys, 50, false);
 
         // ------------------------------------------
         // Matching --> Unlink && Update
@@ -325,7 +325,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
             assertNotNull(push);
 
             // execute the new task
-            TaskExecTO pushExec = execProvisioningTask(push.getKey(), 50, false);
+            TaskExecTO pushExec = execProvisioningTask(taskService, push.getKey(), 50, false);
             assertTrue(PropagationTaskExecStatus.valueOf(pushExec.getStatus()).isSuccessful());
         } finally {
             groupService.delete(groupTO.getKey());
@@ -373,7 +373,7 @@ public class PushTaskITCase extends AbstractTaskITCase {
         notification = getObject(responseNotification.getLocation(), NotificationService.class, NotificationTO.class);
         assertNotNull(notification);
 
-        execProvisioningTask(actual.getKey(), 50, false);
+        execProvisioningTask(taskService, actual.getKey(), 50, false);
 
         NotificationTaskTO taskTO = findNotificationTaskBySender("syncope648@syncope.apache.org");
         assertNotNull(taskTO);

http://git-wip-us.apache.org/repos/asf/syncope/blob/f03ffb30/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java
index 9f277fa..4313c00 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/SyncTaskITCase.java
@@ -163,7 +163,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
                     page(1).size(1).build()).getTotalCount();
             assertNotNull(usersPre);
 
-            execProvisioningTask(SYNC_TASK_ID, 50, false);
+            execProvisioningTask(taskService, SYNC_TASK_ID, 50, false);
 
             // after execution of the sync task the user data should have been synced from CSV
             // and processed by user template
@@ -234,7 +234,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
             Set<Long> otherSyncTaskKeys = new HashSet<>();
             otherSyncTaskKeys.add(25L);
             otherSyncTaskKeys.add(26L);
-            execProvisioningTasks(otherSyncTaskKeys, 50, false);
+            execProvisioningTasks(taskService, otherSyncTaskKeys, 50, false);
 
             // Matching --> UNLINK
             assertFalse(readUser("test9").getResources().contains(RESOURCE_NAME_CSV));
@@ -246,7 +246,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
 
     @Test
     public void dryRun() {
-        TaskExecTO execution = execProvisioningTask(SYNC_TASK_ID, 50, true);
+        TaskExecTO execution = execProvisioningTask(taskService, SYNC_TASK_ID, 50, true);
         assertEquals("Execution of task " + execution.getTask() + " failed with message " + execution.getMessage(),
                 "SUCCESS", execution.getStatus());
     }
@@ -254,7 +254,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
     @Test
     public void reconcileFromDB() {
         // update sync task
-        TaskExecTO execution = execProvisioningTask(7L, 50, false);
+        TaskExecTO execution = execProvisioningTask(taskService, 7L, 50, false);
         assertNotNull(execution.getStatus());
         assertTrue(PropagationTaskExecStatus.valueOf(execution.getStatus()).isSuccessful());
 
@@ -268,7 +268,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
         jdbcTemplate.execute("UPDATE TEST SET STATUS=TRUE");
 
         // re-execute the same SyncTask: now user must be active
-        execution = execProvisioningTask(7L, 50, false);
+        execution = execProvisioningTask(taskService, 7L, 50, false);
         assertNotNull(execution.getStatus());
         assertTrue(PropagationTaskExecStatus.valueOf(execution.getStatus()).isSuccessful());
 
@@ -313,14 +313,14 @@ public class SyncTaskITCase extends AbstractTaskITCase {
         ldapCleanup();
 
         // 0. synchronize
-        TaskExecTO execution = execProvisioningTask(11L, 50, false);
+        TaskExecTO execution = execProvisioningTask(taskService, 11L, 50, false);
 
         // 1. verify execution status
         String status = execution.getStatus();
         assertNotNull(status);
         assertTrue(PropagationTaskExecStatus.valueOf(status).isSuccessful());
 
-        // 2. verify that synchronized group is found, with expected attributes
+        // 2. verify that synchronized group is found
         PagedResult<GroupTO> matchingGroups = groupService.search(
                 SyncopeClient.getAnySearchQueryBuilder().realm(SyncopeConstants.ROOT_REALM).
                 fiql(SyncopeClient.getGroupSearchConditionBuilder().is("name").equalTo("testLDAPGroup").query()).
@@ -328,6 +328,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
         assertNotNull(matchingGroups);
         assertEquals(1, matchingGroups.getResult().size());
 
+        // 3. verify that synchronized user is found
         PagedResult<UserTO> matchingUsers = userService.search(
                 SyncopeClient.getAnySearchQueryBuilder().realm(SyncopeConstants.ROOT_REALM).
                 fiql(SyncopeClient.getUserSearchConditionBuilder().is("username").equalTo("syncFromLDAP").query()).
@@ -351,7 +352,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
         assertNull(groupTO.getGroupOwner());
 
         // SYNCOPE-317
-        execProvisioningTask(11L, 50, false);
+        execProvisioningTask(taskService, 11L, 50, false);
     }
 
     @Test
@@ -383,7 +384,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
         }
 
         // 3. synchronize
-        execProvisioningTask(28L, 50, false);
+        execProvisioningTask(taskService, 28L, 50, false);
 
         // 4. verify that printer was re-created in Syncope
         matchingPrinters = anyObjectService.search(
@@ -456,7 +457,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
             assertFalse(actual.getTemplates().get(AnyTypeKind.USER.name()).getResources().isEmpty());
             assertFalse(((UserTO) actual.getTemplates().get(AnyTypeKind.USER.name())).getMemberships().isEmpty());
 
-            TaskExecTO execution = execProvisioningTask(actual.getKey(), 50, false);
+            TaskExecTO execution = execProvisioningTask(taskService, actual.getKey(), 50, false);
             final String status = execution.getStatus();
             assertNotNull(status);
             assertTrue(PropagationTaskExecStatus.valueOf(status).isSuccessful());
@@ -475,7 +476,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
     @Test
     public void issueSYNCOPE230() {
         // 1. read SyncTask for resource-db-sync (table TESTSYNC on external H2)
-        execProvisioningTask(10L, 50, false);
+        execProvisioningTask(taskService, 10L, 50, false);
 
         // 3. read e-mail address for user created by the SyncTask first execution
         UserTO userTO = readUser("issuesyncope230");
@@ -488,7 +489,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
         jdbcTemplate.execute("UPDATE TESTSYNC SET email='updatedSYNCOPE230@syncope.apache.org'");
 
         // 5. re-execute the SyncTask
-        execProvisioningTask(10L, 50, false);
+        execProvisioningTask(taskService, 10L, 50, false);
 
         // 6. verify that the e-mail was updated
         userTO = readUser("issuesyncope230");
@@ -550,7 +551,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
 
         userService.update(userMod);
 
-        execProvisioningTask(actual.getKey(), 50, false);
+        execProvisioningTask(taskService, actual.getKey(), 50, false);
 
         SyncTaskTO executed = taskService.read(actual.getKey());
         assertEquals(1, executed.getExecutions().size());
@@ -574,7 +575,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
             assertEquals(1, userTO.getPropagationStatusTOs().size());
             assertTrue(userTO.getPropagationStatusTOs().get(0).getStatus().isSuccessful());
 
-            TaskExecTO taskExecTO = execProvisioningTask(24L, 50, false);
+            TaskExecTO taskExecTO = execProvisioningTask(taskService, 24L, 50, false);
 
             assertNotNull(taskExecTO.getStatus());
             assertTrue(PropagationTaskExecStatus.valueOf(taskExecTO.getStatus()).isSuccessful());
@@ -623,7 +624,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
         task.getTemplates().put(AnyTypeKind.USER.name(), template);
 
         taskService.update(task);
-        execProvisioningTask(task.getKey(), 50, false);
+        execProvisioningTask(taskService, task.getKey(), 50, false);
 
         // check for sync policy
         userTO = userService.read(userTO.getKey());
@@ -680,7 +681,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
         assertEquals(actual.getKey(), syncTask.getKey());
         assertEquals(actual.getJobDelegateClassName(), syncTask.getJobDelegateClassName());
 
-        TaskExecTO execution = execProvisioningTask(syncTask.getKey(), 50, false);
+        TaskExecTO execution = execProvisioningTask(taskService, syncTask.getKey(), 50, false);
         final String status = execution.getStatus();
         assertNotNull(status);
         assertTrue(PropagationTaskExecStatus.valueOf(status).isSuccessful());
@@ -757,7 +758,7 @@ public class SyncTaskITCase extends AbstractTaskITCase {
         assertEquals(actual.getKey(), syncTask.getKey());
         assertEquals(actual.getJobDelegateClassName(), syncTask.getJobDelegateClassName());
 
-        TaskExecTO execution = execProvisioningTask(syncTask.getKey(), 50, false);
+        TaskExecTO execution = execProvisioningTask(taskService, syncTask.getKey(), 50, false);
         String status = execution.getStatus();
         assertNotNull(status);
         assertTrue(PropagationTaskExecStatus.valueOf(status).isSuccessful());


[4/5] syncope git commit: Merge branch 'master' into SYNCOPE-652

Posted by il...@apache.org.
Merge branch 'master' into SYNCOPE-652


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

Branch: refs/heads/SYNCOPE-652
Commit: 2cb3f47fab57698aae452234c9b45ea93bbc7ee0
Parents: f098a83 ba7f1a5
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Wed Aug 12 16:05:10 2015 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Wed Aug 12 16:05:10 2015 +0200

----------------------------------------------------------------------
 .../console/pages/BulkActionModalPage.java      |   9 +-
 .../console/pages/ProvisioningModalPage.java    |  13 +-
 .../console/panels/AbstractResourceModal.java   |  78 +++++
 .../console/panels/ActionDataTablePanel.java    |  14 +-
 .../console/panels/BeanReflectionModal.java     |  36 ++
 .../console/panels/BeanReflectionPanel.java     | 339 +++++++++++++++++++
 .../client/console/panels/ConnectorModal.java   |  50 +--
 .../client/console/panels/ListViewPanel.java    | 322 ++++++++++++++++++
 .../client/console/panels/ModalContent.java     |   8 +-
 .../console/panels/ResourceMappingPanel.java    |  66 ++--
 .../client/console/panels/ResourceModal.java    |  94 +++--
 .../client/console/topology/Topology.java       | 337 ++++++++++--------
 .../client/console/topology/TopologyNode.java   |   5 +-
 .../console/topology/TopologyNodePanel.java     |  47 ++-
 .../markup/html/form/AbstractFieldPanel.java    |   2 +-
 .../wicket/markup/html/form/ActionLink.java     |  23 +-
 .../markup/html/form/ActionLinksPanel.java      | 261 +++++++++++---
 .../form/CheckBoxMultipleChoiceFieldPanel.java  |  13 +-
 .../client/console/wizards/AjaxWizard.java      | 125 +++++++
 .../console/wizards/AjaxWizardButton.java       |  66 ++++
 .../console/wizards/AjaxWizardButtonBar.java    | 111 ++++++
 .../client/console/wizards/ProvisionWizard.java | 123 +++++++
 .../META-INF/resources/css/syncopeConsole.css   | 139 ++++----
 .../resources/META-INF/resources/js/topology.js |  90 ++---
 .../console/panels/BeanReflectionModal.html     |  30 ++
 .../console/panels/BeanReflectionPanel.html     |  39 +++
 .../client/console/panels/ConnectorModal.html   |  41 +--
 .../client/console/panels/ListViewPanel.html    |  60 ++++
 .../client/console/panels/ResourceModal.html    |  14 +-
 .../console/panels/ResourceModal.properties     |   7 +
 .../console/panels/ResourceModal_it.properties  |   7 +
 .../panels/ResourceModal_pt_BR.properties       |   7 +
 .../client/console/topology/Topology.html       |  21 +-
 .../console/topology/TopologyNodePanel.html     |  59 ++--
 .../markup/html/form/ActionLinksPanel.html      |  32 +-
 .../form/CheckBoxMultipleChoiceFieldPanel.html  |   8 +-
 .../wizards/ProvisionWizard$AccountLink.html    |  23 ++
 .../wizards/ProvisionWizard$Mapping.html        |  23 ++
 .../wizards/ProvisionWizard$ObjectType.html     |  30 ++
 .../console/wizards/ProvisionWizard.properties  |  24 ++
 .../wizards/ProvisionWizard_it.properties       |  24 ++
 .../wizards/ProvisionWizard_pt_BR.properties    |  24 ++
 pom.xml                                         |   5 +-
 43 files changed, 2350 insertions(+), 499 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/2cb3f47f/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/syncope/blob/2cb3f47f/pom.xml
----------------------------------------------------------------------