X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=plugins%2Forg.argeo.slc.client.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fviews%2FJcrResultTreeView.java;h=8fcea20aa0ecb23def8c1ffcc2270c2c468f18e2;hb=22bac4f4b709262422f39b3a85d3bab4aa3b5a48;hp=9d5bb8cd97a87b09e4f016e8a87bed5528a0b73b;hpb=d38faac41402e2cb5a727ccb327f7f5d9c6f81f2;p=gpl%2Fargeo-slc.git diff --git a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultTreeView.java b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultTreeView.java index 9d5bb8cd9..8fcea20aa 100644 --- a/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultTreeView.java +++ b/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrResultTreeView.java @@ -1,5 +1,22 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.argeo.slc.client.ui.views; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.List; @@ -7,23 +24,17 @@ import java.util.List; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Property; -import javax.jcr.PropertyIterator; -import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Session; -import javax.jcr.Value; import javax.jcr.nodetype.NodeType; import javax.jcr.observation.Event; import javax.jcr.observation.EventListener; import javax.jcr.observation.ObservationManager; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.argeo.ArgeoException; import org.argeo.eclipse.ui.jcr.AsyncUiEventListener; import org.argeo.eclipse.ui.utils.CommandUtils; import org.argeo.jcr.JcrUtils; -import org.argeo.jcr.UserJcrUtils; import org.argeo.slc.SlcException; import org.argeo.slc.client.ui.ClientUiPlugin; import org.argeo.slc.client.ui.SlcUiConstants; @@ -34,6 +45,8 @@ import org.argeo.slc.client.ui.editors.ProcessEditor; import org.argeo.slc.client.ui.editors.ProcessEditorInput; import org.argeo.slc.client.ui.model.ParentNodeFolder; import org.argeo.slc.client.ui.model.ResultFolder; +import org.argeo.slc.client.ui.model.ResultItemsComparator; +import org.argeo.slc.client.ui.model.ResultItemsComparer; import org.argeo.slc.client.ui.model.ResultParent; import org.argeo.slc.client.ui.model.ResultParentUtils; import org.argeo.slc.client.ui.model.SingleResultNode; @@ -87,7 +100,11 @@ import org.eclipse.ui.part.ViewPart; public class JcrResultTreeView extends ViewPart { public final static String ID = ClientUiPlugin.ID + ".jcrResultTreeView"; - private final static Log log = LogFactory.getLog(JcrResultTreeView.class); + private final static DateFormat dateFormat = new SimpleDateFormat( + SlcUiConstants.DEFAULT_DISPLAY_DATE_TIME_FORMAT); + + // private final static Log log = + // LogFactory.getLog(JcrResultTreeView.class); /* DEPENDENCY INJECTION */ private Session session; @@ -96,15 +113,20 @@ public class JcrResultTreeView extends ViewPart { private TreeViewer resultTreeViewer; private TableViewer propertiesViewer; - private EventListener resultsObserver = null; + private EventListener myResultsObserver = null; + private EventListener allResultsObserver = null; - private final static String[] observedNodeTypes = { + // under My Results + private final static String[] observedNodeTypesUnderMyResult = { SlcTypes.SLC_TEST_RESULT, SlcTypes.SLC_RESULT_FOLDER, - NodeType.NT_UNSTRUCTURED }; + SlcTypes.SLC_MY_RESULT_ROOT_FOLDER }; + + private final static String[] observedNodeTypesUnderAllResults = { + SlcTypes.SLC_TEST_RESULT, NodeType.NT_UNSTRUCTURED }; // FIXME cache to ease D&D private boolean isActionUnderMyResult = false; - private ResultParent lastSelectedTargetElement; + // private ResultParent lastSelectedTargetElement; private ResultParent lastSelectedSourceElement; private ResultParent lastSelectedSourceElementParent; private boolean isResultFolder = false; @@ -141,22 +163,44 @@ public class JcrResultTreeView extends ViewPart { sashForm.setWeights(getWeights()); - resultTreeViewer.setInput(initializeResultTree()); + setOrderedInput(resultTreeViewer); + // Initialize observer try { ObservationManager observationManager = session.getWorkspace() .getObservationManager(); - resultsObserver = new ResultObserver(resultTreeViewer.getTree() - .getDisplay()); - observationManager.addEventListener(resultsObserver, - Event.NODE_MOVED | Event.NODE_ADDED | Event.NODE_REMOVED, - UserJcrUtils.getUserHome(session).getPath(), true, null, - observedNodeTypes, false); + myResultsObserver = new MyResultsObserver(resultTreeViewer + .getTree().getDisplay()); + allResultsObserver = new AllResultsObserver(resultTreeViewer + .getTree().getDisplay()); + + // observe tree changes under MyResults + observationManager.addEventListener(myResultsObserver, + Event.NODE_ADDED | Event.NODE_REMOVED, + SlcJcrResultUtils.getMyResultsBasePath(session), true, + null, observedNodeTypesUnderMyResult, false); + // observe tree changes under All results + observationManager.addEventListener(allResultsObserver, + Event.NODE_ADDED | Event.NODE_REMOVED, + SlcJcrResultUtils.getSlcResultsBasePath(session), true, + null, observedNodeTypesUnderAllResults, false); } catch (RepositoryException e) { throw new SlcException("Cannot register listeners", e); } } + /** + * Override default behaviour so that default defined order remains + * unchanged on first level of the tree + */ + private void setOrderedInput(TreeViewer viewer) { + // Add specific ordering + resultTreeViewer.setInput(null); + viewer.setComparator(null); + resultTreeViewer.setInput(initializeResultTree()); + viewer.setComparator(new ResultItemsComparator()); + } + // The main tree viewer protected TreeViewer createResultsTreeViewer(Composite parent) { int style = SWT.BORDER | SWT.MULTI; @@ -175,6 +219,12 @@ public class JcrResultTreeView extends ViewPart { decorator)); viewer.addDoubleClickListener(new ViewDoubleClickListener()); + // Override default behaviour to insure that 2 distincts results that + // have the same name will be correctly and distincly returned by + // corresponding + // TreeViewer.getSelection() method. + viewer.setComparer(new ResultItemsComparer()); + // viewer.setLabelProvider(rtLblProvider); getSite().setSelectionProvider(viewer); @@ -211,11 +261,23 @@ public class JcrResultTreeView extends ViewPart { TableViewerColumn col = new TableViewerColumn(propertiesViewer, SWT.NONE); col.getColumn().setText("Name"); - col.getColumn().setWidth(200); + col.getColumn().setWidth(100); col.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { try { - return ((Property) element).getName(); + String name = ((Property) element).getName(); + String value = null; + if (SlcNames.SLC_TEST_CASE.equals(name)) + value = "Test case"; + else if (SlcNames.SLC_COMPLETED.equals(name)) + value = "Completed on"; + else if (SlcNames.SLC_SUCCESS.equals(name)) + value = "Status"; + else if (SlcNames.SLC_MESSAGE.equals(name)) + value = "Message"; + else if (SlcNames.SLC_ERROR_MESSAGE.equals(name)) + value = "Error"; + return value; } catch (RepositoryException e) { throw new ArgeoException( "Unexpected exception in label provider", e); @@ -224,39 +286,33 @@ public class JcrResultTreeView extends ViewPart { }); col = new TableViewerColumn(propertiesViewer, SWT.NONE); col.getColumn().setText("Value"); - col.getColumn().setWidth(400); + col.getColumn().setWidth(200); col.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { try { Property property = (Property) element; - if (property.getType() == PropertyType.BINARY) - return ""; - else if (property.isMultiple()) { - StringBuffer buf = new StringBuffer("["); - Value[] values = property.getValues(); - for (int i = 0; i < values.length; i++) { - if (i != 0) - buf.append(", "); - buf.append(values[i].getString()); + String name = property.getName(); + String value = null; + + if (SlcNames.SLC_TEST_CASE.equals(name) + || SlcNames.SLC_ERROR_MESSAGE.equals(name) + || SlcNames.SLC_MESSAGE.equals(name)) + value = property.getValue().getString(); + else if (SlcNames.SLC_COMPLETED.equals(name)) { + Calendar date = property.getValue().getDate(); + value = dateFormat.format(date.getTime()); + } else if (SlcNames.SLC_SUCCESS.equals(name)) { + if (property.getValue().getBoolean()) + value = "SUCCESS"; + else { + if (property.getParent().hasNode( + SlcNames.SLC_ERROR_MESSAGE)) + value = "ERROR"; + else + value = "FAILED"; } - buf.append(']'); - return buf.toString(); - } else - return property.getValue().getString(); - } catch (RepositoryException e) { - throw new ArgeoException( - "Unexpected exception in label provider", e); - } - } - }); - col = new TableViewerColumn(propertiesViewer, SWT.NONE); - col.getColumn().setText("Type"); - col.getColumn().setWidth(200); - col.setLabelProvider(new ColumnLabelProvider() { - public String getText(Object element) { - try { - return PropertyType.nameFromValue(((Property) element) - .getType()); + } + return value; } catch (RepositoryException e) { throw new ArgeoException( "Unexpected exception in label provider", e); @@ -306,11 +362,13 @@ public class JcrResultTreeView extends ViewPart { * */ public void refresh(ResultParent resultParent) { - // if (log.isDebugEnabled()) - // log.debug("Refreshing '" + resultParent + "'..."); - // Thread.dumpStack(); if (resultParent == null) { - resultTreeViewer.setInput(initializeResultTree()); + if (!resultTreeViewer.getTree().isDisposed()) { + TreePath[] tps = resultTreeViewer.getExpandedTreePaths(); + setOrderedInput(resultTreeViewer); + resultTreeViewer.setExpandedTreePaths(tps); + } else + setOrderedInput(resultTreeViewer); } else { if (resultParent instanceof ParentNodeFolder) { ParentNodeFolder currFolder = (ParentNodeFolder) resultParent; @@ -318,10 +376,8 @@ public class JcrResultTreeView extends ViewPart { currFolder.forceFullRefresh(); } // FIXME: specific refresh does not work - // resultTreeViewer.refresh(currFolder, true); - TreePath[] tps = resultTreeViewer.getExpandedTreePaths(); - resultTreeViewer.setInput(initializeResultTree()); - resultTreeViewer.setExpandedTreePaths(tps); + // resultTreeViewer.refresh(resultParent, true); + refresh(null); } } @@ -343,9 +399,6 @@ public class JcrResultTreeView extends ViewPart { .getProperty(SlcNames.SLC_SUCCESS).getBoolean(); } else if (node.isNodeType(SlcTypes.SLC_RESULT_FOLDER)) { NodeIterator ni = node.getNodes(); - // quicker but wrong : refresh will stop as soon as a failed - // test is found and the whole tree won't be refreshed - // while (isPassed && ni.hasNext()){ while (ni.hasNext()) { Node currChild = ni.nextNode(); isPassed = isPassed & jcrRefresh(currChild); @@ -573,7 +626,9 @@ public class JcrResultTreeView extends ViewPart { if (isResultFolder) { source = ((ParentNodeFolder) lastSelectedSourceElement) .getNode(); - if (tpNode.getPath().startsWith(source.getPath())) + if (tpNode.getPath().startsWith(source.getPath()) + || source.getParent().getPath() + .equals(tpNode.getPath())) doit = false; } else if (lastSelectedSourceElement instanceof SingleResultNode) { source = ((SingleResultNode) lastSelectedSourceElement) @@ -586,7 +641,7 @@ public class JcrResultTreeView extends ViewPart { if (doit) { targetParentNode = tpNode; validDrop = true; - lastSelectedTargetElement = (ResultParent) target; + // lastSelectedTargetElement = (ResultParent) target; } } } catch (RepositoryException re) { @@ -603,7 +658,6 @@ public class JcrResultTreeView extends ViewPart { try { Node source = session.getNodeByIdentifier((String) data); - // Check is a node with same name already exists at destination String name; if (source.hasProperty(Property.JCR_TITLE)) name = source.getProperty(Property.JCR_TITLE).getString(); @@ -613,7 +667,11 @@ public class JcrResultTreeView extends ViewPart { else name = source.getName(); - if (targetParentNode.hasNode(name)) { + // Check if a user defined folder result with same name exists + // at target + if (targetParentNode.hasNode(name) + && targetParentNode.getNode(name).isNodeType( + SlcTypes.SLC_RESULT_FOLDER)) { ConfirmOverwriteWizard wizard = new ConfirmOverwriteWizard( name, targetParentNode); WizardDialog dialog = new WizardDialog(Display.getDefault() @@ -630,8 +688,10 @@ public class JcrResultTreeView extends ViewPart { } Node target; + boolean passedStatus = source.getNode(SlcNames.SLC_STATUS) + .getProperty(SlcNames.SLC_SUCCESS).getBoolean(); if (!isActionUnderMyResult) {// Copy - target = targetParentNode.addNode(name, source + target = targetParentNode.addNode(source.getName(), source .getPrimaryNodeType().getName()); JcrUtils.copy(source, target); } else {// move @@ -639,16 +699,18 @@ public class JcrResultTreeView extends ViewPart { String destPath = targetParentNode.getPath() + "/" + name; session.move(sourcePath, destPath); // session.save(); + // Update passed status of the parent source Node + ResultParentUtils.updatePassedStatus( + session.getNode(JcrUtils.parentPath(sourcePath)), + true); target = session.getNode(destPath); + } if (!target.isNodeType(NodeType.MIX_TITLE)) target.addMixin(NodeType.MIX_TITLE); target.setProperty(Property.JCR_TITLE, name); - ResultParentUtils - .updatePassedStatus(target, - target.getNode(SlcNames.SLC_STATUS) - .getProperty(SlcNames.SLC_SUCCESS) - .getBoolean()); + ResultParentUtils.updatePassedStatus(target.getParent(), + passedStatus); session.save(); } catch (RepositoryException re) { throw new SlcException( @@ -658,9 +720,9 @@ public class JcrResultTreeView extends ViewPart { } } - class ResultObserver extends AsyncUiEventListener { + class MyResultsObserver extends AsyncUiEventListener { - public ResultObserver(Display display) { + public MyResultsObserver(Display display) { super(display); } @@ -673,43 +735,42 @@ public class JcrResultTreeView extends ViewPart { protected void onEventInUiThread(List events) throws RepositoryException { - refresh(lastSelectedSourceElementParent); + List nodesToRefresh = new ArrayList(); + + for (Event event : events) { + String parPath = JcrUtils.parentPath(event.getPath()); + if (session.nodeExists(parPath)) { + Node node = session.getNode(parPath); + if (!nodesToRefresh.contains(node)) { + nodesToRefresh.add(node); + } + } + } - // boolean wasRemoved = false; - // boolean wasAdded = false; - // - // for (Event event : events) { - // // if (log.isDebugEnabled()) - // // log.debug("Received event " + event); - // int eventType = event.getType(); - // if (eventType == Event.NODE_REMOVED) { - // String path = event.getPath(); - // String parPath = JcrUtils.parentPath(path); - // if (session.nodeExists(parPath)) { - // Node currNode = session.getNode(parPath); - // if (currNode.isNodeType(NodeType.NT_UNSTRUCTURED)) { - // // jcrRefresh(currNode); - // wasRemoved = true; - // } - // } - // } else if (eventType == Event.NODE_ADDED) { - // // refresh(lastSelectedTargetElement); - // String path = event.getPath(); - // if (session.nodeExists(path)) { - // Node currNode = session.getNode(path); - // if (currNode.isNodeType(SlcTypes.SLC_TEST_RESULT) - // || currNode - // .isNodeType(SlcTypes.SLC_RESULT_FOLDER)) { - // // refresh(lastSelectedTargetElement); - // wasAdded = true; - // // resultTreeViewer.expandToLevel( - // // lastSelectedTargetElement, 1); - // } - // } - // } - // } - // if (wasRemoved || wasAdded) - // refresh(lastSelectedSourceElementParent); + // Update check nodes + for (Node node : nodesToRefresh) + jcrRefresh(node); + refresh(null); + } + } + + class AllResultsObserver extends AsyncUiEventListener { + + public AllResultsObserver(Display display) { + super(display); + } + + @Override + protected Boolean willProcessInUiThread(List events) + throws RepositoryException { + // unfiltered for the time being + return true; + } + + protected void onEventInUiThread(List events) + throws RepositoryException { + if (lastSelectedSourceElementParent != null) + refresh(lastSelectedSourceElementParent); } } @@ -724,14 +785,28 @@ public class JcrResultTreeView extends ViewPart { public Object[] getElements(Object inputElement) { try { if (inputElement instanceof Node) { - List props = new ArrayList(); - PropertyIterator pit = ((Node) inputElement) - .getProperties(); - while (pit.hasNext()) - props.add(pit.nextProperty()); - return props.toArray(); + Node node = (Node) inputElement; + if (node.isNodeType(SlcTypes.SLC_TEST_RESULT)) { + List props = new ArrayList(); + if (node.hasProperty(SlcNames.SLC_TEST_CASE)) + props.add(node.getProperty(SlcNames.SLC_TEST_CASE)); + if (node.hasProperty(SlcNames.SLC_COMPLETED)) + props.add(node.getProperty(SlcNames.SLC_COMPLETED)); + if (node.hasNode(SlcNames.SLC_STATUS)) { + Node status = node.getNode(SlcNames.SLC_STATUS); + props.add(status.getProperty(SlcNames.SLC_SUCCESS)); + if (status.hasProperty(SlcNames.SLC_MESSAGE)) + props.add(status + .getProperty(SlcNames.SLC_MESSAGE)); + if (status.hasProperty(SlcNames.SLC_ERROR_MESSAGE)) + props.add(status + .getProperty(SlcNames.SLC_ERROR_MESSAGE)); + } + return props.toArray(); + } } return new Object[] {}; + } catch (RepositoryException e) { throw new ArgeoException("Cannot get element for " + inputElement, e); @@ -752,7 +827,7 @@ public class JcrResultTreeView extends ViewPart { else propertiesViewer.setInput(null); // update cache for Drag & drop - lastSelectedTargetElement = firstItem; + // lastSelectedTargetElement = firstItem; lastSelectedSourceElement = firstItem; lastSelectedSourceElementParent = (ResultParent) firstItem .getParent();