org.apache.axis2.jaxrs.JAXRSUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.axis2.jaxrs.JAXRSUtils.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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 org.apache.axis2.jaxrs;

import org.apache.axis2.Constants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import java.lang.reflect.Method;
import java.lang.annotation.Annotation;

public class JAXRSUtils {
    private static Log log = LogFactory.getLog(JAXRSModel.class);

    /**
      * returns a jaxrs class model reading class level annotation given the service class
      * @param serviceClass
      * @return
      */
    public static JAXRSModel getClassModel(Class serviceClass) {
        JAXRSModel model = new JAXRSModel();
        Annotation[] annotation = serviceClass.getAnnotations();
        for (Annotation a : annotation) {
            if (a != null) {
                if (a instanceof Produces) {
                    addProducesToClassModel((Produces) a, model);
                } else if (a instanceof Consumes) {
                    addConsumesToClassModel((Consumes) a, model);
                } else if (a instanceof Path) {
                    addPathToClassModel((Path) a, model);
                } else {
                    System.out.println("Could not identify the Annotation....");
                }

            }

        }

        return model;
    }

    /**
      * given a jaxrs class model & java method , construct a jaxrs model associated with
      * method , reading the method level annotations.
      * @param classModel
      * @param serviceMethod
      * @return
      */
    public static JAXRSModel getMethodModel(JAXRSModel classModel, Method serviceMethod) {
        JAXRSModel model = new JAXRSModel();
        addProducesToMethodModel(classModel, model);
        addConsumesToMethodModel(classModel, model);
        addPathToMethodModel(classModel, model);
        Annotation[] annotation = serviceMethod.getAnnotations();
        for (Annotation a : annotation) {
            if (a != null) {
                if (a instanceof Produces) {
                    addProducesToMethodModel((Produces) a, model);
                } else if (a instanceof Consumes) {
                    addConsumesToMethodModel((Consumes) a, model);
                } else if (a instanceof Path) {
                    addPathToMethodModel((Path) a, model);
                } else {
                    addHTTPMethodToMethodModel(a, model);
                }

            }
        }
        return model;
    }

    /**
      * add value of the produces annotation to the given jaxrs-class model.method breaks the
      * input String & convert it to a String[] before adding.
      * @param produces
      * @param classModel
      */
    private static void addProducesToClassModel(Produces produces, JAXRSModel classModel) {

        String[] array = null;
        String value = null;
        array = produces.value();
        for (String s : array) {
            if (value == null) {
                value = s;
            } else {
                value = value + "," + s;
            }
        }

        classModel.setProduces(value);

    }

    /**
      * add value of the consumes annotaiton to the given jaxrs-class model. breaks the input String
      * & convert it to a string[] before adding.
      * @param consumes
      * @param classModel
      */
    private static void addConsumesToClassModel(Consumes consumes, JAXRSModel classModel) {

        String[] array = null;
        String value = null;
        array = consumes.value();
        for (String s : array) {
            if (value == null) {
                value = s;
            } else {
                value = value + "," + s;
            }
        }
        classModel.setConsumes(value);

    }

    /**
      * adding value of the path annotation to the class model
      * @param path
      * @param classModel
      */
    private static void addPathToClassModel(Path path, JAXRSModel classModel) {

        String value = null;
        value = path.value();
        if (value != null) {
            if (value.startsWith("/")) {
                value = value.substring(1);
            }
            if (value.endsWith("/")) {
                value = value.substring(0, (value.length() - 1));
            }
        }

        classModel.setPath(value);

    }

    private static void addProducesToMethodModel(Produces produces, JAXRSModel methodModel) {

        String value = null;
        for (String s : produces.value()) {
            if (value != null) {
                value = value + s;
            } else {
                value = s;
            }
            methodModel.setProduces(value);
        }

    }

    private static void addProducesToMethodModel(JAXRSModel classModel, JAXRSModel methodModel) {
        String value = classModel.getProduces();
        if (value != null) {
            methodModel.setProduces(value);
        }
    }

    private static void addConsumesToMethodModel(Consumes consumes, JAXRSModel methodModel) {
        String value = null;
        for (String s : consumes.value()) {
            if (value != null) {
                value = value + s;
            } else {
                value = s;
            }
            methodModel.setConsumes(value);
        }

    }

    /**
      * copies class level Consumes value to method level model
      * @param classModel
      * @param methodModel
      */
    private static void addConsumesToMethodModel(JAXRSModel classModel, JAXRSModel methodModel) {
        String value = classModel.getConsumes();
        if (value != null) {
            methodModel.setConsumes(value);
        }
    }

    /**
     * add value of the HTTPMethod to the jaxrs-method model. axis2 only supports POST,GET,PUT,DELETE.
      * it doesnt support HEAD. if HEAD is given it resolves to the default method (POST)
      * @param annotation
      * @param methodModel
      */

    private static void addHTTPMethodToMethodModel(Annotation annotation, JAXRSModel methodModel) {

        if (annotation instanceof POST) {
            methodModel.setHTTPMethod(Constants.Configuration.HTTP_METHOD_POST);
        } else if (annotation instanceof GET) {
            methodModel.setHTTPMethod(Constants.Configuration.HTTP_METHOD_GET);
        } else if (annotation instanceof PUT) {
            methodModel.setHTTPMethod(Constants.Configuration.HTTP_METHOD_PUT);
        } else if (annotation instanceof DELETE) {
            methodModel.setHTTPMethod(Constants.Configuration.HTTP_METHOD_DELETE);
        } else if (annotation instanceof HEAD) {
            log.warn("HTTP Method HEAD is not supported by AXIS2");
        }

    }

    /**
      * add http location to jaxrs method model. if service level location is already available
      * it concatanates two.
      * @param path
      * @param methodModel
      */
    private static void addPathToMethodModel(Path path, JAXRSModel methodModel) {
        String value = path.value();
        if (value != null) {
            if (value.startsWith("/")) {
                value = value.substring(1);
            }
            if (value.endsWith("/")) {
                value = value.substring(0, (value.length() - 1));
            }
        }
        if (methodModel.getPath() != null) {

            methodModel.setPath(methodModel.getPath() + "/" + value);
        } else {

            methodModel.setPath(value);
        }
    }

    /**
      * this copies the class service level path to method level
      * @param classModel
      * @param methodModel
      */
    private static void addPathToMethodModel(JAXRSModel classModel, JAXRSModel methodModel) {
        String value = classModel.getPath();
        if (value != null) {
            methodModel.setPath(value);
        }
    }

}