/*_########################################################################## _## _## Copyright (C) 2013 Kaito Yamada _## _########################################################################## */ package com.github.kaitoy.sneo.giane.action; import java.net.URL; import java.util.Map; import org.apache.struts2.ServletActionContext; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.InterceptorRef; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.interceptor.ApplicationAware; import org.apache.struts2.interceptor.validation.SkipValidation; import org.h2.tools.Server; import com.github.kaitoy.sneo.giane.action.message.FormMessage; import com.github.kaitoy.sneo.giane.action.message.H2DbWebConsoleMessage; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.validator.annotations.IntRangeFieldValidator; import com.opensymphony.xwork2.validator.annotations.RequiredFieldValidator; @ParentPackage("giane-default") @InterceptorRef("gianeDefaultStack") public class H2DbWebConsoleAction extends ActionSupport implements ApplicationAware, H2DbWebConsoleMessage, FormMessage { /** * */ private static final long serialVersionUID = 830216491132312506L; private Integer port; private boolean h2DbWebServerRunning; private String url; private Map<String, Object> application; private static Object lock = new Object(); public Integer getPort() { return port; } @RequiredFieldValidator( key = "RequiredFieldValidator.error", shortCircuit = true ) @IntRangeFieldValidator( key = "IntRangeFieldValidator.error.min.max", min = "1", max = "65535", shortCircuit = true ) public void setPort(Integer port) { this.port = port; } public boolean isH2DbWebServerRunning() { return h2DbWebServerRunning; } public String getUrl() { return url; } public void setApplication(Map<String, Object> application) { this.application = application; } @Action( value = "h2-db-web-console-tab-content", results = { @Result(name = "tab", location = "h2-db-web-console-tab-content.jsp") } ) @SkipValidation public String tab() throws Exception { Server server = (Server)application.get("h2DbWebServer"); if (server != null && server.isRunning(false)) { h2DbWebServerRunning = true; } else { h2DbWebServerRunning = false; } return "tab"; } @Action( value = "h2-db-web-console-start", results = { @Result(name = "sucess", location = "h2-db-web-console-stop.jsp") } ) public String start() throws Exception { synchronized (lock) { Server server = (Server)application.get("h2DbWebServer"); if (server != null && server.isRunning(false)) { URL urlObj = new URL(ServletActionContext.getRequest().getRequestURL().toString()); StringBuffer sb = new StringBuffer(); sb.append(urlObj.getProtocol()) .append("://") .append(urlObj.getHost()) .append(":") .append(server.getPort()) .append("/"); url = sb.toString(); } else { server = Server.createWebServer( "-webPort", port.toString(), "-baseDir", ".", "-webAllowOthers", "-webDaemon" ); server.start(); application.put("h2DbWebServer", server); URL urlObj = new URL(ServletActionContext.getRequest().getRequestURL().toString()); StringBuffer sb = new StringBuffer(); sb.append(urlObj.getProtocol()) .append("://") .append(urlObj.getHost()) .append(":") .append(port) .append("/"); url = sb.toString(); } } return "sucess"; } @Action( value = "h2-db-web-console-stop", results = { @Result(name = "sucess", location = "h2-db-web-console-start.jsp") } ) @SkipValidation public String stop() throws Exception { synchronized (lock) { Server server = (Server)application.get("h2DbWebServer"); if (server != null && server.isRunning(false)) { server.stop(); } } return "sucess"; } }