1 package org
.argeo
.slc
.client
.ui
.dist
.editors
;
3 import java
.util
.ArrayList
;
7 import javax
.jcr
.NodeIterator
;
8 import javax
.jcr
.Property
;
9 import javax
.jcr
.PropertyIterator
;
10 import javax
.jcr
.RepositoryException
;
11 import javax
.jcr
.Value
;
12 import javax
.jcr
.nodetype
.NodeType
;
14 import org
.apache
.commons
.logging
.Log
;
15 import org
.apache
.commons
.logging
.LogFactory
;
16 import org
.argeo
.ArgeoException
;
17 import org
.argeo
.slc
.client
.ui
.dist
.DistImages
;
18 import org
.argeo
.slc
.client
.ui
.dist
.utils
.DistUiHelpers
;
19 import org
.argeo
.slc
.client
.ui
.dist
.utils
.GenericDoubleClickListener
;
20 import org
.argeo
.slc
.jcr
.SlcNames
;
21 import org
.argeo
.slc
.jcr
.SlcTypes
;
22 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
23 import org
.eclipse
.jface
.viewers
.ITreeContentProvider
;
24 import org
.eclipse
.jface
.viewers
.TreeViewer
;
25 import org
.eclipse
.jface
.viewers
.Viewer
;
26 import org
.eclipse
.jface
.viewers
.ViewerCell
;
27 import org
.eclipse
.swt
.SWT
;
28 import org
.eclipse
.swt
.layout
.GridData
;
29 import org
.eclipse
.swt
.layout
.GridLayout
;
30 import org
.eclipse
.swt
.widgets
.Composite
;
31 import org
.eclipse
.swt
.widgets
.Text
;
32 import org
.eclipse
.swt
.widgets
.Tree
;
33 import org
.eclipse
.swt
.widgets
.TreeColumn
;
34 import org
.eclipse
.ui
.forms
.IManagedForm
;
35 import org
.eclipse
.ui
.forms
.editor
.FormEditor
;
36 import org
.eclipse
.ui
.forms
.editor
.FormPage
;
37 import org
.eclipse
.ui
.forms
.widgets
.FormToolkit
;
38 import org
.eclipse
.ui
.forms
.widgets
.ScrolledForm
;
41 * Generic editor property page. Lists all properties of current node as a
42 * complex tree. TODO: enable editing
45 public class ArtifactDetailsPage
extends FormPage
implements SlcNames
, SlcTypes
{
46 private final static Log log
= LogFactory
.getLog(ArtifactDetailsPage
.class);
48 // Main business Objects
49 private Node currentNode
;
52 private FormToolkit tk
;
53 private TreeViewer complexTree
;
54 private Text mavenSnippet
;
56 public ArtifactDetailsPage(FormEditor editor
, String title
, Node currentNode
) {
57 super(editor
, "id", title
);
58 this.currentNode
= currentNode
;
61 protected void createFormContent(IManagedForm managedForm
) {
62 tk
= managedForm
.getToolkit();
63 ScrolledForm form
= managedForm
.getForm();
64 GridLayout layout
= new GridLayout(1, false);
65 layout
.marginWidth
= 5;
66 form
.getBody().setLayout(layout
);
68 complexTree
= createComplexTree(form
.getBody());
69 createMavenSnipet(form
.getBody());
72 private TreeViewer
createComplexTree(Composite parent
) {
73 int style
= SWT
.BORDER
| SWT
.MULTI
| SWT
.FULL_SELECTION
;
74 Tree tree
= new Tree(parent
, style
);
75 GridData gd
= new GridData(GridData
.FILL_BOTH
);
76 gd
.grabExcessHorizontalSpace
= true;
77 gd
.grabExcessVerticalSpace
= true;
78 tree
.setLayoutData(gd
);
79 createColumn(tree
, "Attribute", SWT
.LEFT
, 200);
80 createColumn(tree
, "Value", SWT
.LEFT
, 200);
81 tree
.setLinesVisible(true);
82 tree
.setHeaderVisible(true);
84 TreeViewer result
= new TreeViewer(tree
);
85 result
.setContentProvider(new TreeContentProvider());
86 result
.setLabelProvider(new TreeLabelProvider());
88 result
.setInput(currentNode
);
89 result
.expandToLevel(2);
91 result
.addDoubleClickListener(new GenericDoubleClickListener(result
));
92 // result.expandAll();
96 private void createMavenSnipet(Composite parent
) {
97 mavenSnippet
= new Text(parent
, SWT
.MULTI
| SWT
.WRAP
| SWT
.BORDER
);
98 GridData gd
= new GridData(GridData
.FILL_HORIZONTAL
);
99 gd
.grabExcessHorizontalSpace
= true;
101 mavenSnippet
.setLayoutData(gd
);
102 mavenSnippet
.setText(generateXmlSnippet());
106 private String
generateXmlSnippet() {
108 StringBuffer sb
= new StringBuffer();
109 sb
.append("<dependency>\n");
110 sb
.append("\t<groupeId>");
111 sb
.append(currentNode
.getProperty(SLC_GROUP_ID
).getString());
112 sb
.append("</groupeId>\n");
113 sb
.append("\t<artifactId>");
114 sb
.append(currentNode
.getProperty(SLC_ARTIFACT_ID
).getString());
115 sb
.append("</artifactId>\n");
116 sb
.append("\t<version>");
117 sb
.append(currentNode
.getProperty(SLC_ARTIFACT_VERSION
).getString());
118 sb
.append("</version>\n");
119 sb
.append("</dependency>");
120 return sb
.toString();
121 } catch (RepositoryException re
) {
122 throw new ArgeoException(
123 "unexpected error while generating maven snippet");
127 private static TreeColumn
createColumn(Tree parent
, String name
, int style
,
129 TreeColumn result
= new TreeColumn(parent
, style
);
130 result
.setText(name
);
131 result
.setWidth(width
);
132 result
.setMoveable(true);
133 result
.setResizable(true);
137 // View specific object
138 private class ViewSpecificItems
{
140 private Object value
;
141 private boolean isFolder
;
142 private Node curNode
;
144 public ViewSpecificItems(String key
, Object value
, boolean isFolder
) {
147 this.isFolder
= isFolder
;
150 public String
getKey() {
154 public void setNode(Node node
) {
158 public Node
getNode() {
162 public Object
getValue() {
166 public boolean isFolder() {
173 private class TreeLabelProvider
extends ColumnLabelProvider
implements
176 public void update(ViewerCell cell
) {
179 int colIndex
= cell
.getColumnIndex();
180 Object element
= cell
.getElement();
181 if (element
instanceof Property
) {
182 Property prop
= (Property
) element
;
184 cell
.setText(DistUiHelpers
.getLabelJcrName(prop
186 else if (colIndex
== 1)
187 cell
.setText(DistUiHelpers
.formatValueAsString(prop
190 } else if (element
instanceof ViewSpecificItems
) {
192 cell
.setText(((ViewSpecificItems
) element
).getKey());
193 else if (colIndex
== 1)
194 cell
.setText(DistUiHelpers
195 .formatAsString(((ViewSpecificItems
) element
)
198 } else if (element
instanceof Node
) {
199 Node node
= (Node
) element
;
201 if (node
.isNodeType(NodeType
.NT_FILE
)) {
202 cell
.setImage(DistImages
.IMG_FILE
);
203 cell
.setText(node
.getName());
204 } else if (node
.isNodeType(SLC_IMPORTED_PACKAGE
))
205 cell
.setText("Import package");
206 else if (node
.isNodeType(SLC_EXPORTED_PACKAGE
))
207 cell
.setText("Export package");
209 } else if (colIndex
== 1) {
210 if (node
.isNodeType(SLC_ARTIFACT
)) {
211 StringBuffer sb
= new StringBuffer("");
212 if (node
.hasProperty(SLC_ARTIFACT_CLASSIFIER
)) {
213 sb
.append(node
.getProperty(
214 SLC_ARTIFACT_CLASSIFIER
).getString());
217 if (node
.hasProperty(SLC_ARTIFACT_EXTENSION
))
218 sb
.append(node
.getProperty(
219 SLC_ARTIFACT_EXTENSION
).getString());
220 cell
.setText(sb
.toString());
221 } else if (node
.isNodeType(SLC_IMPORTED_PACKAGE
)
222 || node
.isNodeType(SLC_EXPORTED_PACKAGE
))
223 cell
.setText(node
.getProperty(SLC_NAME
).getString());
226 } catch (RepositoryException e
) {
227 throw new ArgeoException(
228 "unexpected error while getting artifact information",
234 private class TreeContentProvider
implements ITreeContentProvider
{
235 public Object
[] getElements(Object parent
) {
236 List
<Object
> elements
= new ArrayList
<Object
>();
239 Node node
= (Node
) parent
;
240 elements
= new ArrayList
<Object
>();
243 elements
.add(node
.getProperty(SLC_GROUP_ID
));
244 elements
.add(node
.getProperty(SLC_ARTIFACT_ID
));
245 elements
.add(node
.getProperty(SLC_ARTIFACT_VERSION
));
248 // boolean gotSource = false;
249 // // TODO: implement this check
250 // elements.add(new ViewSpecificItems("Sources available",
254 NodeIterator ni
= node
.getNodes();
255 while (ni
.hasNext()) {
256 Node child
= ni
.nextNode();
257 if (child
.isNodeType(SLC_ARTIFACT
)) {
258 // we skip sha1 files for the time being.
262 } catch (RepositoryException e
) {
263 throw new ArgeoException(
264 "Unexpected exception while listing node properties", e
);
266 return elements
.toArray();
269 public Object
getParent(Object child
) {
273 public Object
[] getChildren(Object parent
) {
274 Object
[] result
= null;
276 if (parent
instanceof Property
) {
277 Property prop
= (Property
) parent
;
278 if (prop
.isMultiple()) {
279 Value
[] values
= prop
.getValues();
282 } else if (parent
instanceof Node
) {
283 Node node
= (Node
) parent
;
284 if (node
.hasNodes()) {
285 List
<Object
> elements
= new ArrayList
<Object
>();
286 PropertyIterator pi
= node
.getProperties();
287 while (pi
.hasNext()) {
288 Property curProp
= pi
.nextProperty();
289 if (!curProp
.getName().startsWith("jcr:")
290 && !curProp
.isMultiple())
291 elements
.add(curProp
);
294 NodeIterator ni
= node
.getNodes();
295 while (ni
.hasNext()) {
296 Node curNode
= ni
.nextNode();
297 if (curNode
.isNodeType(SLC_IMPORTED_PACKAGE
)
298 || curNode
.isNodeType(SLC_EXPORTED_PACKAGE
)) {
299 ViewSpecificItems vsi
= new ViewSpecificItems(
300 "Bundle dependencies", "", true);
306 return elements
.toArray();
308 } else if (parent
instanceof ViewSpecificItems
309 && ((ViewSpecificItems
) parent
).isFolder()) {
310 NodeIterator ni
= ((ViewSpecificItems
) parent
).getNode()
312 List
<Node
> elements
= new ArrayList
<Node
>();
313 while (ni
.hasNext()) {
314 Node curNode
= ni
.nextNode();
315 if (curNode
.isNodeType(SLC_IMPORTED_PACKAGE
)
316 || curNode
.isNodeType(SLC_EXPORTED_PACKAGE
)) {
317 elements
.add(curNode
);
320 return elements
.toArray();
322 } catch (RepositoryException e
) {
323 throw new ArgeoException(
324 "Unexpected error getting multiple values property.", e
);
329 public boolean hasChildren(Object parent
) {
331 if (parent
instanceof Property
332 && ((Property
) parent
).isMultiple()) {
334 } else if (parent
instanceof Node
&& ((Node
) parent
).hasNodes()
335 && ((Node
) parent
).isNodeType(SLC_BUNDLE_ARTIFACT
)) {
337 } else if (parent
instanceof ViewSpecificItems
338 && ((ViewSpecificItems
) parent
).isFolder()) {
341 } catch (RepositoryException e
) {
342 throw new ArgeoException(
343 "Unexpected exception while checking if property is multiple",
349 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
352 public void dispose() {