| /* |
| * 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); |
| } |
| } |
| |
| } |