package de.cinovo.cloudconductor.server.web.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import de.cinovo.cloudconductor.server.comparators.PackageComparator;
import de.cinovo.cloudconductor.server.dao.IPackageDAO;
import de.cinovo.cloudconductor.server.dao.IPackageVersionDAO;
import de.cinovo.cloudconductor.server.dao.IServiceDAO;
import de.cinovo.cloudconductor.server.dao.IServiceDefaultStateDAO;
import de.cinovo.cloudconductor.server.dao.ITemplateDAO;
import de.cinovo.cloudconductor.server.model.EPackage;
import de.cinovo.cloudconductor.server.model.EPackageVersion;
import de.cinovo.cloudconductor.server.model.EService;
import de.cinovo.cloudconductor.server.model.EServiceDefaultState;
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.IPackages;
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 PackagesImpl extends AWebPage implements IPackages {
@Autowired
protected IPackageDAO dPkg;
@Autowired
protected IServiceDAO dSvc;
@Autowired
protected IPackageVersionDAO dVersion;
@Autowired
protected ITemplateDAO dTemplate;
@Autowired
private IServiceDefaultStateDAO dSvcDefState;
@Override
protected String getTemplateFolder() {
return "packages";
}
@Override
protected SidebarType getSidebarType() {
return SidebarType.ALPHABETICAL;
}
@Override
protected void init() {
this.navRegistry.registerSubMenu(NavbarHardLinks.config, this.getNavElementName(), IPackages.ROOT);
this.addBreadCrumb(IWebPath.WEBROOT + IPackages.ROOT, "Packages");
}
@Override
protected String getNavElementName() {
return "Packages";
}
@Override
@Transactional
public RenderedUI view() {
List<EPackage> packageList = this.dPkg.findList();
List<EService> serviceList = this.dSvc.findList();
Multimap<String, EService> serviceMap = ArrayListMultimap.create();
Multimap<String, EPackageVersion> versionMap = ArrayListMultimap.create();
Collections.sort(packageList, new PackageComparator());
for (EPackage pkg : packageList) {
this.addSidebarElement(pkg.getName());
for (EPackageVersion version : pkg.getRPMs()) {
versionMap.put(pkg.getName(), version);
}
for (EService s : serviceList) {
if (s.getPackages().contains(pkg)) {
serviceMap.put(pkg.getName(), s);
}
}
}
CSViewModel view = this.createView();
view.addModel("PACKAGES", packageList);
view.addModel("SERVICES", serviceMap);
view.addModel("VERSIONS", versionMap);
return view.render();
}
@Override
@Transactional
public RenderedUI addPackageView(String pname, Long versionid) {
RESTAssert.assertNotEmpty(pname);
RESTAssert.assertNotNull(versionid);
EPackageVersion version = this.dVersion.findById(versionid);
List<ETemplate> templates = this.dTemplate.findList();
List<ETemplate> ts = new ArrayList<>();
for (ETemplate temp : templates) {
if (temp.getPackageVersions().contains(version)) {
continue;
}
ts.add(temp);
}
this.sortNamedList(ts);
// Fill template with models and return.
final CSViewModel vm = this.createModal("mInstallPackage");
vm.addModel("templates", ts);
vm.addModel("version", version);
return vm.render();
}
@Override
@Transactional
public AjaxAnswer addPackage(String pname, Long versionId, String[] templates) throws FormErrorException {
RESTAssert.assertNotEmpty(pname);
RESTAssert.assertNotNull(versionId);
if ((templates == null) || (templates.length < 1)) {
throw this.createError("Please select at least one template.");
}
EPackageVersion pv = this.dVersion.findById(versionId);
List<EService> services = this.dSvc.findList();
for (String temp : templates) {
ETemplate t = this.dTemplate.findByName(temp);
if (t.getPackageVersions() == null) {
t.setPackageVersions(new ArrayList<EPackageVersion>());
}
// check if package exists remove old rpm
for (EPackageVersion existing : t.getPackageVersions()) {
if (existing.getPkg().equals(pv.getPkg())) {
t.getPackageVersions().remove(existing);
break;
}
}
t.getPackageVersions().add(pv);
this.dTemplate.save(t);
// update default service list
for (EService s : services) {
if (s.getPackages().contains(pv.getPkg())) {
this.setDefaultService(s, t);
break;
}
}
}
return new AjaxAnswer(IWebPath.WEBROOT + IPackages.ROOT);
}
private void setDefaultService(EService service, ETemplate template) {
EServiceDefaultState sds = this.dSvcDefState.findByName(service.getName(), template.getName());
if (sds == null) {
sds = new EServiceDefaultState();
sds.setService(service);
sds.setTemplate(template);
this.dSvcDefState.save(sds);
}
}
@Override
@Transactional
public RenderedUI addServiceView(String pname) {
RESTAssert.assertNotEmpty(pname);
EPackage pkg = this.dPkg.findByName(pname);
List<EService> serviceList = new ArrayList<>();
for (EService s : this.dSvc.findList()) {
if (!s.getPackages().contains(pkg)) {
serviceList.add(s);
}
}
// Fill template with models and return.
this.sortNamedList(serviceList);
final CSViewModel modal = this.createModal("mAddService");
modal.addModel("services", serviceList);
modal.addModel("packageName", pname);
return modal.render();
}
@Override
@Transactional
public AjaxAnswer addService(String pname, String[] services) throws FormErrorException {
RESTAssert.assertNotEmpty(pname);
if ((services == null) || (services.length < 1)) {
throw this.createError("Please select at least one service.");
}
EPackage pkg = this.dPkg.findByName(pname);
for (String service : services) {
EService eservice = this.dSvc.findByName(service);
eservice.getPackages().add(pkg);
this.dSvc.save(eservice);
}
return new AjaxAnswer(IWebPath.WEBROOT + IPackages.ROOT + "#" + pname);
}
@Override
@Transactional
public RenderedUI newServiceView(String pname) {
CSViewModel modal = this.createModal("mNewService");
modal.addModel("packageName", pname);
return modal.render();
}
@Override
@Transactional
public AjaxAnswer newService(String pname, String servicename, String initscript, String description) throws FormErrorException {
RESTAssert.assertNotEmpty(pname);
String errorMessage = "Please fill in all the information.";
FormErrorException error = null;
// servicename and initscript are needed, description not!
error = this.checkForEmpty(servicename, errorMessage, error, "servicename");
error = this.checkForEmpty(initscript, errorMessage, error, "initscript");
if (error != null) {
// add the currently entered values to the answer
error.addFormParam("servicename", servicename);
error.addFormParam("initscript", initscript);
error.addFormParam("description", description);
throw error;
}
EPackage pkg = this.dPkg.findByName(pname);
EService service = new EService();
service.setName(servicename);
service.setInitScript(initscript);
service.setDescription(description);
service.getPackages().add(pkg);
service = this.dSvc.save(service);
return new AjaxAnswer(IWebPath.WEBROOT + IPackages.ROOT + "#" + pname);
}
@Override
@Transactional
public RenderedUI deleteServiceView(String pname, String sname) {
CSViewModel modal = this.createModal("mDeleteService");
modal.addModel("packageName", pname);
modal.addModel("serviceName", sname);
return modal.render();
}
@Override
@Transactional
public AjaxAnswer deleteService(String pname, String sname) {
RESTAssert.assertNotEmpty(pname);
RESTAssert.assertNotEmpty(sname);
EPackage pkgVersion = this.dPkg.findByName(pname);
EService service = this.dSvc.findByName(sname);
service.getPackages().remove(pkgVersion);
this.dSvc.save(service);
return new AjaxAnswer(IWebPath.WEBROOT + IPackages.ROOT + "#" + pname);
}
}