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

org.apache.juneau.httppart.bean.RequestBeanMeta Maven / Gradle / Ivy

// ***************************************************************************************************************************
// * 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.juneau.httppart.bean;

import static org.apache.juneau.httppart.bean.Utils.*;
import static org.apache.juneau.internal.ClassUtils.*;
import static org.apache.juneau.internal.CollectionUtils.*;
import static org.apache.juneau.httppart.HttpPartType.*;

import java.util.*;

import org.apache.juneau.*;
import org.apache.juneau.cp.*;
import org.apache.juneau.http.annotation.*;
import org.apache.juneau.httppart.*;
import org.apache.juneau.reflect.*;

/**
 * Represents the metadata gathered from a parameter or class annotated with {@link Request}.
 *
 * 
See Also:
*/ public class RequestBeanMeta { /** * Create metadata from specified parameter. * * @param mpi The method parameter. * @param annotations The annotations to apply to any new part serializers or parsers. * @return Metadata about the parameter, or null if parameter or parameter type not annotated with {@link Request}. */ public static RequestBeanMeta create(ParamInfo mpi, AnnotationWorkList annotations) { if (mpi.hasNoAnnotation(Request.class)) return null; return new RequestBeanMeta.Builder(annotations).apply(mpi).build(); } /** * Create metadata from specified class. * * @param c The class annotated with {@link Request}. * @param annotations The annotations to apply to any new part serializers or parsers. * @return Metadata about the class, or null if class not annotated with {@link Request}. */ public static RequestBeanMeta create(Class c, AnnotationWorkList annotations) { ClassInfo ci = ClassInfo.of(c); if (ci.hasNoAnnotation(Request.class)) return null; return new RequestBeanMeta.Builder(annotations).apply(c).build(); } //----------------------------------------------------------------------------------------------------------------- // Instance //----------------------------------------------------------------------------------------------------------------- private final ClassMeta cm; private final Map properties; private final HttpPartSerializer serializer; private final HttpPartParser parser; RequestBeanMeta(Builder b) { this.cm = b.cm; this.serializer = b.serializer.orElse(null); this.parser = b.parser.orElse(null); Map properties = map(); b.properties.forEach((k,v) -> properties.put(k, v.build(serializer, parser))); this.properties = unmodifiable(properties); } static class Builder { ClassMeta cm; AnnotationWorkList annotations; BeanCreator serializer = BeanCreator.of(HttpPartSerializer.class); BeanCreator parser = BeanCreator.of(HttpPartParser.class); Map properties = map(); Builder(AnnotationWorkList annotations) { this.annotations = annotations; } Builder apply(ParamInfo mpi) { return apply(mpi.getParameterType().inner()).apply(mpi.getAnnotation(Request.class)); } Builder apply(Class c) { this.cm = BeanContext.DEFAULT.getClassMeta(c); apply(cm.getLastAnnotation(Request.class)); cm.getInfo().forEachPublicMethod(x -> true, x -> { String n = x.getSimpleName(); if (x.hasAnnotation(Header.class)) { assertNoArgs(x, Header.class); assertReturnNotVoid(x, Header.class); properties.put(n, RequestBeanPropertyMeta.create(HEADER, Header.class, x)); } else if (x.hasAnnotation(Query.class)) { assertNoArgs(x, Query.class); assertReturnNotVoid(x, Query.class); properties.put(n, RequestBeanPropertyMeta.create(QUERY, Query.class, x)); } else if (x.hasAnnotation(FormData.class)) { assertNoArgs(x, FormData.class); assertReturnNotVoid(x, FormData.class); properties.put(n, RequestBeanPropertyMeta.create(FORMDATA, FormData.class, x)); } else if (x.hasAnnotation(Path.class)) { assertNoArgs(x, Path.class); assertReturnNotVoid(x, Path.class); properties.put(n, RequestBeanPropertyMeta.create(PATH, Path.class, x)); } else if (x.hasAnnotation(Content.class)) { assertNoArgs(x, Content.class); assertReturnNotVoid(x, Content.class); properties.put(n, RequestBeanPropertyMeta.create(BODY, Content.class, x)); } }); return this; } Builder apply(Request a) { if (a != null) { if (isNotVoid(a.serializer())) serializer.type(a.serializer()); if (isNotVoid(a.parser())) parser.type(a.parser()); } return this; } RequestBeanMeta build() { return new RequestBeanMeta(this); } } /** * Returns metadata about the class. * * @return Metadata about the class. */ public ClassMeta getClassMeta() { return cm; } /** * Returns metadata about the bean property with the specified property name. * * @param name The bean property name. * @return Metadata about the bean property, or null if none found. */ public RequestBeanPropertyMeta getProperty(String name) { return properties.get(name); } /** * Returns all the annotated methods on this bean. * * @return All the annotated methods on this bean. */ public Collection getProperties() { return properties.values(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy