package org.jboss.windup.rules.apps.javaee.service;
import java.util.Collections;
import com.google.common.collect.Iterables;
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.EjbRemoteServiceModel;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.gremlin.java.GremlinPipeline;
/**
* Contains methods for managing {@link EjbRemoteServiceModel} instances.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*/
public class EjbRemoteServiceModelService extends GraphService<EjbRemoteServiceModel>
{
public EjbRemoteServiceModelService(GraphContext context)
{
super(context, EjbRemoteServiceModel.class);
}
/**
* Either creates a new {@link EjbRemoteServiceModel} or returns an existing one if one already exists.
*/
public EjbRemoteServiceModel getOrCreate(Iterable<ProjectModel> applications, JavaClassModel remoteInterface, JavaClassModel implementationClass)
{
GremlinPipeline<Vertex, Vertex> pipeline = new GremlinPipeline<>(getGraphContext().getGraph());
pipeline.V().has(WindupVertexFrame.TYPE_PROP, EjbRemoteServiceModel.TYPE);
if (remoteInterface != null)
pipeline.as("remoteInterface").out(EjbRemoteServiceModel.EJB_INTERFACE).retain(Collections.singleton(remoteInterface.asVertex()))
.back("remoteInterface");
if (implementationClass != null)
pipeline.as("implementationClass").out(EjbRemoteServiceModel.EJB_IMPLEMENTATION_CLASS)
.retain(Collections.singleton(implementationClass.asVertex()))
.back("implementationClass");
if (pipeline.hasNext())
{
EjbRemoteServiceModel result = frame(pipeline.next());
for (ProjectModel application : applications)
{
if (!Iterables.contains(result.getApplications(), application))
result.addApplication(application);
}
return result;
}
else
{
EjbRemoteServiceModel model = create();
model.setApplications(applications);
model.setInterface(remoteInterface);
model.setImplementationClass(implementationClass);
return model;
}
}
}