package org.jboss.windup.rules.apps.javaee.service; import java.util.Iterator; import java.util.logging.Logger; import org.jboss.windup.graph.GraphContext; import org.jboss.windup.graph.model.ProjectModel; import org.jboss.windup.graph.model.WindupVertexFrame; import org.jboss.windup.graph.service.GraphService; import org.jboss.windup.rules.apps.java.model.JavaClassModel; import org.jboss.windup.rules.apps.javaee.model.RMIServiceModel; import org.jboss.windup.util.Logging; import com.thinkaurelius.titan.core.attribute.Text; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.gremlin.java.GremlinPipeline; /** * Provides methods for finding, creating, and modifying {@link RMIServiceModel} instances. * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> */ public class RMIServiceModelService extends GraphService<RMIServiceModel> { private static final Logger LOG = Logging.get(RMIServiceModelService.class); public RMIServiceModelService(GraphContext context) { super(context, RMIServiceModel.class); } public RMIServiceModel getOrCreate(ProjectModel application, JavaClassModel rmiInterface) { LOG.info("RMI Interface: " + rmiInterface.getQualifiedName()); RMIServiceModel rmiServiceModel = findByInterface(rmiInterface); if (rmiServiceModel == null) { rmiServiceModel = create(); rmiServiceModel.addApplication(application); rmiServiceModel.setInterface(rmiInterface); Iterator<JavaClassModel> implementations = rmiInterface.getImplementedBy().iterator(); while (implementations.hasNext()) { JavaClassModel implModel = implementations.next(); LOG.info(" -- Implementations: " + implModel.getQualifiedName()); rmiServiceModel.setImplementationClass(implModel); } } else { if (!rmiServiceModel.isAssociatedWithApplication(application)) rmiServiceModel.addApplication(application); } return rmiServiceModel; } private RMIServiceModel findByInterface(JavaClassModel rmiInterface) { GremlinPipeline<Vertex, Vertex> pipeline = new GremlinPipeline<>(rmiInterface.asVertex()); pipeline.in(RMIServiceModel.RMI_INTERFACE); pipeline.has(WindupVertexFrame.TYPE_PROP, Text.CONTAINS, RMIServiceModel.TYPE); if (pipeline.hasNext()) { return frame(pipeline.next()); } else { return null; } } }