at.graz.meduni.bibbox.liferay.portlet.service.impl.ApplicationInstanceServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for at.graz.meduni.bibbox.liferay.portlet.service.impl.ApplicationInstanceServiceImpl.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package at.graz.meduni.bibbox.liferay.portlet.service.impl;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.liferay.portal.kernel.json.JSONArray;
import com.liferay.portal.kernel.json.JSONException;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.jsonwebservice.JSONWebService;
import com.liferay.portal.kernel.model.Company;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.model.Portlet;
import com.liferay.portal.kernel.model.PortletPreferences;
import com.liferay.portal.kernel.model.Role;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.portlet.PortletClassLoaderUtil;
import com.liferay.portal.kernel.service.CompanyLocalServiceUtil;
import com.liferay.portal.kernel.service.LayoutLocalServiceUtil;
import com.liferay.portal.kernel.service.PortletLocalServiceUtil;
import com.liferay.portal.kernel.service.PortletPreferencesLocalServiceUtil;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.util.PortletKeys;
import com.liferay.portal.kernel.backgroundtask.BackgroundTask;
import com.liferay.portal.kernel.backgroundtask.BackgroundTaskManagerUtil;
import com.liferay.portal.kernel.dao.orm.DynamicQuery;
import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
import com.liferay.portal.kernel.exception.PortalException;

import aQute.bnd.annotation.ProviderType;

import com.liferay.portal.kernel.json.JSONFactoryUtil;

import at.graz.meduni.bibbox.helper.ActivitiesProtocol;
import at.graz.meduni.bibbox.helper.BibboxConfigReader;
import at.graz.meduni.bibbox.helper.FormatExceptionMessage;
import at.graz.meduni.bibbox.helper.UpdateGitRepositoriesBackgroundTask;
import at.graz.meduni.bibbox.helper.UpdateGitRepository;
import at.graz.meduni.bibbox.liferay.backgroundtasks.BibboxBackgroundTaskExecutorNames;
import at.graz.meduni.bibbox.liferay.backgroundtasks.ControleApplication;
import at.graz.meduni.bibbox.liferay.backgroundtasks.DeleteApplication;
import at.graz.meduni.bibbox.liferay.backgroundtasks.InstallApplicationBG;
import at.graz.meduni.bibbox.liferay.portlet.model.ApplicationInstance;
import at.graz.meduni.bibbox.liferay.portlet.model.ApplicationInstanceContainer;
import at.graz.meduni.bibbox.liferay.portlet.model.ApplicationInstancePort;
import at.graz.meduni.bibbox.liferay.portlet.model.ApplicationInstanceStatus;
import at.graz.meduni.bibbox.liferay.portlet.service.ApplicationInstanceContainerLocalServiceUtil;
import at.graz.meduni.bibbox.liferay.portlet.service.ApplicationInstanceLocalServiceUtil;
import at.graz.meduni.bibbox.liferay.portlet.service.ApplicationInstancePortLocalServiceUtil;
import at.graz.meduni.bibbox.liferay.portlet.service.ApplicationInstanceStatusLocalServiceUtil;
import at.graz.meduni.bibbox.liferay.portlet.service.base.ApplicationInstanceServiceBaseImpl;

/**
 * The implementation of the application instance remote service.
 *
 * <p>
 * All custom service methods should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link at.graz.meduni.bibbox.liferay.portlet.service.ApplicationInstanceService} interface.
 *
 * <p>
 * This is a remote service. Methods of this service are expected to have security checks based on the propagated JAAS credentials because this service can be accessed remotely.
 * </p>
 *
 * @author Robert Reihs
 * @see ApplicationInstanceServiceBaseImpl
 * @see at.graz.meduni.bibbox.liferay.portlet.service.ApplicationInstanceServiceUtil
 */
@ProviderType
public class ApplicationInstanceServiceImpl extends ApplicationInstanceServiceBaseImpl {
    /*
     * NOTE FOR DEVELOPERS:
     *
     * Never reference this class directly. Always use {@link at.graz.meduni.bibbox.liferay.portlet.service.ApplicationInstanceServiceUtil} to access the application instance remote service.
     */

    /**
     * Error Format for date
     */
    private String log_portlet_ = "BIBBOXDocker";
    private String log_classname_ = "at.graz.meduni.bibbox.liferay.portlet.service.impl.ApplicationInstanceServiceImpl";

    private static SimpleDateFormat format_date = new SimpleDateFormat("yyyy-MM-dd");
    private static SimpleDateFormat format_time = new SimpleDateFormat("HH:mm:ss.SSS");
    public static String newline_ = System.getProperty("line.separator");

    @JSONWebService("/version")
    public JSONObject getVersionAPI() {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        returnobject.put("BIBBOX Version", "v1.0");
        return returnobject;
    }

    @JSONWebService("/get-application-store-list")
    public JSONObject getApplicationStoreListAPI() {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        returnobject.put("status", "local");
        returnobject.put("groups", getApplicationStoreList());
        returnobject.put("user", getUserObject());
        return returnobject;
    }

    @JSONWebService("/get-updated-application-store-list")
    public JSONObject getUpdatedApplicationStoreListAPI() {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        UpdateGitRepository updategitrepository = new UpdateGitRepository();
        String gitstatus = updategitrepository
                .updateLocalGitRepository(BibboxConfigReader.getApplicationStorePWD() + "/application-store");
        returnobject.put("status", gitstatus);
        returnobject.put("groups", getApplicationStoreList());
        returnobject.put("user", getUserObject());
        UpdateGitRepositoriesBackgroundTask updategitrepositoriesbackgroundtask = new UpdateGitRepositoriesBackgroundTask(
                "Update Application Store");
        updategitrepositoriesbackgroundtask.start();
        return returnobject;
    }

    @JSONWebService("/get-application-store-item")
    public JSONObject getApplicationStoreItemAPI(String applicationname, String version) {
        JSONObject returnobject = getApplicationStoreItem(applicationname, version);
        returnobject.put("user", getUserObject());
        return returnobject;
    }

    @JSONWebService(value = "/install-application", method = "POST")
    public JSONObject installApplicationAPI(String applicationname, String version, String instanceid,
            String instancename, String data) {
        if (!checkPermission(instanceid, "edit")) {
            JSONObject returnobject = JSONFactoryUtil.createJSONObject();
            returnobject.put("status", "error");
            returnobject.put("error", "permission denied");
            returnobject.put("user", getUserObject());
            return returnobject;
        }
        JSONObject returnobject = installApplication(applicationname, version, instanceid, instancename, data);
        returnobject.put("user", getUserObject());
        return returnobject;
    }

    @JSONWebService(value = "/get-instance-list")
    public JSONObject getInstanceListAPI() {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        returnobject.put("instances", getInstanceList());
        returnobject.put("user", getUserObject());
        return returnobject;
    }

    @JSONWebService(value = "/get-instance-info")
    public JSONObject getInstanceInfoAPI(String instanceId) {
        if (!checkPermission(instanceId, "view")) {
            JSONObject returnobject = JSONFactoryUtil.createJSONObject();
            returnobject.put("status", "error");
            returnobject.put("error", "permission denied");
            returnobject.put("user", getUserObject());
            return returnobject;
        }
        JSONObject returnobject = getInstanceDashboard(instanceId);
        returnobject.put("user", getUserObject());
        return returnobject;
    }

    @JSONWebService(value = "/get-instance-dashboard")
    public JSONObject getInstanceDashboardAPI(String instanceId) {
        if (!checkPermission(instanceId, "view")) {
            JSONObject returnobject = JSONFactoryUtil.createJSONObject();
            returnobject.put("status", "error");
            returnobject.put("error", "permission denied");
            returnobject.put("user", getUserObject());
            return returnobject;
        }
        JSONObject returnobject = getInstanceDashboard(instanceId);
        returnobject.put("user", getUserObject());
        return returnobject;
    }

    @JSONWebService(value = "/get-instance-log")
    public JSONObject getInstanceLogdAPI(String instanceId) {
        if (!checkPermission(instanceId, "view")) {
            JSONObject returnobject = JSONFactoryUtil.createJSONObject();
            returnobject.put("status", "error");
            returnobject.put("error", "permission denied");
            returnobject.put("user", getUserObject());
            return returnobject;
        }
        JSONObject returnobject = getInstanceLogd(instanceId, "200");
        returnobject.put("user", getUserObject());
        return returnobject;
    }

    @JSONWebService(value = "/get-instance-log")
    public JSONObject getInstanceLogdAPI(String instanceId, String lines) {
        if (!checkPermission(instanceId, "view")) {
            JSONObject returnobject = JSONFactoryUtil.createJSONObject();
            returnobject.put("status", "error");
            returnobject.put("error", "permission denied");
            returnobject.put("user", getUserObject());
            return returnobject;
        }
        JSONObject returnobject = getInstanceLogd(instanceId, lines);
        returnobject.put("user", getUserObject());
        return returnobject;
    }

    @JSONWebService(value = "/get-instance-maintenance")
    public JSONObject getInstanceMaintenanceAPI(String instanceId) {
        JSONObject returnobject = getInstanceMaintenance(instanceId);
        returnobject.put("user", getUserObject());
        return returnobject;
    }

    @JSONWebService(value = "/update-instance-info", method = "POST")
    public JSONObject updateInstanceInfoAPI(String instanceId, String instancename, String instanceshortname,
            String description, String shortdescription, String adminnode, String maintenance) {
        if (!checkPermission(instanceId, "edit")) {
            JSONObject returnobject = JSONFactoryUtil.createJSONObject();
            returnobject.put("status", "error");
            returnobject.put("error", "permission denied");
            returnobject.put("user", getUserObject());
            return returnobject;
        }
        JSONObject returnobject = updateInstanceInfo(instanceId, instancename, instanceshortname, description,
                shortdescription, adminnode, maintenance);
        returnobject.put("user", getUserObject());
        return returnobject;
    }

    @JSONWebService(value = "/delete-instance-status")
    public JSONObject deleteInstanceStatusAPI(String instanceId) {
        if (!checkPermission(instanceId, "edit")) {
            JSONObject returnobject = JSONFactoryUtil.createJSONObject();
            returnobject.put("status", "error");
            returnobject.put("error", "permission denied");
            returnobject.put("user", getUserObject());
            return returnobject;
        }
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        deleteInstance(instanceId);
        returnobject.put("user", getUserObject());
        return returnobject;
    }

    @JSONWebService(value = "/set-instance-status")
    public JSONObject setInstanceStatusAPI(String instanceId, String status) {
        if (!checkPermission(instanceId, "edit")) {
            JSONObject returnobject = JSONFactoryUtil.createJSONObject();
            returnobject.put("status", "error");
            returnobject.put("error", "permission denied");
            returnobject.put("user", getUserObject());
            return returnobject;
        }
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        if (status.equalsIgnoreCase("start")) {
            returnobject = startInstance(instanceId);
        } else if (status.equalsIgnoreCase("stop")) {
            returnobject = stopInstance(instanceId);
        } else if (status.equalsIgnoreCase("restart")) {
            returnobject = restartInstance(instanceId);
        } else {
            returnobject.put("status", "error");
            returnobject.put("error", "Status not know!");
        }
        returnobject.put("user", getUserObject());
        return returnobject;
    }

    @JSONWebService(value = "/toggle-instance-maintenance-status")
    public JSONObject toggleInstanceMaintenanceStatusAPI(String instanceId) {
        if (!checkPermission(instanceId, "edit")) {
            JSONObject returnobject = JSONFactoryUtil.createJSONObject();
            returnobject.put("status", "error");
            returnobject.put("error", "permission denied");
            returnobject.put("user", getUserObject());
            return returnobject;
        }
        JSONObject returnobject = toggleInstanceMaintenanceStatus(instanceId);
        returnobject.put("user", getUserObject());
        return returnobject;
    }

    @JSONWebService(value = "/get-id-mapping-info")
    public JSONObject getIdMappingInfoAPI(String instanceId) {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        ApplicationInstance applicationinstance = ApplicationInstanceLocalServiceUtil
                .getApplicationInstance(instanceId);
        if (applicationinstance == null) {
            returnobject.put("status", "error");
            returnobject.put("error", "InstanceId dose not exist!");
        } else {
            try {
                String jsonstring = BibboxConfigReader.readApplicationsStoreJsonFile(
                        BibboxConfigReader.getApplicationFolder(applicationinstance.getApplication(),
                                applicationinstance.getVersion()) + "/id-mapping-info.json");
                return JSONFactoryUtil.createJSONObject(jsonstring);
            } catch (JSONException e) {
                returnobject.put("status", "error");
                returnobject.put("error", "Parsing JSON file: " + e.getMessage());
                System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_,
                        log_classname_, "getIdMappingInfoAPI(String instanceId)",
                        "Error parsing id-mapping-info.json for instance: " + instanceId));
                e.printStackTrace();
            }
        }
        return returnobject;
    }

    @JSONWebService(value = "/test")
    public void getTestAPI(String string) {
        try {
            JSONFactoryUtil.createJSONObject(string);
        } catch (JSONException e) {
            System.out.println("ERROR creating Json Object");
            e.printStackTrace();
        }
        try {
            String string2 = "{MYSQL_PASSWORD=, INSTITUTE_NAME=BIBBOX Demo Biobank, MYSQL_USER=openspecimen, TOMCAT_MANAGER_USER=admin, TOMCAT_MANAGER_PASSWORD=}";
            JSONFactoryUtil.createJSONObject(string2);
        } catch (JSONException e) {
            System.out.println("ERROR creating Json Object 2");
            e.printStackTrace();
        }
    }

    @JSONWebService(value = "/set-portlet-configuration")
    public JSONObject setPortletConfiguration(long companyId, long plid, String portletId, String preferences) {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        System.out.println("-------------------------");
        System.out.println("PortletConfiguration");
        System.out.println("companyId:" + companyId + " plid:" + plid + " portletId:" + portletId + " preferences:"
                + preferences);
        returnobject.put("companyId", companyId);
        returnobject.put("plid", plid);
        returnobject.put("portletId", portletId);
        returnobject.put("preferences", preferences);
        Layout layout;
        try {
            layout = LayoutLocalServiceUtil.getLayout(plid);
            System.out.println("ModelClassName" + layout.getModelClassName());
        } catch (PortalException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        List<PortletPreferences> portletpreferences = PortletPreferencesLocalServiceUtil.getPortletPreferences(plid,
                portletId);
        System.out.println(portletpreferences.size());
        if (portletpreferences.size() == 0) {
            long ownerId = 0;
            Portlet portlet = PortletLocalServiceUtil.getPortletById(portletId);
            PortletPreferencesLocalServiceUtil.addPortletPreferences(companyId, ownerId,
                    PortletKeys.PREFS_OWNER_TYPE_LAYOUT, plid, portletId, portlet, preferences);
        } else {
            for (PortletPreferences portletpreference : portletpreferences) {
                portletpreference.setPreferences(preferences);
                PortletPreferencesLocalServiceUtil.updatePortletPreferences(portletpreference);

            }
        }
        System.out.println("PortletConfiguration ... end");
        return returnobject;
    }

    private JSONArray getApplicationStoreList() {
        try {
            String applicationstore = BibboxConfigReader.getApplicationStorePWD();
            String jsonstring = BibboxConfigReader.readApplicationsStoreJsonFile(
                    applicationstore + "/application-store/" + BibboxConfigReader.getBibboxKit() + ".json");
            return JSONFactoryUtil.createJSONArray(jsonstring);
        } catch (Exception e) {
            System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_, log_classname_,
                    "getApplicationStoreList()", "Error reading application store list."));
            e.printStackTrace();
        }
        return JSONFactoryUtil.createJSONArray();
    }

    private JSONObject getApplicationStoreItem(String applicationname, String version) {
        JSONObject retrunobject = null;
        if (version.equalsIgnoreCase("development")) {
            retrunobject = getApplicationStoreItemDeveloperVersion(applicationname);
        } else {
            retrunobject = getApplicationStoreItemVersion(applicationname, version);
        }
        retrunobject.put("install", getApplicationStoreItemInstallParameters(applicationname, version));
        retrunobject.put("usedinstanceids", ApplicationInstanceLocalServiceUtil.getUsedInstanceIds());
        return retrunobject;
    }

    private JSONObject getApplicationStoreItemDeveloperVersion(String applicationname) {
        try {
            UpdateGitRepository updategitrepository = new UpdateGitRepository();
            String jsonstring = "";
            String applicationfolder = BibboxConfigReader.getApplicationFolder(applicationname, "development");
            if (updategitrepository.checkIfLocalRepositoryExists(applicationfolder)) {
                updategitrepository.updateLocalGitRepository(applicationfolder);
                jsonstring = BibboxConfigReader.readApplicationsStoreJsonFile(applicationfolder + "/appinfo.json");
            } else {
                updategitrepository.cloneRepositoryToFolder(applicationfolder, applicationname);
                jsonstring = BibboxConfigReader.readApplicationsStoreJsonFile(applicationfolder + "/appinfo.json");
            }
            return JSONFactoryUtil.createJSONObject(jsonstring);
        } catch (JSONException e) {
            System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_, log_classname_,
                    "getApplicationStoreItemDeveloperVersion(String applicationname)",
                    "Error reading application store jason file. Applicationname:" + applicationname));
            e.printStackTrace();
        }
        return JSONFactoryUtil.createJSONObject();
    }

    private JSONObject getApplicationStoreItemVersion(String applicationname, String version) {
        try {
            UpdateGitRepository updategitrepository = new UpdateGitRepository();
            String jsonstring = "";
            String applicationfolder = BibboxConfigReader.getApplicationFolder(applicationname, version);
            String applicationfolderdevelopment = BibboxConfigReader.getApplicationFolder(applicationname,
                    "development");
            if (updategitrepository.checkIfLocalRepositoryExists(applicationfolder)) {
                jsonstring = BibboxConfigReader.readApplicationsStoreJsonFile(applicationfolder + "/appinfo.json");
            } else {
                if (!updategitrepository.checkIfLocalRepositoryExists(applicationfolderdevelopment)) {
                    updategitrepository.cloneRepositoryToFolder(applicationfolderdevelopment, applicationname);
                } else {
                    updategitrepository.updateLocalGitRepository(applicationfolderdevelopment);
                }
                updategitrepository.createTagFodler(applicationname, version);
                jsonstring = BibboxConfigReader.readApplicationsStoreJsonFile(applicationfolder + "/appinfo.json");
            }
            return JSONFactoryUtil.createJSONObject(jsonstring);
        } catch (JSONException e) {
            System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_, log_classname_,
                    "getApplicationStoreItemVersion(String applicationname, String version)",
                    "Error reading application store json file. Applicationname:" + applicationname + " Version: "
                            + version));
            e.printStackTrace();
        }
        return JSONFactoryUtil.createJSONObject();
    }

    private JSONArray getApplicationStoreItemInstallParameters(String applicationname, String version) {
        try {
            String jsonstring = "";
            String applicationfolder = BibboxConfigReader.getApplicationFolder(applicationname, version);
            jsonstring = BibboxConfigReader
                    .readApplicationsStoreJsonFile(applicationfolder + "/environment-parameters.json");
            return JSONFactoryUtil.createJSONArray(jsonstring);
        } catch (JSONException e) {
            System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_, log_classname_,
                    "getApplicationStoreItemInstallParameters(String applicationname, String version)",
                    "Error reading application store environment-parameters.json file. Applicationname:"
                            + applicationname + " Version: " + version));
            e.printStackTrace();
        }
        return JSONFactoryUtil.createJSONArray();
    }

    private JSONObject installApplication(String applicationname, String version, String instanceid,
            String instancename, String data) {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();

        if (ApplicationInstanceLocalServiceUtil.checkInstanceNameAvailable(instanceid)) {
            returnobject.put("status", "error");
            returnobject.put("error", "InstanceId alredy exists!");
            return returnobject;
        }

        ApplicationInstanceLocalServiceUtil.registerApplication(applicationname, version, instanceid, instancename);

        long userId = 0;
        long groupId = 0;
        try {
            User user = this.getGuestOrUser();
            Company company = CompanyLocalServiceUtil.getCompany(user.getCompanyId());
            groupId = company.getGroupId();
            userId = user.getUserId();
        } catch (Exception e) {
            System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_, log_classname_,
                    "installApplication(String applicationname, String version, String instanceid, String instancename, String data)",
                    "Error getting user from api call."));
            e.printStackTrace();
        }

        Map<String, Serializable> taskContextMap = new HashMap<>();

        taskContextMap.put("instanceId", instanceid);
        taskContextMap.put("data", data);

        try {
            BackgroundTaskManagerUtil.addBackgroundTask(userId, groupId,
                    BibboxBackgroundTaskExecutorNames.BIBBOX_INSTANCE_INSTALLER_BACKGROUND_TASK_EXECUTOR,
                    new String[] { "BIBBOXDocker-portlet" }, InstallApplicationBG.class, taskContextMap,
                    new ServiceContext());
        } catch (PortalException e) {
            System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_, log_classname_,
                    "installApplication(String applicationname, String version, String instanceid, String instancename, String data)",
                    "Error starting Background Task. For instance: " + instanceid));
            e.printStackTrace();
        }

        returnobject.put("status", "installing");
        returnobject.put("instanceid", instanceid);

        return returnobject;
    }

    private JSONArray getInstanceList() {
        JSONArray returnobject = JSONFactoryUtil.createJSONArray();
        List<ApplicationInstance> applicationinstances = ApplicationInstanceLocalServiceUtil
                .getActiveApplicationInstances();
        for (ApplicationInstance applicationinstance : applicationinstances) {
            JSONObject instanceobject = applicationinstance.getInstanceJSONObject();
            instanceobject.put("description", applicationinstance.getShortdescription());
            instanceobject.put("application", applicationinstance.getApplication());
            instanceobject.put("tags", applicationinstance.getApplicationTags());
            returnobject.put(instanceobject);
        }
        return returnobject;
    }

    private JSONObject getInstanceInfo(String instanceId) {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        ApplicationInstance applicationinstance = ApplicationInstanceLocalServiceUtil
                .getApplicationInstance(instanceId);
        if (applicationinstance == null) {
            returnobject.put("status", "error");
            returnobject.put("error", "InstanceId dose not exist!");
        } else {
            returnobject = applicationinstance.getInstanceJSONObject();
            returnobject.put("application", getApplicationStoreItem(applicationinstance.getApplication(),
                    applicationinstance.getVersion()));
            return returnobject;
        }
        applicationinstance = null;
        return returnobject;
    }

    private JSONObject getInstanceDashboard(String instanceId) {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        ApplicationInstance applicationinstance = ApplicationInstanceLocalServiceUtil
                .getApplicationInstance(instanceId);
        if (applicationinstance == null) {
            returnobject.put("status", "error");
            returnobject.put("error", "InstanceId dose not exist!");
        } else {
            returnobject = applicationinstance.getInstanceJSONObject();
            returnobject.put("maintenance", applicationinstance.getMaintenance());
            returnobject.put("adminnode", applicationinstance.getAdminnode());
            returnobject.put("application", getApplicationStoreItem(applicationinstance.getApplication(),
                    applicationinstance.getVersion()));
            return returnobject;
        }
        applicationinstance = null;
        return returnobject;
    }

    private JSONObject getInstanceMaintenance(String instanceId) {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        ApplicationInstance applicationinstance = ApplicationInstanceLocalServiceUtil
                .getApplicationInstance(instanceId);
        if (applicationinstance == null) {
            returnobject.put("status", "error");
            returnobject.put("error", "InstanceId dose not exist!");
        } else {
            returnobject = applicationinstance.getInstanceJSONObject();
            returnobject.put("maintenance", applicationinstance.getMaintenance());
            returnobject.put("ismaintenance", applicationinstance.getIsmaintenance());
            return returnobject;
        }
        applicationinstance = null;
        return returnobject;
    }

    private JSONObject updateInstanceInfo(String instanceId, String instancename, String instanceshortname,
            String description, String shortdescription, String adminnode, String maintenance) {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        ApplicationInstance applicationinstance = ApplicationInstanceLocalServiceUtil
                .getApplicationInstance(instanceId);
        if (applicationinstance == null) {
            returnobject.put("status", "error");
            returnobject.put("error", "InstanceId dose not exist!");
        } else {
            applicationinstance.setName(instancename);
            applicationinstance.setShortName(instanceshortname);
            applicationinstance.setDescription(description);
            applicationinstance.setShortdescription(shortdescription);
            applicationinstance.setMaintenance(maintenance);
            applicationinstance.setAdminnode(adminnode);
            ApplicationInstanceLocalServiceUtil.updateApplicationInstance(applicationinstance);
            returnobject = applicationinstance.getInstanceJSONObject();
            returnobject.put("maintenance", applicationinstance.getMaintenance());
            returnobject.put("ismaintenance", applicationinstance.getIsmaintenance());
            return returnobject;
        }
        return returnobject;
    }

    private JSONObject getInstanceLogd(String instanceId, String lines) {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        ApplicationInstance applicationinstance = ApplicationInstanceLocalServiceUtil
                .getApplicationInstance(instanceId);
        if (applicationinstance == null) {
            returnobject.put("status", "error");
            returnobject.put("error", "InstanceId dose not exist!");
        } else {
            returnobject = applicationinstance.getInstanceJSONObject();
            returnobject.put("maintenance", applicationinstance.getMaintenance());
            returnobject.put("application", applicationinstance.getApplication());
            returnobject.put("longname", applicationinstance.getName());
            returnobject.put("logs", getComposeLog(applicationinstance, lines));
            returnobject.put("log", "");
            return returnobject;
        }
        return returnobject;
    }

    private JSONArray getComposeLog(ApplicationInstance applicationinstance, String lines) {
        return applicationinstance.getComposeLog(lines);
    }

    private JSONObject deleteInstance(String instanceId) {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        ApplicationInstance applicationinstance = ApplicationInstanceLocalServiceUtil
                .getApplicationInstance(instanceId);
        if (applicationinstance == null) {
            returnobject.put("status", "error");
            returnobject.put("error", "InstanceId dose not exist!");
        } else {
            applicationinstance.setDeleted(true);
            applicationinstance.setStatus("deleting");
            ApplicationInstanceLocalServiceUtil.updateApplicationInstance(applicationinstance);

            long userId = 0;
            long groupId = 0;

            try {
                User user = this.getGuestOrUser();
                Company company = CompanyLocalServiceUtil.getCompany(user.getCompanyId());
                groupId = company.getGroupId();
                userId = user.getUserId();
            } catch (Exception e) {
                System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_,
                        log_classname_, "getUserObject()", "Error getting user from api call"));
                e.printStackTrace();
            }

            Map<String, Serializable> taskContextMap = new HashMap<>();
            taskContextMap.put("instanceId", instanceId);

            try {
                BackgroundTaskManagerUtil.addBackgroundTask(userId, groupId,
                        BibboxBackgroundTaskExecutorNames.BIBBOX_INSTANCE_DELETE_BACKGROUND_TASK_EXECUTOR,
                        new String[] { "BIBBOXDocker-portlet" }, DeleteApplication.class, taskContextMap,
                        new ServiceContext());
            } catch (PortalException e) {
                System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_,
                        log_classname_, "getUserObject()", "Error starting delete Task."));
                e.printStackTrace();
            }

            returnobject.put("status", "installing");
            returnobject.put("instanceid", instanceId);
        }
        return returnobject;
    }

    private JSONObject startInstance(String instanceId) {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        ApplicationInstance applicationinstance = ApplicationInstanceLocalServiceUtil
                .getApplicationInstance(instanceId);
        if (applicationinstance == null) {
            returnobject.put("status", "error");
            returnobject.put("error", "InstanceId dose not exist!");
            String activityId = addMessageActivity("Starting Instance " + instanceId, "STARTAPP", "RUNNING",
                    "UNKNOWN");
            ActivitiesProtocol.addActivityLogEntry(activityId, "ERROR", "InstanceId dose not exist!");
            finishActivity(activityId, "FINISHED", "ERROR");
        } else {
            ApplicationInstanceStatus applicationinstancestatus = ApplicationInstanceStatusLocalServiceUtil
                    .getApplicationInstanceStatusByInstanceId(applicationinstance.getApplicationInstanceId());
            applicationinstancestatus.setStatus("starting");
            applicationinstancestatus = ApplicationInstanceStatusLocalServiceUtil
                    .updateApplicationInstanceStatus(applicationinstancestatus);

            long userId = 0;
            long groupId = 0;
            try {
                User user = this.getGuestOrUser();
                Company company = CompanyLocalServiceUtil.getCompany(user.getCompanyId());
                groupId = company.getGroupId();
                userId = user.getUserId();
            } catch (Exception e) {
                System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_,
                        log_classname_, "startInstance(String instanceId)", "Error getting user from api call."));
                e.printStackTrace();
            }

            Map<String, Serializable> taskContextMap = new HashMap<>();

            taskContextMap.put("instanceId", instanceId);
            taskContextMap.put("command", "start");

            try {
                BackgroundTaskManagerUtil.addBackgroundTask(userId, groupId,
                        BibboxBackgroundTaskExecutorNames.BIBBOX_INSTANCE_CONTROLE_BACKGROUND_TASK_EXECUTOR,
                        new String[] { "BIBBOXDocker-portlet" }, ControleApplication.class, taskContextMap,
                        new ServiceContext());
            } catch (PortalException e) {
                System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_,
                        log_classname_, "startInstance(String instanceId)",
                        "Error starting Background Task. For instance: " + instanceId));
                e.printStackTrace();
            }
        }
        applicationinstance = null;
        returnobject.put("status", "starting");
        return returnobject;
    }

    private JSONObject stopInstance(String instanceId) {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        ApplicationInstance applicationinstance = ApplicationInstanceLocalServiceUtil
                .getApplicationInstance(instanceId);
        if (applicationinstance == null) {
            returnobject.put("status", "error");
            returnobject.put("error", "InstanceId dose not exist!");
            String activityId = addMessageActivity("Stopping Instance " + instanceId, "STOPAPP", "RUNNING",
                    "UNKNOWN");
            ActivitiesProtocol.addActivityLogEntry(activityId, "ERROR", "InstanceId dose not exist!");
            finishActivity(activityId, "FINISHED", "ERROR");
        } else {
            ApplicationInstanceStatus applicationinstancestatus = ApplicationInstanceStatusLocalServiceUtil
                    .getApplicationInstanceStatusByInstanceId(applicationinstance.getApplicationInstanceId());
            applicationinstancestatus.setStatus("stopping");
            applicationinstancestatus = ApplicationInstanceStatusLocalServiceUtil
                    .updateApplicationInstanceStatus(applicationinstancestatus);

            long userId = 0;
            long groupId = 0;
            try {
                User user = this.getGuestOrUser();
                Company company = CompanyLocalServiceUtil.getCompany(user.getCompanyId());
                groupId = company.getGroupId();
                userId = user.getUserId();
            } catch (Exception e) {
                System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_,
                        log_classname_, "stopInstance(String instanceId)", "Error getting user from api call."));
                e.printStackTrace();
            }

            Map<String, Serializable> taskContextMap = new HashMap<>();

            taskContextMap.put("instanceId", instanceId);
            taskContextMap.put("command", "stop");

            try {
                BackgroundTaskManagerUtil.addBackgroundTask(userId, groupId,
                        BibboxBackgroundTaskExecutorNames.BIBBOX_INSTANCE_CONTROLE_BACKGROUND_TASK_EXECUTOR,
                        new String[] { "BIBBOXDocker-portlet" }, ControleApplication.class, taskContextMap,
                        new ServiceContext());
            } catch (PortalException e) {
                System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_,
                        log_classname_, "stopInstance(String instanceId)",
                        "Error starting Background Task. For instance: " + instanceId));
                e.printStackTrace();
            }
        }
        returnobject.put("status", "stopping");
        return returnobject;
    }

    private JSONObject restartInstance(String instanceId) {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        ApplicationInstance applicationinstance = ApplicationInstanceLocalServiceUtil
                .getApplicationInstance(instanceId);
        if (applicationinstance == null) {
            returnobject.put("status", "error");
            returnobject.put("error", "InstanceId dose not exist!");
            String activityId = addMessageActivity("Restart Instance " + instanceId, "RESTARTAPP", "RUNNING",
                    "UNKNOWN");
            ActivitiesProtocol.addActivityLogEntry(activityId, "ERROR", "InstanceId dose not exist!");
            finishActivity(activityId, "FINISHED", "ERROR");
        } else {
            ApplicationInstanceStatus applicationinstancestatus = ApplicationInstanceStatusLocalServiceUtil
                    .getApplicationInstanceStatusByInstanceId(applicationinstance.getApplicationInstanceId());
            applicationinstancestatus.setStatus("restarting");
            applicationinstancestatus = ApplicationInstanceStatusLocalServiceUtil
                    .updateApplicationInstanceStatus(applicationinstancestatus);

            long userId = 0;
            long groupId = 0;
            try {
                User user = this.getGuestOrUser();
                Company company = CompanyLocalServiceUtil.getCompany(user.getCompanyId());
                groupId = company.getGroupId();
                userId = user.getUserId();
            } catch (Exception e) {
                System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_,
                        log_classname_, "restartInstance(String instanceId)", "Error getting user from api call."));
                e.printStackTrace();
            }

            Map<String, Serializable> taskContextMap = new HashMap<>();

            taskContextMap.put("instanceId", instanceId);
            taskContextMap.put("command", "restart");

            try {
                BackgroundTaskManagerUtil.addBackgroundTask(userId, groupId,
                        BibboxBackgroundTaskExecutorNames.BIBBOX_INSTANCE_CONTROLE_BACKGROUND_TASK_EXECUTOR,
                        new String[] { "BIBBOXDocker-portlet" }, ControleApplication.class, taskContextMap,
                        new ServiceContext());
            } catch (PortalException e) {
                System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_,
                        log_classname_, "restartInstance(String instanceId)",
                        "Error starting Background Task. For instance: " + instanceId));
                e.printStackTrace();
            }
        }
        returnobject.put("status", "restarting");
        return returnobject;
    }

    private JSONObject toggleInstanceMaintenanceStatus(String instanceId) {
        String activityId = addMessageActivity("Switch maintenance mode " + instanceId, "MAINTENANCEAPP", "RUNNING",
                "UNKNOWN");
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        ApplicationInstance applicationinstance = ApplicationInstanceLocalServiceUtil
                .getApplicationInstance(instanceId);
        if (applicationinstance == null) {
            returnobject.put("status", "error");
            returnobject.put("error", "InstanceId dose not exist!");
            ActivitiesProtocol.addActivityLogEntry(activityId, "ERROR", "InstanceId dose not exist!");
            finishActivity(activityId, "FINISHED", "ERROR");
        } else {
            applicationinstance.setIsmaintenance(!applicationinstance.getIsmaintenance());
            applicationinstance = ApplicationInstanceLocalServiceUtil
                    .updateApplicationInstance(applicationinstance);
            returnobject = getInstanceDashboard(instanceId);
            if (applicationinstance.getIsmaintenance()) {
                ActivitiesProtocol.addActivityLogEntry(activityId, "INFO",
                        "Instance " + applicationinstance.getInstanceId() + " set to maintenance mode");
                finishActivity(activityId, "FINISHED", "SUCCESS");
            } else {
                ActivitiesProtocol.addActivityLogEntry(activityId, "INFO",
                        "Instance " + applicationinstance.getInstanceId() + " set online again");
                finishActivity(activityId, "FINISHED", "SUCCESS");
            }
        }
        return returnobject;
    }

    private JSONObject getUserObject() {
        JSONObject returnobject = JSONFactoryUtil.createJSONObject();
        try {
            User user = this.getGuestOrUser();
            returnobject.put("username", user.getFullName());
            returnobject.put("role", getFrontendRole());
        } catch (Exception e) {
            System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_, log_classname_,
                    "getUserObject()", "Error getting user from api call"));
            e.printStackTrace();
        }
        return returnobject;
    }

    private String getFrontendRole() {
        try {
            User user = this.getGuestOrUser();
            List<Role> roles = user.getRoles();
            BibboxConfigReader.getAdminRoles();
            ArrayList<String> adminroles = new ArrayList<String>();
            String adminrolesstring = BibboxConfigReader.getAdminRoles();
            for (String rolename : adminrolesstring.split(";")) {
                adminroles.add(rolename);
            }
            ArrayList<String> vmadminroles = new ArrayList<String>();
            String vmadminrolesstring = BibboxConfigReader.getVMAdminRoles();
            for (String rolename : vmadminrolesstring.split(";")) {
                vmadminroles.add(rolename);
            }
            boolean admin = false;
            for (Role role : roles) {
                if (adminroles.contains(role.getName())) {
                    admin = true;
                }
                if (vmadminroles.contains(role.getName())) {
                    return "vmadmin";
                }
            }
            if (admin) {
                return "admin";
            }
        } catch (Exception e) {
            System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_, log_classname_,
                    "checkPermission()", "Error getting user permission."));
            e.printStackTrace();
        }
        return "user";
    }

    // Umbauen
    private boolean checkPermission(String instanceid, String actions) {
        try {
            User user = this.getGuestOrUser();
            List<Role> roles = user.getRoles();
            BibboxConfigReader.getAdminRoles();
            ArrayList<String> adminroles = new ArrayList<String>();
            String adminrolesstring = BibboxConfigReader.getAdminRoles();
            for (String rolename : adminrolesstring.split(";")) {
                adminroles.add(rolename);
            }
            ArrayList<String> vmadminroles = new ArrayList<String>();
            String vmadminrolesstring = BibboxConfigReader.getVMAdminRoles();
            for (String rolename : vmadminrolesstring.split(";")) {
                vmadminroles.add(rolename);
            }
            boolean admin = false;
            for (Role role : roles) {
                if (adminroles.contains(role.getName())) {
                    admin = true;
                }
                if (vmadminroles.contains(role.getName())) {
                    return true;
                }
            }
            if (admin) {
                String lockedids = BibboxConfigReader.getBibboxLockedAppsInstanceIds() + ";";
                if (lockedids.contains(instanceid + ";") && actions.equals("edit")) {
                    return false;
                }
                return true;
            }
        } catch (Exception e) {
            System.err.println(FormatExceptionMessage.formatExceptionMessage("error", log_portlet_, log_classname_,
                    "checkPermission()", "Error getting user permission."));
            e.printStackTrace();
        }
        return false;
    }

    private String addMessageActivity(String name, String type, String state, String result) {
        JSONObject activity = JSONFactoryUtil.createJSONObject();
        Date curDate = new Date();
        activity.put("name", name);
        activity.put("type", type);
        activity.put("state", state);
        activity.put("result", result);
        activity.put("start_time", format_date.format(curDate) + "T" + format_time.format(curDate) + "Z");
        if (state.equals("FINISHED")) {
            activity.put("finished_time", format_date.format(curDate) + "T" + format_time.format(curDate) + "Z");
        }
        JSONObject activityresult = ActivitiesProtocol.createActivity(activity.toJSONString());
        return activityresult.getString("activitId");
    }

    private void finishActivity(String activityId, String state, String result) {
        JSONObject activity = JSONFactoryUtil.createJSONObject();
        activity.put("state", state);
        activity.put("result", result);
        Date curDate = new Date();
        activity.put("finished_time", format_date.format(curDate) + "T" + format_time.format(curDate) + "Z");
        ActivitiesProtocol.updateActivity(activityId, activity.toJSONString());
    }
}