package org.vaadin.mideaas.frontend; import java.io.File; import javax.servlet.http.HttpServletRequest; import org.vaadin.mideaas.model.SharedProject; import org.vaadin.mideaas.model.User; import com.vaadin.server.ExternalResource; import com.vaadin.server.VaadinServletService; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.Label; import com.vaadin.ui.Link; import com.vaadin.ui.Panel; import com.vaadin.ui.VerticalLayout; import fi.jasoft.qrcode.QRCode; @SuppressWarnings("serial") public class JettyComponent extends CustomComponent { private final SharedProject project; private final String contextPath; private final User user; private final LogView logView = new LogView(); private VerticalLayout layout = new VerticalLayout(); final private Button startButton = new Button("Start Jetty"); final private Button stopButton = new Button("Stop Jetty"); final private Button showLogButton = new ShowLogButton("Jetty Log", logView); private Label statusLabel = new Label(); private Link link = new Link("Link To App", null); private Integer port = null; private QRCode qrCode = new QRCode(); public JettyComponent(SharedProject project, User user) { super(); this.project = project; this.user = user; this.contextPath = JettyUtil.contextPathFor(project); Panel p = new Panel("Jetty Server"); p.setContent(layout); layout.setMargin(true); setCompositionRoot(p); } @Override public void attach() { super.attach(); buildLayout(); } private void buildLayout() { layout.addComponent(startButton); layout.addComponent(stopButton); stopButton.setEnabled(false); layout.addComponent(statusLabel); layout.addComponent(showLogButton); layout.addComponent(qrCode); qrCode.setVisible(false); qrCode.setWidth("128px"); qrCode.setHeight("128px"); layout.addComponent(link); link.setVisible(false); this.startButton.addClickListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { logView.clear(); startJetty(); } }); stopButton.addClickListener(new Button.ClickListener(){; @Override public void buttonClick(ClickEvent event) { logView.clear(); stopJetty(); } }); } private void startJetty() { File pomXml = project.getPomXmlFile(); String target = MavenUtil.targetDirFor(user); port = JettyUtil.runJetty(pomXml, contextPath, target, logView); startButton.setEnabled(false); stopButton.setEnabled(true); statusLabel.setValue("Running"); String uri = getServer() + ":" + port + contextPath + "/"; link.setResource(new ExternalResource(uri)); link.setVisible(true); qrCode.setValue(uri); qrCode.setVisible(true); } private static String getServer() { HttpServletRequest request = VaadinServletService.getCurrentServletRequest(); return (request.isSecure() ? "https://" : "http://") + request.getServerName(); } private void stopJetty() { if (port==null) { return; // XXX } File pomXml = project.getPomXmlFile(); JettyUtil.stopJetty(port,pomXml,contextPath, logView); startButton.setEnabled(true); stopButton.setEnabled(false); statusLabel.setValue(null); link.setVisible(false); qrCode.setVisible(false); } }