package org.bitionaire.elbombillo.ms.idea;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import io.advantageous.qbit.server.ServiceEndpointServer;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.bitionaire.elbombillo.ms.idea.configuration.IdeaServerConfiguration;
import org.bitionaire.elbombillo.ms.idea.service.IdeaService;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.io.File;
import java.io.IOException;
import java.util.Set;
/**
*
*
* @author netdevfighter
*/
@Slf4j
public class IdeaRestServer {
private final static ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
private File serverFile;
@Option(name = "-h", aliases = "--help", usage = "print the help message", help = true)
@Getter
private boolean showHelp = false;
@Option(name="-s", aliases = "--serverfile", required = true, usage="Sets a file if that is present")
public void setServerFile(File fileConfiguration) {
if (fileConfiguration.exists() && fileConfiguration.canRead()) {
this.serverFile = fileConfiguration;
} else {
throw new IllegalArgumentException("The given file '" + fileConfiguration
+ "' exists not or there is rights issue.");
}
}
private IdeaServerConfiguration createServerConfiguration() {
final ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
try {
final IdeaServerConfiguration obj = mapper.readValue(serverFile, IdeaServerConfiguration.class);
validateConfiguration(obj);
return obj;
} catch (final IOException e) {
throw new InitializationException("Cannot read the file " + serverFile, e);
}
}
private void validateConfiguration(IdeaServerConfiguration serverConfiguration) {
final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
final Validator validator = factory.getValidator();
Set<ConstraintViolation<IdeaServerConfiguration>> constraintViolations =
validator.validate( serverConfiguration );
for (ConstraintViolation<IdeaServerConfiguration> violation : constraintViolations) {
System.err.println("ERORR: " + violation.getMessage());
}
if (!constraintViolations.isEmpty()) {
throw new InitializationException("The server encountered a misconfiguration");
}
}
public static void main(String[] args) {
final IdeaRestServer ideaServer = new IdeaRestServer();
final CmdLineParser cmdLineParser = new CmdLineParser(ideaServer);
try {
cmdLineParser.parseArgument(args);
if (ideaServer.isShowHelp()) {
cmdLineParser.printUsage(System.out);
} else {
IdeaServerConfiguration serverConf = ideaServer.createServerConfiguration();
ServiceEndpointServer se = serverConf.getServerFactory().createServiceEndpoint();
se.initServices(new IdeaService());
se.startServer();
}
} catch (final InitializationException | CmdLineException e) {
log.error("could not parse or process command-line arguments", e);
if (e.getMessage() != null && !e.getMessage().isEmpty()) {
System.err.println("could not start application because of following error: ");
System.err.println(e.getMessage());
} else {
System.err.println("failed to start application, check the logs for more information");
}
cmdLineParser.printUsage(System.err);
}
}
}