org.openecomp.sdnc.sli.aai.AAIRequest.java Source code

Java tutorial

Introduction

Here is the source code for org.openecomp.sdnc.sli.aai.AAIRequest.java

Source

/*-
 * ============LICENSE_START=======================================================
 * openECOMP : SDN-C
 * ================================================================================
 * Copyright (C) 2017 AT&T Intellectual Property. All rights
 *                      reserved.
 * ================================================================================
 * 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.
 * ============LICENSE_END=========================================================
 */

package org.openecomp.sdnc.sli.aai;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;

import org.apache.commons.lang.StringUtils;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.openecomp.sdnc.sli.aai.data.AAIDatum;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import org.openecomp.aai.inventory.v10.*;

public abstract class AAIRequest {
    protected static final Logger LOG = LoggerFactory.getLogger(AAIRequest.class);

    protected static final String TARGET_URI = "org.openecomp.sdnc.sli.aai.uri";

    protected static final String MASTER_REQUEST = "master-request";

    public static final String RESOURCE_VERSION = "resource-version";

    public static final String DEPTH = "depth";

    protected static Properties configProperties;
    protected final String target_uri;
    protected static AAIService aaiService;

    protected AAIDatum requestDatum;

    protected final Properties requestProperties = new Properties();

    public static AAIRequest createRequest(String resoourceName, Map<String, String> nameValues) {

        String resoource = resoourceName;

        if (resoource == null)
            return null;

        if (resoource.contains(":")) {
            String[] tokens = resoource.split(":");
            if (tokens != null && tokens.length > 0) {
                resoource = tokens[0];
            }
        }

        if (nameValues.containsKey("selflink")) {
            Class<? extends AAIDatum> clazz = null;
            try {
                clazz = getClassFromResource(resoource);
            } catch (ClassNotFoundException e) {
                LOG.warn("AAIRequest does not support class: " + e.getMessage());
                return null;
            }

            if (clazz != null)
                return new SelfLinkRequest(clazz);
            else
                return null;
        }

        switch (resoource) {
        case "generic-query":
            return new GenericQueryRequest();
        case "named-query":
            return new NamedQueryRequest();
        case "nodes-query":
            return new NodesQueryRequest();
        case "custom-query":
            return new CustomQueryRequest();
        case "linterface":
            return new LInterfaceRequest(LInterfaceRequest.TYPE.L2_BRIDGE_SBG);
        case "l2-bridge-sbg":
            return new SubInterfaceRequest(SubInterfaceRequest.TYPE.L2_BRIDGE_SBG);
        case "l2-bridge-bgf":
            return new SubInterfaceRequest(SubInterfaceRequest.TYPE.L2_BRIDGE_BGF);
        case "echo":
        case "test":
            return new EchoRequest();

        default: {
            AAIRequest request = getRequestFromResource(resoource);
            if (request == null) {
                return null;
            }
            return request;
        }
        }
    }

    /**
     * Map containing resource tag to its bit position in bitset mapping
     */
    private static Map<String, String> tagValues = new LinkedHashMap<String, String>();
    /**
     * Map containing bitset value of the path to its path mapping
     */
    private static Map<BitSet, String> bitsetPaths = new LinkedHashMap<BitSet, String>();

    public static void setProperties(Properties props, AAIService aaiService) {
        AAIRequest.configProperties = props;
        AAIRequest.aaiService = aaiService;

        try {
            URL url = null;
            Bundle bundle = FrameworkUtil.getBundle(AAIServiceActivator.class);
            if (bundle != null) {
                BundleContext ctx = bundle.getBundleContext();
                if (ctx == null)
                    return;

                url = ctx.getBundle().getResource(AAIService.PATH_PROPERTIES);
            } else {
                url = aaiService.getClass().getResource("/aai-path.properties");
            }

            InputStream in = url.openStream();
            Reader reader = new InputStreamReader(in, "UTF-8");

            Properties properties = new Properties();
            properties.load(reader);
            LOG.info("loaded " + properties.size());

            Set<String> keys = properties.stringPropertyNames();

            int index = 0;
            Set<String> resourceNames = new TreeSet<String>();

            for (String key : keys) {
                String[] tags = key.split("\\|");
                for (String tag : tags) {
                    if (!resourceNames.contains(tag)) {
                        resourceNames.add(tag);
                        tagValues.put(tag, Integer.toString(++index));
                    }
                }
                BitSet bs = new BitSet(256);
                for (String tag : tags) {
                    String value = tagValues.get(tag);
                    Integer bitIndex = Integer.parseInt(value);
                    bs.set(bitIndex);
                }
                String path = properties.getProperty(key);
                LOG.info(String.format("bitset %s\t\t%s", bs.toString(), path));
                bitsetPaths.put(bs, path);
            }
            LOG.info("loaded " + resourceNames.toString());
        } catch (Exception e) {
            LOG.error("Caught exception", e);
        }
    }

    public AAIRequest() {
        target_uri = configProperties.getProperty(TARGET_URI);
    }

    public void addRequestProperty(String key, String value) {
        requestProperties.put(key, value);
    }

    public final void setRequestObject(AAIDatum value) {
        requestDatum = value;
    }

    public final AAIDatum getRequestObject() {
        return requestDatum;
    }

    public final void addMasterRequest(AAIRequest masterRequest) {
        requestProperties.put(MASTER_REQUEST, masterRequest);
    }

    protected static String encodeQuery(String param) throws UnsupportedEncodingException {
        return URLEncoder.encode(param, "UTF-8").replace("+", "%20");
    }

    protected void handleException(AAIRequest lInterfaceRequest, JsonProcessingException exc) {
        aaiService.getLogger()
                .warn("Could not deserialize object of type " + lInterfaceRequest.getClass().getSimpleName(), exc);
    }

    //   public abstract URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException;

    public URL getRequestUrl(String method, String resourceVersion)
            throws UnsupportedEncodingException, MalformedURLException {

        String request_url = null;

        request_url = target_uri + getRequestPath();

        Set<String> uniqueResources = extractUniqueResourceSetFromKeys(requestProperties.stringPropertyNames());

        //      request_url = processPathData(request_url, requestProperties);

        for (String resoourceName : uniqueResources) {
            AAIRequest locRequest = AAIRequest.createRequest(resoourceName, new HashMap<String, String>());
            if (locRequest != null) {
                Class<?> clazz = locRequest.getClass();
                Method function = null;
                try {
                    function = clazz.getMethod("processPathData", request_url.getClass(),
                            requestProperties.getClass());
                    request_url = (String) function.invoke(null, request_url, requestProperties);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //            request_url = locRequest.processPathData(request_url, requestProperties);
            }
        }

        if (resourceVersion != null) {
            request_url = request_url + "?resource-version=" + resourceVersion;
        }
        URL http_req_url = new URL(request_url);

        aaiService.LOGwriteFirstTrace(method, http_req_url.toString());

        return http_req_url;
    }

    protected String getRequestPath() throws MalformedURLException {
        Set<String> uniqueResources = extractUniqueResourceSetFromKeys(requestProperties.stringPropertyNames());
        BitSet bitset = new BitSet();
        for (String key : uniqueResources) {
            if (tagValues.containsKey(key)) {
                Object tmpValue = tagValues.get(key);
                if (tmpValue != null) {
                    String value = tmpValue.toString();
                    int bitIndex = Integer.parseInt(value);
                    bitset.set(bitIndex);
                }
            }
        }

        String path = bitsetPaths.get(bitset);
        if (path == null) {
            throw new MalformedURLException(
                    "PATH not found for key string containing valies :" + requestProperties.toString());
        }
        return path;
    }

    public abstract URL getRequestQueryUrl(String method)
            throws UnsupportedEncodingException, MalformedURLException;

    public abstract String toJSONString();

    public abstract String[] getArgsList();

    public abstract Class<? extends AAIDatum> getModelClass();

    public String getPrimaryResourceName(String resource) {
        return resource;
    }

    public String formatKey(String argument) {
        return argument;
    }

    public AAIDatum jsonStringToObject(String jsonData)
            throws JsonParseException, JsonMappingException, IOException {
        if (jsonData == null) {
            return null;
        }

        AAIDatum response = null;
        ObjectMapper mapper = getObjectMapper();
        response = mapper.readValue(jsonData, getModelClass());
        return response;
    }

    protected static Set<String> extractUniqueResourceSetFromKeys(Set<String> keySet) {
        Set<String> uniqueResources = new TreeSet<String>();
        List<String> keys = new ArrayList<String>(keySet);
        for (String resource : keys) {
            if (resource.contains(".")) {
                String[] split = resource.split("\\.");
                uniqueResources.add(split[0].replaceAll("_", "-"));
            }
        }
        return uniqueResources;
    }

    public void processRequestPathValues(Map<String, String> nameValues) {
        Set<String> uniqueResources = extractUniqueResourceSetFromKeys(nameValues.keySet());

        Set<String> tokens = new TreeSet<String>();
        tokens.add(DEPTH);
        tokens.addAll(Arrays.asList(this.getArgsList()));

        for (String resoourceName : uniqueResources) {
            AAIRequest locRequest = AAIRequest.createRequest(resoourceName, nameValues);
            if (locRequest != null)
                tokens.addAll(Arrays.asList(locRequest.getArgsList()));
        }

        String[] arguments = tokens.toArray(new String[0]);
        for (String name : arguments) {
            String tmpName = name.replaceAll("-", "_");
            String value = nameValues.get(tmpName);
            if (value != null && !value.isEmpty()) {
                value = value.trim().replace("'", "").replace("$", "").replace("'", "");
                this.addRequestProperty(name, value);
            }
        }
    }

    public static String processPathData(String request_url, Properties requestProperties)
            throws UnsupportedEncodingException {
        return request_url;
    }

    public boolean isDeleteDataRequired() {
        return false;
    }

    ObjectMapper getObjectMapper() {
        return AAIService.getObjectMapper();
    }

    protected static Class<? extends AAIDatum> getClassFromResource(String resoourceName)
            throws ClassNotFoundException {
        String className = GenericVnf.class.getName();
        String[] split = resoourceName.split("-");
        for (int i = 0; i < split.length; i++) {
            split[i] = StringUtils.capitalize(split[i]);
        }

        String caps = StringUtils.join(split);
        className = className.replace("GenericVnf", caps);
        Class<? extends AAIDatum> clazz = null;
        try {
            clazz = (Class<? extends AAIDatum>) Class.forName(className);
        } catch (ClassNotFoundException e) {
            LOG.warn("AAIRequest does not support class: " + e.getMessage());
            return null;
        }

        return clazz;
    }

    protected static AAIRequest getRequestFromResource(String resoourceName) {

        Class<? extends AAIDatum> clazz = null;
        try {
            clazz = getClassFromResource(resoourceName);
        } catch (ClassNotFoundException e) {
            LOG.warn("AAIRequest does not support class: " + e.getMessage());
            return null;
        }
        if (clazz == null) {
            return null;
        }
        GenericRequest request = new GenericRequest(clazz);
        return request;
    }

    public static Map<String, String> splitQuery(String query) throws UnsupportedEncodingException {
        Map<String, String> query_pairs = new LinkedHashMap<String, String>();

        if (query != null && !query.isEmpty()) {
            String[] pairs = query.split("&");
            for (String pair : pairs) {
                int idx = pair.indexOf("=");
                query_pairs.put(URLDecoder.decode(pair.substring(0, idx), "UTF-8"),
                        URLDecoder.decode(pair.substring(idx + 1), "UTF-8"));
            }
        }
        return query_pairs;
    }

    protected boolean expectsDataFromPUTRequest() {
        return false;
    }
}