/** * This file is part of CloudML [ http://cloudml.org ] * * Copyright (C) 2012 - SINTEF ICT * Contact: Franck Chauvel <franck.chauvel@sintef.no> * * Module: root * * CloudML is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * CloudML is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with CloudML. If not, see * <http://www.gnu.org/licenses/>. */ /* */ package org.cloudml.core.builders; import org.cloudml.core.*; import java.util.logging.Level; import java.util.logging.Logger; import static org.cloudml.core.builders.Commons.*; public class RelationshipInstanceBuilder extends WithResourcesBuilder<RelationshipInstance, RelationshipInstanceBuilder> implements SubPartBuilder<Deployment> { public static final String DEFAULT_RELATIONSHIP_INSTANCE_NAME = "Default relationship instance name"; private static final Logger journal = Logger.getLogger(RelationshipInstanceBuilder.class.getName()); private String typeName; private String client; private String clientPort; private String server; private String serverPort; public RelationshipInstanceBuilder() { typeName = DEFAULT_RELATIONSHIP_INSTANCE_NAME; client = "default client instance"; clientPort = "port"; server = "default server instance"; serverPort = "port"; } public RelationshipInstanceBuilder ofType(String typeName) { this.typeName = typeName; return next(); } public RelationshipInstanceBuilder from(String componentName, String portName) { client = componentName; clientPort = portName; return next(); } public RelationshipInstanceBuilder to(String componentName, String portName) { server = componentName; serverPort = portName; return next(); } @Override public RelationshipInstance build() { final RelationshipInstance relationship = new RelationshipInstance(getName(), createClientPort(), createServerPort(), createType()); super.prepare(relationship); return relationship; } private RequiredPortInstance createClientPort() { return new RequiredPortInstance(clientPort, new RequiredPort("required port type")); } private ProvidedPortInstance createServerPort() { return new ProvidedPortInstance(serverPort, new ProvidedPort("provided port type")); } private Relationship createType() { return new Relationship(typeName, new RequiredPort("required port type"), new ProvidedPort("provided port type")); } @Override protected RelationshipInstanceBuilder next() { return this; } @Override public void integrateIn(Deployment container) { final RelationshipInstance relationship = new RelationshipInstance(getName(), findClientPort(container), findServerPort(container), findType(container)); super.prepare(relationship); container.getRelationshipInstances().add(relationship); } private RequiredPortInstance findClientPort(Deployment container) { final InternalComponentInstance client = findClient(container); final RequiredPort portType = client.getType().getRequiredPorts().firstNamed(clientPort); if(portType == null){ final String error = String.format("Unable to find the required port type '%s'", clientPort); throw new IllegalStateException(error); } final RequiredPortInstance port = client.getRequiredPorts().ofType(portType); if (port == null) { final String error = String.format("Unable to find the required port instance '%s' in '%s'", clientPort, client); throw new IllegalStateException(error); } return port; } private ProvidedPortInstance findServerPort(Deployment container) { final ComponentInstance server = findServer(container); final ProvidedPort portType = server.getType().getProvidedPorts().firstNamed(serverPort); final ProvidedPortInstance port = server.getProvidedPorts().ofType(portType); if (port == null) { final String error = String.format("Unable to find the provided port '%s' in '%s'", serverPort, server); throw new IllegalStateException(error); } return port; } private Relationship findType(Deployment container) { final Relationship type = container.getRelationships().firstNamed(typeName); if (type == null) { final String error = String.format("Unable to find the relationship '%s'", typeName); throw new IllegalStateException(error); } return type; } private ComponentInstance<? extends Component> findServer(Deployment container) throws IllegalStateException { final ComponentInstance<? extends Component> serverComponent = container.getComponentInstances().firstNamed(server); if (serverComponent == null) { final String error = String.format("Unable to find the component instance '%s'", server); throw new IllegalStateException(error); } return serverComponent; } private InternalComponentInstance findClient(Deployment container) throws IllegalStateException { final InternalComponentInstance clientComponent = container.getComponentInstances().onlyInternals().firstNamed(client); if (clientComponent == null) { final String error = String.format("Unable to find the internal component instance '%s'", client); throw new IllegalStateException(error); } return clientComponent; } }