You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by md...@apache.org on 2015/08/12 16:07:16 UTC

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

Repository: syncope
Updated Branches:
  refs/heads/SYNCOPE-156 4e1dbd37f -> 474b92560


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/4] syncope git commit: [SYNCOPE-156] providing ListView table view + Provision wizard functionalities

Posted by md...@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-156
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/4] syncope git commit: [SYNCOPE-156] providing ListView table view + Provision wizard functionalities

Posted by md...@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>


[4/4] syncope git commit: Merge from master

Posted by md...@apache.org.
Merge from master


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

Branch: refs/heads/SYNCOPE-156
Commit: 474b92560a5d7449be1b7a9a3d36efb94e4f5504
Parents: 4e1dbd3 ba7f1a5
Author: Marco Di Sabatino Di Diodoro <md...@apache.org>
Authored: Wed Aug 12 16:06:48 2015 +0200
Committer: Marco Di Sabatino Di Diodoro <md...@apache.org>
Committed: Wed Aug 12 16:06:48 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   |   5 +
 .../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, 2283 insertions(+), 432 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/474b9256/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/syncope/blob/474b9256/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
----------------------------------------------------------------------