package de.cinovo.cloudconductor.server.web.impl; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.List; import java.util.Map.Entry; import java.util.Properties; import java.util.concurrent.TimeUnit; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import org.apache.cxf.jaxrs.ext.MessageContext; import de.cinovo.cloudconductor.api.lib.helper.SchedulerService; import de.cinovo.cloudconductor.server.ServerStarter; import de.cinovo.cloudconductor.server.util.ICCProperties; import de.cinovo.cloudconductor.server.util.RestartTask; import de.cinovo.cloudconductor.server.util.exception.FormErrorException; import de.cinovo.cloudconductor.server.util.exception.FormErrorExceptionHander; import de.cinovo.cloudconductor.server.web.CSViewModel; import de.cinovo.cloudconductor.server.web.helper.FormValidator; import de.cinovo.cloudconductor.server.web.interfaces.IContextAware; import de.cinovo.cloudconductor.server.web.interfaces.IInstall; import de.taimos.cxf_renderer.model.RenderedUI; /** * Copyright 2014 Cinovo AG<br> * <br> * * @author psigloch * */ public class InstallImpl implements IInstall, IContextAware { private static final String DB_TYPE_FORM = "db-type"; private static final String DB_HOST_FORM = "db-host"; private static final String DB_PORT_FORM = "db-port"; private static final String DB_USER_FORM = "db-user"; private static final String DB_PW_FORM = "db-pw"; private static final String DB_NAME_FORM = "db-name"; private static final String CC_PORT_FORM = "cc-port"; private static final String CC_NAME_FORM = "cc-name"; private static final String CC_USER_FORM = "cc-user"; private static final String CC_PW_FORM = "cc-pw"; private static final String REPO_SCAN_FORM = "repo-scan"; private static final String REPO_INDEXER_FORM = "repo-indexer"; private static final String REPO_PROVIDER_FORM = "repo-provider"; private static final String REPO_BASEDIR_FORM = "repo-basedir"; private static final String REPO_BASEURL_FORM = "repo-baseurl"; private static final String REPO_AWS_BUCKET_FORM = "repo-bucket"; private static final String REPO_AWS_ACCESS_KEY_FORM = "aws-accessKeyId"; private static final String REPO_AWS_SECRET_KEY_FORM = "aws-secretKey"; @Override public RenderedUI view() { CSViewModel view = new CSViewModel("install/install"); if (this.hasError()) { FormErrorException error = (FormErrorException) this.mc.getHttpServletRequest().getSession(true).getAttribute(FormErrorExceptionHander.FORM_ERROR_DATA); this.mc.getHttpServletRequest().getSession().removeAttribute(FormErrorExceptionHander.FORM_ERROR_DATA); view.addModel("ERROR", error); } return view.render(); } @Override public Response save(MultivaluedMap<String, String> form) throws FormErrorException { FormValidator validator = FormValidator.create("", form); validator.notEmpty(InstallImpl.DB_TYPE_FORM); if (validator.fieldCheck(InstallImpl.DB_TYPE_FORM)) { validator.notEquals(InstallImpl.DB_TYPE_FORM, "-1"); } validator.notEmpty(InstallImpl.DB_HOST_FORM).notEmpty(InstallImpl.DB_PORT_FORM).notEmpty(InstallImpl.DB_USER_FORM).notEmpty(InstallImpl.DB_PW_FORM).notEmpty(InstallImpl.DB_NAME_FORM); validator.notEmpty(InstallImpl.CC_PORT_FORM).notEmpty(InstallImpl.CC_NAME_FORM).notEmpty(InstallImpl.CC_USER_FORM).notEmpty(InstallImpl.CC_PW_FORM); validator.notEmpty(InstallImpl.REPO_SCAN_FORM); if (validator.fieldCheck(InstallImpl.REPO_SCAN_FORM)) { if (form.get(InstallImpl.REPO_SCAN_FORM).get(0) == "true") { validator.notEmpty(InstallImpl.REPO_INDEXER_FORM); } } validator.notEmpty(InstallImpl.REPO_PROVIDER_FORM); if (validator.fieldCheck(InstallImpl.REPO_PROVIDER_FORM)) { validator.notEquals(InstallImpl.REPO_PROVIDER_FORM, "-1"); switch (form.get(InstallImpl.REPO_PROVIDER_FORM).get(0)) { case "FileProvider": validator.notEmpty(InstallImpl.REPO_BASEDIR_FORM); break; case "HTTPProvider": validator.notEmpty(InstallImpl.REPO_BASEURL_FORM); break; case "AWSS3Provider": validator.notEmpty(InstallImpl.REPO_AWS_BUCKET_FORM); validator.notEmpty(InstallImpl.REPO_AWS_ACCESS_KEY_FORM); validator.notEmpty(InstallImpl.REPO_AWS_SECRET_KEY_FORM); break; default: break; } } validator.validate(); Properties props = this.generateProps(form); File f = new File(ServerStarter.CLOUDCONDUCTOR_PROPERTIES); try (OutputStream out = new FileOutputStream(f);) { props.store(out, ""); } catch (IOException e) { throw new FormErrorException("/", "Couldn't write the config file! Please check the folder rights."); } SchedulerService.instance.executeOnce(new RestartTask(), 10, TimeUnit.SECONDS); try { return Response.seeOther(new URI("/finish/")).build(); } catch (URISyntaxException e) { return Response.serverError().build(); } } private Properties generateProps(MultivaluedMap<String, String> form) { Properties props = new Properties(); for (Entry<String, List<String>> entry : form.entrySet()) { String key = null; switch (entry.getKey()) { case DB_TYPE_FORM: key = ICCProperties.DB_TYPE; break; case DB_HOST_FORM: key = ICCProperties.DB_HOST; break; case DB_PORT_FORM: key = ICCProperties.DB_PORT; break; case DB_USER_FORM: key = ICCProperties.DB_USER; break; case DB_PW_FORM: key = ICCProperties.DB_PW; break; case DB_NAME_FORM: key = ICCProperties.DB_NAME; break; case CC_PORT_FORM: key = ICCProperties.CC_PORT; break; case CC_NAME_FORM: key = ICCProperties.CC_NAME; break; case CC_USER_FORM: key = ICCProperties.CC_USER; break; case CC_PW_FORM: key = ICCProperties.CC_PW; break; case REPO_SCAN_FORM: key = ICCProperties.REPO_SCAN; break; case REPO_INDEXER_FORM: key = ICCProperties.REPO_INDEXER; break; case REPO_PROVIDER_FORM: key = ICCProperties.REPO_PROVIDER; break; case REPO_BASEDIR_FORM: key = ICCProperties.REPO_BASEDIR; break; case REPO_BASEURL_FORM: key = ICCProperties.REPO_BASEURL; break; case REPO_AWS_BUCKET_FORM: key = ICCProperties.REPO_AWS_BUCKET; break; case REPO_AWS_ACCESS_KEY_FORM: key = ICCProperties.REPO_AWS_ACCESS_KEY; break; case REPO_AWS_SECRET_KEY_FORM: key = ICCProperties.REPO_AWS_SECRET_KEY; break; } if ((key != null) && (entry.getValue().get(0) != null) && !entry.getValue().get(0).isEmpty()) { props.setProperty(key, entry.getValue().get(0)); } } return props; } @Override public RenderedUI progressView() { CSViewModel view = new CSViewModel("install/progress"); return view.render(); } @Override public InputStream getCSS(String css) { return this.getClass().getResourceAsStream("/web/css/" + css); } @Override public InputStream getBSCSS(String css) { return this.getClass().getResourceAsStream("/web/bootstrap/css/" + css); } @Override public InputStream getImage(String img) { return this.getClass().getResourceAsStream("/web/images/" + img); } @Override public InputStream getJS(String js) { return this.getClass().getResourceAsStream("/web/js/" + js); } @Override public InputStream getBSJS(String js) { return this.getClass().getResourceAsStream("/web/bootstrap/js/" + js); } @Override public InputStream getBSFonts(String font) { return this.getClass().getResourceAsStream("/web/bootstrap/fonts/" + font); } protected MessageContext mc; @Override public void setMessageContext(MessageContext context) { this.mc = context; } protected Boolean hasError() { if (this.mc.getHttpServletRequest().getParameter(FormErrorExceptionHander.REQUEST_ERROR_PARAM) != null) { return this.mc.getHttpServletRequest().getParameter(FormErrorExceptionHander.REQUEST_ERROR_PARAM).equals("true"); } return false; } }