/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.tuscany.sca.node.manager.impl; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import javax.ws.rs.DefaultValue; import javax.ws.rs.PathParam; import javax.ws.rs.WebApplicationException; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.Component; import org.apache.tuscany.sca.assembly.Composite; import org.apache.tuscany.sca.assembly.Service; import org.apache.tuscany.sca.binding.rest.RESTBinding; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.core.FactoryExtensionPoint; import org.apache.tuscany.sca.host.http.client.HttpClientFactory; import org.apache.tuscany.sca.interfacedef.Interface; import org.apache.tuscany.sca.node.Node; import org.apache.tuscany.sca.node.extensibility.NodeActivator; import org.apache.tuscany.sca.node.extensibility.NodeExtension; import org.apache.tuscany.sca.node.manager.DomainAssetManagerResource; import org.apache.tuscany.sca.node.manager.ManageableResource; import org.apache.tuscany.sca.node.manager.ManageableService; import org.apache.tuscany.sca.node.manager.Status; import org.oasisopen.sca.annotation.Init; public class DomainAssetManagerResourceImpl implements NodeActivator, DomainAssetManagerResource { private static Map nodeMap = new ConcurrentHashMap(); private HttpClientFactory httpClientFactory; public void nodeStarted(Node node) { NodeExtension nodeExtension = (NodeExtension) node; nodeMap.put(nodeExtension.getDomainURI(), nodeExtension); } public void nodeStopped(Node node) { NodeExtension nodeExtension = (NodeExtension) node; nodeMap.remove(nodeExtension.getDomainURI()); } @Init public void init() { NodeExtension node = (NodeExtension) nodeMap.values().iterator().next(); if(node != null) { ExtensionPointRegistry extensionPoints = node.getExtensionPointRegistry(); FactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class); this.httpClientFactory = HttpClientFactory.getInstance(extensionPoints); } } @Override public List getResourceStatus(@PathParam("domainURI") @DefaultValue("default") String domainURI) { if( ! nodeMap.containsKey(domainURI)) { throw new WebApplicationException(404); } NodeExtension node = nodeMap.get(domainURI); Composite domainComposite = node.getDomainComposite(); List statuses = new ArrayList(); for(Component component : domainComposite.getComponents()) { for(Service service : component.getServices()) { Interface interfaceContract = service.getInterfaceContract().getInterface(); if(ManageableResource.class.getName().equals(interfaceContract.toString())) { Binding binding = service.getBinding(RESTBinding.class); if(binding != null) { Status status = new Status(); status.setName(component.getName()); status.setUri(binding.getURI()); try { Timer t = new Timer(); status = testResource(status); status.setExecution(t.elapsed(TimeUnit.MILLISECONDS)); status.setStatus(Status.SUCCESS); } catch (Exception e) { status.setStatus(Status.FAILURE); status.setStatusMessage(e.getMessage()); } statuses.add(status); } } } } return statuses; } @Override public List getServiceStatus(@PathParam("domainURI") @DefaultValue("default") String domainURI) { if( ! nodeMap.containsKey(domainURI)) { throw new WebApplicationException(404); } NodeExtension node = nodeMap.get(domainURI); Composite domainComposite = node.getDomainComposite(); List statuses = new ArrayList(); for(Component component : domainComposite.getComponents()) { for(Service service : component.getServices()) { Interface interfaceContract = service.getInterfaceContract().getInterface(); if(ManageableService.class.getName().equals(interfaceContract.toString())) { Status status = new Status(); status.setName(component.getName()); status.setUri(service.getBindings().get(0).getURI()); try { String serviceName = component.getName() +"/" + service.getName(); ManageableService serviceInstance = node.getService(ManageableService.class, component.getName()); Timer t = new Timer(); serviceInstance.isAlive(); status.setExecution(t.elapsed(TimeUnit.MILLISECONDS)); status.setStatus(Status.SUCCESS); } catch (Exception e) { status.setStatus(Status.FAILURE); status.setStatusMessage(e.getMessage()); } statuses.add(status); } } } return statuses; } private Status testResource(Status status) throws IOException { // Create an HTTP client HttpClient httpClient = httpClientFactory.createHttpClient(); HttpGet request = new HttpGet(status.getUri() + "ping"); //request.addHeader("Accept","application/json"); HttpResponse response = httpClient.execute(request); if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { throw new IOException("Error invoking service at '" + request.getURI() +"' => " + response.getStatusLine().getReasonPhrase()); } if (httpClient != null) { httpClient.getConnectionManager().shutdown(); } return status; } class Timer { Date time; long t; public Timer() { reset(); } public void reset() { time = new Date(); t = System.nanoTime(); } public Date time() { return time; } public long elapsed(TimeUnit timeUnit) { long elapsedTime = elapsed(); return timeUnit.convert(elapsedTime, TimeUnit.NANOSECONDS); } public void print(String s, TimeUnit timeUnit) { long elapsedTime = elapsed(); System.out.println(s + ": " + timeUnit.convert(elapsedTime, TimeUnit.NANOSECONDS) + "ms"); } private long elapsed() { return System.nanoTime() - t; } } }