package de.cinovo.cloudconductor.server.web.impl;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import javax.servlet.http.HttpSession;
import de.cinovo.cloudconductor.server.dao.*;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import de.cinovo.cloudconductor.api.ServiceState;
import de.cinovo.cloudconductor.server.model.EHost;
import de.cinovo.cloudconductor.server.model.EPackageState;
import de.cinovo.cloudconductor.server.model.EPackageVersion;
import de.cinovo.cloudconductor.server.model.EServiceState;
import de.cinovo.cloudconductor.server.model.ETemplate;
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.interfaces.IIndex;
import de.cinovo.cloudconductor.server.web.interfaces.IWebPath;
import de.taimos.cxf_renderer.model.RenderedUI;
/**
* Copyright 2014 Cinovo AG<br>
* <br>
*
* @author psigloch
*
*/
public class IndexImpl extends AWebPage implements IIndex {
/** */
public static final String AUTOREFRESH = "AUTOREFRESH";
@Autowired
protected IAdditionalLinksDAO dLinks;
@Autowired
protected ITemplateDAO dTemplate;
@Autowired
protected IHostDAO dHost;
@Autowired
protected IServiceStateDAO dSvcState;
@Autowired
protected IPackageDAO dPkg;
@Autowired
protected IServiceDAO dSvc;
@Autowired
protected IFileDAO dFile;
@Autowired
protected ISSHKeyDAO dSSH;
@Autowired
protected IDirectoryDAO ddir;
@Override
public void init() {
this.navRegistry.registerMainMenu(this.getNavElementName(), IWebPath.DEFAULTVIEW);
}
@Override
protected String getNavElementName() {
return "Home";
}
@Override
public InputStream getCSS(String css) {
return this.getClass().getResourceAsStream("/webres/css/" + css);
}
@Override
public InputStream getBSCSS(String css) {
return this.getClass().getResourceAsStream("/webres/bootstrap/css/" + css);
}
@Override
public InputStream getImage(String img) {
return this.getClass().getResourceAsStream("/webres/images/" + img);
}
@Override
public InputStream getJS(String js) {
return this.getClass().getResourceAsStream("/webres/js/" + js);
}
@Override
public InputStream getBSJS(String js) {
return this.getClass().getResourceAsStream("/webres/bootstrap/js/" + js);
}
@Override
public InputStream getBSFonts(String font) {
return this.getClass().getResourceAsStream("/webres/bootstrap/fonts/" + font);
}
@Override
protected String getTemplateFolder() {
return "start";
}
@Override
@Transactional
public RenderedUI view() {
List<EHost> hostList = this.dHost.findList();
List<ETemplate> templateList = this.dTemplate.findList();
CSViewModel view = this.createView();
view.addModel("LINKLIST", this.dLinks.findList());
view.addModel("TEMPLATELIST", this.getTemplateList(templateList));
view.addModel("HOSTLIST", this.getHostWatch(hostList));
view.addModel("SERCVICELIST", this.getServiceWatch());
view.addModel("HOSTCOUNT", hostList.size());
view.addModel("PACKAGECOUNT", this.dPkg.count());
view.addModel("SERVICECOUNT", this.dSvc.count());
view.addModel("FILECOUNT", this.dFile.count());
view.addModel("SSHKEYCOUNT", this.dSSH.count());
view.addModel("DIRCOUNT", this.ddir.count());
return view.render();
}
private List<Entry<String, String>> getTemplateList(List<ETemplate> templateList) {
HashMap<String, String> result = new HashMap<>();
for (ETemplate t : templateList) {
result.put(t.getName(), String.valueOf(t.getHosts().size()));
}
return this.sortMap(result);
}
private List<Entry<String, String[]>> getHostWatch(List<EHost> hostList) {
HashMap<String, String[]> result = new HashMap<>();
for (EHost h : hostList) {
DateTime now = new DateTime();
String[] error = new String[2];
if (now.minusMinutes(15).getMillis() > h.getLastSeen()) {
error[0] = "offline";
}
if (!this.hostInSync(h)) {
error[1] = "not synced";
}
if (error.length < 1) {
result.put(h.getName(), error);
}
}
return this.sortMap(result);
}
private boolean hostInSync(EHost h) {
List<EPackageVersion> trpms = h.getTemplate().getPackageVersions();
if ((h.getPackages() == null) || h.getPackages().isEmpty()) {
return false;
}
for (EPackageState hpkg : h.getPackages()) {
if (!trpms.contains(hpkg.getVersion())) {
return false;
}
}
for (EPackageVersion v : trpms) {
boolean found = false;
for (EPackageState hpkg : h.getPackages()) {
if (v.equals(hpkg.getVersion())) {
found = true;
continue;
}
}
if (!found) {
return false;
}
}
return true;
}
private List<Entry<String, ServiceState>> getServiceWatch() {
HashMap<String, ServiceState> result = new HashMap<>();
for (EServiceState ss : this.dSvcState.findList()) {
switch (ss.getState()) {
case RESTARTING_STARTING:
case RESTARTING_STOPPING:
case STARTING:
if (result.get(ss.getService().getName()) == ServiceState.STOPPED) {
result.put(ss.getService().getName(), ServiceState.STARTING);
}
break;
case STOPPED:
case STOPPING:
if (result.get(ss.getService().getName()) == null) {
result.put(ss.getService().getName(), ServiceState.STOPPED);
}
break;
default:
break;
}
}
return this.sortMap(result);
}
@Override
public AjaxAnswer toggleAutoRefresh() {
final HttpSession session = this.mc.getHttpServletRequest().getSession();
Boolean val = (Boolean) session.getAttribute(IndexImpl.AUTOREFRESH);
if (val == null) {
session.setAttribute(IndexImpl.AUTOREFRESH, true);
} else {
session.setAttribute(IndexImpl.AUTOREFRESH, !val.booleanValue());
}
String path = this.mc.getHttpServletRequest().getPathInfo();
path = path.substring(IWebPath.WEBROOT.length(), path.length());
return new AjaxAnswer(path);
}
}