Author: jawi
Date: Wed Jul 19 13:07:57 2017
New Revision: 1802386

URL: http://svn.apache.org/viewvc?rev=1802386&view=rev
Log:
ACE-625 show more details in Web UI

- added extensions to show the details of artifacts (refactoring the existing
  target-info extension);
- added extensions for all associations in the various columns.


Added:
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/ArtifactInfoExtensionFactory.java
   (with props)
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/ArtifactToFeatureAssocExtensionFactory.java
   (with props)
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseAssociationExtensionFactory.java
   (with props)
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseInfoExtensionFactory.java
   (with props)
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseUIExtensionFactory.java
   (with props)
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/DistributionToFeatureAssocExtensionFactory.java
   (with props)
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/DistributionToTargetAssocExtensionFactory.java
   (with props)
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/FeatureToArtifactAssocExtensionFactory.java
   (with props)
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/FeatureToDistributionAssocExtensionFactory.java
   (with props)
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/TargetInfoExtensionFactory.java
   (with props)
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/TargetToDistributionAssocExtensionFactory.java
   (with props)
Modified:
    ace/trunk/org.apache.ace.webui.vaadin/bnd.bnd
    
ace/trunk/org.apache.ace.webui.vaadin/resources/VAADIN/themes/reindeer/styles.css
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/Activator.java
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/EditWindow.java
    
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java

Modified: ace/trunk/org.apache.ace.webui.vaadin/bnd.bnd
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/bnd.bnd?rev=1802386&r1=1802385&r2=1802386&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.webui.vaadin/bnd.bnd (original)
+++ ace/trunk/org.apache.ace.webui.vaadin/bnd.bnd Wed Jul 19 13:07:57 2017
@@ -20,6 +20,7 @@ Private-Package: \
        org.apache.ace.webui.domain,\
        org.apache.ace.webui.vaadin,\
        org.apache.ace.webui.vaadin.component,\
+       org.apache.ace.webui.vaadin.extension,\
        org.apache.ace.bnd.registry,\
        org.apache.ace.bnd.repository,\
        org.kxml2.io,\
@@ -30,7 +31,7 @@ Private-Package: \
        org.osgi.service.obr,\
        org.osgi.service.repository*,\
        org.xmlpull.v1
-       
+
 Export-Package: org.apache.ace.webui
 Include-Resource: resources/
 Bundle-Activator: org.apache.ace.webui.vaadin.Activator

Modified: 
ace/trunk/org.apache.ace.webui.vaadin/resources/VAADIN/themes/reindeer/styles.css
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/resources/VAADIN/themes/reindeer/styles.css?rev=1802386&r1=1802385&r2=1802386&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/resources/VAADIN/themes/reindeer/styles.css
 (original)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/resources/VAADIN/themes/reindeer/styles.css
 Wed Jul 19 13:07:57 2017
@@ -51,13 +51,13 @@
        padding: .2em 1em;
        color: inherit;
        font: inherit;
-       line-height: normal;            
+       line-height: normal;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
        -khtml-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
-       user-select: none;      
+       user-select: none;
        -webkit-box-sizing: border-box;
        -moz-box-sizing: border-box;
        -ms-box-sizing: border-box;
@@ -173,7 +173,7 @@
 /*
  * Checkbox styles
  * -------------------------------------- */
- 
+
  .v-checkbox {
        display: block;
  }
@@ -299,7 +299,7 @@ div.v-app-loading {
        position: relative;
 }
 /**
- * Try to handle printing somehow. Reasonable printing support 
+ * Try to handle printing somehow. Reasonable printing support
  * needs application specific planning and CSS tuning.
  */
 @media print {
@@ -421,7 +421,7 @@ div.v-app-loading {
 .v-label h5,
 .v-label h6 {
        line-height: normal;
-} 
+}
 /* Loading indicator states
  * Note: client side expects that loading indicator has a height. It depends on
  * this css property to ensure browsers have applied all required styles.
@@ -498,27 +498,27 @@ div.v-app-loading {
        overflow: auto;
 }
 .v-ios.v-webkit & .v-scrollable {
-    -webkit-overflow-scrolling: touch; 
-} 
-/* Disable native scrolling on iOS 5 due to #8792 */ 
+    -webkit-overflow-scrolling: touch;
+}
+/* Disable native scrolling on iOS 5 due to #8792 */
 .v-ios5.v-webkit & .v-scrollable {
-    -webkit-overflow-scrolling: none; 
-}    
+    -webkit-overflow-scrolling: none;
+}
 
 .v-csslayout {
        overflow: hidden;
 }
 .v-csslayout-margin-top {
-       padding-top: 12px;      
+       padding-top: 12px;
 }
 .v-csslayout-margin-bottom {
-       padding-bottom: 12px;   
+       padding-bottom: 12px;
 }
 .v-csslayout-margin-left {
-       padding-left: 12px;     
+       padding-left: 12px;
 }
 .v-csslayout-margin-right {
-       padding-right: 12px;    
+       padding-right: 12px;
 }
 
 .v-customcomponent {
@@ -554,7 +554,7 @@ div.v-app-loading {
        margin: 0;
 }
 .v-datefield-calendarpanel:focus {
-       outline:none;   
+       outline:none;
 }
 .v-datefield-calendarpanel-header td {
        text-align: center;
@@ -815,17 +815,17 @@ div.v-app-loading {
 .v-formlayout-captioncell .v-caption {
        overflow: visible;
 }
-.v-formlayout-spacing > tbody > .v-formlayout-row > .v-formlayout-captioncell, 
+.v-formlayout-spacing > tbody > .v-formlayout-row > .v-formlayout-captioncell,
 .v-formlayout-spacing > tbody > .v-formlayout-row > .v-formlayout-contentcell,
 .v-formlayout-spacing > tbody > .v-formlayout-row > .v-formlayout-errorcell {
        padding-top: 6px;
 }
-.v-formlayout-spacing > tbody > .v-formlayout-firstrow > 
.v-formlayout-captioncell, 
+.v-formlayout-spacing > tbody > .v-formlayout-firstrow > 
.v-formlayout-captioncell,
 .v-formlayout-spacing > tbody > .v-formlayout-firstrow > 
.v-formlayout-contentcell,
 .v-formlayout-spacing > tbody > .v-formlayout-firstrow > 
.v-formlayout-errorcell {
        padding-top: 0;
 }
-.v-formlayout-margin-top > tbody > .v-formlayout-firstrow > 
.v-formlayout-captioncell, 
+.v-formlayout-margin-top > tbody > .v-formlayout-firstrow > 
.v-formlayout-captioncell,
 .v-formlayout-margin-top > tbody > .v-formlayout-firstrow > 
.v-formlayout-contentcell,
 .v-formlayout-margin-top > tbody > .v-formlayout-firstrow > 
.v-formlayout-errorcell {
        padding-top: 12px;
@@ -835,12 +835,12 @@ div.v-app-loading {
 .v-formlayout-margin-bottom > tbody > .v-formlayout-lastrow > 
.v-formlayout-errorcell {
        padding-bottom: 12px;
 }
-.v-ie6 .v-formlayout-spacing .v-formlayout-row .v-formlayout-captioncell, 
+.v-ie6 .v-formlayout-spacing .v-formlayout-row .v-formlayout-captioncell,
 .v-ie6 .v-formlayout-spacing .v-formlayout-row .v-formlayout-contentcell,
 .v-ie6 .v-formlayout-spacing .v-formlayout-row .v-formlayout-errorcell {
        padding-top: 
expression(/v-formlayout-spacing/.test(this.parentNode.parentNode.parentNode.className)
 ? "6px" : "0px");
 }
-.v-ie6 .v-formlayout-margin-top .v-formlayout-row .v-formlayout-captioncell, 
+.v-ie6 .v-formlayout-margin-top .v-formlayout-row .v-formlayout-captioncell,
 .v-ie6 .v-formlayout-margin-top .v-formlayout-row .v-formlayout-contentcell,
 .v-ie6 .v-formlayout-margin-top .v-formlayout-row .v-formlayout-errorcell {
        padding-top: 
expression((/v-formlayout-firstrow/.test(this.parentNode.className) && 
/v-formlayout-margin-top/.test(this.parentNode.parentNode.parentNode.className))
 ? "12px" : 
(/v-formlayout-spacing/.test(this.parentNode.parentNode.parentNode.className) ? 
"6px" : "0px"));
@@ -852,7 +852,7 @@ div.v-app-loading {
 }
 .v-formlayout-margin-left > tbody > .v-formlayout-row > 
.v-formlayout-captioncell {
        padding-left: 12px;
-} 
+}
 .v-formlayout-margin-right > tbody > .v-formlayout-row > 
.v-formlayout-contentcell {
        padding-right: 12px;
 }
@@ -874,7 +874,7 @@ div.v-app-loading {
 }
 .v-gridlayout-margin-left {
        padding-left: 12px;
-} 
+}
 .v-gridlayout-margin-right {
        padding-right: 12px;
 }
@@ -898,7 +898,7 @@ div.v-app-loading {
 }
 
 .v-link {
-       white-space: nowrap;    
+       white-space: nowrap;
 }
 .v-link a {
        vertical-align: middle;
@@ -949,7 +949,7 @@ div.v-app-loading {
        background: #333;
        color: #fff;
 }
-.v-menubar-submenu .v-menubar-menuitem { 
+.v-menubar-submenu .v-menubar-menuitem {
        cursor: default;
        display: block;
        position: relative;
@@ -1006,7 +1006,7 @@ div.v-app-loading {
 .v-menubar-popup:focus,
 .v-menubar-popup .popupContent:focus,
 .v-menubar-popup .popupContent .v-menubar-submenu:focus{
-       outline: none;  
+       outline: none;
 }
 /* Checkboxes for checkable/checked menu items */
 /* Checked/unchecked requires combined style selected-(un)checked for IE6 */
@@ -1016,7 +1016,7 @@ div.v-app-loading {
 .v-menubar-submenu-check-column .v-menubar-menuitem-caption {
        padding-left: 18px;
 }
-.v-menubar-submenu .v-menubar-menuitem-checked .v-menubar-menuitem-caption { 
+.v-menubar-submenu .v-menubar-menuitem-checked .v-menubar-menuitem-caption {
        background: transparent url(../base/menubar/img/check.gif) no-repeat 
left;
 }
 
@@ -1027,7 +1027,7 @@ div.v-app-loading {
        overflow: hidden;
        padding: 1em;
        max-width:85%;
-       
+
 }
 .v-Notification h1,
 .v-Notification p,
@@ -1204,7 +1204,7 @@ div.v-progressindicator-indeterminate-di
 .v-select-optiongroup .v-icon {
        vertical-align: middle;
        white-space: nowrap;
-       margin: 0 2px;  
+       margin: 0 2px;
 }
 .v-ie .v-select-optiongroup .v-select-option {
        zoom: 1;
@@ -1344,7 +1344,7 @@ div.v-progressindicator-indeterminate-di
 */
 
 /*  Required field styles (disabled by default)
-   
+
 .v-filterselect-error .v-filterselect-input,
 .v-select-required .v-select-option,
 .v-select-required .v-select-select,
@@ -1438,7 +1438,7 @@ div.v-progressindicator-indeterminate-di
        filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2) 
alpha(opacity=20);
        margin-top: -2px;
        margin-left: -2px;
-}  
+}
 
 .v-slider {
        margin: 5px 0;
@@ -1450,7 +1450,7 @@ div.v-progressindicator-indeterminate-di
        background: #eee;
        border-left: 1px solid #ddd;
        border-right: 1px solid #eee;
-       
+
 }
 .v-slider-handle {
        background: #aaa;
@@ -1565,12 +1565,12 @@ div.v-progressindicator-indeterminate-di
 }
 
 /* Table theme building instructions
- * 
- * Vaadin scroll table is very complex widget with dozens of features. These 
+ *
+ * Vaadin scroll table is very complex widget with dozens of features. These
  * features set some limitations for theme builder. To keep things working, it
  * is safest to try to just override values used in default theme and comfort 
to
  * these instructions.
- * 
+ *
  * Borders in table header and in table body need to be same width
  * - specify vertical borders on .v-table-header-wrap and .v-table-body
  *
@@ -1581,7 +1581,7 @@ div.v-progressindicator-indeterminate-di
  *  - background is allowed for both elements
  *
  * Table headers:
- *  - table cells in header contain .v-table-resizer and 
+ *  - table cells in header contain .v-table-resizer and
  *       .v-table-caption-container div elements, which are both floated to 
right
  *  - to align header caption to body content resizer width + 
.v-table-caption-container
  *    padding right should be equal to content cells padding-right and 
border-right.
@@ -1644,8 +1644,8 @@ div.v-progressindicator-indeterminate-di
 .v-table-footer-cell {
        cursor: pointer;
 }
-.v-table-footer-container {    
-       float:right;    
+.v-table-footer-container {
+       float:right;
        padding-right:6px;
        overflow:hidden;
        white-space:nowrap;
@@ -1654,14 +1654,14 @@ div.v-progressindicator-indeterminate-di
        display: block;
        height: 1.2em;
        float: right;
-       background: #aaa;       
+       background: #aaa;
        cursor: e-resize;       /* Opera does not support col-resize, so use 
e-resize instead */
-       cursor: col-resize;     
+       cursor: col-resize;
        width: 1px;
        overflow: hidden;
 }
 .v-table.v-disabled .v-table-resizer {
-       cursor: default;        
+       cursor: default;
 }
 .v-table-caption-container {
        overflow: hidden;
@@ -1685,7 +1685,7 @@ div.v-progressindicator-indeterminate-di
        width: 16px;
        height: 1.2em;
        float: right;
-}              
+}
 .v-table-header-cell-asc .v-table-sort-indicator {
        background: transparent url(../base/common/img/sprites.png) no-repeat 
right 6px;
 }
@@ -1813,7 +1813,7 @@ div.v-progressindicator-indeterminate-di
 }
 /* row in column selector */
 .v-on {
-       
+
 }
 .v-off {
        color: #ddd;
@@ -2029,18 +2029,18 @@ textarea.v-textarea-readonly:focus {
 .v-textarea-error,
 .v-textfield-error,
 .v-richtextarea-error iframe.gwt-RichTextArea {
-       background: #FFE0E0;    
+       background: #FFE0E0;
 }
 */
 /* Disabled by default
 .v-textarea-required,
 .v-textfield-required,
 .v-richtextarea-required iframe.gwt-RichTextArea {
-       background: #FFE0E0;    
+       background: #FFE0E0;
 }
 */
 /* Safari focus glow fix */
-.v-sa input:focus, 
+.v-sa input:focus,
 .v-sa textarea:focus {
        outline-width: medium;
 }
@@ -2093,7 +2093,7 @@ textarea.v-textarea-readonly:focus {
 }
 .v-richtextarea .gwt-RichTextToolbar .gwt-ToggleButton img,
 .v-richtextarea .gwt-RichTextToolbar .gwt-PushButton img {
-       
+
 }
 .v-richtextarea .gwt-RichTextToolbar .gwt-ListBox {
        width: 24.5%;
@@ -2144,8 +2144,8 @@ div.v-tree-node-leaf {
 .v-tree-node-children {
        padding-left: 1em;
 }
-/* ie6compatnode is hidden from non ie6 browsers, for ie6 
- * uses weird hack to sink all events properly 
+/* ie6compatnode is hidden from non ie6 browsers, for ie6
+ * uses weird hack to sink all events properly
  */
 .v-tree-node-ie6compatnode {
        display: none;
@@ -2291,16 +2291,16 @@ div.v-tree-node-leaf {
 }
 
 .v-ie6 .v-treetable-node-closed {
-       background-image: url(../base/treetable/img/arrow-right.gif); 
-} 
+       background-image: url(../base/treetable/img/arrow-right.gif);
+}
 
 .v-treetable-node-open {
     background: url(../base/treetable/img/arrow-down.png) right top no-repeat;
 }
 
 .v-ie6 .v-treetable-node-open {
-       background-image: url(../base/treetable/img/arrow-down.gif); 
-} 
+       background-image: url(../base/treetable/img/arrow-down.gif);
+}
 
 .v-treetable .v-checkbox {
        display: inline-block;
@@ -2388,7 +2388,7 @@ div table.v-treetable-animation-clone tr
        width: 100%;
        text-align: left;
 }
-  
+
 
 .v-window {
        background: #fff;
@@ -2400,7 +2400,7 @@ div table.v-treetable-animation-clone tr
 
 .v-window-outerheader,
 .v-window-draggingCurtain {
-       cursor: move;   
+       cursor: move;
 }
 
 .v-window-header {
@@ -2481,9 +2481,9 @@ div.v-window-header {
        filter: alpha(opacity=50);
 }
 /* IE6 workaround for position:fixed; */
-.v-ie6 .v-window-modalitycurtain { 
+.v-ie6 .v-window-modalitycurtain {
        position: absolute;
-       top: expression(document.documentElement.scrollTop + "px"); 
+       top: expression(document.documentElement.scrollTop + "px");
 }
 /* min-width for IE6 */
 .v-ie6 .v-window {
@@ -2563,12 +2563,12 @@ div.v-window-header {
 /* Automatically compiled css file from subdirectories. */
 
 /*------------
- * General vertical and horizontal sprites 
+ * General vertical and horizontal sprites
  * -----------*/
 
 
 /*------------
- * Buttons 
+ * Buttons
  * -----------*/
 
 .v-accordion {
@@ -2700,20 +2700,20 @@ div.v-window-header {
   -background-image: url(button/img/black-button-sprites-ie6.png);
   background-position: left -0px;
        }
-       
+
 .black .v-button:focus .v-button-wrap {
   background-image: url(button/img/black-button-sprites.png);
   -background-image: url(button/img/black-button-sprites-ie6.png);
   background-position: right -26px;
        }
-       
+
 .black .v-button:active,
 .black .v-button.v-pressed {
   background-image: url(button/img/black-button-sprites.png);
   -background-image: url(button/img/black-button-sprites-ie6.png);
   background-position: left -52px;
        }
-       
+
 .black .v-button:active .v-button-wrap,
 .black .v-button.v-pressed .v-button-wrap {
   background-image: url(button/img/black-button-sprites.png);
@@ -2727,14 +2727,14 @@ div.v-window-header {
   -background-image: url(button/img/black-button-sprites-ie6.png);
   background-position: left -104px;
        }
-       
+
 .black .v-button-wrap,
 .black .v-disabled.v-button .v-button-wrap {
   background-image: url(button/img/black-button-sprites.png);
   -background-image: url(button/img/black-button-sprites-ie6.png);
   background-position: right -130px;
        }
-       
+
 .black .v-button-caption {
        color: #c9ccce;
        text-shadow: #121314 0 -1px 0;
@@ -2745,13 +2745,13 @@ div.v-window-header {
   -background-image: url(button/img/button-sprites-ie6.png);
   background-position: left -156px;
        }
-       
+
 .v-button-primary:focus .v-button-wrap {
   background-image: url(button/img/button-sprites.png);
   -background-image: url(button/img/button-sprites-ie6.png);
   background-position: right -182px;
        }
-       
+
 .v-button-primary:active,
 .v-button-primary.v-pressed {
   background-image: url(button/img/button-sprites.png);
@@ -2772,14 +2772,14 @@ div.v-window-header {
   -background-image: url(button/img/button-sprites-ie6.png);
   background-position: left -260px;
        }
-       
+
 .v-button-primary .v-button-wrap,
 .v-disabled.v-button-primary .v-button-wrap {
   background-image: url(button/img/button-sprites.png);
   -background-image: url(button/img/button-sprites-ie6.png);
   background-position: right -286px;
        }
-       
+
 
 
 
@@ -2791,21 +2791,21 @@ div.v-window-header {
   -background-image: url(button/img/black-button-sprites-ie6.png);
   background-position: left -156px;
        }
-       
+
 .black .v-button-primary:focus .v-button-wrap {
   background-image: url(button/img/black-button-sprites.png);
   -background-image: url(button/img/black-button-sprites-ie6.png);
   background-position: right -182px;
        color: #eaf4fb;
        }
-       
+
 .black .v-button-primary:active,
 .black .v-button-primary.v-pressed {
   background-image: url(button/img/black-button-sprites.png);
   -background-image: url(button/img/black-button-sprites-ie6.png);
   background-position: left -208px;
        }
-       
+
 .black .v-button-primary:active .v-button-wrap,
 .black .v-button-primary.v-pressed .v-button-wrap {
   background-image: url(button/img/black-button-sprites.png);
@@ -2819,7 +2819,7 @@ div.v-window-header {
   -background-image: url(button/img/black-button-sprites-ie6.png);
   background-position: left -260px;
        }
-       
+
 .black .v-button-primary .v-button-wrap,
 .black .v-disabled.v-button-primary .v-button-wrap {
   background-image: url(button/img/black-button-sprites.png);
@@ -2832,13 +2832,13 @@ div.v-window-header {
   -background-image: url(button/img/button-sprites-ie6.png);
   background-position: left -312px;
        }
-       
+
 .v-button-small:focus .v-button-wrap {
   background-image: url(button/img/button-sprites.png);
   -background-image: url(button/img/button-sprites-ie6.png);
   background-position: right -332px;
        }
-       
+
 .v-button-small:active,
 .v-button-small.v-pressed {
   background-image: url(button/img/button-sprites.png);
@@ -2860,7 +2860,7 @@ div.v-window-header {
   background-position: left -392px;
        height: 20px;
        }
-       
+
 .v-button-small .v-button-wrap,
 .v-disabled.v-button-small .v-button-wrap {
   background-image: url(button/img/button-sprites.png);
@@ -2873,7 +2873,7 @@ div.v-window-header {
 .v-button-small .v-button-caption {
        font-weight: normal;
        }
-       
+
 
 
 
@@ -2884,20 +2884,20 @@ div.v-window-header {
   -background-image: url(button/img/black-button-sprites-ie6.png);
   background-position: left -312px;
        }
-       
+
 .black .v-button-small:focus .v-button-wrap {
   background-image: url(button/img/black-button-sprites.png);
   -background-image: url(button/img/black-button-sprites-ie6.png);
   background-position: right -332px;
        }
-       
+
 .black .v-button-small:active,
 .black .v-button-small.v-pressed {
   background-image: url(button/img/black-button-sprites.png);
   -background-image: url(button/img/black-button-sprites-ie6.png);
   background-position: left -352px;
        }
-       
+
 .black .v-button-small:active .v-button-wrap,
 .black .v-button-small.v-pressed .v-button-wrap {
   background-image: url(button/img/black-button-sprites.png);
@@ -2911,7 +2911,7 @@ div.v-window-header {
   -background-image: url(button/img/black-button-sprites-ie6.png);
   background-position: left -392px;
        }
-       
+
 .black .v-button-small .v-button-wrap,
 .black .v-disabled.v-button-small .v-button-wrap {
   background-image: url(button/img/black-button-sprites.png);
@@ -2940,7 +2940,7 @@ div.v-window-header {
 .v-button.v-button-link.v-disabled .v-button-wrap {
        cursor: default;
        }
-       
+
 .v-button-link .v-button-caption,
 .v-nativebutton-link .v-nativebutton-caption {
        line-height: inherit;
@@ -2949,7 +2949,7 @@ div.v-window-header {
        font-size: 12px;
        text-shadow: none;
        }
-       
+
 .v-button-link:focus .v-button-caption,
 .v-nativebutton-link:focus .v-nativebutton-caption {
        outline: 1px dotted #1b699f;
@@ -3168,7 +3168,7 @@ div.v-window-header {
 }
 
 input.v-textfield-readonly:focus{
-       background-color: transparent;  
+       background-color: transparent;
 }
 .v-datefield-calendarpanel {
        border-collapse: collapse;
@@ -3618,12 +3618,12 @@ div.v-table-full-height-fields .v-datefi
        text-align: right;
        white-space: nowrap;
 }
-.v-formlayout-spacing > tbody > .v-formlayout-row > .v-formlayout-captioncell, 
+.v-formlayout-spacing > tbody > .v-formlayout-row > .v-formlayout-captioncell,
 .v-formlayout-spacing > tbody > .v-formlayout-row > .v-formlayout-contentcell,
 .v-formlayout-spacing > tbody > .v-formlayout-row > .v-formlayout-errorcell {
        padding-top: 8px;
 }
-.v-formlayout-margin-top > tbody > .v-formlayout-firstrow > 
.v-formlayout-captioncell, 
+.v-formlayout-margin-top > tbody > .v-formlayout-firstrow > 
.v-formlayout-captioncell,
 .v-formlayout-margin-top > tbody > .v-formlayout-firstrow > 
.v-formlayout-contentcell,
 .v-formlayout-margin-top > tbody > .v-formlayout-firstrow > 
.v-formlayout-errorcell {
        padding-top: 15px;
@@ -3633,12 +3633,12 @@ div.v-table-full-height-fields .v-datefi
 .v-formlayout-margin-bottom > tbody > .v-formlayout-lastrow > 
.v-formlayout-errorcell {
        padding-bottom: 15px;
 }
-.v-ie6 .v-formlayout-spacing .v-formlayout-row .v-formlayout-captioncell, 
+.v-ie6 .v-formlayout-spacing .v-formlayout-row .v-formlayout-captioncell,
 .v-ie6 .v-formlayout-spacing .v-formlayout-row .v-formlayout-contentcell,
 .v-ie6 .v-formlayout-spacing .v-formlayout-row .v-formlayout-errorcell {
        padding-top: 
expression(/v-formlayout-spacing/.test(this.parentNode.parentNode.parentNode.className)
 ? "8px" : "0px");
 }
-.v-ie6 .v-formlayout-margin-top .v-formlayout-row .v-formlayout-captioncell, 
+.v-ie6 .v-formlayout-margin-top .v-formlayout-row .v-formlayout-captioncell,
 .v-ie6 .v-formlayout-margin-top .v-formlayout-row .v-formlayout-contentcell,
 .v-ie6 .v-formlayout-margin-top .v-formlayout-row .v-formlayout-errorcell {
        padding-top: 
expression((/v-formlayout-firstrow/.test(this.parentNode.className) && 
/v-formlayout-margin-top/.test(this.parentNode.parentNode.parentNode.className))
 ? "15px" : 
(/v-formlayout-spacing/.test(this.parentNode.parentNode.parentNode.className) ? 
"8px" : "0px"));
@@ -3650,7 +3650,7 @@ div.v-table-full-height-fields .v-datefi
 }
 .v-formlayout-margin-left > tbody > .v-formlayout-row > 
.v-formlayout-captioncell {
        padding-left: 18px;
-} 
+}
 .v-formlayout-margin-right > tbody > .v-formlayout-row > 
.v-formlayout-contentcell {
        padding-right: 18px;
 }
@@ -3851,7 +3851,7 @@ div.v-table-full-height-fields .v-datefi
 }
 .v-gridlayout-margin-left {
        padding-left: 24px;
-} 
+}
 .v-gridlayout-margin-right {
        padding-right: 24px;
 }
@@ -3946,7 +3946,7 @@ div.v-table-full-height-fields .v-datefi
        padding: 1px 26px 1px 10px;
        line-height: 16px;
 }
-.v-menubar-submenu .v-menubar-menuitem-caption .v-icon { 
+.v-menubar-submenu .v-menubar-menuitem-caption .v-icon {
        vertical-align: middle;
 }
 .v-menubar .v-menubar-menuitem-selected,
@@ -3980,13 +3980,13 @@ div.v-table-full-height-fields .v-datefi
 .v-menubar-submenu-check-column .v-menubar-menuitem-caption {
        padding-left: 18px;
 }
-.v-menubar-submenu .v-menubar-menuitem-checked .v-menubar-menuitem-caption { 
+.v-menubar-submenu .v-menubar-menuitem-checked .v-menubar-menuitem-caption {
        background: transparent url(menubar/img/checked.png) no-repeat left;
 }
 .v-menubar-submenu .v-menubar-menuitem-unchecked .v-menubar-menuitem-caption {
        background: transparent url(menubar/img/unchecked.png) no-repeat left;
 }
-.v-menubar-submenu .v-menubar-menuitem-selected-checked 
.v-menubar-menuitem-caption { 
+.v-menubar-submenu .v-menubar-menuitem-selected-checked 
.v-menubar-menuitem-caption {
        background: transparent url(menubar/img/checked-selected.png) no-repeat 
left;
 }
 .v-menubar-submenu .v-menubar-menuitem-selected-unchecked 
.v-menubar-menuitem-caption {
@@ -4007,7 +4007,7 @@ div.v-table-full-height-fields .v-datefi
        /* Fix for #6793 */
        font-weight: bold;
 }
-       
+
 .v-Notification p {
        line-height: 1.3;
 }
@@ -4543,7 +4543,7 @@ div.v-table-full-height-fields .v-datefi
        border-left: 1px solid #adb0b1;
        border-right: none;
        border-top: 1px solid #adb0b1;
-       border-bottom: 1px solid #adb0b1;       
+       border-bottom: 1px solid #adb0b1;
 }
 .v-slider-vertical .v-slider-handle {
        width: 10px;
@@ -4657,17 +4657,17 @@ div.v-table-full-height-fields .v-datefi
 .v-ie6 .v-table-header-wrap,
 .v-ie6 .v-table-footer-wrap,
 .v-ie6 .v-table-column-selector {
-       /* The header will overflow the Table due to a bug in IE6 after changes 
in #3003. To fix this (#7314) 
-        * we need to apply position:relative to the wrappers and selector to 
make them appear on top of the 
+       /* The header will overflow the Table due to a bug in IE6 after changes 
in #3003. To fix this (#7314)
+        * we need to apply position:relative to the wrappers and selector to 
make them appear on top of the
         * header. We also need to apply it to the table root div to get rid of 
a really weird IE6 rendering bug
-        * caused by all this relativeness (see attachment in #7314).  
+        * caused by all this relativeness (see attachment in #7314).
         */
        position: relative;
 }
 
 .v-ie6 .v-table.v-disabled,
 .v-ie7 .v-table.v-disabled {
-       /* Fixes ie issue #7324 where disabled shim does not cover table body 
*/ 
+       /* Fixes ie issue #7324 where disabled shim does not cover table body */
        position: relative;
 }
 
@@ -5723,7 +5723,7 @@ textarea.v-textarea-readonly,
        padding-bottom: 0px;
 }
 .v-tree-node-focused span{
-       border: 1px dotted black;       
+       border: 1px dotted black;
 }
 .v-ie6 .v-tree-node-ie6compatnode.v-tree-node-focused{
        padding-left: 0px;
@@ -6050,3 +6050,6 @@ textarea.v-textarea-readonly,
        height: 20px;
        padding: 1px 4px 0px 0px;
 }
+.v-table-cell-content-pre .v-label {
+       white-space: pre;
+}
\ No newline at end of file

Modified: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/Activator.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/Activator.java?rev=1802386&r1=1802385&r2=1802386&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/Activator.java
 (original)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/Activator.java
 Wed Jul 19 13:07:57 2017
@@ -18,6 +18,13 @@
  */
 package org.apache.ace.webui.vaadin;
 
+import static org.apache.ace.webui.UIExtensionFactory.EXTENSION_POINT_KEY;
+import static 
org.apache.ace.webui.UIExtensionFactory.EXTENSION_POINT_VALUE_ARTIFACT;
+import static 
org.apache.ace.webui.UIExtensionFactory.EXTENSION_POINT_VALUE_DISTRIBUTION;
+import static 
org.apache.ace.webui.UIExtensionFactory.EXTENSION_POINT_VALUE_FEATURE;
+import static 
org.apache.ace.webui.UIExtensionFactory.EXTENSION_POINT_VALUE_TARGET;
+import static 
org.apache.ace.webui.vaadin.VaadinServlet.DEFAULT_SERVLET_ENDPOINT;
+import static org.osgi.framework.Constants.SERVICE_RANKING;
 import static 
org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME;
 import static 
org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH;
 import static 
org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT;
@@ -25,24 +32,25 @@ import static org.osgi.service.http.whit
 import static 
org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_RESOURCE_PREFIX;
 import static 
org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN;
 
-import java.util.Map;
 import java.util.Properties;
 
 import javax.servlet.Servlet;
 
-import org.apache.ace.client.repository.stateful.StatefulTargetObject;
 import org.apache.ace.webui.UIExtensionFactory;
+import org.apache.ace.webui.vaadin.extension.ArtifactInfoExtensionFactory;
+import 
org.apache.ace.webui.vaadin.extension.ArtifactToFeatureAssocExtensionFactory;
+import 
org.apache.ace.webui.vaadin.extension.DistributionToFeatureAssocExtensionFactory;
+import 
org.apache.ace.webui.vaadin.extension.DistributionToTargetAssocExtensionFactory;
+import 
org.apache.ace.webui.vaadin.extension.FeatureToArtifactAssocExtensionFactory;
+import 
org.apache.ace.webui.vaadin.extension.FeatureToDistributionAssocExtensionFactory;
+import org.apache.ace.webui.vaadin.extension.TargetInfoExtensionFactory;
+import 
org.apache.ace.webui.vaadin.extension.TargetToDistributionAssocExtensionFactory;
 import org.apache.felix.dm.DependencyActivatorBase;
 import org.apache.felix.dm.DependencyManager;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
 import org.osgi.service.http.context.ServletContextHelper;
 import org.osgi.service.log.LogService;
 
-import com.vaadin.ui.Component;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.VerticalLayout;
-
 public class Activator extends DependencyActivatorBase {
     private static final String PID = "org.apache.ace.webui.vaadin";
 
@@ -54,6 +62,7 @@ public class Activator extends Dependenc
         Properties contextProps = new Properties();
         contextProps.put(HTTP_WHITEBOARD_CONTEXT_NAME, 
ACE_WEBUI_WHITEBOARD_CONTEXT_NAME);
         contextProps.put(HTTP_WHITEBOARD_CONTEXT_PATH, "/");
+
         manager.add(createComponent()
             .setInterface(ServletContextHelper.class.getName(), contextProps)
             .setImplementation(AceWebuiServletContextHelper.class)
@@ -64,12 +73,13 @@ public class Activator extends Dependenc
         resourceRegistrationProps.put(HTTP_WHITEBOARD_RESOURCE_PREFIX, 
"/VAADIN");
         resourceRegistrationProps.put(HTTP_WHITEBOARD_RESOURCE_PATTERN, 
"/VAADIN/*");
         resourceRegistrationProps.put(HTTP_WHITEBOARD_CONTEXT_SELECT, 
ACE_WEBUI_WHITEBOARD_CONTEXT_SELECT_FILTER);
+
         manager.add(createComponent()
             .setInterface(Object.class.getName(), resourceRegistrationProps)
             .setImplementation(new Object()));
 
         Properties props = new Properties();
-        props.put(HTTP_WHITEBOARD_SERVLET_PATTERN, 
VaadinServlet.DEFAULT_SERVLET_ENDPOINT.concat("/*"));
+        props.put(HTTP_WHITEBOARD_SERVLET_PATTERN, 
DEFAULT_SERVLET_ENDPOINT.concat("/*"));
         props.put(HTTP_WHITEBOARD_CONTEXT_SELECT, 
ACE_WEBUI_WHITEBOARD_CONTEXT_SELECT_FILTER);
 
         // register the main application for the ACE UI client
@@ -78,29 +88,87 @@ public class Activator extends Dependenc
             .setImplementation(VaadinServlet.class)
             .add(createConfigurationDependency().setPid(PID)));
 
+        addArtifactExtensions(manager);
+        addFeatureExtensions(manager);
+        addDistributionExtensions(manager);
+        addTargetExtensions(manager);
+    }
+
+    private void addArtifactExtensions(DependencyManager manager) {
+        Properties props = new Properties();
+        props.put(EXTENSION_POINT_KEY, EXTENSION_POINT_VALUE_ARTIFACT);
+        props.put(SERVICE_RANKING, Integer.valueOf(110));
+
+        manager.add(createComponent()
+            .setInterface(UIExtensionFactory.class.getName(), props)
+            .setImplementation(ArtifactInfoExtensionFactory.class));
+
+        props = new Properties();
+        props.put(EXTENSION_POINT_KEY, EXTENSION_POINT_VALUE_ARTIFACT);
+        props.put(SERVICE_RANKING, Integer.valueOf(100));
+
+        manager.add(createComponent()
+            .setInterface(UIExtensionFactory.class.getName(), props)
+            .setImplementation(ArtifactToFeatureAssocExtensionFactory.class));
+    }
+
+    private void addFeatureExtensions(DependencyManager manager) {
+        Properties props = new Properties();
+        props.put(EXTENSION_POINT_KEY, EXTENSION_POINT_VALUE_FEATURE);
+        props.put(SERVICE_RANKING, Integer.valueOf(110));
+
+        // shows off components that are contributed by extensions
+        manager.add(createComponent()
+            .setInterface(UIExtensionFactory.class.getName(), props)
+            .setImplementation(FeatureToArtifactAssocExtensionFactory.class));
+
+        props = new Properties();
+        props.put(EXTENSION_POINT_KEY, EXTENSION_POINT_VALUE_FEATURE);
+        props.put(SERVICE_RANKING, Integer.valueOf(100));
+
+        // shows off components that are contributed by extensions
+        manager.add(createComponent()
+            .setInterface(UIExtensionFactory.class.getName(), props)
+            
.setImplementation(FeatureToDistributionAssocExtensionFactory.class));
+    }
+
+    private void addDistributionExtensions(DependencyManager manager) {
+        Properties props = new Properties();
+        props.put(EXTENSION_POINT_KEY, EXTENSION_POINT_VALUE_DISTRIBUTION);
+        props.put(SERVICE_RANKING, Integer.valueOf(110));
+
+        // shows off components that are contributed by extensions
+        manager.add(createComponent()
+            .setInterface(UIExtensionFactory.class.getName(), props)
+            
.setImplementation(DistributionToFeatureAssocExtensionFactory.class));
+
+        props = new Properties();
+        props.put(EXTENSION_POINT_KEY, EXTENSION_POINT_VALUE_DISTRIBUTION);
+        props.put(SERVICE_RANKING, Integer.valueOf(100));
+
+        // shows off components that are contributed by extensions
+        manager.add(createComponent()
+            .setInterface(UIExtensionFactory.class.getName(), props)
+            
.setImplementation(DistributionToTargetAssocExtensionFactory.class));
+    }
+
+    private void addTargetExtensions(DependencyManager manager) {
+        Properties props = new Properties();
+        props.put(EXTENSION_POINT_KEY, EXTENSION_POINT_VALUE_TARGET);
+        props.put(SERVICE_RANKING, Integer.valueOf(110));
+
+        // shows off components that are contributed by extensions
+        manager.add(createComponent()
+            .setInterface(UIExtensionFactory.class.getName(), props)
+            .setImplementation(TargetInfoExtensionFactory.class));
+
         props = new Properties();
-        props.put(UIExtensionFactory.EXTENSION_POINT_KEY, 
UIExtensionFactory.EXTENSION_POINT_VALUE_TARGET);
-        props.put(Constants.SERVICE_RANKING, Integer.valueOf(100));
+        props.put(EXTENSION_POINT_KEY, EXTENSION_POINT_VALUE_TARGET);
+        props.put(SERVICE_RANKING, Integer.valueOf(100));
 
         // shows off components that are contributed by extensions
         manager.add(createComponent()
             .setInterface(UIExtensionFactory.class.getName(), props)
-            .setImplementation(new UIExtensionFactory() {
-                public Component create(Map<String, Object> context) {
-                    VerticalLayout vl = new VerticalLayout();
-                    vl.setCaption("Info");
-                    final StatefulTargetObject target = (StatefulTargetObject) 
context.get("statefulTarget");
-                    Label info = new Label("Target ID          : " + 
target.getID() + "\n" +
-                        "Installed version  : " + 
(target.getLastInstallVersion() == null ? "(none)" : 
target.getLastInstallVersion()) + "\n" +
-                        "Available version  : " + target.getCurrentVersion() + 
"\n" +
-                        "Approval state     : " + target.getApprovalState() + 
"\n" +
-                        "Store state        : " + target.getStoreState() + 
"\n" +
-                        "Provisioning state : " + 
target.getProvisioningState() + "\n" +
-                        "Registration state : " + 
target.getRegistrationState());
-                    info.setContentMode(Label.CONTENT_PREFORMATTED);
-                    vl.addComponent(info);
-                    return vl;
-                }
-            }));
+            
.setImplementation(TargetToDistributionAssocExtensionFactory.class));
     }
 }

Modified: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/EditWindow.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/EditWindow.java?rev=1802386&r1=1802385&r2=1802386&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/EditWindow.java
 (original)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/EditWindow.java
 Wed Jul 19 13:07:57 2017
@@ -29,6 +29,7 @@ import com.vaadin.event.ShortcutAction.K
 import com.vaadin.ui.Alignment;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Component;
 import com.vaadin.ui.HorizontalLayout;
 import com.vaadin.ui.TabSheet;
 import com.vaadin.ui.TextField;
@@ -64,7 +65,7 @@ public abstract class EditWindow extends
 
     /**
      * Shows this dialog on screen.
-     * 
+     *
      * @param window the parent window to show this dialog on, cannot be 
<code>null</code>.
      */
     public void show(Window parent) {
@@ -80,7 +81,7 @@ public abstract class EditWindow extends
 
     /**
      * Called when the {@link #onOk(String, String)} method failed with an 
exception.
-     * 
+     *
      * @param e the exception to handle, never <code>null</code>.
      */
     protected abstract void handleError(Exception e);
@@ -89,7 +90,7 @@ public abstract class EditWindow extends
      * @param object
      * @param factories
      */
-    protected void initDialog(final NamedObject object, 
List<UIExtensionFactory> factories) {
+    protected void initDialog(NamedObject object, List<UIExtensionFactory> 
factories) {
         VerticalLayout fields = new VerticalLayout();
         fields.setSpacing(true);
         fields.addComponent(m_name);
@@ -101,12 +102,15 @@ public abstract class EditWindow extends
         tabs.setVisible(!factories.isEmpty());
 
         Map<String, Object> context = new HashMap<>();
-        context.put("object", object);
+        context.put("object", object.getObject());
         populateContext(context);
 
         for (UIExtensionFactory factory : factories) {
             try {
-                tabs.addTab(factory.create(context));
+                Component tabComp = factory.create(context);
+                if (tabComp != null) {
+                    tabs.addTab(tabComp);
+                }
             }
             catch (Throwable ex) {
                 // We ignore extension factories that throw exceptions
@@ -152,17 +156,17 @@ public abstract class EditWindow extends
         // The components added to the window are actually added to the 
window's
         // layout; you can use either. Alignments are set using the layout
         layout.setComponentAlignment(buttonBar, Alignment.BOTTOM_RIGHT);
-        
+
         m_name.focus();
     }
-    
+
     protected Map<String, Object> populateContext(Map<String, Object> context) 
{
         return context;
     }
 
     /**
      * Called when the user acknowledges this window by pressing Ok.
-     * 
+     *
      * @param name the value of the name field;
      * @param description the value of the description field.
      * @throws Exception in case the creation failed.

Modified: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java?rev=1802386&r1=1802385&r2=1802386&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java
 (original)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/VaadinClient.java
 Wed Jul 19 13:07:57 2017
@@ -60,7 +60,6 @@ import org.apache.ace.client.repository.
 import org.apache.ace.connectionfactory.ConnectionFactory;
 import org.apache.ace.webui.NamedObject;
 import org.apache.ace.webui.UIExtensionFactory;
-import org.apache.ace.webui.domain.NamedStatefulTargetObject;
 import org.apache.ace.webui.domain.NamedTargetObject;
 import org.apache.ace.webui.vaadin.LoginWindow.LoginFunction;
 import org.apache.ace.webui.vaadin.UploadHelper.ArtifactDropHandler;
@@ -906,10 +905,7 @@ public class VaadinClient extends com.va
                     @Override
                     protected Map<String, Object> populateContext(Map<String, 
Object> context) {
                         if (object instanceof NamedTargetObject) {
-                            context.put("statefulTarget", 
m_statefulTargetRepository.get(object.getDefinition()));
-                        }
-                        else if (object instanceof NamedStatefulTargetObject) {
-                            context.put("statefulTarget", object.getObject());
+                            context.put("object", 
m_statefulTargetRepository.get(object.getDefinition()));
                         }
                         return context;
                     }

Added: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/ArtifactInfoExtensionFactory.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/ArtifactInfoExtensionFactory.java?rev=1802386&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/ArtifactInfoExtensionFactory.java
 (added)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/ArtifactInfoExtensionFactory.java
 Wed Jul 19 13:07:57 2017
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ace.webui.vaadin.extension;
+
+import org.apache.ace.client.repository.object.ArtifactObject;
+
+import com.vaadin.ui.Table;
+
+/**
+ * Provides a UI extension for the artifact details window showing some 
details on an artifact.
+ */
+public class ArtifactInfoExtensionFactory extends 
BaseInfoExtensionFactory<ArtifactObject> {
+
+    @Override
+    protected void addTableRows(Table table, ArtifactObject artifact) {
+        addItem(table, "MIME type", artifact.getMimetype());
+        addItem(table, "Processor PID", artifact.getProcessorPID());
+        addItem(table, "Resource ID", artifact.getResourceId());
+        addItem(table, "Size", artifact.getSize());
+        addItem(table, "URL", artifact.getURL());
+    }
+}

Propchange: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/ArtifactInfoExtensionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/ArtifactToFeatureAssocExtensionFactory.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/ArtifactToFeatureAssocExtensionFactory.java?rev=1802386&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/ArtifactToFeatureAssocExtensionFactory.java
 (added)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/ArtifactToFeatureAssocExtensionFactory.java
 Wed Jul 19 13:07:57 2017
@@ -0,0 +1,41 @@
+/*
+ * 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.ace.webui.vaadin.extension;
+
+import java.util.stream.Stream;
+
+import org.apache.ace.client.repository.object.Artifact2FeatureAssociation;
+import org.apache.ace.client.repository.object.ArtifactObject;
+
+/**
+ * Provides a UI extension for the details window showing some details on all 
associations.
+ */
+public class ArtifactToFeatureAssocExtensionFactory extends 
BaseAssociationExtensionFactory<ArtifactObject, Artifact2FeatureAssociation> {
+
+    public ArtifactToFeatureAssocExtensionFactory() {
+        super("Features");
+    }
+
+    @Override
+    protected Stream<Artifact2FeatureAssociation> 
getAssocations(ArtifactObject artifact) {
+        return artifact.getFeatures().stream()
+            .flatMap(f -> artifact.getAssociationsWith(f).stream());
+    }
+
+}

Propchange: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/ArtifactToFeatureAssocExtensionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseAssociationExtensionFactory.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseAssociationExtensionFactory.java?rev=1802386&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseAssociationExtensionFactory.java
 (added)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseAssociationExtensionFactory.java
 Wed Jul 19 13:07:57 2017
@@ -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.ace.webui.vaadin.extension;
+
+import static org.apache.ace.client.repository.Association.LEFT_CARDINALITY;
+import static org.apache.ace.client.repository.Association.LEFT_ENDPOINT;
+import static org.apache.ace.client.repository.Association.RIGHT_CARDINALITY;
+import static org.apache.ace.client.repository.Association.RIGHT_ENDPOINT;
+
+import java.util.stream.Stream;
+
+import org.apache.ace.client.repository.Association;
+import org.apache.ace.client.repository.RepositoryObject;
+
+import com.vaadin.ui.Component;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Table;
+
+/**
+ * Provides a UI extension for the target details window showing some details 
on a (stateful) target.
+ */
+abstract class BaseAssociationExtensionFactory<OBJ extends RepositoryObject, 
ASSOC extends Association<?, ?>> extends BaseUIExtensionFactory<OBJ> {
+
+    protected BaseAssociationExtensionFactory(String caption) {
+        super(caption);
+    }
+
+    @Override
+    public final Component create(OBJ obj) {
+        Table table = new Table();
+        table.setEditable(false);
+        table.setWidth("100%");
+
+        table.addContainerProperty("Left endpoint", Label.class, null);
+        table.addContainerProperty("Left cardinality", Label.class, null);
+        table.addContainerProperty("Right endpoint", Label.class, null);
+        table.addContainerProperty("Right cardinality", Label.class, null);
+
+        table.setColumnExpandRatio("Left endpoint", 1.0f);
+        table.setColumnExpandRatio("Left cardinality", 0.12f);
+        table.setColumnExpandRatio("Right endpoint", 1.0f);
+        table.setColumnExpandRatio("Right cardinality", 0.12f);
+
+        getAssocations(obj)
+            .forEach(assoc -> table.addItem(new Object[] {
+                assoc.getAttribute(LEFT_ENDPOINT),
+                getCardinality(assoc.getAttribute(LEFT_CARDINALITY)),
+                assoc.getAttribute(RIGHT_ENDPOINT),
+                getCardinality(assoc.getAttribute(RIGHT_CARDINALITY)) }, 
null));
+
+        return table;
+    }
+
+    protected abstract Stream<ASSOC> getAssocations(OBJ obj);
+
+    private String getCardinality(String cardinality) {
+        if (cardinality.equals(Integer.toString(Integer.MAX_VALUE))) {
+            cardinality = "*";
+        }
+        return cardinality;
+    }
+}

Propchange: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseAssociationExtensionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseInfoExtensionFactory.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseInfoExtensionFactory.java?rev=1802386&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseInfoExtensionFactory.java
 (added)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseInfoExtensionFactory.java
 Wed Jul 19 13:07:57 2017
@@ -0,0 +1,72 @@
+/*
+ * 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.ace.webui.vaadin.extension;
+
+import org.apache.ace.client.repository.RepositoryObject;
+
+import com.vaadin.ui.Component;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Table;
+
+/**
+ * Provides a UI extension for the target details window showing some details 
on a (stateful) target.
+ */
+abstract class BaseInfoExtensionFactory<OBJ extends RepositoryObject> extends 
BaseUIExtensionFactory<OBJ> {
+
+    protected BaseInfoExtensionFactory() {
+        super("Info");
+    }
+
+    @Override
+    public final Component create(OBJ obj) {
+        Table table = new Table();
+        table.setEditable(false);
+        table.setWidth("100%");
+
+        table.addContainerProperty("Name", Label.class, null);
+        table.addContainerProperty("Value", Label.class, null);
+
+        table.setColumnExpandRatio("Name", 0.22f);
+        table.setColumnExpandRatio("Value", 1.0f);
+
+        addTableRows(table, obj);
+
+        return table;
+    }
+
+    protected final void addItem(Table table, String label, Enum<?> value) {
+        if (value != null) {
+            table.addItem(new Object[] { label, value.name() }, null);
+        }
+    }
+
+    protected final void addItem(Table table, String label, Long value) {
+        if (value != null && value.longValue() >= 0) {
+            table.addItem(new Object[] { label, value }, null);
+        }
+    }
+
+    protected final void addItem(Table table, String label, String value) {
+        if (value != null && !"".equals(value)) {
+            table.addItem(new Object[] { label, value }, null);
+        }
+    }
+
+    protected abstract void addTableRows(Table table, OBJ obj);
+}

Propchange: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseInfoExtensionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseUIExtensionFactory.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseUIExtensionFactory.java?rev=1802386&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseUIExtensionFactory.java
 (added)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseUIExtensionFactory.java
 Wed Jul 19 13:07:57 2017
@@ -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.
+ */
+package org.apache.ace.webui.vaadin.extension;
+
+import java.util.Map;
+
+import org.apache.ace.client.repository.RepositoryObject;
+import org.apache.ace.webui.UIExtensionFactory;
+
+import com.vaadin.ui.Component;
+import com.vaadin.ui.VerticalLayout;
+
+abstract class BaseUIExtensionFactory<OBJ extends RepositoryObject> implements 
UIExtensionFactory {
+    private final String m_caption;
+
+    protected BaseUIExtensionFactory(String caption) {
+        m_caption = caption;
+    }
+
+    @Override
+    public final Component create(Map<String, Object> context) {
+        VerticalLayout vl = new VerticalLayout();
+        vl.setCaption(m_caption);
+        vl.setSpacing(false);
+        vl.setSizeFull();
+
+        OBJ obj = getObjectFromContext(context);
+        if (obj == null) {
+            return null;
+        }
+
+        vl.addComponent(create(obj));
+
+        return vl;
+    }
+
+    abstract Component create(OBJ obj);
+
+    @SuppressWarnings("unchecked")
+    private OBJ getObjectFromContext(Map<String, Object> context) {
+        return (OBJ) context.get("object");
+    }
+
+}

Propchange: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/BaseUIExtensionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/DistributionToFeatureAssocExtensionFactory.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/DistributionToFeatureAssocExtensionFactory.java?rev=1802386&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/DistributionToFeatureAssocExtensionFactory.java
 (added)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/DistributionToFeatureAssocExtensionFactory.java
 Wed Jul 19 13:07:57 2017
@@ -0,0 +1,40 @@
+/*
+ * 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.ace.webui.vaadin.extension;
+
+import java.util.stream.Stream;
+
+import org.apache.ace.client.repository.object.DistributionObject;
+import org.apache.ace.client.repository.object.Feature2DistributionAssociation;
+
+/**
+ * Provides a UI extension for the details window showing some details on all 
associations.
+ */
+public class DistributionToFeatureAssocExtensionFactory extends 
BaseAssociationExtensionFactory<DistributionObject, 
Feature2DistributionAssociation> {
+
+    public DistributionToFeatureAssocExtensionFactory() {
+        super("Features");
+    }
+
+    @Override
+    protected Stream<Feature2DistributionAssociation> 
getAssocations(DistributionObject dist) {
+        return dist.getFeatures().stream()
+            .flatMap(d -> dist.getAssociationsWith(d).stream());
+    }
+}

Propchange: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/DistributionToFeatureAssocExtensionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/DistributionToTargetAssocExtensionFactory.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/DistributionToTargetAssocExtensionFactory.java?rev=1802386&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/DistributionToTargetAssocExtensionFactory.java
 (added)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/DistributionToTargetAssocExtensionFactory.java
 Wed Jul 19 13:07:57 2017
@@ -0,0 +1,40 @@
+/*
+ * 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.ace.webui.vaadin.extension;
+
+import java.util.stream.Stream;
+
+import org.apache.ace.client.repository.object.Distribution2TargetAssociation;
+import org.apache.ace.client.repository.object.DistributionObject;
+
+/**
+ * Provides a UI extension for the details window showing some details on all 
associations.
+ */
+public class DistributionToTargetAssocExtensionFactory extends 
BaseAssociationExtensionFactory<DistributionObject, 
Distribution2TargetAssociation> {
+
+    public DistributionToTargetAssocExtensionFactory() {
+        super("Targets");
+    }
+
+    @Override
+    protected Stream<Distribution2TargetAssociation> 
getAssocations(DistributionObject dist) {
+        return dist.getTargets().stream()
+            .flatMap(d -> dist.getAssociationsWith(d).stream());
+    }
+}

Propchange: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/DistributionToTargetAssocExtensionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/FeatureToArtifactAssocExtensionFactory.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/FeatureToArtifactAssocExtensionFactory.java?rev=1802386&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/FeatureToArtifactAssocExtensionFactory.java
 (added)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/FeatureToArtifactAssocExtensionFactory.java
 Wed Jul 19 13:07:57 2017
@@ -0,0 +1,40 @@
+/*
+ * 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.ace.webui.vaadin.extension;
+
+import java.util.stream.Stream;
+
+import org.apache.ace.client.repository.object.Artifact2FeatureAssociation;
+import org.apache.ace.client.repository.object.FeatureObject;
+
+/**
+ * Provides a UI extension for the details window showing some details on all 
associations.
+ */
+public class FeatureToArtifactAssocExtensionFactory extends 
BaseAssociationExtensionFactory<FeatureObject, Artifact2FeatureAssociation> {
+
+    public FeatureToArtifactAssocExtensionFactory() {
+        super("Artifacts");
+    }
+
+    @Override
+    protected Stream<Artifact2FeatureAssociation> getAssocations(FeatureObject 
feature) {
+        return feature.getArtifacts().stream()
+            .flatMap(a -> feature.getAssociationsWith(a).stream());
+    }
+}

Propchange: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/FeatureToArtifactAssocExtensionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/FeatureToDistributionAssocExtensionFactory.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/FeatureToDistributionAssocExtensionFactory.java?rev=1802386&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/FeatureToDistributionAssocExtensionFactory.java
 (added)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/FeatureToDistributionAssocExtensionFactory.java
 Wed Jul 19 13:07:57 2017
@@ -0,0 +1,40 @@
+/*
+ * 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.ace.webui.vaadin.extension;
+
+import java.util.stream.Stream;
+
+import org.apache.ace.client.repository.object.Feature2DistributionAssociation;
+import org.apache.ace.client.repository.object.FeatureObject;
+
+/**
+ * Provides a UI extension for the details window showing some details on all 
associations.
+ */
+public class FeatureToDistributionAssocExtensionFactory extends 
BaseAssociationExtensionFactory<FeatureObject, Feature2DistributionAssociation> 
{
+
+    public FeatureToDistributionAssocExtensionFactory() {
+        super("Distributions");
+    }
+
+    @Override
+    protected Stream<Feature2DistributionAssociation> 
getAssocations(FeatureObject feature) {
+        return feature.getDistributions().stream()
+            .flatMap(d -> feature.getAssociationsWith(d).stream());
+    }
+}

Propchange: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/FeatureToDistributionAssocExtensionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/TargetInfoExtensionFactory.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/TargetInfoExtensionFactory.java?rev=1802386&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/TargetInfoExtensionFactory.java
 (added)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/TargetInfoExtensionFactory.java
 Wed Jul 19 13:07:57 2017
@@ -0,0 +1,40 @@
+/*
+ * 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.ace.webui.vaadin.extension;
+
+import org.apache.ace.client.repository.stateful.StatefulTargetObject;
+
+import com.vaadin.ui.Table;
+
+/**
+ * Provides a UI extension for the target details window showing some details 
on a (stateful) target.
+ */
+public class TargetInfoExtensionFactory extends 
BaseInfoExtensionFactory<StatefulTargetObject> {
+
+    @Override
+    protected void addTableRows(Table table, StatefulTargetObject target) {
+        addItem(table, "Target ID", target.getID());
+        addItem(table, "Available version", target.getCurrentVersion());
+        addItem(table, "Installed version", (target.getLastInstallVersion() == 
null ? "(none)" : target.getLastInstallVersion()));
+        addItem(table, "Registration state", target.getRegistrationState());
+        addItem(table, "Approval state", target.getApprovalState());
+        addItem(table, "Provisioning state", target.getProvisioningState());
+        addItem(table, "Store state", target.getStoreState());
+    }
+}

Propchange: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/TargetInfoExtensionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/TargetToDistributionAssocExtensionFactory.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/TargetToDistributionAssocExtensionFactory.java?rev=1802386&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/TargetToDistributionAssocExtensionFactory.java
 (added)
+++ 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/TargetToDistributionAssocExtensionFactory.java
 Wed Jul 19 13:07:57 2017
@@ -0,0 +1,40 @@
+/*
+ * 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.ace.webui.vaadin.extension;
+
+import java.util.stream.Stream;
+
+import org.apache.ace.client.repository.object.Distribution2TargetAssociation;
+import org.apache.ace.client.repository.stateful.StatefulTargetObject;
+
+/**
+ * Provides a UI extension for the details window showing some details on all 
associations.
+ */
+public class TargetToDistributionAssocExtensionFactory extends 
BaseAssociationExtensionFactory<StatefulTargetObject, 
Distribution2TargetAssociation> {
+
+    public TargetToDistributionAssocExtensionFactory() {
+        super("Distributions");
+    }
+
+    @Override
+    protected Stream<Distribution2TargetAssociation> 
getAssocations(StatefulTargetObject target) {
+        return target.getDistributions().stream()
+            .flatMap(d -> target.getAssociationsWith(d).stream());
+    }
+}

Propchange: 
ace/trunk/org.apache.ace.webui.vaadin/src/org/apache/ace/webui/vaadin/extension/TargetToDistributionAssocExtensionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to