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

com.cuubez.visualizer.processor.ApiMetaDataProcessor Maven / Gradle / Ivy

Go to download

Cuubez API Visualization Framework is complete implementation for describing and visualizing RESTful web services.

The newest version!
/**
 *	Copyright [2013] [www.cuubez.com]
 *	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.cuubez.visualizer.processor;


import com.cuubez.visualizer.domain.*;
import com.cuubez.visualizer.domain.configuration.*;
import com.cuubez.visualizer.domain.configuration.Group;
import com.cuubez.visualizer.domain.configuration.HttpCode;
import com.cuubez.visualizer.resource.InformationRepository;
import com.cuubez.visualizer.resource.RootResource;
import com.cuubez.visualizer.resource.SubResource;
import com.cuubez.visualizer.util.CuubezUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ApiMetaDataProcessor {

    private static Log log = LogFactory.getLog(ApiMetaDataProcessor.class);
    private static final String DEFAULT_HEADER = "Cuubez API Documentation";
    private static final String DEFAULT_TITTLE = "Cuubez API Documentation";

    Map apiMetaDataMap = new HashMap();

    public void process() {

        ConfigurationType configurationType = InformationRepository.getInstance().getApplicationConfigurationContext().getConfigurationType();

        if(configurationType.equals(ConfigurationType.XML)) {
            xmlConfigurationProcess();
        } else {
            annotationProcess();
        }

    }

    private void annotationProcess() {


        List rootResourceList = InformationRepository.getInstance().getRootResources();

        for (RootResource rootResource : rootResourceList) {

            for (SubResource subResource : rootResource.getSubResources()) {

                String path = CuubezUtil.constructApiPath(rootResource.getPath(), subResource.getPath());

                ApiMetaData apiMetaData = new ApiMetaData(CuubezUtil.generateRandomString(), subResource.getHttpMethod(), path);
                apiMetaData.setName(CuubezUtil.getName(rootResource.getName(), subResource.getName()));
                apiMetaData.setDetail(CuubezUtil.getDetail(rootResource.getDetail(), subResource.getDetail()));
                apiMetaData.setPathVariableMetaDataList(subResource.getPathVariableMetaDataList());
                apiMetaData.setQueryVariableMetaDataList(subResource.getQueryVariableMetaDataList());
                apiMetaData.setHeaderVariableMetaDataList(subResource.getHeaderVariableMetaDataList());
                if(subResource.getRequestBody() != null) {
                    apiMetaData.setRequestBody(CuubezUtil.generateJsonSchema(subResource.getRequestBody()));
                }
                apiMetaData.setHttpCodeMetaDataList(CuubezUtil.getHttpCodes(rootResource.getHttpCodeMetaDataList(), subResource.getHttpCodeMetaDataList()));

                if(subResource.getReturnType() != null) {
                    apiMetaData.setResponseBody(CuubezUtil.generateJsonSchema(subResource.getReturnType()));
                }

                if(!CuubezUtil.isNullOrEmpty(rootResource.getGroupName())) {
                    finalizeApiMetaData(apiMetaData);
                    addSubResource(rootResource.getGroupName(), rootResource.getGroupTittle(), apiMetaData);
                }
            }


        }

        ApiMetaDataInformation apiMetaDataInformation = new ApiMetaDataInformation();
        apiMetaDataInformation.setApiMetaData(apiMetaDataMap);
        populateDisplayConfiguration(apiMetaDataInformation);
        InformationRepository.getInstance().setApiMetaData(apiMetaDataInformation);


    }


    private void xmlConfigurationProcess() {

       Configuration configuration = InformationRepository.getInstance().getConfiguration();

        if (configuration != null) {

           List groups = configuration.getGroups();

            if(groups != null) {

                for (Group group : groups) {

                    List resources = group.getResources();

                    if (resources != null) {

                        for (Resource resource : resources)  {

                            if(!CuubezUtil.isNullOrEmpty(resource.getHttpMethod()) && !CuubezUtil.isNullOrEmpty(resource.getPath())) {

                                ApiMetaData apiMetaData = new ApiMetaData(CuubezUtil.generateRandomString(), resource.getHttpMethod(), resource.getPath());

                                apiMetaData.setName(resource.getName() == null?"":resource.getName());
                                apiMetaData.setDetail(resource.getDetail() == null?"":resource.getDetail());
                                apiMetaData.setPathVariableMetaDataList(getPathVariableMetaDataList(resource.getVariables()));
                                apiMetaData.setQueryVariableMetaDataList(getQueryVariableMetaDataList(resource.getVariables()));
                                apiMetaData.setHeaderVariableMetaDataList(getHeaderVariableMetaDataList(resource.getVariables()));
                                if (resource.getRequestBodyType() != null) {
                                    try {
                                        Class requestType = Class.forName(resource.getRequestBodyType());
                                        apiMetaData.setRequestBody(CuubezUtil.generateJsonSchema(requestType));
                                    } catch (ClassNotFoundException e) {
                                        log.error("Request body type class [" + resource.getRequestBodyType() + "] not found", e);
                                    }

                                }

                                if (resource.getResponseBodyType() != null) {
                                    try {
                                        Class responseType = Class.forName(resource.getResponseBodyType());
                                        apiMetaData.setResponseBody(CuubezUtil.generateJsonSchema(responseType));
                                    } catch (ClassNotFoundException e) {
                                        log.error("Response body type class [" + resource.getRequestBodyType() + "] not found", e);
                                    }
                                }


                                apiMetaData.setHttpCodeMetaDataList(CuubezUtil.getHttpCodes(getHttpCodeMetaDataList(group.getHttpCodes()), getHttpCodeMetaDataList(resource.getHttpCodes())));
                                finalizeApiMetaData(apiMetaData);
                                if(!CuubezUtil.isNullOrEmpty(group.getName())) {
                                    addSubResource(group.getName(), group.getTitle(), apiMetaData);
                                }
                                ApiMetaDataInformation apiMetaDataInformation = new ApiMetaDataInformation();
                                apiMetaDataInformation.setApiMetaData(apiMetaDataMap);
                                populateDisplayConfiguration(apiMetaDataInformation);
                                InformationRepository.getInstance().setApiMetaData(apiMetaDataInformation);

                            }

                        }
                    }

                }

            }

        }

    }

    private void finalizeApiMetaData(ApiMetaData apiMetaData) {
        List pathVariableMetaDataList = apiMetaData.getPathVariableMetaDataList();
        List queryVariableMetaDataList = apiMetaData.getQueryVariableMetaDataList();
        List headerVariableMetaDataList = apiMetaData.getHeaderVariableMetaDataList();
        List httpCodeMetaDataList = apiMetaData.getHttpCodeMetaDataList();
        String requestBody = apiMetaData.getRequestBody();
        String responseBody = apiMetaData.getResponseBody();

        if((pathVariableMetaDataList == null || pathVariableMetaDataList.isEmpty()) && (queryVariableMetaDataList == null || queryVariableMetaDataList.isEmpty())
                && (headerVariableMetaDataList == null || headerVariableMetaDataList.isEmpty())) {

            apiMetaData.setRequestParamContain(false);

            if(CuubezUtil.isNullOrEmpty(requestBody)) {
                apiMetaData.setRequestContain(false);
            }
        }

        if(httpCodeMetaDataList == null) {

            apiMetaData.setHttpResponseCodeContain(false);

            if (CuubezUtil.isNullOrEmpty(responseBody)) {
                apiMetaData.setResponseContain(false);
            }

        }
    }

    private List getPathVariableMetaDataList(List variables) {

        if (variables == null) {
            return null;
        }

        List pathVariableMetaDataList = new ArrayList();

        for (Variable variable : variables) {
            if(!CuubezUtil.isNullOrEmpty(variable.getParameterType()) && "path".equalsIgnoreCase(variable.getParameterType()) && !CuubezUtil.isNullOrEmpty(variable.getName())) {
                PathVariableMetaData pathVariableMetaData = new PathVariableMetaData(variable.getName(), variable.isMandatory(), variable.getVariableType(), variable.getDescription() == null?"":variable.getDescription());
                pathVariableMetaDataList.add(pathVariableMetaData);
            }
        }

        return pathVariableMetaDataList;
    }

    private List getQueryVariableMetaDataList(List variables) {

        if (variables == null) {
            return null;
        }

        List queryVariableMetaDataList = new ArrayList();

        for (Variable variable : variables) {
            if(!CuubezUtil.isNullOrEmpty(variable.getParameterType()) && "query".equalsIgnoreCase(variable.getParameterType()) && !CuubezUtil.isNullOrEmpty(variable.getName())) {
                QueryVariableMetaData queryVariableMetaData = new QueryVariableMetaData(variable.getName(), variable.isMandatory(), variable.getVariableType(), variable.getDescription() == null?"":variable.getDescription());
                queryVariableMetaDataList.add(queryVariableMetaData);
            }
        }

        return queryVariableMetaDataList;
    }

    private List getHeaderVariableMetaDataList(List variables) {

        if (variables == null) {
            return null;
        }

        List headerVariableMetaDataList = new ArrayList();

        for (Variable variable : variables) {
            if(!CuubezUtil.isNullOrEmpty(variable.getParameterType()) && "header".equalsIgnoreCase(variable.getParameterType()) && !CuubezUtil.isNullOrEmpty(variable.getName())) {
                HeaderVariableMetaData headerVariableMetaData = new HeaderVariableMetaData(variable.getName(), variable.isMandatory(), variable.getVariableType(),variable.getDescription() == null?"":variable.getDescription());
                headerVariableMetaDataList.add(headerVariableMetaData);
            }
        }

        return headerVariableMetaDataList;
    }

    private List getHttpCodeMetaDataList(List httpCodes) {

        if(httpCodes == null) {
            return null;
        }

        List httpCodeMetaDataList = new ArrayList();

        for (HttpCode httpCode : httpCodes) {

            if (httpCode.getCode() != null) {
                HttpCodeMetaData httpCodeMetaData = new HttpCodeMetaData(String.valueOf(httpCode.getCode()), httpCode.getReason() == null ? "" : httpCode.getReason());
                httpCodeMetaDataList.add(httpCodeMetaData);
            }
        }

      return httpCodeMetaDataList;
    }

    private void addSubResource(String groupName, String groupTittle, ApiMetaData apiMetaData) {

        if(apiMetaDataMap.get(groupName) == null) {
            ApiGroupMetaData groupMetaData = new ApiGroupMetaData();
            groupMetaData.setId(CuubezUtil.generateRandomString());
            groupMetaData.setGroupName(groupName);
            groupMetaData.setGroupTittle(groupTittle == null?"":groupTittle);
            groupMetaData.setApiMetaDataList(new ArrayList());
            apiMetaDataMap.put(groupName, groupMetaData);
        }

        apiMetaDataMap.get(groupName).addApiMetaData(apiMetaData);


    }

    private void populateDisplayConfiguration(ApiMetaDataInformation apiMetaDataInformation) {

        Configuration configuration = InformationRepository.getInstance().getConfiguration();
        Display display;
        if (configuration != null && configuration.getDisplay() != null) {
            display = configuration.getDisplay();

            if(CuubezUtil.isNullOrEmpty(display.getHeader())) {
                display.setHeader(DEFAULT_HEADER);
            }
            if(CuubezUtil.isNullOrEmpty(display.getTitle())) {
                display.setTittle(DEFAULT_TITTLE);
            }

        } else {
            display = getDefaultDisplayConfiguration();
        }

        apiMetaDataInformation.setDisplay(display);
    }

    private Display getDefaultDisplayConfiguration() {
        Display display = new Display();
        display.setHeader(DEFAULT_HEADER);
        display.setTittle(DEFAULT_TITTLE);

        return display;

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy