org.openmrs.module.fhir.swagger.SwaggerSpecificationCreator.java Source code

Java tutorial

Introduction

Here is the source code for org.openmrs.module.fhir.swagger.SwaggerSpecificationCreator.java

Source

/**
 * The contents of this file are subject to the OpenMRS Public License
 * Version 1.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://license.openmrs.org
 * <p/>
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations
 * under the License.
 * <p/>
 * Copyright (C) OpenMRS, LLC.  All Rights Reserved.
 */
package org.openmrs.module.fhir.swagger;

import ca.uhn.fhir.model.dstu2.resource.Conformance;
import ca.uhn.fhir.model.dstu2.resource.OperationDefinition;
import ca.uhn.fhir.model.primitive.CodeDt;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.module.fhir.server.ConformanceProvider;
import org.openmrs.module.fhir.swagger.docs.Contact;
import org.openmrs.module.fhir.swagger.docs.Definition;
import org.openmrs.module.fhir.swagger.docs.Definitions;
import org.openmrs.module.fhir.swagger.docs.ExternalDocs;
import org.openmrs.module.fhir.swagger.docs.Info;
import org.openmrs.module.fhir.swagger.docs.License;
import org.openmrs.module.fhir.swagger.docs.NullSerializer;
import org.openmrs.module.fhir.swagger.docs.Operation;
import org.openmrs.module.fhir.swagger.docs.Parameter;
import org.openmrs.module.fhir.swagger.docs.Path;
import org.openmrs.module.fhir.swagger.docs.Paths;
import org.openmrs.module.fhir.swagger.docs.Response;
import org.openmrs.module.fhir.swagger.docs.Schema;
import org.openmrs.module.fhir.swagger.docs.SwaggerSpecification;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SwaggerSpecificationCreator {
    protected Log log = LogFactory.getLog(getClass());
    private SwaggerSpecification swaggerSpecification;
    private Conformance conformance;
    private String baseUrl;
    private String basePath;
    private Map<String, Definition> definitionMap = new HashMap<String, Definition>();

    public SwaggerSpecificationCreator(String baseUrl, String basePath) {
        this.swaggerSpecification = new SwaggerSpecification();
        this.conformance = ConformanceProvider.getConformance();
        this.baseUrl = baseUrl;
        this.basePath = basePath;
    }

    public String buildJSON() {
        synchronized (this) {
            createApiDefinition();
            addPaths();
            addParameters();
            createObjectDefinitions();
        }
        return createSwaggerSpecification();
    }

    /*
     * Creating the information section of the swagger including base path licence
     */
    private void createApiDefinition() {
        Info info = new Info();
        info.setVersion(SwaggerDocConstants.VERSION);
        info.setTitle(SwaggerDocConstants.TITLE);
        info.setDescription(SwaggerDocConstants.DESCRIPTION);
        info.setTermsOfService(SwaggerDocConstants.TERMS_AND_CONDITIONS);
        //Setting the contact
        Contact contact = new Contact();
        contact.setName(SwaggerDocConstants.CONTACT_NAME);
        contact.setUrl(SwaggerDocConstants.CONTACT_URL);
        contact.setEmail(SwaggerDocConstants.CONTACT_EMAIL);
        //Setting the licence
        License license = new License();
        license.setName(SwaggerDocConstants.LICENSE_NAME);
        license.setUrl(SwaggerDocConstants.LICENSE_URL);
        info.setContact(contact);
        info.setLicense(license);
        swaggerSpecification.setInfo(info);
        List<String> produces = new ArrayList<String>();
        //Set mime type supported
        produces.add(SwaggerDocConstants.PRODUCES_JSON);
        produces.add(SwaggerDocConstants.PRODUCES_XML);
        List<CodeDt> formats = conformance.getFormat();
        for (CodeDt format : formats) {
            produces.add(format.getValue());
        }
        List<String> consumes = new ArrayList<String>();
        consumes.add(SwaggerDocConstants.CONSUMES_XML);
        consumes.add(SwaggerDocConstants.CONSUMES_JSON);
        swaggerSpecification.setHost(getBaseUrl());
        swaggerSpecification.setProduces(produces);
        swaggerSpecification.setConsumes(consumes);
        swaggerSpecification.setBasePath(basePath);
        List<String> schemas = new ArrayList<String>();
        schemas.add(SwaggerDocConstants.SCHEMA_HTTP);
        schemas.add(SwaggerDocConstants.SCHEMA_HTTPS);
        ExternalDocs externalDocs = new ExternalDocs();
        externalDocs.setDescription(SwaggerDocConstants.MORE_INFO);
        externalDocs.setUrl(SwaggerDocConstants.DOCS_URL);
        swaggerSpecification.setExternalDocs(externalDocs);
    }

    /**
     * Creating paths section swagger documentation
     */
    private void addPaths() {
        List<Conformance.Rest> resources = conformance.getRest();
        Paths fullPaths = new Paths();//Hold full path list
        Map<String, Path> pathMap = new HashMap<String, Path>();//Map holding path to path object mappings
        for (Conformance.Rest restResource : resources) {
            for (Conformance.RestResource resource : restResource.getResource()) {
                String resourceName = resource.getType();
                if (SwaggerDocConstants.STRUCTURE_DEFINITION.equalsIgnoreCase(resourceName)) {
                    continue;
                }
                List<Conformance.RestResourceInteraction> restResourceInteractions = resource.getInteraction();
                //Iterating over available opearations
                for (Conformance.RestResourceInteraction restResourceInteraction : restResourceInteractions) {
                    //Add GET operation paths
                    if (SwaggerDocConstants.READ.equalsIgnoreCase(restResourceInteraction.getCode())) {
                        String pathId = "/" + resourceName + "/" + SwaggerDocConstants.READ_RESOURCE_PATH;
                        Path read;
                        Map<String, Operation> readOperationsMap;
                        if (pathMap.containsKey(pathId)) {
                            read = pathMap.get(pathId);
                            readOperationsMap = read.getOperations();
                            if (readOperationsMap == null) {
                                readOperationsMap = new HashMap<String, Operation>();
                            }
                        } else {
                            read = new Path();
                            readOperationsMap = new HashMap<String, Operation>();
                        }
                        Operation readOperation = new Operation();
                        readOperation.setSummary(SwaggerDocConstants.RETURNS + " " + resourceName + " "
                                + SwaggerDocConstants.DETAILS_OF_GIVEN_ID);
                        List<String> produces = new ArrayList<String>();
                        //Set mime type supported
                        produces.add(SwaggerDocConstants.PRODUCES_JSON);
                        produces.add(SwaggerDocConstants.PRODUCES_XML);
                        List<CodeDt> formats = conformance.getFormat();
                        for (CodeDt format : formats) {
                            produces.add(format.getValue());
                        }
                        readOperation.setProduces(produces);
                        //Set parameters
                        List<Parameter> parameters = new ArrayList<Parameter>();
                        Parameter parameter = new Parameter();
                        parameter.setDescription(SwaggerDocConstants.ID_DESCRIPTION + " " + resourceName + " "
                                + SwaggerDocConstants.RESOURCE);
                        parameter.setName(SwaggerDocConstants.ID);
                        parameter.setIn(SwaggerDocConstants.IN_PATH);
                        parameter.setRequired(true);
                        parameters.add(parameter);
                        readOperation.setParameters(parameters);
                        ;

                        Map<String, Response> responseMap = new HashMap<String, Response>();
                        //Set response schemas and example responses
                        Response responseSuccess = new Response();
                        responseSuccess.setDescription(SwaggerDocConstants.RETURNS + " " + resourceName + " "
                                + SwaggerDocConstants.DETAILS_OF_GIVEN_ID);
                        Schema schemaSuccess = new Schema();
                        schemaSuccess.setRef(getSchemaRef(resourceName));
                        schemaSuccess.setType(SwaggerDocConstants.OBJECT);
                        setExamples(resourceName, responseSuccess);
                        responseSuccess.setSchema(schemaSuccess);
                        responseMap.put(SwaggerDocConstants.SUCCESS_RESPONSE_CODE, responseSuccess);

                        Response responseError = new Response();
                        responseError.setDescription(SwaggerDocConstants.ERROR_OCCURRED);
                        Schema schemaError = new Schema();
                        schemaError.setRef(getSchemaRef(SwaggerDocConstants.GENERAL_ERROR));
                        schemaError.setType(SwaggerDocConstants.OBJECT);
                        responseError.setSchema(schemaError);
                        Map<String, String> examplesError = new HashMap<String, String>();
                        examplesError.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.ERROR_PAYLOAD);
                        responseError.setExamples(examplesError);
                        responseMap.put(SwaggerDocConstants.ERROR_RESPONSE_CODE, responseError);
                        readOperation.setResponses(responseMap);

                        readOperationsMap.put(SwaggerDocConstants.GET, readOperation);
                        read.setOperations(readOperationsMap);
                        pathMap.put(pathId, read);
                    } else if (SwaggerDocConstants.CREATE.equalsIgnoreCase(restResourceInteraction.getCode())) {
                        //Set POST operation path properties
                        String pathId = "/" + resourceName;
                        Path create;
                        Map<String, Operation> createOperationsMap;
                        if (pathMap.containsKey(pathId)) {
                            create = pathMap.get(pathId);
                            createOperationsMap = create.getOperations();
                            if (createOperationsMap == null) {
                                createOperationsMap = new HashMap<String, Operation>();
                            }
                        } else {
                            create = new Path();
                            createOperationsMap = new HashMap<String, Operation>();
                        }
                        Operation createOperation = new Operation();
                        createOperation.setSummary(SwaggerDocConstants.CREATE_RESOURCE + " " + resourceName + " "
                                + SwaggerDocConstants.RESOURCE + " " + SwaggerDocConstants.CONTENT_OF_THE_REQUEST);
                        List<String> produces = new ArrayList<String>();
                        //Set mime type supported
                        produces.add(SwaggerDocConstants.PRODUCES_JSON);
                        produces.add(SwaggerDocConstants.PRODUCES_XML);
                        List<CodeDt> formats = conformance.getFormat();
                        for (CodeDt format : formats) {
                            produces.add(format.getValue());
                        }
                        createOperation.setProduces(produces);
                        //Set parameters
                        List<Parameter> parameters = new ArrayList<Parameter>();
                        Parameter parameter = new Parameter();
                        parameter.setDescription(resourceName + " " + SwaggerDocConstants.RESOURCE + " "
                                + SwaggerDocConstants.OBJECT);
                        parameter.setName(SwaggerDocConstants.BODY);
                        parameter.setIn(SwaggerDocConstants.IN_BODY);
                        parameter.setType(null);
                        parameter.setRequired(true);
                        Schema schema = new Schema();
                        schema.setRef(getSchemaRef(resourceName));
                        parameter.setSchema(schema);
                        parameters.add(parameter);
                        createOperation.setParameters(parameters);

                        //Set response properties
                        Map<String, Response> responseMap = new HashMap<String, Response>();
                        Response responseSuccess = new Response();
                        responseSuccess.setDescription(SwaggerDocConstants.RETURNS_SUCCESS_OPERATION_OUTCOME);
                        Schema schemaSuccess = new Schema();
                        schemaSuccess.setRef(getSchemaRef(SwaggerDocConstants.OPERATION_OUTCOME));
                        schemaSuccess.setType(SwaggerDocConstants.OBJECT);
                        responseSuccess.setSchema(schemaSuccess);
                        Map<String, String> examplesSuccess = new HashMap<String, String>();
                        examplesSuccess.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.SUCCESS_PAYLOAD);
                        responseSuccess.setExamples(examplesSuccess);
                        responseMap.put(SwaggerDocConstants.SUCCESS_RESPONSE_CODE, responseSuccess);

                        Response responseError = new Response();
                        responseError.setDescription(SwaggerDocConstants.ERROR_OCCURRED);
                        Schema schemaError = new Schema();
                        schemaError.setRef(getSchemaRef(SwaggerDocConstants.GENERAL_ERROR));
                        schemaError.setType(SwaggerDocConstants.OBJECT);
                        Map<String, String> examplesError = new HashMap<String, String>();
                        examplesError.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.ERROR_PAYLOAD);
                        responseError.setExamples(examplesError);
                        responseError.setSchema(schemaError);
                        responseMap.put(SwaggerDocConstants.ERROR_RESPONSE_CODE, responseError);
                        createOperation.setResponses(responseMap);

                        createOperationsMap.put(SwaggerDocConstants.POST, createOperation);
                        create.setOperations(createOperationsMap);
                        pathMap.put(pathId, create);
                    } else if (SwaggerDocConstants.UPDATE.equalsIgnoreCase(restResourceInteraction.getCode())) {
                        //Configure PUT operation path properties
                        String pathId = "/" + resourceName + "/" + SwaggerDocConstants.UPDATE_RESOURCE_PATH;
                        Path update;
                        Map<String, Operation> updateOperationsMap;
                        if (pathMap.containsKey(pathId)) {
                            update = pathMap.get(pathId);
                            updateOperationsMap = update.getOperations();
                            if (updateOperationsMap == null) {
                                updateOperationsMap = new HashMap<String, Operation>();
                            }
                        } else {
                            update = new Path();
                            updateOperationsMap = new HashMap<String, Operation>();
                        }
                        Operation updateOperation = new Operation();
                        updateOperation.setSummary(SwaggerDocConstants.UPDATR_RESOURCE + " " + resourceName + " "
                                + SwaggerDocConstants.RESOURCE + " " + SwaggerDocConstants.CONTENT_OF_THE_REQUEST);
                        List<String> produces = new ArrayList<String>();
                        //Set mime type supported
                        produces.add(SwaggerDocConstants.PRODUCES_JSON);
                        produces.add(SwaggerDocConstants.PRODUCES_XML);
                        List<CodeDt> formats = conformance.getFormat();
                        for (CodeDt format : formats) {
                            produces.add(format.getValue());
                        }
                        updateOperation.setProduces(produces);
                        //Set put operation parameters and responses
                        List<Parameter> parameters = new ArrayList<Parameter>();
                        Parameter parameter = new Parameter();
                        parameter.setDescription(resourceName + " " + SwaggerDocConstants.RESOURCE + " "
                                + SwaggerDocConstants.OBJECT);
                        parameter.setName(SwaggerDocConstants.BODY);
                        parameter.setIn(SwaggerDocConstants.IN_BODY);
                        parameter.setRequired(true);
                        parameter.setType(null);

                        Schema schema = new Schema();
                        schema.setRef(getSchemaRef(resourceName));
                        parameter.setSchema(schema);

                        parameters.add(parameter);

                        Parameter parameterId = new Parameter();
                        parameterId.setDescription(SwaggerDocConstants.ID_DESCRIPTION + " " + resourceName + " "
                                + SwaggerDocConstants.RESOURCE);
                        parameterId.setName(SwaggerDocConstants.ID);
                        parameterId.setIn(SwaggerDocConstants.IN_PATH);
                        parameterId.setRequired(true);
                        parameters.add(parameterId);

                        updateOperation.setParameters(parameters);

                        Map<String, Response> responseMap = new HashMap<String, Response>();
                        Response responseSuccess = new Response();
                        responseSuccess.setDescription(SwaggerDocConstants.RETURNS_SUCCESS_OPERATION_OUTCOME);
                        Schema schemaSuccess = new Schema();
                        schemaSuccess.setRef(getSchemaRef(SwaggerDocConstants.OPERATION_OUTCOME));
                        schemaSuccess.setType(SwaggerDocConstants.OBJECT);
                        responseSuccess.setSchema(schemaSuccess);
                        Map<String, String> examplesSuccess = new HashMap<String, String>();
                        examplesSuccess.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.SUCCESS_PAYLOAD);
                        responseSuccess.setExamples(examplesSuccess);
                        responseMap.put(SwaggerDocConstants.SUCCESS_RESPONSE_CODE, responseSuccess);

                        Response responseError = new Response();
                        responseError.setDescription(SwaggerDocConstants.ERROR_OCCURRED);
                        Schema schemaError = new Schema();
                        schemaError.setRef(getSchemaRef(SwaggerDocConstants.GENERAL_ERROR));
                        schemaError.setType(SwaggerDocConstants.OBJECT);
                        responseError.setSchema(schemaError);
                        Map<String, String> examplesError = new HashMap<String, String>();
                        examplesError.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.ERROR_PAYLOAD);
                        responseError.setExamples(examplesError);
                        responseMap.put(SwaggerDocConstants.ERROR_RESPONSE_CODE, responseError);
                        updateOperation.setResponses(responseMap);

                        updateOperationsMap.put(SwaggerDocConstants.PUT, updateOperation);
                        update.setOperations(updateOperationsMap);
                        pathMap.put(pathId, update);
                    } else if (SwaggerDocConstants.DELETE.equalsIgnoreCase(restResourceInteraction.getCode())) {
                        //Set DELETE operation path properties
                        String pathId = "/" + resourceName + "/" + SwaggerDocConstants.DELETE_RESOURCE_PATH;
                        Path delete;
                        Map<String, Operation> deleteOperationMap;
                        if (pathMap.containsKey(pathId)) {
                            delete = pathMap.get(pathId);
                            deleteOperationMap = delete.getOperations();
                            if (deleteOperationMap == null) {
                                deleteOperationMap = new HashMap<String, Operation>();
                            }
                        } else {
                            delete = new Path();
                            deleteOperationMap = new HashMap<String, Operation>();
                        }
                        Operation deleteOperation = new Operation();
                        deleteOperation.setSummary(SwaggerDocConstants.RETURNS + " " + resourceName + " "
                                + SwaggerDocConstants.DETAILS_OF_GIVEN_ID);

                        List<String> produces = new ArrayList<String>();
                        //Set mime type supported
                        produces.add(SwaggerDocConstants.PRODUCES_JSON);
                        produces.add(SwaggerDocConstants.PRODUCES_XML);
                        List<CodeDt> formats = conformance.getFormat();
                        for (CodeDt format : formats) {
                            produces.add(format.getValue());
                        }
                        deleteOperation.setProduces(produces);
                        List<Parameter> parameters = new ArrayList<Parameter>();
                        Parameter parameter = new Parameter();
                        parameter.setDescription(SwaggerDocConstants.ID_DESCRIPTION + " " + resourceName + " "
                                + SwaggerDocConstants.RESOURCE);
                        parameter.setName(SwaggerDocConstants.ID);
                        parameter.setIn(SwaggerDocConstants.IN_PATH);
                        parameter.setRequired(true);
                        parameters.add(parameter);
                        deleteOperation.setParameters(parameters);
                        ;

                        Map<String, Response> responseMap = new HashMap<String, Response>();
                        Response responseSuccess = new Response();
                        responseSuccess.setDescription(SwaggerDocConstants.DELETE_DESCRIPTION + " " + resourceName
                                + " " + SwaggerDocConstants.DETAILS_OF_GIVEN_ID);
                        Map<String, String> examplesSuccess = new HashMap<String, String>();
                        examplesSuccess.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.SUCCESS_PAYLOAD);
                        responseSuccess.setExamples(examplesSuccess);
                        responseMap.put(SwaggerDocConstants.SUCCESS_RESPONSE_CODE, responseSuccess);

                        Response responseError = new Response();
                        responseError.setDescription(SwaggerDocConstants.ERROR_OCCURRED);
                        Schema schemaError = new Schema();
                        schemaError.setRef(getSchemaRef(SwaggerDocConstants.GENERAL_ERROR));
                        schemaError.setType(SwaggerDocConstants.OBJECT);
                        Map<String, String> examplesError = new HashMap<String, String>();
                        examplesError.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.ERROR_PAYLOAD);
                        responseError.setExamples(examplesError);
                        responseError.setSchema(schemaError);
                        responseMap.put(SwaggerDocConstants.ERROR_RESPONSE_CODE, responseError);
                        deleteOperation.setResponses(responseMap);

                        deleteOperationMap.put(SwaggerDocConstants.DELETE, deleteOperation);
                        delete.setOperations(deleteOperationMap);
                        pathMap.put(pathId, delete);
                    } else if (SwaggerDocConstants.SEARCH_TYPE
                            .equalsIgnoreCase(restResourceInteraction.getCode())) {
                        //Set search operation GET method parameters
                        String pathId = "/" + resourceName;
                        Path search;
                        Map<String, Operation> searchOperationMap;
                        if (pathMap.containsKey(pathId)) {
                            search = pathMap.get(pathId);
                            searchOperationMap = search.getOperations();
                            if (searchOperationMap == null) {
                                searchOperationMap = new HashMap<String, Operation>();
                            }
                        } else {
                            search = new Path();
                            searchOperationMap = new HashMap<String, Operation>();
                        }
                        Operation searchOperation = new Operation();
                        searchOperation.setSummary(SwaggerDocConstants.RETURNS + " " + resourceName + " "
                                + SwaggerDocConstants.RETURNS_MATCHING_RESTULS);

                        List<String> produces = new ArrayList<String>();
                        //Set mime type supported
                        produces.add(SwaggerDocConstants.PRODUCES_JSON);
                        produces.add(SwaggerDocConstants.PRODUCES_XML);
                        List<CodeDt> formats = conformance.getFormat();
                        for (CodeDt format : formats) {
                            produces.add(format.getValue());
                        }
                        searchOperation.setProduces(produces);
                        Map<String, Parameter> parameters = new HashMap<String, Parameter>();
                        List<Conformance.RestResourceSearchParam> searchParams = resource.getSearchParam();
                        for (Conformance.RestResourceSearchParam searchParam : searchParams) {
                            Parameter parameter = new Parameter();
                            parameter.setDescription(searchParam.getDocumentation());
                            parameter.setName(searchParam.getName());
                            parameter.setIn(SwaggerDocConstants.IN_QUERY);
                            parameter.setRequired(false);
                            parameters.put(searchParam.getName(), parameter);
                        }

                        Map<String, Response> responseMap = new HashMap<String, Response>();
                        Response responseSuccess = new Response();
                        responseSuccess.setDescription(SwaggerDocConstants.BUNDLE_DESCRIPTION + " " + resourceName
                                + " " + SwaggerDocConstants.RESOURCES);
                        Schema schemaSuccess = new Schema();
                        schemaSuccess.setRef(getSchemaRef(resourceName));
                        schemaSuccess.setType(SwaggerDocConstants.ARRAY);
                        responseSuccess.setSchema(schemaSuccess);
                        setExamples(resourceName, responseSuccess);
                        responseMap.put(SwaggerDocConstants.SUCCESS_RESPONSE_CODE, responseSuccess);

                        Response responseError = new Response();
                        responseError.setDescription(SwaggerDocConstants.ERROR_OCCURRED);
                        Schema schemaError = new Schema();
                        schemaError.setRef(getSchemaRef(SwaggerDocConstants.GENERAL_ERROR));
                        schemaError.setType(SwaggerDocConstants.OBJECT);
                        responseError.setSchema(schemaError);
                        Map<String, String> examplesError = new HashMap<String, String>();
                        examplesError.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.ERROR_PAYLOAD);
                        responseError.setExamples(examplesError);
                        responseMap.put(SwaggerDocConstants.ERROR_RESPONSE_CODE, responseError);
                        searchOperation.setResponses(responseMap);
                        List<Parameter> parametersAvailable = new ArrayList<Parameter>();
                        for (Map.Entry<String, Parameter> parameter : parameters.entrySet()) {
                            parametersAvailable.add(parameter.getValue());
                        }
                        searchOperation.setParameters(parametersAvailable);
                        searchOperationMap.put(SwaggerDocConstants.GET, searchOperation);
                        search.setOperations(searchOperationMap);
                        pathMap.put(pathId, search);
                    }
                }
                createDefinition(resourceName);
            }

            //Set $everything operation properties
            for (Conformance.RestOperation restOperation : restResource.getOperation()) {
                if (SwaggerDocConstants.EVERYTHING.equalsIgnoreCase(restOperation.getName())) {
                    OperationDefinition resource = (OperationDefinition) restOperation.getDefinition()
                            .getResource();
                    if (resource == null) {
                        continue;
                    }
                    String resourceName = resource.getType().get(0).getValue();
                    String pathId = "/" + resourceName + "/" + SwaggerDocConstants.POST_RESOURCE_PATH + "/"
                            + SwaggerDocConstants.EVERYTHING;
                    Path everything;
                    Map<String, Operation> everythingOperationsMap;
                    if (pathMap.containsKey(pathId)) {
                        everything = pathMap.get(pathId);
                        everythingOperationsMap = everything.getOperations();
                        if (everythingOperationsMap == null) {
                            everythingOperationsMap = new HashMap<String, Operation>();
                        }
                    } else {
                        everything = new Path();
                        everythingOperationsMap = new HashMap<String, Operation>();
                    }

                    Operation everythingOp = new Operation();
                    everythingOp.setSummary(SwaggerDocConstants.RETURNS + " " + resourceName + " "
                            + SwaggerDocConstants.EVERYTHING_OF_GIVEN_ID);
                    List<String> produces = new ArrayList<String>();
                    //Set mime type supported
                    produces.add(SwaggerDocConstants.PRODUCES_JSON);
                    produces.add(SwaggerDocConstants.PRODUCES_XML);
                    List<CodeDt> formats = conformance.getFormat();
                    for (CodeDt format : formats) {
                        produces.add(format.getValue());
                    }

                    everythingOp.setProduces(produces);

                    List<Parameter> parameters = new ArrayList<Parameter>();
                    Parameter parameter = new Parameter();
                    parameter.setDescription(SwaggerDocConstants.ID_DESCRIPTION + " " + resourceName + " "
                            + SwaggerDocConstants.RESOURCE);
                    parameter.setName(SwaggerDocConstants.ID);
                    parameter.setIn(SwaggerDocConstants.IN_PATH);
                    parameter.setRequired(true);
                    parameters.add(parameter);

                    Parameter parameterBody = new Parameter();
                    parameterBody.setDescription(resourceName + " " + SwaggerDocConstants.RESOURCE + " "
                            + SwaggerDocConstants.BODY_SAMPLE_VALUE);
                    parameterBody.setName(SwaggerDocConstants.BODY);
                    parameterBody.setIn(SwaggerDocConstants.IN_BODY);
                    parameterBody.setType(null);
                    parameterBody.setRequired(true);
                    Schema schema = new Schema();
                    schema.setRef(getSchemaRef(resourceName));
                    parameterBody.setSchema(schema);
                    parameters.add(parameterBody);

                    everythingOp.setParameters(parameters);

                    Map<String, Response> responseMap = new HashMap<String, Response>();
                    Response responseSuccess = new Response();
                    responseSuccess.setDescription(SwaggerDocConstants.RETURNS + " " + resourceName + " "
                            + SwaggerDocConstants.EVERYTHING_OF_GIVEN_ID);
                    Schema schemaSuccess = new Schema();
                    schemaSuccess.setRef(getSchemaRef(resourceName));
                    schemaSuccess.setType(SwaggerDocConstants.OBJECT);
                    responseSuccess.setSchema(schemaSuccess);
                    responseMap.put(SwaggerDocConstants.SUCCESS_RESPONSE_CODE, responseSuccess);

                    Response responseError = new Response();
                    responseError.setDescription(SwaggerDocConstants.ERROR_OCCURRED);
                    Schema schemaError = new Schema();
                    schemaError.setRef(getSchemaRef(SwaggerDocConstants.GENERAL_ERROR));
                    schemaError.setType(SwaggerDocConstants.OBJECT);
                    responseError.setSchema(schemaError);
                    Map<String, String> examplesError = new HashMap<String, String>();
                    examplesError.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.ERROR_PAYLOAD);
                    responseError.setExamples(examplesError);
                    responseMap.put(SwaggerDocConstants.ERROR_RESPONSE_CODE, responseError);
                    everythingOp.setResponses(responseMap);

                    everythingOperationsMap.put(SwaggerDocConstants.POST, everythingOp);
                    everything.setOperations(everythingOperationsMap);
                    pathMap.put(pathId, everything);
                }
            }

            createDefinition(SwaggerDocConstants.GENERAL_ERROR);
            createDefinition(SwaggerDocConstants.OPERATION_OUTCOME);
            createDefinition(SwaggerDocConstants.BUNDLE);
        }
        fullPaths.setPaths(pathMap);
        swaggerSpecification.setPaths(fullPaths);
    }

    private void createObjectDefinitions() {
        Definitions definitions = new Definitions();
        definitions.setDefinitions(definitionMap);
        swaggerSpecification.setDefinitions(definitions);
    }

    private void createDefinition(String resourceName) {
        String definitionName = resourceName;
        Definition definition = new Definition();
        definition.setType(SwaggerDocConstants.OBJECT);
        definitionMap.put(definitionName, definition);
    }

    /**
     * @return the swaggerSpecification
     */
    public SwaggerSpecification getSwaggerSpecification() {
        return swaggerSpecification;
    }

    private String createSwaggerSpecification() {
        String json = "";
        try {
            ObjectMapper mapper = new ObjectMapper();
            mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
            mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, true);
            mapper.setSerializationInclusion(Include.NON_NULL);
            mapper.getSerializerProvider().setNullKeySerializer(new NullSerializer());
            json = mapper.writeValueAsString(swaggerSpecification);
        } catch (Exception exp) {
            log.error("Error while creating object mapper", exp);
        }
        return json;
    }

    /**
     * @return the baseUrl
     */
    public String getBaseUrl() {
        return baseUrl;
    }

    /**
     * @param baseUrl the baseUrl to set
     */
    public void setBaseUrl(String baseUrl) {
        this.baseUrl = baseUrl;
    }

    public void addParameters() {
        Map<String, Parameter> parameters = new HashMap<String, Parameter>();
        Parameter parameter = new Parameter();
        parameter.setName(SwaggerDocConstants.FORMAT_PARAM);
        parameter.setDescription(SwaggerDocConstants.FORMAT_PARAM_DESC);
        parameter.setIn(SwaggerDocConstants.IN_QUERY);
        parameter.setRequired(false);
        parameters.put(SwaggerDocConstants.FORMAT_PARAM_NAME, parameter);
        swaggerSpecification.setParameters(parameters);
    }

    private String getSchemaRef(String resourceName) {
        return "#/definitions/" + resourceName;
    }

    private void setExamples(String resourceName, Response responseSuccess) {
        Map<String, String> examples = new HashMap<String, String>();
        if (SwaggerDocConstants.PERSON_RESOURCE.equalsIgnoreCase(resourceName)) {
            examples.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.PERSON_PAYLOAD);
        } else if (SwaggerDocConstants.PATIENT_RESOURCE.equalsIgnoreCase(resourceName)) {
            examples.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.PATIENT_PAYLOAD);
        } else if (SwaggerDocConstants.PRACTITIONER_RESOURCE.equalsIgnoreCase(resourceName)) {
            examples.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.PRACTITIONER_PAYLOAD);
        } else if (SwaggerDocConstants.ENCOUNTER_RESOURCE.equalsIgnoreCase(resourceName)) {
            examples.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.ENCOUNTER_PAYLOAD);
        } else if (SwaggerDocConstants.FAMILY_HISTORY_RESOURCE.equalsIgnoreCase(resourceName)) {
            examples.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.FAMILY_HISTORY_PAYLOAD);
        } else if (SwaggerDocConstants.ALLERGY_RESOURCE.equalsIgnoreCase(resourceName)) {
            examples.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.ALLERGY_PAYLOAD);
        } else if (SwaggerDocConstants.OBSERVATION_RESOURCE.equalsIgnoreCase(resourceName)) {
            examples.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.OBSERVATION_PAYLOAD);
        } else if (SwaggerDocConstants.LOCATION_RESOURCE.equalsIgnoreCase(resourceName)) {
            examples.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.LOCATION_PAYLOAD);
        } else {
            examples.put(SwaggerDocConstants.CONSUMES_JSON, SwaggerDocConstants.EMPTY);
        }
        responseSuccess.setExamples(examples);
    }
}