/*******************************************************************************
* Copyright (c) 2014 Wind River Systems, Inc. and others. All rights reserved.
* This program and the accompanying materials are made available under the terms
* of the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.te.tcf.processes.core.util;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.tcf.protocol.Protocol;
import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode;
import org.eclipse.tcf.te.runtime.persistence.PersistenceManager;
import org.eclipse.tcf.te.runtime.persistence.interfaces.IPersistenceDelegate;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode;
import org.eclipse.tcf.te.tcf.processes.core.interfaces.IProcessContextItem;
import org.eclipse.tcf.te.tcf.processes.core.model.ModelManager;
import org.eclipse.tcf.te.tcf.processes.core.model.interfaces.IProcessContextNode;
import org.eclipse.tcf.te.tcf.processes.core.model.interfaces.runtime.IRuntimeModelLookupService;
import org.eclipse.tcf.te.tcf.processes.core.persistence.ProcessContextItem;
/**
* Process data helper for en/decoding.
*/
public class ProcessDataHelper {
public static final String encodeProcessContextItems(IProcessContextItem[] items) {
try {
if (items != null && items.length > 0) {
IPersistenceDelegate delegate = PersistenceManager.getInstance().getDelegate(IProcessContextItem.class, String.class);
return (String)delegate.writeList(items, String.class);
}
}
catch (Exception e) {
}
return null;
}
public static final IProcessContextItem[] decodeProcessContextItems(String encoded) {
if (encoded != null && encoded.trim().length() > 0) {
try {
IPersistenceDelegate delegate = PersistenceManager.getInstance().getDelegate(IProcessContextItem.class, String.class);
Object[] input = delegate.readList(IProcessContextItem.class, encoded);
List<IProcessContextItem> items = new ArrayList<IProcessContextItem>();
for (Object object : input) {
if (object instanceof IProcessContextItem) {
items.add((IProcessContextItem)object);
}
}
return items.toArray(new IProcessContextItem[items.size()]);
}
catch (Exception e) {
}
}
return new IProcessContextItem[0];
}
public static final IProcessContextItem getProcessContextItem(final IProcessContextNode node) {
final AtomicReference<IProcessContextItem> ctxItem = new AtomicReference<IProcessContextItem>();
Protocol.invokeAndWait(new Runnable() {
@Override
public void run() {
if (node.getProcessContext() != null) {
Boolean value = node.getProcessContext().getProperties().containsKey("CanAttach") ? //$NON-NLS-1$
(Boolean)node.getProcessContext().getProperties().get("CanAttach") : Boolean.TRUE; //$NON-NLS-1$
if (value != null && value.booleanValue()) {
IProcessContextItem item = new ProcessContextItem();
item.setProperty(IProcessContextItem.PROPERTY_ID, node.getProcessContext().getID());
item.setProperty(IProcessContextItem.PROPERTY_NAME, node.getProcessContext().getName());
item.setProperty(IProcessContextItem.PROPERTY_PATH, getProcessContextNodePath(node));
ctxItem.set(item);
}
}
}
});
return ctxItem.get();
}
protected static final String getProcessContextNodePath(IProcessContextNode node) {
String path = null;
while (node.getParent() instanceof IProcessContextNode) {
node = (IProcessContextNode)node.getParent();
path = node.getProcessContext().getName() + (path != null ? IProcessContextItem.PATH_SEPARATOR + path : ""); //$NON-NLS-1$
}
return path;
}
public static final IProcessContextNode[] getProcessContextNodes(final IPeerNode peerNode, final IProcessContextItem item) {
final List<IProcessContextNode> nodes = new ArrayList<IProcessContextNode>();
Protocol.invokeAndWait(new Runnable() {
@Override
public void run() {
IRuntimeModelLookupService lkup = ModelManager.getRuntimeModel(peerNode).getService(IRuntimeModelLookupService.class);
IModelNode[] modelNodes = null;
if (item.getId() != null) {
modelNodes = lkup.lkupModelNodesById(item.getId());
}
if (modelNodes == null || modelNodes.length == 0) {
modelNodes = lkup.lkupModelNodesByName(item.getName());
}
if (modelNodes != null) {
for (IModelNode node : modelNodes) {
if (node instanceof IProcessContextNode && isValid((IProcessContextNode)node, item)) {
nodes.add((IProcessContextNode)node);
}
}
}
}
});
return nodes.toArray(new IProcessContextNode[nodes.size()]);
}
protected static final boolean isValid(IProcessContextNode node, IProcessContextItem item) {
if (item.getName() != null && node.getProcessContext().getName().equals(item.getName())) {
String itemPath = item.getPath();
String nodePath = getProcessContextNodePath(node);
return (itemPath == null && nodePath == null) || (itemPath != null && itemPath.equals(nodePath));
}
return false;
}
}