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.ISSHKeyDAO;
import de.cinovo.cloudconductor.server.dao.ITemplateDAO;
import de.cinovo.cloudconductor.server.model.ESSHKey;
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.interfaces.ISSHKey;
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 SSHKeyImpl extends AWebPage implements ISSHKey {
@Autowired
private ISSHKeyDAO dSSH;
@Autowired
private ITemplateDAO dTemplate;
@Override
protected String getTemplateFolder() {
return "ssh";
}
@Override
protected void init() {
this.navRegistry.registerSubMenu(NavbarHardLinks.config, this.getNavElementName(), ISSHKey.ROOT);
this.addBreadCrumb(IWebPath.WEBROOT + ISSHKey.ROOT, this.getNavElementName());
this.addTopAction(IWebPath.WEBROOT + ISSHKey.ROOT + IWebPath.ACTION_ADD, "Create new Key");
this.addViewType("default", "Default", true);
this.addViewType("template", "by Template", false);
}
@Override
protected String getNavElementName() {
return "SSH Keys";
}
@Override
@Transactional
public RenderedUI view(String viewtype) {
List<ESSHKey> keys = this.dSSH.findList();
List<ETemplate> templates = this.dTemplate.findList();
this.sortNamedList(keys);
CSViewModel view;
if ((viewtype != null) && viewtype.equals("template")) {
view = this.createView("viewTemplate");
view.addModel("SIDEBARTYPE", null);
} else {
view = this.createView();
}
view.addModel("KEYS", keys);
view.addModel("TEMPLATES", templates);
return view.render();
}
@Override
@Transactional
public RenderedUI addTemplateView(String owner) {
RESTAssert.assertNotEmpty(owner);
ESSHKey key = this.dSSH.findByOwner(owner);
RESTAssert.assertNotNull(key);
List<ETemplate> templates = this.dTemplate.findList();
final CSViewModel model = this.createModal("mAddTemplate");
model.addModel("KEY", key);
model.addModel("TEMPLATES", templates);
return model.render();
}
@Override
@Transactional
public RenderedUI addKeyView(String template) {
RESTAssert.assertNotEmpty(template);
ETemplate t = this.dTemplate.findByName(template);
RESTAssert.assertNotNull(t);
CSViewModel modal = this.createModal("mAddKey");
modal.addModel("KEYS", this.dSSH.findList());
modal.addModel("TEMPLATE", t);
return modal.render();
}
@Override
@Transactional
public RenderedUI deleteTemplateView(String owner, String tname) {
RESTAssert.assertNotEmpty(owner);
ESSHKey key = this.dSSH.findByOwner(owner);
RESTAssert.assertNotNull(key);
ETemplate template = this.dTemplate.findByName(tname);
RESTAssert.assertNotNull(template);
CSViewModel modal = this.createModal("mDeleteTemplate");
modal.addModel("KEY", key);
modal.addModel("TEMPLATE", template);
return modal.render();
}
@Override
@Transactional
public RenderedUI deleteView(String owner) {
RESTAssert.assertNotEmpty(owner);
ESSHKey key = this.dSSH.findByOwner(owner);
RESTAssert.assertNotNull(key);
CSViewModel modal = this.createModal("mDeleteKey");
modal.addModel("KEY", key);
return modal.render();
}
@Override
@Transactional
public RenderedUI editView(String owner) {
RESTAssert.assertNotEmpty(owner);
ESSHKey key = this.dSSH.findByOwner(owner);
RESTAssert.assertNotNull(key);
CSViewModel modal = this.prepareView();
modal.addModel("KEY", key);
return modal.render();
}
private CSViewModel prepareView() {
List<ETemplate> templates = this.dTemplate.findList();
CSViewModel modal = this.createModal("mModKey");
modal.addModel("TEMPLATES", templates);
return modal;
}
@Override
@Transactional
public RenderedUI addView() {
CSViewModel modal = this.prepareView();
return modal.render();
}
@Override
@Transactional
public AjaxAnswer save(String oldOwner, String owner, String key, String[] templates) throws FormErrorException {
// Form error handling
FormErrorException error = null;
error = this.assertNotEmpty(owner, error, "owner");
error = this.assertNotEmpty(key, error, "key_content");
if (error != null) {
error.addFormParam("owner", owner);
error.addFormParam("key_content", key);
error.addFormParam("templates", Arrays.asList(templates));
if (oldOwner.equals("0")) {
error.setParentUrl(ISSHKey.ROOT, IWebPath.ACTION_ADD);
} else {
error.setParentUrl(ISSHKey.ROOT, oldOwner, IWebPath.ACTION_EDIT);
}
throw error;
}
ESSHKey ekey = this.dSSH.findByOwner(oldOwner);
if (ekey == null) {
ekey = new ESSHKey();
}
ekey.setName(owner);
ekey.setOwner(owner);
ekey.setKeycontent(key);
ekey = this.dSSH.save(ekey);
List<ETemplate> etemplates = this.dTemplate.findList();
List<String> tls = Arrays.asList(templates);
for (ETemplate template : etemplates) {
if (tls.contains(template.getName())) {
if (!template.getSshkeys().contains(ekey)) {
template.getSshkeys().add(ekey);
this.dTemplate.save(template);
}
} else if (template.getSshkeys().contains(ekey)) {
template.getSshkeys().remove(ekey);
this.dTemplate.save(template);
}
}
return new AjaxAnswer(IWebPath.WEBROOT + ISSHKey.ROOT);
}
@Override
@Transactional
public AjaxAnswer addTemplate(String owner, String[] templates) {
RESTAssert.assertNotEmpty(owner);
ESSHKey key = this.dSSH.findByOwner(owner);
RESTAssert.assertNotNull(key);
for (String template : templates) {
ETemplate t = this.dTemplate.findByName(template);
t.getSshkeys().add(key);
this.dTemplate.save(t);
}
return new AjaxAnswer(IWebPath.WEBROOT + ISSHKey.ROOT, "default");
}
@Override
@Transactional
public AjaxAnswer addKey(String template, String[] keys) {
RESTAssert.assertNotEmpty(template);
ETemplate t = this.dTemplate.findByName(template);
for (String key : keys) {
ESSHKey ssh = this.dSSH.findByOwner(key);
t.getSshkeys().add(ssh);
this.dTemplate.save(t);
}
return new AjaxAnswer(IWebPath.WEBROOT + ISSHKey.ROOT, "template");
}
@Override
@Transactional
public AjaxAnswer deleteTemplate(String owner, String tname) {
RESTAssert.assertNotEmpty(tname);
ETemplate template = this.dTemplate.findByName(tname);
ESSHKey key = this.dSSH.findByOwner(owner);
if (template.getSshkeys().contains(key)) {
template.getSshkeys().remove(key);
this.dTemplate.save(template);
}
return new AjaxAnswer(IWebPath.WEBROOT + ISSHKey.ROOT, "template");
}
@Override
@Transactional
public AjaxAnswer delete(String owner) {
RESTAssert.assertNotEmpty(owner);
ESSHKey key = this.dSSH.findByOwner(owner);
this.dSSH.delete(key);
return new AjaxAnswer(IWebPath.WEBROOT + ISSHKey.ROOT);
}
}