}
}
// Add the contribution if necessary
if (contributionEntry == null) {
Item item = new Item();
item.setLink(contributionLocation);
contributionCollection.post(contributionURI, item);
}
// Look for the specified deployable composite in the contribution
String compositeKey = null;
Entry<String, Item>[] deployableEntries = deployableCollection.query("contribution=" + contributionURI);
for (Entry<String, Item> entry: deployableEntries) {
Item item = entry.getData();
String compositeFileName = compositeURI.substring(compositeURI.lastIndexOf("/") + 1);
if (contributionURI.equals(contributionURI(entry.getKey())) &&
(item.getAlternate().endsWith(compositeURI) ||
item.getAlternate().endsWith(compositeFileName))) {
compositeKey = entry.getKey();
break;
}
}
if (compositeKey == null) {
logger.info("Composite not found");
response.sendError(HttpServletResponse.SC_NOT_FOUND, compositeURI);
return;
}
// Look for the deployable composite in the domain composite
try {
domainCompositeCollection.get(compositeKey);
} catch (NotFoundException e) {
// Add the deployable composite to the domain composite
Item item = new Item();
domainCompositeCollection.post(compositeKey, item);
}
// Check if the deployable composite is already assigned a node
Entry<String, Item>[] nodeEntries = cloudCollection.getAll();
String nodeName = null;
for (Entry<String, Item> entry: nodeEntries) {
Item item = entry.getData();
String related = item.getRelated();
if (related != null) {
int c = related.indexOf("composite:");
related = related.substring(c);
if (compositeKey.equals(related)) {
nodeName = compositeQName(entry.getKey()).getLocalPart();
}
}
}
// Create a new node for the composite if necessary
if (nodeName == null) {
// Construct node name and key
QName compositeName = compositeQName(compositeKey);
nodeName = compositeName.getLocalPart() + "Node";
String nodeKey = compositeKey("http://tuscany.apache.org/cloud", new QName("http://tuscany.apache.org/cloud", nodeName));
// Find a free node port
Set<Integer> nodePorts = new HashSet<Integer>();
for (Entry<String, Item> entry: nodeEntries) {
Item item = entry.getData();
String uri = nodeURI(item.getContents());
if (uri != null) {
URI u = URI.create(uri);
int port = u.getPort();
if (port != -1) {
nodePorts.add(port);
}
}
}
String nodeURI = null;
for (int port = 8100; port<8200; port++) {
if (!nodePorts.contains(port)) {
nodeURI = "http://localhost:" + port;
break;
}
}
if (nodeURI == null) {
throw new RuntimeException("Couldn't find a free port for new node: " + nodeName);
}
// Build the entry describing the node
Item item = new Item();
String content =
"<composite xmlns=\"http://www.osoa.org/xmlns/sca/1.0\"\n" +
" xmlns:t=\"http://tuscany.apache.org/xmlns/sca/1.0\"\n" +
" targetNamespace=\"http://tuscany.apache.org/cloud\"\n" +
" xmlns:c=\"" + compositeName.getNamespaceURI() + "\"\n" +
" name=\"" + nodeName + "\">\n" +
"\n" +
" <component name=\"" + nodeName + "\">\n" +
" <t:implementation.node uri=\"" + contributionURI + "\" composite=\"c:" + compositeName.getLocalPart() + "\"/>\n" +
" <service name=\"Node\">\n" +
" <binding.sca uri=\"" + nodeURI + "\"/>\n" +
" <binding.ws uri=\"" + nodeURI + "\"/>\n" +
" <t:binding.http uri=\"" + nodeURI + "\"/>\n" +
" <t:binding.jsonrpc uri=\"" + nodeURI + "\"/>\n" +
" <t:binding.atom uri=\"" + nodeURI + "\"/>\n" +
" </service>\n" +
" </component>\n" +
"</composite>";
item.setContents(content);
// Create the new node
cloudCollection.post(nodeKey, item);
}
// Finally, start the node
if ("true".equals(start)) {
processCollection.post(nodeName, new Item());
}
response.getWriter().print("<html><body>Node <span id=\"node\">" + nodeName + "</span> OK.</body></html>");
} catch (Exception e) {