package de.cinovo.cloudconductor.server.web.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import de.cinovo.cloudconductor.server.dao.IDirectoryDAO; import de.cinovo.cloudconductor.server.dao.IPackageDAO; import de.cinovo.cloudconductor.server.dao.IServiceDAO; import de.cinovo.cloudconductor.server.dao.ITemplateDAO; import de.cinovo.cloudconductor.server.model.EDirectory; import de.cinovo.cloudconductor.server.model.EPackage; import de.cinovo.cloudconductor.server.model.EService; import de.cinovo.cloudconductor.server.model.ETemplate; 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.IDirectories; 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 jawe09 * */ public class DirectoriesImpl extends AWebPage implements IDirectories { @Autowired protected IDirectoryDAO dDirectory; @Autowired protected ITemplateDAO dTemplate; @Autowired protected IPackageDAO dPackage; @Autowired private IServiceDAO dService; @Override protected String getTemplateFolder() { return "directories"; } @Override protected void init() { this.navRegistry.registerSubMenu(NavbarHardLinks.config, this.getNavElementName(), IDirectories.ROOT); this.addBreadCrumb(IWebPath.WEBROOT + IDirectories.ROOT, this.getNavElementName()); this.addTopAction(IWebPath.WEBROOT + IDirectories.ROOT + IWebPath.ACTION_ADD, "Create new Directory"); this.addViewType("default", "Default", true); this.addViewType("template", "by Template", false); } @Override protected SidebarType getSidebarType() { return SidebarType.ALPHABETICAL; } @Override protected String getNavElementName() { return "Directories"; } @Override @Transactional public RenderedUI view(String viewtype, String[] filter) { this.clearFilter(); if ((viewtype != null) && viewtype.equals(IDirectories.TEMPLATE_FILTER)) { return this.templateView(); } return this.defaultView(filter); } @Transactional private RenderedUI defaultView(String[] filter) { List<EDirectory> daodirectories = this.dDirectory.findList(); List<EDirectory> directories = new ArrayList<>(); for (EDirectory d : daodirectories) { this.addSidebarElement(d.getName()); directories.add(d); } this.addSidebarElements(directories); List<ETemplate> templates = this.dTemplate.findList(); this.sortNamedList(directories); CSViewModel view = this.createView(); view.addModel("DIRECTORIES", directories); view.addModel("TEMPLATES", templates); return view.render(); } @Transactional private RenderedUI templateView() { List<EDirectory> directories = this.dDirectory.findList(); for (EDirectory d : directories) { this.addSidebarElement(d.getName()); } this.addSidebarElements(directories); List<ETemplate> templates = this.dTemplate.findList(); this.sortNamedList(directories); CSViewModel view; view = this.createView("viewTemplate"); view.addModel("SIDEBARTYPE", null); view.addModel("DIRECTORIES", directories); view.addModel("TEMPLATES", templates); return view.render(); } @Override @Transactional public RenderedUI newDirectoryView() { List<EPackage> packages = this.dPackage.findList(); this.sortNamedList(packages); List<EService> services = this.dService.findList(); this.sortNamedList(services); List<ETemplate> templates = this.dTemplate.findList(); this.sortNamedList(templates); CSViewModel modal = this.createModal("mModDirectory"); modal.addModel("PACKAGES", packages); modal.addModel("SERVICES", services); modal.addModel("TEMPLATES", templates); return modal.render(); } @Override @Transactional public RenderedUI editDirectoryView(String name) { RESTAssert.assertNotEmpty(name); EDirectory oldDirectory = this.dDirectory.findByName(name); List<EPackage> packages = this.dPackage.findList(); List<EService> services = this.dService.findList(); this.sortNamedList(services); this.sortNamedList(packages); List<ETemplate> templates = this.dTemplate.findList(); this.sortNamedList(templates); CSViewModel modal = this.createModal("mModDirectory"); modal.addModel("DIRECTORY", oldDirectory); modal.addModel("PACKAGES", packages); modal.addModel("SERVICES", services); modal.addModel("TEMPLATES", templates); return modal.render(); } @Override public RenderedUI deleteDirectoryView(String name) { RESTAssert.assertNotEmpty(name); EDirectory directory = this.dDirectory.findByName(name); CSViewModel modal = this.createModal("mDeleteDirectory"); modal.addModel("DIRECTORY", directory); return modal.render(); } @Override @Transactional public RenderedUI deleteDirectoryFromTemplateView(String name, String template) { RESTAssert.assertNotEmpty(name); RESTAssert.assertNotEmpty(template); ETemplate t = this.dTemplate.findByName(template); RESTAssert.assertNotNull(t); EDirectory directory = this.dDirectory.findByName(name); RESTAssert.assertNotNull(directory); CSViewModel modal = this.createModal("mDeleteDirectoryFromTemplate"); modal.addModel("DIRECTORY", directory); modal.addModel("TEMPLATE", t); return modal.render(); } @Override @Transactional public RenderedUI addDirectoryToTemplateView(String template) { RESTAssert.assertNotEmpty(template); ETemplate t = this.dTemplate.findByName(template); RESTAssert.assertNotNull(t); CSViewModel modal = this.createModal("mAddDirectory"); List<EDirectory> directories = this.dDirectory.findList(); modal.addModel("DIRECTORIES", directories); modal.addModel("TEMPLATE", t); return modal.render(); } @Override @Transactional public RenderedUI addTemplateToDirectoryView(String directory) { RESTAssert.assertNotEmpty(directory); EDirectory f = this.dDirectory.findByName(directory); RESTAssert.assertNotNull(f); CSViewModel modal = this.createModal("mAddTemplate"); List<ETemplate> templates = this.dTemplate.findList(); modal.addModel("DIRECTORY", f); modal.addModel("TEMPLATES", templates); return modal.render(); } @Override @Transactional public AjaxAnswer saveDirectory(String oldname, String newname, String owner, String group, String mode, String targetPath, String depPackage, String[] depServices, String[] templates) throws FormErrorException { RESTAssert.assertNotEmpty(oldname); EDirectory dir = this.dDirectory.findByName(oldname); // Form error handling FormErrorException error = null; error = this.assertNotEmpty(newname, error, "name"); error = this.assertNotEmpty(owner, error, "owner"); error = this.assertNotEmpty(group, error, "group"); error = this.assertNotEmpty(mode, error, "mode"); error = this.assertNotEmpty(targetPath, error, "targetPath"); error = this.assertNotEmpty(owner, error, "owner"); if (!oldname.equals(newname) && (this.dDirectory.findByName(newname) != null)) { error = error == null ? this.createError("The service name already exists.") : error; error.addElementError("name", true); } if ((newname != null) && !newname.isEmpty() && newname.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", newname); error.addFormParam("owner", owner); error.addFormParam("group", group); error.addFormParam("mode", mode); error.addFormParam("targetPath", targetPath); error.addFormParam("depPackage", depPackage); error.addFormParam("depServices", Arrays.asList(depServices)); error.addFormParam("templates", templates); if (oldname.equals("0")) { error.setParentUrl(IDirectories.ROOT, IWebPath.ACTION_ADD); } else { error.setParentUrl(IDirectories.ROOT, oldname, IWebPath.ACTION_EDIT); } throw error; } // save process if (dir == null) { dir = new EDirectory(); dir.setDependentServices(new ArrayList<EService>()); } dir.setName(newname); dir.setOwner(owner); dir.setGroup(group); dir.setFileMode(mode); dir.setTargetPath(targetPath); dir.setPkg(this.dPackage.findByName(depPackage)); if (depServices.length > 0) { Set<EService> notfound = new HashSet<>(dir.getDependentServices()); for (String service : depServices) { EService eservice = this.dService.findByName(service); if (!dir.getDependentServices().contains(eservice)) { dir.getDependentServices().add(eservice); } notfound.remove(eservice); } dir.getDependentServices().removeAll(notfound); } else { dir.getDependentServices().clear(); } dir = this.dDirectory.save(dir); List<ETemplate> notfound = this.dTemplate.findList(); for (String template : templates) { ETemplate temp = this.dTemplate.findByName(template); if (!temp.getDirectory().contains(dir)) { temp.getDirectory().add(dir); this.dTemplate.save(temp); } notfound.remove(temp); } for (ETemplate template : notfound) { if (template.getDirectory().contains(dir)) { template.getDirectory().remove(dir); this.dTemplate.save(template); } } return new AjaxAnswer(IWebPath.WEBROOT + IDirectories.ROOT, this.getCurrentViewType()); } @Override @Transactional public AjaxAnswer deleteDirectory(String name) { RESTAssert.assertNotEmpty(name); EDirectory dir = this.dDirectory.findByName(name); if (dir == null) { return new AjaxAnswer(IWebPath.WEBROOT + IDirectories.ROOT); } this.dDirectory.delete(dir); this.removeSidebarElement(name); return new AjaxAnswer(IWebPath.WEBROOT + IDirectories.ROOT); } @Override @Transactional public AjaxAnswer deleteDirectoryFromTemplate(String name, String template) { RESTAssert.assertNotEmpty(template); RESTAssert.assertNotEmpty(name); ETemplate t = this.dTemplate.findByName(template); EDirectory dir = this.dDirectory.findByName(name); if (t.getDirectory().contains(dir)) { t.getDirectory().remove(dir); this.dTemplate.save(t); } // Fill template with models and return. return new AjaxAnswer(IWebPath.WEBROOT + IDirectories.ROOT, IDirectories.TEMPLATE_FILTER + "#" + template); } @Override @Transactional public AjaxAnswer addDirectoryToTemplate(String[] name, String template) { RESTAssert.assertNotEmpty(template); ETemplate t = this.dTemplate.findByName(template); for (String directory : name) { EDirectory d = this.dDirectory.findByName(directory); t.getDirectory().add(d); this.dTemplate.save(t); } return new AjaxAnswer(IWebPath.WEBROOT + IDirectories.ROOT, IDirectories.TEMPLATE_FILTER + "#" + template); } @Override @Transactional public AjaxAnswer addTemplateToDirectory(String[] template, String name) { RESTAssert.assertNotEmpty(name); EDirectory d = this.dDirectory.findByName(name); for (String temp : template) { ETemplate t = this.dTemplate.findByName(temp); t.getDirectory().add(d); this.dTemplate.save(t); } return new AjaxAnswer(IWebPath.WEBROOT + IDirectories.ROOT, IDirectories.TEMPLATE_FILTER + "#" + template); } }