WebServer.java
/*
* @copyright defined in LICENSE.txt
*/
package ship.build;
import static hera.DefaultConstants.DEFAULT_ENDPOINT;
import static hera.util.StringUtils.nvl;
import hera.server.ServerStatus;
import hera.server.ThreadServer;
import hera.util.ThreadUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.LogManager;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.boot.Banner.Mode;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import ship.ProjectFile;
import ship.build.web.SpringWebLauncher;
import ship.build.web.service.BuildService;
@NoArgsConstructor
public class WebServer extends ThreadServer {
protected int port = -1;
@Setter
protected ProjectFile projectFile;
protected ConfigurableApplicationContext applicationContext;
public WebServer(final int port) {
this.port = port;
}
/**
* Get server port.
* <p>
* Return 8080 as default port if not specified.
* </p>
* @return server port
*/
public int getPort() {
if (port < 0) {
return 8080;
} else {
return port;
}
}
/**
* Get build service from server.
*
* @return build service
*/
public BuildService getBuildService() {
if (null == applicationContext) {
return null;
}
return applicationContext.getBean(BuildService.class);
}
/**
* Set server port.
* <p>
* Specify negative value if you want default port.
* </p>
*
* @param port server port
*/
public void setPort(final int port) {
if (isStatus(ServerStatus.TERMINATED)) {
this.port = port;
} else {
throw new IllegalStateException("Server already started");
}
}
@Override
protected void initialize() throws Exception {
super.initialize();
final SpringApplicationBuilder builder = new SpringApplicationBuilder(SpringWebLauncher.class);
builder.bannerMode(Mode.OFF);
builder.logStartupInfo(false);
final Map<String, Object> properties = new HashMap<>();
if (0 <= port) {
properties.put("server.port", port);
}
properties.put("project.endpoint", nvl(projectFile.getEndpoint(), DEFAULT_ENDPOINT));
if (!properties.isEmpty()) {
builder.properties(properties);
}
LogManager.getLogManager().reset();
applicationContext = builder.run();
}
@Override
protected void process() throws Exception {
super.process();
ThreadUtils.trySleep(2000);
}
@Override
protected void terminate() {
try {
applicationContext.close();;
} catch (Throwable ex) {
this.exception = ex;
}
super.terminate();
}
}