blob: 605fa42be49401eeae25bbf58944a77ee943be1b [file] [log] [blame]
/*
* 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);
}
}
}