package de.cinovo.cloudconductor.server.web.impl; import java.util.Arrays; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import de.cinovo.cloudconductor.server.dao.IPackageDAO; import de.cinovo.cloudconductor.server.dao.IServiceDAO; import de.cinovo.cloudconductor.server.model.EPackage; import de.cinovo.cloudconductor.server.model.EService; import de.cinovo.cloudconductor.server.util.exception.FormErrorException; import de.cinovo.cloudconductor.server.web.CSViewModel; import de.cinovo.cloudconductor.server.web.helper.AWebPage; import de.cinovo.cloudconductor.server.web.helper.AjaxAnswer; import de.cinovo.cloudconductor.server.web.helper.NavbarHardLinks; import de.cinovo.cloudconductor.server.web.helper.SidebarType; import de.cinovo.cloudconductor.server.web.interfaces.IServices; import de.cinovo.cloudconductor.server.web.interfaces.IWebPath; import de.taimos.cxf_renderer.model.RenderedUI; import de.taimos.restutils.RESTAssert; /** * Copyright 2014 Cinovo AG<br> * <br> * * @author psigloch * */ public class ServiceImpl extends AWebPage implements IServices { @Autowired private IServiceDAO dService; @Autowired private IPackageDAO dPackage; @Override protected String getTemplateFolder() { return "services"; } @Override protected void init() { this.navRegistry.registerSubMenu(NavbarHardLinks.config, this.getNavElementName(), IServices.ROOT); this.addBreadCrumb(IWebPath.WEBROOT + IServices.ROOT, this.getNavElementName()); this.addTopAction(IWebPath.WEBROOT + IServices.ROOT + IWebPath.ACTION_ADD, "Create new Service"); } @Override protected SidebarType getSidebarType() { return SidebarType.ALPHABETICAL; } @Override protected String getNavElementName() { return "Services"; } @Override @Transactional public RenderedUI view() { List<EService> services = this.dService.findList(); for (EService svc : services) { this.addSidebarElement(svc.getName()); svc.getPackages().size(); } this.sortNamedList(services); CSViewModel view = this.createView(); view.addModel("SERVICES", services); return view.render(); } @Override public RenderedUI newServiceView() { CSViewModel modal = this.createModal("mModService"); List<EPackage> packages = this.dPackage.findList(); this.sortNamedList(packages); modal.addModel("PACKAGES", packages); return modal.render(); } @Override @Transactional public RenderedUI editServiceView(String service) { RESTAssert.assertNotEmpty(service); CSViewModel modal = this.createModal("mModService"); EService svc = this.dService.findByName(service); RESTAssert.assertNotNull(svc); svc.getPackages().size(); List<EPackage> packages = this.dPackage.findList(); this.sortNamedList(packages); modal.addModel("SERVICE", svc); modal.addModel("PACKAGES", packages); return modal.render(); } @Override public RenderedUI deleteServiceView(String service) { RESTAssert.assertNotEmpty(service); CSViewModel modal = this.createModal("mDeleteService"); modal.addModel("SERVICE", this.dService.findByName(service)); return modal.render(); } @Override public RenderedUI deletePackageView(String service, String pkg) { RESTAssert.assertNotEmpty(service); RESTAssert.assertNotEmpty(pkg); CSViewModel modal = this.createModal("mDeletePackage"); modal.addModel("SERVICE", this.dService.findByName(service)); modal.addModel("PACKAGE", this.dPackage.findByName(pkg)); return modal.render(); } @Override public RenderedUI addPackageView(String service) { RESTAssert.assertNotEmpty(service); EService svc = this.dService.findByName(service); List<EPackage> pkgs = this.dPackage.findNotUsedPackage(svc); this.sortNamedList(pkgs); CSViewModel modal = this.createModal("mAddPackage"); modal.addModel("SERVICE", svc); modal.addModel("PACKAGES", pkgs); return modal.render(); } @Override public AjaxAnswer deleteService(String service) throws FormErrorException { RESTAssert.assertNotEmpty(service); EService svc = this.dService.findByName(service); this.dService.delete(svc); return new AjaxAnswer(IWebPath.WEBROOT + IServices.ROOT); } @Override public AjaxAnswer deletePackage(String service, String pkg) throws FormErrorException { EPackage pkgVersion = this.dPackage.findByName(pkg); EService svc = this.dService.findByName(service); svc.getPackages().remove(pkgVersion); this.dService.save(svc, "Removed package " + pkg + " from service " + svc.getName()); return new AjaxAnswer(IWebPath.WEBROOT + IServices.ROOT); } @Override public AjaxAnswer addPackage(String service, String[] pkgs) throws FormErrorException { RESTAssert.assertNotEmpty(service); if ((pkgs == null) || (pkgs.length < 1)) { throw this.createError("Please select at least one package."); } EService svc = this.dService.findByName(service); for (String pkg : pkgs) { EPackage ep = this.dPackage.findByName(pkg); if (ep != null) { svc.getPackages().add(ep); this.dService.save(svc); } } return new AjaxAnswer(IWebPath.WEBROOT + IServices.ROOT); } @Override public AjaxAnswer saveService(String service, String newservice, String initscript, String description, String[] pkgs) throws FormErrorException { RESTAssert.assertNotNull(service); RESTAssert.assertNotEmpty(newservice); RESTAssert.assertNotEmpty(initscript); RESTAssert.assertNotEmpty(description); FormErrorException error = null; error = this.assertNotEmpty(newservice, error, "name"); error = this.assertNotEmpty(initscript, error, "script"); error = this.assertNotEmpty(initscript, error, description); if (!service.equals(newservice) && (this.dService.findByName(newservice) != null)) { error = error == null ? this.createError("The service name already exists.") : error; error.addElementError("name", true); } if ((newservice != null) && !newservice.isEmpty() && newservice.contains(" ")) { error = error == null ? this.createError("The service name may not contain spaces.") : error; error.addElementError("name", true); } if (error != null) { // add the currently entered values to the answer error.addFormParam("name", newservice); error.addFormParam("script", initscript); error.addFormParam("description", description); error.addFormParam("pkgs", Arrays.asList(pkgs)); error.setParentUrl(IServices.ROOT, service, IWebPath.ACTION_EDIT); if (service.equals("0")) { error.setParentUrl(IServices.ROOT, IWebPath.ACTION_ADD); } throw error; } EService svc = this.dService.findByName(service); if (svc == null) { svc = new EService(); } svc.setName(newservice); svc.setInitScript(initscript); svc.setDescription(description); svc.getPackages().clear(); if (pkgs != null) { for (String pname : pkgs) { EPackage pkg = this.dPackage.findByName(pname); svc.getPackages().add(pkg); } } svc = this.dService.save(svc); return new AjaxAnswer(IWebPath.WEBROOT + IServices.ROOT); } }