]> git.argeo.org Git - gpl/argeo-slc.git/blob - plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/DistWkspBrowserPage.java
Fix distribution editor after further testing with maven produced releases
[gpl/argeo-slc.git] / plugins / org.argeo.slc.client.ui.dist / src / main / java / org / argeo / slc / client / ui / dist / editors / DistWkspBrowserPage.java
1 /*
2 * Copyright (C) 2007-2012 Argeo GmbH
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.argeo.slc.client.ui.dist.editors;
17
18 import java.util.ArrayList;
19 import java.util.HashMap;
20 import java.util.List;
21 import java.util.Map;
22
23 import javax.jcr.Node;
24 import javax.jcr.NodeIterator;
25 import javax.jcr.RepositoryException;
26 import javax.jcr.Session;
27 import javax.jcr.query.QueryManager;
28 import javax.jcr.query.QueryResult;
29 import javax.jcr.query.qom.Ordering;
30 import javax.jcr.query.qom.QueryObjectModel;
31 import javax.jcr.query.qom.QueryObjectModelFactory;
32 import javax.jcr.query.qom.Selector;
33
34 import org.argeo.eclipse.ui.utils.CommandUtils;
35 import org.argeo.jcr.JcrUtils;
36 import org.argeo.slc.SlcException;
37 import org.argeo.slc.client.ui.dist.DistConstants;
38 import org.argeo.slc.client.ui.dist.DistImages;
39 import org.argeo.slc.client.ui.dist.commands.OpenModuleEditor;
40 import org.argeo.slc.jcr.SlcNames;
41 import org.argeo.slc.jcr.SlcTypes;
42 import org.argeo.slc.repo.RepoConstants;
43 import org.eclipse.jface.viewers.ColumnLabelProvider;
44 import org.eclipse.jface.viewers.DoubleClickEvent;
45 import org.eclipse.jface.viewers.IDoubleClickListener;
46 import org.eclipse.jface.viewers.IStructuredSelection;
47 import org.eclipse.jface.viewers.ITreeContentProvider;
48 import org.eclipse.jface.viewers.TreeViewer;
49 import org.eclipse.jface.viewers.Viewer;
50 import org.eclipse.swt.SWT;
51 import org.eclipse.swt.graphics.Image;
52 import org.eclipse.swt.layout.FillLayout;
53 import org.eclipse.swt.widgets.Composite;
54 import org.eclipse.swt.widgets.Tree;
55 import org.eclipse.swt.widgets.TreeColumn;
56 import org.eclipse.ui.forms.IManagedForm;
57 import org.eclipse.ui.forms.editor.FormEditor;
58 import org.eclipse.ui.forms.editor.FormPage;
59 import org.eclipse.ui.forms.widgets.ScrolledForm;
60
61 /**
62 * Expose Maven artifacts of a given workspace as a tree. Artifacts are grouped
63 * by Maven group.
64 */
65 public class DistWkspBrowserPage extends FormPage implements DistConstants,
66 RepoConstants {
67 // private final static Log log = LogFactory
68 // .getLog(ArtifactsBrowserPage.class);
69
70 final static String PAGE_ID = "artifactsBrowserPage";
71
72 // Business object
73 private Session session;
74
75 // This page widgets
76 private TreeViewer artifactTreeViewer;
77
78 public DistWkspBrowserPage(FormEditor editor, String title, Session session) {
79 super(editor, PAGE_ID, title);
80 this.session = session;
81 }
82
83 @Override
84 protected void createFormContent(IManagedForm managedForm) {
85 try {
86 ScrolledForm form = managedForm.getForm();
87 Composite parent = form.getBody();
88 parent.setLayout(new FillLayout());
89 createMavenBrowserPart(parent);
90 getEditor().getSite().setSelectionProvider(artifactTreeViewer);
91 } catch (RepositoryException e) {
92 throw new SlcException("Cannot create artifact browser page", e);
93 }
94 }
95
96 /** Aether specific browser for the current workspace */
97 private void createMavenBrowserPart(Composite parent)
98 throws RepositoryException {
99
100 int style = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL
101 | SWT.FULL_SELECTION | SWT.BORDER;
102
103 Tree tree = new Tree(parent, style);
104 createColumn(tree, "Maven browser", SWT.LEFT, 450);
105 tree.setLinesVisible(true);
106 tree.setHeaderVisible(true);
107
108 artifactTreeViewer = new TreeViewer(tree);
109
110 artifactTreeViewer.setLabelProvider(new ColumnLabelProvider() {
111 @Override
112 public String getText(Object element) {
113 Node node = (Node) element;
114 try {
115 if (node.isNodeType(SlcTypes.SLC_GROUP_BASE))
116 return JcrUtils.get((Node) element,
117 SlcNames.SLC_GROUP_BASE_ID);
118 else if (node.isNodeType(SlcTypes.SLC_ARTIFACT_BASE))
119 return JcrUtils.get((Node) element,
120 SlcNames.SLC_ARTIFACT_ID);
121 else
122 return node.getName();
123 } catch (RepositoryException e) {
124 throw new SlcException("Cannot browse artifacts", e);
125 }
126 }
127
128 @Override
129 public Image getImage(Object element) {
130 Node node = (Node) element;
131 try {
132
133 if (node.isNodeType(SlcTypes.SLC_GROUP_BASE))
134 return DistImages.IMG_GROUP_BASE;
135 else if (node.isNodeType(SlcTypes.SLC_ARTIFACT_BASE))
136 return DistImages.IMG_ARTIFACT_BASE;
137 else if (node
138 .isNodeType(SlcTypes.SLC_ARTIFACT_VERSION_BASE))
139 return DistImages.IMG_ARTIFACT_VERSION_BASE;
140 else
141 return null;
142 } catch (RepositoryException e) {
143 throw new SlcException("Cannot get images for artifacts", e);
144 }
145 }
146 });
147
148 artifactTreeViewer.setContentProvider(new ITreeContentProvider() {
149
150 public void dispose() {
151 }
152
153 public void inputChanged(Viewer viewer, Object oldInput,
154 Object newInput) {
155 }
156
157 public Object[] getElements(Object inputElement) {
158 try {
159 List<Node> nodes = JcrUtils.nodeIteratorToList(listNodes(
160 SlcTypes.SLC_GROUP_BASE, SlcNames.SLC_NAME));
161 return nodes.toArray();
162 } catch (RepositoryException e) {
163 throw new SlcException("Cannot list children Nodes", e);
164 }
165 }
166
167 public Object[] getChildren(Object parentElement) {
168 // Only 3 levels for the time being
169 try {
170 Node pNode = (Node) parentElement;
171 if (pNode.isNodeType(SlcTypes.SLC_GROUP_BASE)) {
172 return getArtifactBase(pNode,
173 SlcTypes.SLC_ARTIFACT_BASE);
174 } else if (pNode.isNodeType(SlcTypes.SLC_ARTIFACT_BASE)) {
175 return getArtifactBase(pNode,
176 SlcTypes.SLC_ARTIFACT_VERSION_BASE);
177 }
178 return null;
179 } catch (RepositoryException e) {
180 throw new SlcException("Cannot list children Nodes", e);
181 }
182 }
183
184 // Helper to get children because current version of Jackrabbit is
185 // buggy in remote
186 private Object[] getArtifactBase(Node parent, String nodeType)
187 throws RepositoryException {
188 List<Node> nodes = new ArrayList<Node>();
189 NodeIterator ni = parent.getNodes();
190 while (ni.hasNext()) {
191 Node node = ni.nextNode();
192 if (node.isNodeType(nodeType))
193 nodes.add(node);
194 }
195 return nodes.toArray();
196 }
197
198 public Object getParent(Object element) {
199 return null;
200 }
201
202 public boolean hasChildren(Object element) {
203 try {
204 Node pNode = (Node) element;
205 if (pNode.isNodeType(SlcTypes.SLC_GROUP_BASE)
206 || pNode.isNodeType(SlcTypes.SLC_ARTIFACT_BASE)) {
207 // might return true even if there is no "valid" child
208 return pNode.hasNodes();
209 } else
210 return false;
211 } catch (RepositoryException e) {
212 throw new SlcException("Cannot check children Nodes", e);
213 }
214 }
215 });
216
217 artifactTreeViewer.addDoubleClickListener(new DoubleClickListener());
218
219 artifactTreeViewer.setInput("Initialize");
220 }
221
222 private class DoubleClickListener implements IDoubleClickListener {
223
224 public void doubleClick(DoubleClickEvent event) {
225 Object obj = ((IStructuredSelection) event.getSelection())
226 .getFirstElement();
227 if (obj instanceof Node) {
228 Node node = (Node) obj;
229 try {
230 if (node.isNodeType(SlcTypes.SLC_ARTIFACT_VERSION_BASE)) {
231 NodeIterator nit = node.getNodes();
232 while (nit.hasNext()) {
233 Node curr = nit.nextNode();
234 if (curr.isNodeType(SlcTypes.SLC_ARTIFACT)) {
235 node = curr;
236 break;
237 }
238 }
239 }
240
241 if (node.isNodeType(SlcTypes.SLC_ARTIFACT)) {
242 DistWkspEditorInput dwip = (DistWkspEditorInput) getEditorInput();
243 Map<String, String> params = new HashMap<String, String>();
244 params.put(OpenModuleEditor.PARAM_REPO_NODE_PATH,
245 dwip.getRepoNodePath());
246 params.put(OpenModuleEditor.PARAM_REPO_URI,
247 dwip.getUri());
248 params.put(OpenModuleEditor.PARAM_WORKSPACE_NAME,
249 dwip.getWorkspaceName());
250 String path = node.getPath();
251 params.put(OpenModuleEditor.PARAM_MODULE_PATH, path);
252 CommandUtils.callCommand(OpenModuleEditor.ID, params);
253 }
254 } catch (RepositoryException re) {
255 throw new SlcException("Cannot get path for node " + node
256 + " while setting parameters for "
257 + "command OpenModuleEditor", re);
258 }
259
260 }
261 }
262 }
263
264 private static TreeColumn createColumn(Tree parent, String name, int style,
265 int width) {
266 TreeColumn result = new TreeColumn(parent, style);
267 result.setText(name);
268 result.setWidth(width);
269 result.setMoveable(true);
270 result.setResizable(true);
271 return result;
272 }
273
274 private NodeIterator listNodes(String nodeType, String orderBy)
275 throws RepositoryException {
276 QueryManager queryManager = session.getWorkspace().getQueryManager();
277 QueryObjectModelFactory factory = queryManager.getQOMFactory();
278
279 final String nodeSelector = "nodes";
280 Selector source = factory.selector(nodeType, nodeSelector);
281
282 Ordering order = factory.ascending(factory.propertyValue(nodeSelector,
283 orderBy));
284 Ordering[] orderings = { order };
285
286 QueryObjectModel query = factory.createQuery(source, null, orderings,
287 null);
288
289 QueryResult result = query.execute();
290
291 return result.getNodes();
292 }
293
294
295 }