package net.unit8.waitt.mojo.component; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.ServiceLoader; import java.util.logging.Logger; import net.unit8.waitt.api.EmbeddedServer; import net.unit8.waitt.api.configuration.Server; import net.unit8.waitt.mojo.configuration.ServerSpec; import org.apache.maven.artifact.Artifact; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.repository.RepositorySystem; import org.codehaus.plexus.classworlds.realm.ClassRealm; import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.components.interactivity.Prompter; import org.codehaus.plexus.components.interactivity.PrompterException; /** * A provider of a server. * * @author kawasima */ public class DefaultServerProvider implements ServerProvider { private static final Logger LOG = Logger.getLogger(DefaultServerProvider.class.getName()); @Requirement private Prompter prompter; @Component protected ArtifactResolver artifactResolver; @Component protected RepositorySystem repositorySystem; @Override public ServerSpec getServer(Server server, ClassRealm parentRealm) { Artifact artifact = repositorySystem.createArtifact(server.getGroupId(), server.getArtifactId(), server.getVersion(), "jar"); ClassRealm serverRealm = artifactResolver.resolve(artifact, parentRealm); ServiceLoader<EmbeddedServer> serviceLoaders = ServiceLoader.load(EmbeddedServer.class, serverRealm); Iterator<EmbeddedServer> iter = serviceLoaders.iterator(); if (!iter.hasNext()) { throw new IllegalArgumentException("Embedded server is not found."); } return new ServerSpec(iter.next(), serverRealm); } @Override public ServerSpec selectServer(List<Server> servers, ClassRealm parentRealm, boolean interactive) { if (servers == null || servers.isEmpty()) { throw new IllegalStateException("No settings for server."); } List<ServerSpec> serverSpecs = new ArrayList<ServerSpec>(); for (Server server : servers) { ServerSpec serverSpec = getServer(server, parentRealm); serverSpecs.add(serverSpec); } if (interactive && serverSpecs.size() > 1) { try { prompter.showMessage("Detect multiple servers...\n"); List<String> possibleValues = new ArrayList<String>(); for (int i=0; i<serverSpecs.size(); i++) { possibleValues.add(Integer.toString(i)); prompter.showMessage(" " + i + ". " + serverSpecs.get(i).getEmbeddedServer().getName() + "\n"); } String res = prompter.prompt("What number will you use? (default: 0)", possibleValues, "0"); int num = Integer.parseInt(res); return serverSpecs.get(num); } catch(PrompterException e) { throw new IllegalStateException("Prompt error.", e); } } else { return serverSpecs.get(0); } } }