package org.jboss.windup.bootstrap.commands.windup; import java.util.List; import java.util.concurrent.Future; import org.jboss.forge.furnace.Furnace; import org.jboss.forge.furnace.se.FurnaceFactory; import org.jboss.windup.bootstrap.Bootstrap; import org.jboss.windup.bootstrap.commands.Command; import org.jboss.windup.bootstrap.commands.CommandPhase; import org.jboss.windup.bootstrap.commands.CommandResult; import org.jboss.windup.bootstrap.commands.addons.AddImmutableAddonDirectoryCommand; import org.jboss.windup.tooling.ToolingRMIServer; public class ServerModeCommand implements Command { public static final String COMMAND_ID = "--startServer"; private Furnace furnace; private int port; private String addonsDirectory; public ServerModeCommand(List<String> arguments) { this.port = getServerPort(arguments); this.addonsDirectory = getAddonDirectory(arguments); } public static boolean isServerMode(List<String> arguments) { return arguments.contains(ServerModeCommand.COMMAND_ID); } private static String getAddonDirectory(List<String> arguments) { int addDirectoryIndex = arguments.indexOf("--immutableAddonDir") + 1; return arguments.get(addDirectoryIndex); } private static int getServerPort(List<String> arguments) { int serverPort = arguments.indexOf(ServerModeCommand.COMMAND_ID) + 1; String serverPortString = arguments.get(serverPort); return Integer.valueOf(serverPortString); } @Override public CommandResult execute() { try { furnace = FurnaceFactory.getInstance(); furnace.setServerMode(true); loadAddons(); try { Future<Furnace> future = furnace.startAsync(); future.get(); // use future.get() to wait until it is started } catch (Exception e) { System.out.println("Failed to start Windup!"); if (e.getMessage() != null) System.out.println("Failure reason: " + e.getMessage()); e.printStackTrace(); } startServer(); } catch (Throwable t) { System.err.println("Windup execution failed due to: " + t.getMessage()); t.printStackTrace(); } System.out.println("Server started..."); return null; } private void loadAddons() { AddImmutableAddonDirectoryCommand addonCommand = new AddImmutableAddonDirectoryCommand(addonsDirectory); addonCommand.setFurnace(furnace); addonCommand.execute(); } private void startServer() { System.out.println("Calling ToolingRMIServer start..."); furnace.getAddonRegistry().getServices(ToolingRMIServer.class).get().startServer(port, Bootstrap.getVersion()); } // TODO: Not sure if this is necessary, or if killing the processes is sufficient. // If necessary, the client needs to invoke. @SuppressWarnings("unused") private void stop() { if (furnace != null && !furnace.getStatus().isStopped()) furnace.stop(); } @Override public CommandPhase getPhase() { return null; } }