All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.centurylink.mdw.service.rest.Implementors Maven / Gradle / Ivy

/*
 * Copyright (C) 2017 CenturyLink, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.centurylink.mdw.service.rest;

import com.centurylink.mdw.activity.types.AdapterActivity;
import com.centurylink.mdw.activity.types.TaskActivity;
import com.centurylink.mdw.app.Templates;
import com.centurylink.mdw.cache.asset.AssetCache;
import com.centurylink.mdw.common.service.ServiceException;
import com.centurylink.mdw.model.asset.Asset;
import com.centurylink.mdw.model.asset.api.AssetInfo;
import com.centurylink.mdw.model.asset.Pagelet;
import com.centurylink.mdw.model.asset.Pagelet.Widget;
import com.centurylink.mdw.model.asset.PrePostWidgetProvider;
import com.centurylink.mdw.model.user.Role;
import com.centurylink.mdw.model.user.UserAction.Entity;
import com.centurylink.mdw.model.user.Workgroup;
import com.centurylink.mdw.model.workflow.ActivityImplementor;
import com.centurylink.mdw.monitor.*;
import com.centurylink.mdw.service.data.user.UserGroupCache;
import com.centurylink.mdw.services.AssetServices;
import com.centurylink.mdw.services.DesignServices;
import com.centurylink.mdw.services.ServiceLocator;
import com.centurylink.mdw.services.rest.JsonRestService;
import com.centurylink.mdw.util.JsonUtil;
import com.centurylink.mdw.util.log.LoggerUtil;
import com.centurylink.mdw.util.log.StandardLogger;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import javax.ws.rs.Path;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

@Path("/Implementors")
@Api("Activity implementor definitions")
public class Implementors extends JsonRestService {

    private static StandardLogger logger = LoggerUtil.getStandardLogger();

    @Override
    protected List getRoles(String path, String method) {
        if (method.equals("GET")) {
            List roles = new ArrayList<>();
            if (UserGroupCache.getRole(Role.ASSET_VIEW) != null) {
                roles.add(Role.ASSET_VIEW);
                roles.add(Role.ASSET_DESIGN);
                roles.add(Workgroup.SITE_ADMIN_GROUP);
            }
            return roles;
        }
        else {
            return super.getRoles(path, method);
        }
    }

    @Override
    protected Entity getEntity(String path, Object content, Map headers) {
        return Entity.ActivityImplementor;
    }

    @Override
    @Path("/{className}")
    @ApiOperation(value="Retrieve activity implementor(s) JSON.",
        notes="If {className} is provided, a specific implementor is returned; otherwise all implementors.",
        response=ActivityImplementor.class, responseContainer="List")
    public JSONObject get(String path, Map headers)
    throws ServiceException, JSONException {
        DesignServices designServices = ServiceLocator.getDesignServices();
        try {
            String implClassName = getSegment(path, 1);
            if (implClassName == null) {
                List impls = designServices.getImplementors();
                Collections.sort(impls);
                return JsonUtil.getJsonArray(impls).getJson();
            }
            else {
                ActivityImplementor impl = designServices.getImplementor(implClassName);
                if (impl == null)
                    throw new ServiceException(ServiceException.NOT_FOUND, "Implementor not found: " + implClassName);
                String pageletStr = impl.getPagelet();
                if (pageletStr != null && !pageletStr.isEmpty()) {
                    AssetServices assetServices = ServiceLocator.getAssetServices();
                    if (!pageletStr.startsWith("{") && !pageletStr.trim().startsWith("<")) {
                        // references a pagelet asset
                        String pageletAssetPath = pageletStr;
                        if (pageletAssetPath.indexOf("/") < 1) { // qualify asset path
                            pageletAssetPath = implClassName.substring(0, implClassName.lastIndexOf(".")) + "/" + pageletStr;
                        }
                        Asset pageletAsset = AssetCache.getAsset(pageletAssetPath);
                        if (pageletAsset == null)
                            throw new FileNotFoundException("No pagelet asset: " + pageletAssetPath);
                        pageletStr = pageletAsset.getText();
                    }
                    Pagelet pagelet = new Pagelet(impl.getCategory(), pageletStr);
                    pagelet.addWidgetProvider(new PrePostWidgetProvider());
                    pagelet.addWidgetProvider(implCategory -> {
                        List widgets = new ArrayList<>();
                        try {
                            Widget monitoringWidget = new Widget(new JSONObject(Templates.get("configurator/monitors.json")));
                            widgets.add(monitoringWidget);
                            JSONArray rows = new JSONArray();
                            for (ActivityMonitor activityMonitor : MonitorRegistry.getInstance().getActivityMonitors()) {
                                AssetInfo implAsset = assetServices.getImplAsset(activityMonitor.getClass().getName());
                                JSONArray row = MonitorAttributes.getRowDefault(implAsset, activityMonitor.getClass());
                                if (row != null) {
                                    rows.put(row);
                                }
                            }
                            if (AdapterActivity.class.getName().equals(implCategory)) {
                                for (AdapterMonitor adapterMonitor : MonitorRegistry.getInstance().getAdapterMonitors()) {
                                    AssetInfo implAsset = assetServices.getImplAsset(adapterMonitor.getClass().getName());
                                    JSONArray row = MonitorAttributes.getRowDefault(implAsset, adapterMonitor.getClass());
                                    if (row != null)
                                        rows.put(row);
                                }
                            }
                            else if (TaskActivity.class.getName().equals(implCategory)) {
                                for (TaskMonitor taskMonitor : MonitorRegistry.getInstance().getTaskMonitors()) {
                                    AssetInfo implAsset = assetServices.getImplAsset(taskMonitor.getClass().getName());
                                    JSONArray row = MonitorAttributes.getRowDefault(implAsset, taskMonitor.getClass());
                                    if (row != null)
                                        rows.put(row);
                                }
                            }
                            if (rows.length() > 0)
                                monitoringWidget.setAttribute("default", rows.toString());
                        }
                        catch (IOException | ServiceException ex) {
                            logger.error("Error loading monitor widgets for: " + implClassName, ex);
                        }
                        return widgets;
                    });

                    JSONObject implJson = impl.getJson();
                    JSONObject pageletJson = pagelet.getJson();
                    implJson.put("pagelet", pageletJson);
                    // template content
                    if (impl.isJava())
                        implJson.put("defaultContent", Templates.get("assets/code/dynamic_java"));
                    return implJson;
                }
                else {
                    return impl.getJson();
                }
            }
        }
        catch (ServiceException ex) {
            throw ex;
        }
        catch (Exception ex) {
            throw new ServiceException(ServiceException.INTERNAL_ERROR, ex.getMessage(), ex);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy