]> 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/ArtifactsBrowserPage.java
Rough protection against too long workspaces name (causes trouble with PostgreSQL)
[gpl/argeo-slc.git] / plugins / org.argeo.slc.client.ui.dist / src / main / java / org / argeo / slc / client / ui / dist / editors / ArtifactsBrowserPage.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.List;
20
21 import javax.jcr.Node;
22 import javax.jcr.NodeIterator;
23 import javax.jcr.RepositoryException;
24 import javax.jcr.Session;
25 import javax.jcr.query.QueryManager;
26 import javax.jcr.query.QueryResult;
27 import javax.jcr.query.qom.Ordering;
28 import javax.jcr.query.qom.QueryObjectModel;
29 import javax.jcr.query.qom.QueryObjectModelFactory;
30 import javax.jcr.query.qom.Selector;
31
32 import org.argeo.ArgeoException;
33 import org.argeo.jcr.JcrUtils;
34 import org.argeo.slc.SlcException;
35 import org.argeo.slc.client.ui.dist.DistConstants;
36 import org.argeo.slc.client.ui.dist.DistImages;
37 import org.argeo.slc.client.ui.dist.DistPlugin;
38 import org.argeo.slc.jcr.SlcNames;
39 import org.argeo.slc.jcr.SlcTypes;
40 import org.argeo.slc.repo.RepoConstants;
41 import org.eclipse.jface.viewers.ColumnLabelProvider;
42 import org.eclipse.jface.viewers.DoubleClickEvent;
43 import org.eclipse.jface.viewers.IDoubleClickListener;
44 import org.eclipse.jface.viewers.IStructuredSelection;
45 import org.eclipse.jface.viewers.ITreeContentProvider;
46 import org.eclipse.jface.viewers.TreeViewer;
47 import org.eclipse.jface.viewers.Viewer;
48 import org.eclipse.swt.SWT;
49 import org.eclipse.swt.graphics.Image;
50 import org.eclipse.swt.layout.FillLayout;
51 import org.eclipse.swt.widgets.Composite;
52 import org.eclipse.swt.widgets.Tree;
53 import org.eclipse.swt.widgets.TreeColumn;
54 import org.eclipse.ui.PartInitException;
55 import org.eclipse.ui.forms.IManagedForm;
56 import org.eclipse.ui.forms.editor.FormEditor;
57 import org.eclipse.ui.forms.editor.FormPage;
58 import org.eclipse.ui.forms.widgets.ScrolledForm;
59
60 /**
61 * Exposes the various group id of a distribution as a tree.
62 */
63 public class ArtifactsBrowserPage extends FormPage implements DistConstants,
64 RepoConstants {
65
66 final static String PAGE_ID = "artifactsBrowserPage";
67 // private final static Log log = LogFactory
68 // .getLog(ArtifactsBrowserPage.class);
69
70 // Business object
71 private Session session;
72
73 // This page widgets
74 private TreeViewer artifactTreeViewer;
75
76 public ArtifactsBrowserPage(FormEditor editor, String title, Session session) {
77 super(editor, PAGE_ID, title);
78 this.session = session;
79 }
80
81 @Override
82 protected void createFormContent(IManagedForm managedForm) {
83 try {
84 ScrolledForm form = managedForm.getForm();
85 Composite parent = form.getBody();
86 // Enable the different parts to fill the whole page when the tab is
87 // maximized
88 parent.setLayout(new FillLayout());
89 createExportPackageSection(parent);
90 getEditor().getSite().setSelectionProvider(artifactTreeViewer);
91 } catch (RepositoryException e) {
92 throw new SlcException("Cannot create artifact browser page", e);
93 }
94 }
95
96 private NodeIterator listNodes(String nodeType, String orderBy)
97 throws RepositoryException {
98 QueryManager queryManager = session.getWorkspace().getQueryManager();
99 QueryObjectModelFactory factory = queryManager.getQOMFactory();
100
101 final String nodeSelector = "nodes";
102 Selector source = factory.selector(nodeType, nodeSelector);
103
104 Ordering order = factory.ascending(factory.propertyValue(nodeSelector,
105 orderBy));
106 Ordering[] orderings = { order };
107
108 QueryObjectModel query = factory.createQuery(source, null, orderings,
109 null);
110
111 QueryResult result = query.execute();
112
113 return result.getNodes();
114 }
115
116 /** Export Package Section */
117 private void createExportPackageSection(Composite parent)
118 throws RepositoryException {
119
120 int style = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL
121 | SWT.FULL_SELECTION | SWT.BORDER;
122 Tree tree = new Tree(parent, style);
123 createColumn(tree, "Artifacts", SWT.LEFT, 300);
124 tree.setLinesVisible(true);
125 tree.setHeaderVisible(true);
126
127 artifactTreeViewer = new TreeViewer(tree);
128
129 artifactTreeViewer.setLabelProvider(new ColumnLabelProvider() {
130 @Override
131 public String getText(Object element) {
132 Node node = (Node) element;
133 try {
134 if (node.isNodeType(SlcTypes.SLC_GROUP_BASE))
135 return JcrUtils.get((Node) element,
136 SlcNames.SLC_GROUP_BASE_ID);
137 else if (node.isNodeType(SlcTypes.SLC_ARTIFACT_BASE))
138 return JcrUtils.get((Node) element,
139 SlcNames.SLC_ARTIFACT_ID);
140 else
141 return node.getName();
142 } catch (RepositoryException e) {
143 throw new SlcException("Cannot browse artifacts", e);
144 }
145 }
146
147 @Override
148 public Image getImage(Object element) {
149 Node node = (Node) element;
150 try {
151
152 if (node.isNodeType(SlcTypes.SLC_GROUP_BASE))
153 return DistImages.IMG_WKSP;
154 else if (node.isNodeType(SlcTypes.SLC_ARTIFACT_BASE))
155 return DistImages.IMG_ARTIFACT_BASE;
156 else if (node
157 .isNodeType(SlcTypes.SLC_ARTIFACT_VERSION_BASE))
158 return DistImages.IMG_ARTIFACT_VERSION_BASE;
159 else
160 return null;
161 } catch (RepositoryException e) {
162 throw new SlcException("Cannot get images for artifacts", e);
163 }
164 }
165 });
166
167 artifactTreeViewer.setContentProvider(new ITreeContentProvider() {
168
169 public void dispose() {
170 }
171
172 public void inputChanged(Viewer viewer, Object oldInput,
173 Object newInput) {
174 }
175
176 public Object[] getElements(Object inputElement) {
177 try {
178 List<Node> nodes = JcrUtils.nodeIteratorToList(listNodes(
179 SlcTypes.SLC_GROUP_BASE, SlcNames.SLC_NAME));
180 return nodes.toArray();
181 } catch (RepositoryException e) {
182 throw new SlcException("Cannot list children Nodes", e);
183 }
184 }
185
186 public Object[] getChildren(Object parentElement) {
187 // Only 3 levels for the time being
188 try {
189 Node pNode = (Node) parentElement;
190 if (pNode.isNodeType(SlcTypes.SLC_GROUP_BASE)) {
191 return getArtifactBase(pNode,
192 SlcTypes.SLC_ARTIFACT_BASE);
193 } else if (pNode.isNodeType(SlcTypes.SLC_ARTIFACT_BASE)) {
194 return getArtifactBase(pNode,
195 SlcTypes.SLC_ARTIFACT_VERSION_BASE);
196 }
197 return null;
198 } catch (RepositoryException e) {
199 throw new SlcException("Cannot list children Nodes", e);
200 }
201 }
202
203 // Helper to get children because current version of Jackrabbit is
204 // buggy in remote
205 private Object[] getArtifactBase(Node parent, String nodeType)
206 throws RepositoryException {
207 List<Node> nodes = new ArrayList<Node>();
208 NodeIterator ni = parent.getNodes();
209 while (ni.hasNext()) {
210 Node node = ni.nextNode();
211 if (node.isNodeType(nodeType))
212 nodes.add(node);
213 }
214 return nodes.toArray();
215 }
216
217 public Object getParent(Object element) {
218 return null;
219 }
220
221 public boolean hasChildren(Object element) {
222 try {
223 Node pNode = (Node) element;
224 if (pNode.isNodeType(SlcTypes.SLC_GROUP_BASE)
225 || pNode.isNodeType(SlcTypes.SLC_ARTIFACT_BASE)) {
226 // might return true even if there is no "valid" child
227 return pNode.hasNodes();
228 } else
229 return false;
230 } catch (RepositoryException e) {
231 throw new SlcException("Cannot check children Nodes", e);
232 }
233 }
234 });
235
236 artifactTreeViewer.addDoubleClickListener(new DoubleClickListener());
237
238 artifactTreeViewer.setInput("Initialize");
239 }
240
241 private class DoubleClickListener implements IDoubleClickListener {
242
243 public void doubleClick(DoubleClickEvent event) {
244 Object obj = ((IStructuredSelection) event.getSelection())
245 .getFirstElement();
246 try {
247 if (obj instanceof Node) {
248 Node node = (Node) obj;
249 if (node.isNodeType(SlcTypes.SLC_ARTIFACT_VERSION_BASE)) {
250 // TODO fix using QOM after jcr upgrade
251 NodeIterator ni = node.getNodes();
252 while (ni.hasNext()) {
253 Node curr = ni.nextNode();
254 if (curr.isNodeType(SlcTypes.SLC_BUNDLE_ARTIFACT)) {
255 GenericBundleEditorInput gaei = new GenericBundleEditorInput(
256 curr);
257 DistPlugin
258 .getDefault()
259 .getWorkbench()
260 .getActiveWorkbenchWindow()
261 .getActivePage()
262 .openEditor(gaei,
263 GenericBundleEditor.ID);
264 }
265 }
266 }
267 }
268 } catch (RepositoryException re) {
269 throw new ArgeoException(
270 "Repository error while getting node info", re);
271 } catch (PartInitException pie) {
272 throw new ArgeoException(
273 "Unexepected exception while opening artifact editor",
274 pie);
275 }
276 }
277 }
278
279 private static TreeColumn createColumn(Tree parent, String name, int style,
280 int width) {
281 TreeColumn result = new TreeColumn(parent, style);
282 result.setText(name);
283 result.setWidth(width);
284 result.setMoveable(true);
285 result.setResizable(true);
286 return result;
287 }
288
289 }