/* * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) 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: * bstefanescu */ package org.eclipse.ecr.automation.server.jaxrs; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.ecr.automation.AutomationService; import org.eclipse.ecr.automation.OperationChain; import org.eclipse.ecr.automation.OperationDocumentation; import org.eclipse.ecr.automation.OperationParameters; /** * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a> */ public class AutomationInfo { protected final List<OperationDocumentation> ops; protected final List<OperationDocumentation> chains; public AutomationInfo(AutomationService service) { ops = service.getDocumentation(); // build a map for easy lookup Map<String, OperationDocumentation> map = new HashMap<String, OperationDocumentation>(); for (OperationDocumentation doc : ops) { map.put(doc.id, doc); } chains = new ArrayList<OperationDocumentation>(); for (OperationChain chain : service.getOperationChains()) { OperationDocumentation doc = new OperationDocumentation( chain.getId()); doc.description = chain.getDescription(); doc.category = "Chain"; doc.label = doc.id; doc.params = Collections.emptyList(); // compute chain signature List<OperationParameters> ops = chain.getOperations(); if (ops.isEmpty()) { doc.signature = new String[] { "void", "void" }; } else if (ops.size() == 1) { OperationDocumentation opdoc = map.get(ops.get(0).id()); doc.signature = opdoc.signature; } else { ArrayList<String[]> sigs = new ArrayList<String[]>(); for (OperationParameters o : ops) { sigs.add(map.get(o.id()).signature); } String[] head = sigs.get(0); ArrayList<String> rs = new ArrayList<String>(); for (int i = 0; i < head.length; i += 2) { String in = head[i]; String out = head[i + 1]; List<String> result = new ArrayList<String>(); checkPath(out, sigs, 1, result); for (String r : result) { rs.add(in); rs.add(r); } } doc.signature = rs.toArray(new String[rs.size()]); } chains.add(doc); } } protected void checkPath(String in, List<String[]> sigs, int offset, List<String> result) { boolean last = sigs.size() - 1 == offset; String[] sig = sigs.get(offset); for (int i = 0; i < sig.length; i += 2) { if ("void".equals(in) || "void".equals(sig[i]) || in.equals(sig[i])) { if (last) { result.add(sig[i + 1]); } else { checkPath(sig[i + 1], sigs, offset + 1, result); } } } } public List<OperationDocumentation> getOperations() { return ops; } public List<OperationDocumentation> getChains() { return chains; } }