import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
import java.util.UUID;
import javax.jcr.Node;
import javax.jcr.observation.EventIterator;
import javax.jcr.observation.EventListener;
import javax.jcr.observation.ObservationManager;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryManager;
import org.argeo.ArgeoException;
import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
-public class ProcessBuilderPage extends FormPage implements SlcNames, SlcTypes {
+public class ProcessBuilderPage extends FormPage implements SlcNames {
public final static String ID = "processBuilderPage";
// private final static Log log =
// LogFactory.getLog(ProcessBuilderPage.class);
getManagedForm().addPart(formPart);
// observation
- statusObserver = new AsyncUiEventListener() {
+ statusObserver = new AsyncUiEventListener(form.getDisplay()) {
protected void onEventInUiThread(EventIterator events) {
statusChanged();
}
Session session = processNode.getSession();
String uuid = UUID.randomUUID().toString();
String destPath = SlcJcrUtils.createExecutionProcessPath(uuid);
- Node newNode = JcrUtils.mkdirs(session, destPath, SLC_PROCESS);
+ Node newNode = JcrUtils.mkdirs(session, destPath,
+ SlcTypes.SLC_PROCESS);
JcrUtils.copy(processNode, newNode);
// session.getWorkspace().copy(processNode.getPath(), destPath);
// Node newNode = session.getNode(destPath);
* @param path
* the path of the flow
*/
- public void addFlow(String path) {
+ protected void addFlow(String path) {
try {
Node flowNode = processNode.getSession().getNode(path);
Node realizedFlowNode = processNode.getNode(SLC_FLOW).addNode(
SLC_FLOW);
- realizedFlowNode.addMixin(SLC_REALIZED_FLOW);
+ realizedFlowNode.addMixin(SlcTypes.SLC_REALIZED_FLOW);
Node address = realizedFlowNode.addNode(SLC_ADDRESS,
NodeType.NT_ADDRESS);
address.setProperty(Property.JCR_PATH, path);
// copy spec attributes
Node specAttrsBase;
- if (flowNode.hasProperty(SLC_SPEC))
- specAttrsBase = flowNode.getProperty(SLC_SPEC).getNode();
- else
+ if (flowNode.hasProperty(SLC_SPEC)) {
+ Node executionSpecNode = flowNode.getProperty(SLC_SPEC)
+ .getNode();
+ specAttrsBase = executionSpecNode;
+ String executionSpecName = executionSpecNode.getProperty(
+ SLC_NAME).getString();
+ realizedFlowNode.setProperty(SLC_SPEC, executionSpecName);
+ } else
specAttrsBase = flowNode;
specAttrs: for (NodeIterator nit = specAttrsBase.getNodes(); nit
.hasNext();) {
Node specAttrNode = nit.nextNode();
+ String attrName = specAttrNode.getName();
if (!specAttrNode
.isNodeType(SlcTypes.SLC_EXECUTION_SPEC_ATTRIBUTE))
continue specAttrs;
Node realizedAttrNode = realizedFlowNode.addNode(specAttrNode
.getName());
JcrUtils.copy(specAttrNode, realizedAttrNode);
+
+ // ovveride with flow value
+ if (flowNode.hasNode(attrName)) {
+ // assuming this is a primitive
+ realizedAttrNode.setProperty(SLC_VALUE,
+ flowNode.getNode(attrName).getProperty(SLC_VALUE)
+ .getValue());
+ }
}
flowsViewer.refresh();
// TODO optimize based on data type?
Object value = PrimitiveUtils.convert(type, specAttrNode
.getProperty(SLC_VALUE).getString());
+ // log.debug(specAttrNode + ", type=" + type + ", value=" +
+ // value);
return value;
}
return null;
public String getText(Object element) {
Node node = (Node) element;
try {
- if (node.isNodeType(SLC_REALIZED_FLOW)) {
+ if (node.isNodeType(SlcTypes.SLC_REALIZED_FLOW)) {
if (node.hasNode(SLC_ADDRESS)) {
String path = node.getNode(SLC_ADDRESS)
.getProperty(Property.JCR_PATH).getString();
public Image getImage(Object element) {
Node node = (Node) element;
try {
- if (node.isNodeType(SLC_REALIZED_FLOW)) {
+ if (node.isNodeType(SlcTypes.SLC_REALIZED_FLOW)) {
return SlcImages.FLOW;
}
} catch (RepositoryException e) {
}
}
+ /** Manages drop event. */
class FlowsDropListener extends ViewerDropAdapter {
public FlowsDropListener(Viewer viewer) {
@Override
public boolean performDrop(Object data) {
String path = data.toString();
- addFlow(path);
- return true;
+ try {
+ // either a node or a whole directory was dragged
+ QueryManager qm = processNode.getSession().getWorkspace()
+ .getQueryManager();
+ String statement = "SELECT * FROM ["
+ + SlcTypes.SLC_EXECUTION_FLOW
+ + "] WHERE ISDESCENDANTNODE(['" + path
+ + "']) OR ISSAMENODE(['" + path + "'])";
+ // log.debug(statement);
+ Query query = qm.createQuery(statement, Query.JCR_SQL2);
+
+ // order paths
+ SortedSet<String> paths = new TreeSet<String>();
+ for (NodeIterator nit = query.execute().getNodes(); nit
+ .hasNext();) {
+ paths.add(nit.nextNode().getPath());
+ }
+
+ for (String p : paths) {
+ addFlow(p);
+ }
+ return true;
+ } catch (RepositoryException e) {
+ throw new SlcException("Cannot query flows under " + path, e);
+ }
}
@Override
}
}
- static class ValuesEditingSupport extends EditingSupport {
+ class ValuesEditingSupport extends EditingSupport {
private final TableViewer tableViewer;
public ValuesEditingSupport(ColumnViewer viewer) {
Node specAttrNode = (Node) element;
return !(specAttrNode.getProperty(SLC_IS_IMMUTABLE)
.getBoolean() || specAttrNode.getProperty(
- SLC_IS_CONSTANT).getBoolean());
+ SLC_IS_CONSTANT).getBoolean())
+ && specAttrNode
+ .isNodeType(SlcTypes.SLC_PRIMITIVE_SPEC_ATTRIBUTE);
} catch (RepositoryException e) {
throw new SlcException("Cannot check canEdit", e);
}
@Override
protected Object getValue(Object element) {
- return getAttributeSpecValue((Node) element);
+ Node specAttrNode = (Node) element;
+ try {
+ Object value = getAttributeSpecValue(specAttrNode);
+ if (value == null)
+ throw new SlcException("Unsupported attribute " + element);
+ if (specAttrNode
+ .isNodeType(SlcTypes.SLC_PRIMITIVE_SPEC_ATTRIBUTE))
+ return value.toString();
+ return value;
+ } catch (RepositoryException e) {
+ throw new SlcException("Cannot get value for " + element, e);
+ }
}
@Override
.getString();
SlcJcrUtils.setPrimitiveAsProperty(specAttrNode, SLC_VALUE,
type, value);
+ valuesViewer.refresh();
+ formPart.markDirty();
}
} catch (RepositoryException e) {
throw new SlcException("Cannot get celle editor", e);