http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/91a388d0/juneau-server/src/main/java/org/apache/juneau/server/annotation/Parameter.java ---------------------------------------------------------------------- diff --git a/juneau-server/src/main/java/org/apache/juneau/server/annotation/Parameter.java b/juneau-server/src/main/java/org/apache/juneau/server/annotation/Parameter.java deleted file mode 100755 index ff7de59..0000000 --- a/juneau-server/src/main/java/org/apache/juneau/server/annotation/Parameter.java +++ /dev/null @@ -1,180 +0,0 @@ -// *************************************************************************************************************************** -// * 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.server.annotation; - -import static java.lang.annotation.ElementType.*; -import static java.lang.annotation.RetentionPolicy.*; - -import java.lang.annotation.*; - -/** - * Annotation used in conjunction with {@link RestMethod#parameters()} to identify content and header descriptions - * on specific method requests. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>( - * name=<js>"*"</js>, - * parameters={ - * <ja>@Parameter</ja>(in=<js>"header"</js>, name=<js>"Range"</js>, description=<js>"$L{ContentRange.description}"</js>) - * } - * ) - * <jk>public void</jk> doAnything(RestRequest req, RestResponse res, <ja>@Method</ja> String method) { - * ... - * } - * </p> - */ -@Documented -@Target(PARAMETER) -@Retention(RUNTIME) -@Inherited -public @interface Parameter { - - /** - * The location of the parameter. - * <p> - * Possible values are: - * <ul> - * <li><js>"query"</js> - * <li><js>"header"</js> - * <li><js>"path"</js> - * <li><js>"formData"</js> - * <li><js>"body"</js> - * </ul> - */ - String in() default ""; - - /** - * The name of the parameter (e.g. <js>"Content-Range"</js>). - * <p> - * Parameter names are case sensitive. - * If <code>in</code> is <js>"path"</js>, the name field MUST correspond to the associated path segment from the <code>path</code> field in the <a href='http://swagger.io/specification/#pathsObject'>Paths Object</a>. - * See <a href='http://swagger.io/specification/#pathTemplating'>Path Templating</a> for further information. - * For all other cases, the name corresponds to the parameter name used based on the <code>in</code> property. - */ - String name() default ""; - - /** - * Parameter description (e.g. <js>"Indicates the range returned when Range header is present in the request"</js>). - * <p> - * A brief description of the parameter. - * This could contain examples of use. - * <a href='https://help.github.com/articles/github-flavored-markdown'>GFM syntax</a> can be used for rich text representation. - * <p> - * The default value pulls the description from the <code>description</code> entry in the servlet resource bundle. - * (e.g. <js>"myMethod.res.[code].[category].[name] = foo"</js> or <js>"MyServlet.myMethod.res.[code].[category].[name] = foo"</js>). - */ - String description() default ""; - - /** - * Determines whether this parameter is mandatory. - * <p> - * If the parameter is <code>in</code> <js>"path"</js>, this property is required and its value MUST be <jk>true</jk>. - * Otherwise, the property MAY be included and its default value is <jk>false</jk>. - */ - boolean required() default false; - - /** - * The schema defining the type used for the body parameter. - * <p> - * Only applicable for <code>in</code> of type <js>"body"</js>. - * <p> - * The schema is a JSON object specified <a href='http://swagger.io/specification/#schemaObject'>here</a>. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>( - * parameters={ - * <ja>@Parameter</ja>( - * in=<js>"header"</js>, - * name=<js>"Foo"</js>, - * schema=<js>"{format:'string',title:'Foo header',description:'Header that contains the Foo value.'}"</js>) - * } - * ) - * <jk>public void</jk> doAnything() { - * </p> - */ - String schema() default ""; - - /** - * The type of the parameter. - * <p> - * The value MUST be one of <js>"string"</js>, <js>"number"</js>, <js>"integer"</js>, <js>"boolean"</js>, <js>"array"</js> or <js>"file"</js>. - * If type is <js>"file"</js>, the consumes MUST be either <js>"multipart/form-data"</js>, <js>"application/x-www-form-urlencoded"</js> or both and the parameter MUST be in <js>"formData"</js>. - */ - String type() default "string"; - - /** - * The extending format for the previously mentioned <code>type</code>. - * <p> - * See <a href='http://swagger.io/specification/#dataTypeFormat'>Data Type Formats</a> for further details. - */ - String format() default ""; - - /** - * Sets the ability to pass empty-valued parameters. - * <p> - * This is valid only for either <code>query</code> or <code>formData</code> parameters and allows you to send a parameter with a name only or an empty value. - * Default value is <jk>false</jk>. - */ - boolean allowEmptyValue() default false; - - /** - * Required if <code>type</code> is <js>"array"</js>. - * <p> - * Describes the type of items in the array. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>( - * parameters={ - * <ja>@Parameter</ja>( - * in=<js>"header"</js>, - * name=<js>"Foo"</js>, - * type=<js>"array"</js>, - * items=<js>"{type:'string',collectionFormat:'csv'}"</js>) - * } - * ) - * <jk>public void</jk> doAnything() { - * </p> - * <p> - * See <a href='http://swagger.io/specification/#itemsObject'>Items Object</a> for further details. - */ - String items() default ""; - - /** - * Determines the format of the array if type array is used. - * <p> - * Possible values are: - * <ul> - * <li><js>"csv"</js> - comma separated values <js>"foo,bar"</js>. - * <li><js>"ssv"</js> - space separated values <js>"foo bar"</js>. - * <li><js>"tsv"</js> - tab separated values <js>"foo\tbar"</js>. - * <li><js>"pipes"</js> - pipe separated values <js>"foo|bar"</js>. - * <li><js>"multi"</js> - corresponds to multiple parameter instances instead of multiple values for a single instance <js>"foo=bar&foo=baz"</js>. - * This is valid only for parameters <code>in</code> <js>"query"</js> or <js>"formData"</js>. - * </ul> - * Default value is <js>"csv"</js>. - */ - String collectionFormat() default ""; - - /** - * Declares the value of the parameter that the server will use if none is provided. - * <p> - * For example a "count" to control the number of results per page might default to 100 if not supplied by the client in the request. - * (Note: "default" has no meaning for required parameters.) - * See <a href='http://json-schema.org/latest/json-schema-validation.html#anchor101'>http://json-schema.org/latest/json-schema-validation.html#anchor101</a>. - * Unlike JSON Schema this value MUST conform to the defined <code>type</code> for this parameter. - */ - String _default() default ""; -}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/91a388d0/juneau-server/src/main/java/org/apache/juneau/server/annotation/Path.java ---------------------------------------------------------------------- diff --git a/juneau-server/src/main/java/org/apache/juneau/server/annotation/Path.java b/juneau-server/src/main/java/org/apache/juneau/server/annotation/Path.java deleted file mode 100755 index f0caa50..0000000 --- a/juneau-server/src/main/java/org/apache/juneau/server/annotation/Path.java +++ /dev/null @@ -1,72 +0,0 @@ -// *************************************************************************************************************************** -// * 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.server.annotation; - -import static java.lang.annotation.ElementType.*; -import static java.lang.annotation.RetentionPolicy.*; - -import java.lang.annotation.*; - -/** - * Annotation that can be applied to a parameter of a {@link RestMethod} annotated method - * to identify it as a variable in a URL path pattern converted to a POJO. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/myurl/{foo}/{bar}/{baz}/*"</js>) - * <jk>public void</jk> doGet(RestRequest req, RestResponse res, - * <ja>@Path</ja> String foo, <ja>@Path</ja> <jk>int</jk> bar, <ja>@Path</ja> UUID baz) { - * ... - * } - * </p> - * <p> - * The <ja>@Path</ja> annotation is optional if the parameters are specified immediately - * following the <code>RestRequest</code> and <code>RestResponse</code> parameters, - * and are specified in the same order as the variables in the URL path pattern. - * The following example is equivalent to the previous example. - * </p> - * <p class='bcode'> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/myurl/{foo}/{bar}/{baz}/*"</js>) - * <jk>public void</jk> doGet(RestRequest req, RestResponse res, - * String foo, <jk>int</jk> bar, UUID baz) { - * ... - * } - * </p> - * <p> - * If the order of parameters is not the default order shown above, the - * attribute names must be specified (since parameter names are lost during compilation). - * The following example is equivalent to the previous example, except - * the parameter order has been switched, requiring the use of the <ja>@Path</ja> - * annotations. - * <p> - * <p class='bcode'> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/myurl/{foo}/{bar}/{baz}/*"</js>) - * <jk>public void</jk> doGet(RestRequest req, RestResponse res, - * <ja>@Path</ja>(<js>"baz"</js>) UUID baz, <ja>@Path</ja>(<js>"foo"</js>) String foo, <ja>@Path</ja>(<js>"bar"</js>) <jk>int</jk> bar) { - * ... - * } - * </p> - */ -@Documented -@Target(PARAMETER) -@Retention(RUNTIME) -@Inherited -public @interface Path { - - /** - * URL variable name. - * <p> - * Optional if the attributes are specified in the same order as in the URL path pattern. - */ - String value() default ""; -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/91a388d0/juneau-server/src/main/java/org/apache/juneau/server/annotation/PathRemainder.java ---------------------------------------------------------------------- diff --git a/juneau-server/src/main/java/org/apache/juneau/server/annotation/PathRemainder.java b/juneau-server/src/main/java/org/apache/juneau/server/annotation/PathRemainder.java deleted file mode 100755 index 49e471f..0000000 --- a/juneau-server/src/main/java/org/apache/juneau/server/annotation/PathRemainder.java +++ /dev/null @@ -1,46 +0,0 @@ -// *************************************************************************************************************************** -// * 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.server.annotation; - -import static java.lang.annotation.ElementType.*; -import static java.lang.annotation.RetentionPolicy.*; - -import java.lang.annotation.*; - -/** - * Annotation that can be applied to a parameter of a {@link RestMethod} annotated method - * to identify it as the URL parameter remainder after a path pattern match. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/foo/*"</js>) - * <jk>public void</jk> doGet(RestRequest req, RestResponse res, <ja>@PathRemainder</ja> String remainder) { - * ... - * } - * </p> - * <p> - * This is functionally equivalent to the following code... - * </p> - * <p class='bcode'> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/foo/*"</js>) - * <jk>public void</jk> doGet(RestRequest req, RestResponse res) { - * String remainder = req.getPathRemainder(); - * ... - * } - * </p> - */ -@Documented -@Target(PARAMETER) -@Retention(RUNTIME) -@Inherited -public @interface PathRemainder {} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/91a388d0/juneau-server/src/main/java/org/apache/juneau/server/annotation/Properties.java ---------------------------------------------------------------------- diff --git a/juneau-server/src/main/java/org/apache/juneau/server/annotation/Properties.java b/juneau-server/src/main/java/org/apache/juneau/server/annotation/Properties.java deleted file mode 100755 index c77f28c..0000000 --- a/juneau-server/src/main/java/org/apache/juneau/server/annotation/Properties.java +++ /dev/null @@ -1,64 +0,0 @@ -// *************************************************************************************************************************** -// * 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.server.annotation; - -import static java.lang.annotation.ElementType.*; -import static java.lang.annotation.RetentionPolicy.*; - -import java.lang.annotation.*; - -import org.apache.juneau.*; - -/** - * Annotation that can be applied to a parameter of a {@link RestMethod} annotated method - * to identify the request-duration properties object for the current request. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>) - * <jk>public Person</jk> doGetPerson(<ja>@Properties</ja> ObjectMap properties) { - * properties.put(<jsf>HTMLDOC_title</jsf>, <js>"This is a person"</js>); - * ... - * } - * </p> - * <p> - * This is functionally equivalent to the following code... - * <p class='bcode'> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>) - * <jk>public Person</jk> doGetPerson(RestResponse res) { - * ObjectMap properties = res.getProperties(); - * properties.put(<jsf>HTMLDOC_title</jsf>, <js>"This is a person"</js>); - * ... - * } - * </p> - * <p> - * ...or this... - * <p class='bcode'> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>) - * <jk>public Person</jk> doGetPerson(RestResponse res) { - * res.setProperty(<jsf>HTMLDOC_title</jsf>, <js>"This is a person"</js>); - * ... - * } - * </p> - * <p> - * The parameter type can be one of the following: - * <ul> - * <li>{@link ObjectMap} - * <li><code>Map<String,Object></code> - * </ul> - */ -@Documented -@Target(PARAMETER) -@Retention(RUNTIME) -@Inherited -public @interface Properties {} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/91a388d0/juneau-server/src/main/java/org/apache/juneau/server/annotation/Property.java ---------------------------------------------------------------------- diff --git a/juneau-server/src/main/java/org/apache/juneau/server/annotation/Property.java b/juneau-server/src/main/java/org/apache/juneau/server/annotation/Property.java deleted file mode 100755 index bae4f0b..0000000 --- a/juneau-server/src/main/java/org/apache/juneau/server/annotation/Property.java +++ /dev/null @@ -1,63 +0,0 @@ -// *************************************************************************************************************************** -// * 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.server.annotation; - -import static java.lang.annotation.ElementType.*; -import static java.lang.annotation.RetentionPolicy.*; - -import java.lang.annotation.*; - -import org.apache.juneau.*; -import org.apache.juneau.jena.*; -import org.apache.juneau.json.*; -import org.apache.juneau.parser.*; -import org.apache.juneau.serializer.*; -import org.apache.juneau.xml.*; - -/** - * Property name/value pair used in the {@link RestResource#properties()} annotation. - * <p> - * Any of the following property names can be specified: - * <ul> - * <li>{@link BeanContext} - * <li>{@link SerializerContext} - * <li>{@link ParserContext} - * <li>{@link JsonSerializerContext} - * <li>{@link RdfSerializerContext} - * <li>{@link RdfParserContext} - * <li>{@link RdfCommonContext} - * <li>{@link XmlSerializerContext} - * <li>{@link XmlParserContext} - * </ul> - * <p> - * Property values types that are not <code>Strings</code> will automatically be converted to the - * correct type (e.g. <code>Boolean</code>, etc...). - * <p> - * See {@link RestResource#properties} for more information. - */ -@Documented -@Target(ANNOTATION_TYPE) -@Retention(RUNTIME) -@Inherited -public @interface Property { - - /** - * Property name. - */ - String name(); - - /** - * Property value. - */ - String value(); -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/91a388d0/juneau-server/src/main/java/org/apache/juneau/server/annotation/Query.java ---------------------------------------------------------------------- diff --git a/juneau-server/src/main/java/org/apache/juneau/server/annotation/Query.java b/juneau-server/src/main/java/org/apache/juneau/server/annotation/Query.java deleted file mode 100755 index 6de96b1..0000000 --- a/juneau-server/src/main/java/org/apache/juneau/server/annotation/Query.java +++ /dev/null @@ -1,92 +0,0 @@ -// *************************************************************************************************************************** -// * 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.server.annotation; - -import static java.lang.annotation.ElementType.*; -import static java.lang.annotation.RetentionPolicy.*; - -import java.lang.annotation.*; - -import org.apache.juneau.server.*; - -/** - * Identical to {@link FormData @FormData}, but only retrieves the parameter from the - * URL string, not URL-encoded form posts. - * <p> - * Unlike {@link FormData @FormData}, using this annotation does not result in the servlet reading the contents - * of URL-encoded form posts. - * Therefore, this annotation can be used in conjunction with the {@link Body @Body} annotation - * or {@link RestRequest#getBody(Class)} method for <code>application/x-www-form-urlencoded POST</code> calls. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>) - * <jk>public void</jk> doGet(RestRequest req, RestResponse res, - * <ja>@Query</ja>(<js>"p1"</js>) <jk>int</jk> p1, <ja>@Query</ja>(<js>"p2"</js>) String p2, <ja>@Query</ja>(<js>"p3"</js>) UUID p3) { - * ... - * } - * </p> - * <p> - * This is functionally equivalent to the following code... - * </p> - * <p class='bcode'> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>) - * <jk>public void</jk> doGet(RestRequest req, RestResponse res) { - * <jk>int</jk> p1 = req.getQueryParameter(<jk>int</jk>.<jk>class</jk>, <js>"p1"</js>, 0); - * String p2 = req.getQueryParameter(String.<jk>class</jk>, <js>"p2"</js>); - * UUID p3 = req.getQueryParameter(UUID.<jk>class</jk>, <js>"p3"</js>); - * ... - * } - * </p> - */ -@Documented -@Target(PARAMETER) -@Retention(RUNTIME) -@Inherited -public @interface Query { - - /** - * URL parameter name. - */ - String value(); - - /** - * Specify <jk>true</jk> if using multi-part parameters to represent collections and arrays. - * <p> - * Normally, we expect single parameters to be specified in UON notation for representing - * collections of values (e.g. <js>"&key=(1,2,3)"</js>. - * This annotation allows the use of multi-part parameters to represent collections - * (e.g. <js>"&key=1&key=2&key=3"</js>. - * <p> - * This setting should only be applied to Java parameters of type array or Collection. - */ - boolean multipart() default false; - - /** - * The expected format of the request parameter. - * <p> - * Possible values: - * <ul class='spaced-list'> - * <li><js>"UON"</js> - URL-Encoded Object Notation.<br> - * This notation allows for request parameters to contain arbitrarily complex POJOs. - * <li><js>"PLAIN"</js> - Plain text.<br> - * This treats request parameters as plain text.<br> - * Only POJOs directly convertable from <l>Strings</l> can be represented in parameters when using this mode. - * <li><js>"INHERIT"</js> (default) - Inherit from the {@link RestServletContext#REST_paramFormat} property on the servlet method or class. - * </ul> - * <p> - * Note that the parameter value <js>"(foo)"</js> is interpreted as <js>"(foo)"</js> when using plain mode, but - * <js>"foo"</js> when using UON mode. - */ - String format() default "INHERIT"; -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/91a388d0/juneau-server/src/main/java/org/apache/juneau/server/annotation/Response.java ---------------------------------------------------------------------- diff --git a/juneau-server/src/main/java/org/apache/juneau/server/annotation/Response.java b/juneau-server/src/main/java/org/apache/juneau/server/annotation/Response.java deleted file mode 100755 index 68da776..0000000 --- a/juneau-server/src/main/java/org/apache/juneau/server/annotation/Response.java +++ /dev/null @@ -1,87 +0,0 @@ -// *************************************************************************************************************************** -// * 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.server.annotation; - -import static java.lang.annotation.ElementType.*; -import static java.lang.annotation.RetentionPolicy.*; - -import java.lang.annotation.*; - -/** - * Annotation used in conjunction with {@link RestMethod#responses()} to identify possible responses by the method. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>( - * name=<js>"*"</js>, - * responses={ - * <ja>@Response</ja>(value=200,description=<js>"Everything was great."</js>), - * <ja>@Response</ja>(value=404,description=<js>"File was not found."</js>) - * <ja>@Response</ja>(500), - * } - * ) - * <jk>public void</jk> doAnything(RestRequest req, RestResponse res, <ja>@Method</ja> String method) { - * ... - * } - * </p> - */ -@Documented -@Target(PARAMETER) -@Retention(RUNTIME) -@Inherited -public @interface Response { - - /** - * HTTP response code. - */ - int value(); - - /** - * Optional description. - * <p> - * The default value pulls the description from the <code>description</code> entry in the servlet resource bundle. - * (e.g. <js>"myMethod.res.[code].description = foo"</js> or <js>"MyServlet.myMethod.res.[code].description = foo"</js>). - * <p> - * This field can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/paths/{path}/{method}/responses/{code}/description</code>. - */ - String description() default ""; - - /** - * A definition of the response structure. - * <p> - * It can be a primitive, an array or an object. - * If this field does not exist, it means no content is returned as part of the response. - * As an extension to the <a href='http://swagger.io/specification/#schemaObject'>Schema Object</a>, its root type value may also be <js>"file"</js>. - * This SHOULD be accompanied by a relevant produces mime-type. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>( - * name=<js>"*"</js>, - * responses={ - * <ja>@Response</ja>(value=200,schema=<js>"{type:'string',description:'A serialized Person bean.'}"</js>), - * } - * </p> - */ - String schema() default ""; - - /** - * Optional response headers. - * <p> - * Response variables can also be defined in the servlet resource bundle. - * (e.g. <js>"myMethod.res.[code].[category].[name] = foo"</js> or <js>"MyServlet.myMethod.res.[code].[category].[name] = foo"</js>). - */ - Parameter[] headers() default {}; -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/91a388d0/juneau-server/src/main/java/org/apache/juneau/server/annotation/RestMethod.java ---------------------------------------------------------------------- diff --git a/juneau-server/src/main/java/org/apache/juneau/server/annotation/RestMethod.java b/juneau-server/src/main/java/org/apache/juneau/server/annotation/RestMethod.java deleted file mode 100755 index 80d496f..0000000 --- a/juneau-server/src/main/java/org/apache/juneau/server/annotation/RestMethod.java +++ /dev/null @@ -1,505 +0,0 @@ -// *************************************************************************************************************************** -// * 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.server.annotation; - -import static java.lang.annotation.ElementType.*; -import static java.lang.annotation.RetentionPolicy.*; - -import java.lang.annotation.*; - -import org.apache.juneau.encoders.*; -import org.apache.juneau.parser.*; -import org.apache.juneau.serializer.*; -import org.apache.juneau.server.*; - -/** - * Identifies a REST Java method on a {@link RestServlet} implementation class. - * <p> - * Refer to {@link org.apache.juneau.server} doc for information on using this class. - */ -@Documented -@Target(METHOD) -@Retention(RUNTIME) -@Inherited -public @interface RestMethod { - - /** - * REST method name. - * <p> - * Typically <js>"GET"</js>, <js>"PUT"</js>, <js>"POST"</js>, <js>"DELETE"</js>, or <js>"OPTIONS"</js>. - * <p> - * Can also be a non-HTTP-standard name that is passed in through a <code>&method=methodName</code> URL parameter. - * <p> - * Method names are case-insensitive (always folded to upper-case). - * <p> - * If a method name is not specified, then the method name is determined based on the Java method name.<br> - * For example, if the method is <code>doPost(...)</code>, then the method name is automatically detected as <js>"POST"</js>. - - */ - String name() default ""; - - /** - * Optional path pattern for the specified method. - * <p> - * Appending <js>"/*"</js> to the end of the path pattern will make it match any remainder too.<br> - * Not appending <js>"/*"</js> to the end of the pattern will cause a 404 (Not found) error to occur - * if the exact pattern is not found. - */ - String path() default "/*"; - - /** - * URL path pattern priority. - * <p> - * To force path patterns to be checked before other path patterns, use a higher priority number. - * <p> - * By default, it's <code>0</code>, which means it will use an internal heuristic to - * determine a best match. - */ - int priority() default 0; - - /** - * Method guards. - * <p> - * Associates one or more {@link RestGuard RestGuards} with a method call. - * These guards get called immediately before execution of the REST method. - * <p> - * Typically, guards will be used for permissions checking on the user making the request, - * but it can also be used for other purposes like pre-call validation of a request. - */ - Class<? extends RestGuard>[] guards() default {}; - - /** - * Method response converters. - * <p> - * Associates one or more {@link RestConverter RestConverters} with a method call. - * These converters get called immediately after execution of the REST method in the same - * order specified in the annotation. - * <p> - * Can be used for performing post-processing on the response object before serialization. - * <p> - * Default converters are available in the {@link org.apache.juneau.server.converters} package. - */ - Class<? extends RestConverter>[] converters() default {}; - - /** - * Method matchers. - * <p> - * Associates one more more {@link RestMatcher RestMatchers} with this method. - * <p> - * Matchers are used to allow multiple Java methods to handle requests assigned to the same - * URL path pattern, but differing based on some request attribute, such as a specific header value. - * <p> - * See {@link RestMatcher} for details. - */ - Class<? extends RestMatcher>[] matchers() default {}; - - /** - * Overrides the list of serializers assigned at the method level. - * <p> - * Use this annotation when the list of serializers assigned to a method differs from the list of serializers assigned at the servlet level. - * <p> - * To append to the list of serializers assigned at the servlet level, use <code>serializersInherit=<jsf>SERIALIZERS</jsf></code>. - * - * <p class='bcode'> - * <jk>public class</jk> MyResource <jk>extends</jk> RestServlet { - * - * <ja>@RestMethod</ja>( - * name=<js>"GET"</js>, - * path=<js>"/foo"</js>, - * serializers=MySpecialSerializer.<jk>class</jk>, - * serializersInherit=<jsf>SERIALIZERS</jsf> - * ) - * <jk>public</jk> Object doGetWithSpecialAcceptType() { - * <jc>// Handle request for special Accept type</jc> - * } - * } - * </p> - */ - Class<? extends Serializer>[] serializers() default {}; - - /** - * Used in conjunction with {@link #serializers()} to identify what class-level settings are inherited by the method serializer group. - * <p> - * Possible values: - * <ul> - * <li>{@link Inherit#SERIALIZERS} - Inherit class-level serializers. - * <li>{@link Inherit#PROPERTIES} - Inherit class-level properties. - * <li>{@link Inherit#TRANSFORMS} - Inherit class-level transforms. - * </ul> - * <p> - * For example, to inherit all serializers, properties, and transforms from the servlet class: - * </p> - * <p class='bcode'> - * <ja>@RestMethod</ja>( - * path=<js>"/foo"</js>, - * serializers=MySpecialSerializer.<jk>class</jk>, - * serializersInherit={<jsf>SERIALIZERS</jsf>,<jsf>PROPERTIES</jsf>,<jsf>TRANSFORMS</jsf>} - * ) - * </p> - */ - Inherit[] serializersInherit() default {}; - - /** - * Overrides the list of parsers assigned at the method level. - * <p> - * Use this annotation when the list of parsers assigned to a method differs from the list of parsers assigned at the servlet level. - * <p> - * To append to the list of serializers assigned at the servlet level, use <code>serializersInherit=<jsf>SERIALIZERS</jsf></code>. - * - * <p class='bcode'> - * <jk>public class</jk> MyResource <jk>extends</jk> RestServlet { - * - * <ja>@RestMethod</ja>( - * name=<js>"PUT"</js>, - * path=<js>"/foo"</js>, - * parsers=MySpecialParser.<jk>class</jk>, - * parsersInherit=<jsf>PARSERS</jsf> - * ) - * <jk>public</jk> Object doGetWithSpecialAcceptType() { - * <jc>// Handle request for special Accept type</jc> - * } - * } - * </p> - */ - Class<? extends Parser>[] parsers() default {}; - - /** - * Used in conjunction with {@link #parsers()} to identify what class-level settings are inherited by the method parser group. - * <p> - * Possible values: - * <ul> - * <li>{@link Inherit#PARSERS} - Inherit class-level parsers. - * <li>{@link Inherit#PROPERTIES} - Inherit class-level properties. - * <li>{@link Inherit#TRANSFORMS} - Inherit class-level transforms. - * </ul> - * <p> - * For example, to inherit all parsers, properties, and transforms from the servlet class: - * <p class='bcode'> - * <ja>@RestMethod</ja>( - * path=<js>"/foo"</js>, - * parsers=MySpecialParser.<jk>class</jk>, - * parsersInherit={<jsf>PARSERS</jsf>,<jsf>PROPERTIES</jsf>,<jsf>TRANSFORMS</jsf>} - * ) - * </p> - */ - Inherit[] parsersInherit() default {}; - - /** - * Appends to the list of {@link Encoder encoders} specified on the servlet. - * <p> - * Use this annotation when the list of encoders assigned to a method differs from the list of encoders assigned at the servlet level. - * <p> - * These can be used to enable various kinds of compression (e.g. <js>"gzip"</js>) on requests and responses. - * - * <p class='bcode'> - * <jk>public class</jk> MyResource <jk>extends</jk> RestServlet { - * - * <ja>@RestMethod</ja>( - * name=<js>"PUT"</js>, - * path=<js>"/foo"</js>, - * encoders={GzipEncoder.<jk>class</jk>} - * ) - * <jk>public</jk> Object doGetWithSpecialEncoding() { - * <jc>// Handle request with special encoding</jc> - * } - * } - * </p> - * <p> - * If you want to OVERRIDE the set of encoders specified by the servlet, combine this annotation with <code><ja>@RestMethod</ja>(inheritEncoders=<jk>false</jk>)</code>. - */ - Class<? extends Encoder>[] encoders() default {}; - - /** - * Specifies whether the method should inherit encoders from the servlet. - */ - boolean inheritEncoders() default true; - - /** - * Same as {@link RestResource#properties()}, except defines property values by default when this method is called. - * <p> - * This is equivalent to simply calling <code>res.addProperties()</code> in the Java method, but is provided for convenience. - */ - Property[] properties() default {}; - - /** - * Appends the specified bean filters to all serializers and parsers used by this method. - */ - Class<?>[] beanFilters() default {}; - - /** - * Appends the specified POJO swaps to all serializers and parsers used by this method. - */ - Class<?>[] pojoSwaps() default {}; - - /** - * Specifies default values for request headers. - * <p> - * Strings are of the format <js>"Header-Name: header-value"</js>. - * <p> - * Affects values returned by {@link RestRequest#getHeader(String)} when the header is not present on the request. - * <p> - * The most useful reason for this annotation is to provide a default <code>Accept</code> header when one is not specified - * so that a particular default {@link Serializer} is picked. - * <p> - * Only one header value can be specified per entry (i.e. it's not a delimited list of header entries). - * <p> - * Header values specified at the method level override header values specified at the servlet level. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <jc>// Assume "text/json" Accept value when Accept not specified</jc> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/*"</js>, defaultRequestHeaders={<js>"Accept: text/json"</js>}) - * <jk>public</jk> String doGet() { - * ... - * } - * </p> - */ - String[] defaultRequestHeaders() default {}; - - /** - * Optional summary for the exposed API. - * <p> - * This summary is used in the following locations: - * <ul class='spaced-list'> - * <li>The value returned by {@link RestRequest#getMethodSummary()}. - * <li>The <js>"$R{methodSummary}"</js> variable. - * <li>The summary of the method in the Swagger page. - * </ul> - * <p> - * The default value pulls the description from the <code>(className.?)[javaMethodName].summary</code> entry in the servlet resource bundle. - * (e.g. <js>"MyClass.myMethod.summary = foo"</js> or <js>"myMethod.summary = foo"</js>). - * <p> - * This field value can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/paths/{path}/{method}/summary</code>. - */ - String summary() default ""; - - /** - * Optional description for the exposed API. - * <p> - * This description is used in the following locations: - * <ul class='spaced-list'> - * <li>The value returned by {@link RestRequest#getMethodDescription()}. - * <li>The <js>"$R{methodDescription}"</js> variable. - * <li>The description of the method in the Swagger page. - * </ul> - * <p> - * The default value pulls the description from the <code>(className.?)[javaMethodName].description</code> entry in the servlet resource bundle. - * (e.g. <js>"MyClass.myMethod.description = foo"</js> or <js>"myMethod.description = foo"</js>). - * <p> - * This field value can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/paths/{path}/{method}/description</code>. - */ - String description() default ""; - - /** - * Optional external documentation information for the exposed API. - * <p> - * Used to populate the Swagger external documentation field. - * <p> - * A simplified JSON string with the following fields: - * <p class='bcode'> - * { - * description: string, - * url: string - * } - * </p> - * <p> - * The default value pulls the description from the <code>(className.?)[javaMethodName].externalDocs</code> entry in the servlet resource bundle. - * (e.g. <js>"MyClass.myMethod.externalDocs = {url:'http://juneau.apache.org'}"</js> or <js>"myMethod.externalDocs = {url:'http://juneau.apache.org'}"</js>). - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>(externalDocs=<js>"{url:'http://juneau.apache.org'}"</js>) - * </p> - * <p> - * This field can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/paths/{path}/{method}/externalDocs</code>. - */ - String externalDocs() default ""; - - /** - * Optional tagging information for the exposed API. - * <p> - * Used to populate the Swagger tags field. - * <p> - * A comma-delimited list of tags for API documentation control. - * Tags can be used for logical grouping of operations by resources or any other qualifier. - * <p> - * The default value pulls the description from the <code>(className.?)[javaMethodName].tags</code> entry in the servlet resource bundle. - * (e.g. <js>"MyClass.myMethod.tags = foo,bar"</js> or <js>"myMethod.tags = foo,bar"</js>). - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>(tags=<js>"foo,bar"</js>) - * </p> - * <p> - * This field can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/paths/{path}/{method}/tags</code>. - */ - String tags() default ""; - - /** - * Optional deprecated flag for the exposed API. - * <p> - * Used to populate the Swagger deprecated field. - * <p> - * The default value pulls the description from the <code>(className.?)[javaMethodName].deprecated</code> entry in the servlet resource bundle. - * (e.g. <js>"MyClass.myMethod.deprecated = true"</js> or <js>"myMethod.deprecated = foo,bar"</js>). - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>(deprecated=<jk>true</jk>) - * </p> - * <p> - * This field can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/paths/{path}/{method}/deprecated</code>. - */ - boolean deprecated() default false; - - /** - * Optional parameter descriptions. - * <p> - * This annotation is provided for documentation purposes and is used to populate the method <js>"parameters"</js> column - * on the Swagger page. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>( - * name=<js>"POST"</js>, path=<js>"/{a}"</js>, - * description=<js>"This is my method."</js>, - * parameters={ - * <ja>@Parameter</ja>(in=<js>"path"</js>, name=<js>"a"</js>, description=<js>"The 'a' attribute"</js>), - * <ja>@Parameter</ja>(in=<js>"query"</js>, name=<js>"b"</js>, description=<js>"The 'b' parameter"</js>, required=<jk>true</jk>), - * <ja>@Parameter</ja>(in=<js>"body"</js>, description=<js>"The HTTP content"</js>), - * <ja>@Parameter</ja>(in=<js>"header"</js>, name=<js>"D"</js>, description=<js>"The 'D' header"</js>), - * } - * ) - * </p> - * This is functionally equivalent to specifying the following keys in the resource bundle for the class, except in this case - * the strings are internationalized. - * <p class='bcode'> - * <jk>MyClass.myMethod.description</jk> = <js>This is my method.</js> - * <jk>MyClass.myMethod.req.path.a.description</jk> = <js>The 'a' attribute</js> - * <jk>MyClass.myMethod.req.query.b.description</jk> = <js>The 'b' parameter</js> - * <jk>MyClass.myMethod.req.body.description</jk> = <js>The HTTP content</js> - * <jk>MyClass.myMethod.req.header.d.description</jk> = <js>The 'D' header</js> - * <p> - * As a general rule, use annotations when you don't care about internationalization (i.e. you only want to support English), - * and use resource bundles if you need to support localization. - * <p> - * These annotations can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/paths/{path}/{method}/parameters</code>. - */ - Parameter[] parameters() default {}; - - /** - * Optional output description. - * <p> - * This annotation is provided for documentation purposes and is used to populate the method <js>"responses"</js> column - * on the Swagger page. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestMethod</ja>( - * name=<js>"GET"</js>, path=<js>"/"</js>, - * responses={ - * <ja>@Response</ja>(200), - * <ja>@Response</ja>( - * value=302, - * description=<js>"Thing wasn't found here"</js>, - * headers={ - * <ja>@Parameter</ja>(name=<js>"Location"</js>, description=<js>"The place to find the thing"</js>) - * } - * ) - * } - * ) - * </p> - * This is functionally equivalent to specifying the following keys in the resource bundle for the class, except in this case - * the strings are internationalized. - * <p class='bcode'> - * <jk>MyClass.myMethod.res.200.description</jk> = <js>OK</js> - * <jk>MyClass.myMethod.res.302.description</jk> = <js>Thing wasn't found here</js> - * <jk>MyClass.myMethod.res.302.header.Location.description</jk> = <js>The place to find the thing</js> - * <p> - * As a general rule, use annotations when you don't care about internationalization (i.e. you only want to support English), - * and use resource bundles if you need to support localization. - * <p> - * These annotations can contain variables (e.g. "$L{my.localized.variable}"). - */ - Response[] responses() default {}; - - /** - * Specifies whether this method can be called based on the client version. - * <p> - * The client version is identified via the HTTP request header identified by {@link RestResource#clientVersionHeader()} which - * by default is <js>"X-Client-Version"</js>. - * <p> - * This is a specialized kind of {@link RestMatcher} that allows you to invoke different Java methods for the same method/path based - * on the client version. - * <p> - * The format of the client version range is similar to that of OSGi versions. - * <p> - * In the following example, the Java methods are mapped to the same HTTP method and URL <js>"/foobar"</js>. - * <p class='bcode'> - * <jc>// Call this method if X-Client-Version is at least 2.0. - * // Note that this also matches 2.0.1.</jc> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/foobar"</js>, clientVersion=<js>"2.0"</js>) - * <jk>public</jk> Object method1() { - * ... - * } - * - * <jc>// Call this method if X-Client-Version is at least 1.1, but less than 2.0.</jc> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/foobar"</js>, clientVersion=<js>"[1.1,2.0)"</js>) - * <jk>public</jk> Object method2() { - * ... - * } - * - * <jc>// Call this method if X-Client-Version is less than 1.1.</jc> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/foobar"</js>, clientVersion=<js>"[0,1.1)"</js>) - * <jk>public</jk> Object method3() { - * ... - * } - * </p> - * <p> - * It's common to combine the client version with transforms that will convert new POJOs into older POJOs for backwards compatability. - * <p class='bcode'> - * <jc>// Call this method if X-Client-Version is at least 2.0.</jc> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/foobar"</js>, clientVersion=<js>"2.0"</js>) - * <jk>public</jk> NewPojo newMethod() { - * ... - * } - * - * <jc>// Call this method if X-Client-Version is at least 1.1, but less than 2.0.</jc> - * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/foobar"</js>, clientVersion=<js>"[1.1,2.0)"</js>, transforms={NewToOldPojoSwap.<jk>class</jk>}) - * <jk>public</jk> NewPojo oldMethod() { - * <jk>return</jk> newMethod() - * } - * <p> - * Note that in the previous example, we're returning the exact same POJO, but using a transform to convert it into an older form. - * The old method could also just return back a completely different object. - * The range can be any of the following: - * <ul> - * <li><js>"[0,1.0)"</js> = Less than 1.0. 1.0 and 1.0.0 does not match. - * <li><js>"[0,1.0]"</js> = Less than or equal to 1.0. Note that 1.0.1 will match. - * <li><js>"1.0"</js> = At least 1.0. 1.0 and 2.0 will match. - * </ul> - */ - String clientVersion() default ""; -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/91a388d0/juneau-server/src/main/java/org/apache/juneau/server/annotation/RestResource.java ---------------------------------------------------------------------- diff --git a/juneau-server/src/main/java/org/apache/juneau/server/annotation/RestResource.java b/juneau-server/src/main/java/org/apache/juneau/server/annotation/RestResource.java deleted file mode 100755 index 4504f7c..0000000 --- a/juneau-server/src/main/java/org/apache/juneau/server/annotation/RestResource.java +++ /dev/null @@ -1,592 +0,0 @@ -// *************************************************************************************************************************** -// * 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.server.annotation; - -import static java.lang.annotation.ElementType.*; -import static java.lang.annotation.RetentionPolicy.*; - -import java.lang.annotation.*; - -import javax.servlet.http.*; - -import org.apache.juneau.*; -import org.apache.juneau.encoders.*; -import org.apache.juneau.jena.*; -import org.apache.juneau.json.*; -import org.apache.juneau.parser.*; -import org.apache.juneau.serializer.*; -import org.apache.juneau.server.*; -import org.apache.juneau.transform.*; -import org.apache.juneau.utils.*; -import org.apache.juneau.xml.*; - -/** - * Optionally used to associate metadata on an instance of {@link RestServlet}. - * <p> - * Refer to {@link org.apache.juneau.server} doc for information on using this class. - */ -@Documented -@Target(TYPE) -@Retention(RUNTIME) -@Inherited -public @interface RestResource { - - /** - * Identifies the location of the resource bundle for this class. - * <p> - * This annotation is used to provide localized messages for the following methods: - * <ul> - * <li>{@link RestServlet#getMessage(java.util.Locale, String, Object...)} - * <li>{@link RestServlet#getTitle(RestRequest)} - * <li>{@link RestServlet#getDescription(RestRequest)} - * </ul> - * <p> - * Refer to the {@link MessageBundle} class for a description of the message key formats - * used in the properties file. - * <p> - * The value can be a relative path like <js>"nls/Messages"</js>, indicating to look for the - * resource bundle <js>"com.foo.sample.nls.Messages"</js> if the resource class - * is in <js>"com.foo.sample"</js>, or it can be an absolute path, like <js>"com.foo.sample.nls.Messages"</js> - */ - String messages() default ""; - - /** - * Class-level guards. - * <p> - * Associates one or more {@link RestGuard RestGuards} with all REST methods defined - * in this class. - * These guards get called immediately before execution of any REST method in this class. - * <p> - * Typically, guards will be used for permissions checking on the user making the request, - * but it can also be used for other purposes like pre-call validation of a request. - */ - Class<? extends RestGuard>[] guards() default {}; - - /** - * Class-level converters. - * <p> - * Associates one or more {@link RestConverter converters} with a resource class. - * These converters get called immediately after execution of the REST method in the same - * order specified in the annotation. - * <p> - * Can be used for performing post-processing on the response object before serialization. - * <p> - * Default converter implementations are provided in the {@link org.apache.juneau.server.converters} package. - */ - Class<? extends RestConverter>[] converters() default {}; - - /** - * Class-level bean filters. - * <p> - * Shortcut to add bean filters to the bean contexts of the objects returned by the following methods: - * <ul> - * <li>{@link RestServlet#getBeanContext()} - * <li>{@link RestServlet#getSerializers()} - * <li>{@link RestServlet#getParsers()} - * </ul> - * <p> - * If the specified class is an instance of {@link BeanFilterBuilder}, then a filter built from that builder is added. - * Any other classes are wrapped in a {@link InterfaceBeanFilterBuilder} to indicate that subclasses should - * be treated as the specified class type. - */ - Class<?>[] beanFilters() default {}; - - /** - * Class-level POJO swaps. - * <p> - * Shortcut to add POJO swaps to the bean contexts of the objects returned by the following methods: - * <ul> - * <li>{@link RestServlet#getBeanContext()} - * <li>{@link RestServlet#getSerializers()} - * <li>{@link RestServlet#getParsers()} - * </ul> - * <p> - * If the specified class is an instance of {@link PojoSwap}, then that swap is added. - * Any other classes are wrapped in a {@link SurrogateSwap}. - */ - Class<?>[] pojoSwaps() default {}; - - /** - * Class-level properties. - * <p> - * Shortcut for specifying class-level properties on this servlet to the objects returned by the following methods: - * <ul> - * <li>{@link RestServlet#getBeanContext()} - * <li>{@link RestServlet#getSerializers()} - * <li>{@link RestServlet#getParsers()} - * </ul> - * <p> - * Any of the following property names can be specified: - * <ul> - * <li>{@link RestServletContext} - * <li>{@link BeanContext} - * <li>{@link SerializerContext} - * <li>{@link ParserContext} - * <li>{@link JsonSerializerContext} - * <li>{@link RdfSerializerContext} - * <li>{@link RdfParserContext} - * <li>{@link RdfCommonContext} - * <li>{@link XmlSerializerContext} - * <li>{@link XmlParserContext} - * </ul> - * <p> - * Property values will be converted to the appropriate type. - * <p> - * In some cases, properties can be overridden at runtime through the {@link RestResponse#setProperty(String, Object)} method - * or through a {@link Properties @Properties} annotated method parameter. - */ - Property[] properties() default {}; - - /** - * Specifies a list of {@link Serializer} classes to add to the list of serializers available for this servlet. - * <p> - * This annotation can only be used on {@link Serializer} classes that have no-arg constructors. - */ - Class<? extends Serializer>[] serializers() default {}; - - /** - * Specifies a list of {@link Parser} classes to add to the list of parsers available for this servlet. - * <p> - * This annotation can only be used on {@link Parser} classes that have no-arg constructors. - */ - Class<? extends Parser>[] parsers() default {}; - - /** - * Specifies a list of {@link ResponseHandler} classes that know how to convert POJOs returned - * by REST methods or set via {@link RestResponse#setOutput(Object)} into appropriate - * HTTP responses. - * <p> - * See {@link ResponseHandler} for details. - */ - Class<? extends ResponseHandler>[] responseHandlers() default {}; - - /** - * Specifies a list of {@link Encoder} to associate with this servlet. - * <p> - * These can be used to enable various kinds of compression (e.g. <js>"gzip"</js>) on requests and responses. - * <p> - * This annotation can only be used on {@link Encoder} classes that have no-arg constructors. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <jc>// Servlet with automated support for GZIP compression</jc> - * <ja>@RestResource</ja>(encoders={GzipEncoder.<jk>class</jk>}) - * <jk>public</jk> MyRestServlet <jk>extends</jk> RestServlet { - * ... - * } - * </p> - */ - Class<? extends Encoder>[] encoders() default {}; - - /** - * Specifies default values for request headers. - * <p> - * Strings are of the format <js>"Header-Name: header-value"</js>. - * <p> - * Affects values returned by {@link RestRequest#getHeader(String)} when the header is not present on the request. - * <p> - * The most useful reason for this annotation is to provide a default <code>Accept</code> header when one is not specified - * so that a particular default {@link Serializer} is picked. - * <p> - * Only one header value can be specified per entry (i.e. it's not a delimited list of header entries). - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <jc>// Assume "text/json" Accept value when Accept not specified</jc> - * <ja>@RestResource</ja>(defaultRequestHeaders={<js>"Accept: text/json"</js>}) - * <jk>public</jk> MyRestServlet <jk>extends</jk> RestServlet { - * ... - * } - * </p> - */ - String[] defaultRequestHeaders() default {}; - - /** - * Specifies default values for response headers. - * <p> - * Strings are of the format <js>"Header-Name: header-value"</js>. - * <p> - * This is equivalent to calling {@link RestResponse#setHeader(String, String)} programmatically in each of the Java methods. - * <p> - * The header value will not be set if the header value has already been specified (hence the 'default' in the name). - * <p> - * Only one header value can be specified per entry (i.e. it's not a delimited list of header entries). - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <jc>// Add a version header attribute to all responses</jc> - * <ja>@RestResource</ja>(defaultResponseHeaders={<js>"X-Version: 1.0"</js>}) - * <jk>public</jk> MyRestServlet <jk>extends</jk> RestServlet { - * ... - * } - * </p> - */ - String[] defaultResponseHeaders() default {}; - - /** - * Defines children of this resource. - * <p> - * A REST child resource is simply another servlet that is initialized as part of the parent - * resource and has a servlet path directly under the parent servlet path. - * The main advantage to defining servlets as REST children is that you do not need - * to define them in the <code>web.xml</code> file of the web application. - * This can cut down on the number of entries that show up in the <code>web.xml</code> file - * if you are defining large numbers of servlets. - * <p> - * Child resources must specify a value for {@link #path()} that identifies the subpath of the - * child resource relative to the parent path. - * <p> - * It should be noted that servlets can be nested arbitrarily deep using this technique (i.e. children can also have children). - * - * <dl> - * <dt>Servlet initialization:</dt> - * <dd> - * <p> - * A child resource will be initialized immediately after the parent servlet is initialized. The child resource - * receives the same servlet config as the parent resource. This allows configuration information such as - * servlet initialization parameters to filter to child resources. - * </p> - * </dd> - * <dt>Runtime behavior:</dt> - * <dd> - * <p> - * As a rule, methods defined on the <code>HttpServletRequest</code> object will behave as if - * the child servlet were deployed as a top-level resource under the child's servlet path. - * For example, the <code>getServletPath()</code> and <code>getPathInfo()</code> methods on the - * <code>HttpServletRequest</code> object will behave as if the child resource were deployed - * using the child's servlet path. - * Therefore, the runtime behavior should be equivalent to deploying the child servlet in - * the <code>web.xml</code> file of the web application. - * </p> - * </dd> - * </dl> - */ - Class<?>[] children() default {}; - - /** - * Identifies the URL subpath relative to the parent resource. - * <p> - * Typically, this annotation is only applicable to resources defined as children through the {@link #children()} - * annotation. However, it may be used in other ways (e.g. defining paths for top-level resources in microservices). - * <p> - * This annotation is ignored on top-level servlets (i.e. servlets defined in <code>web.xml</code> files). - * Therefore, implementers can optionally specify a path value for documentation purposes. - */ - String path() default ""; - - /** - * Optional servlet title. - * <p> - * It is used to populate the Swagger title field and to display on HTML pages. - * This value can be retrieved programmatically through the {@link RestServlet#getTitle(RestRequest)} method. - * <p> - * The default value pulls the label from the <code>label</code> entry in the servlet resource bundle. - * (e.g. <js>"title = foo"</js> or <js>"MyServlet.title = foo"</js>). - * <p> - * This field can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/info/title</code>. - */ - String title() default ""; - - /** - * Optional servlet description. - * <p> - * It is used to populate the Swagger description field and to display on HTML pages. - * This value can be retrieved programmatically through the {@link RestServlet#getDescription(RestRequest)} method. - * <p> - * The default value pulls the description from the <code>description</code> entry in the servlet resource bundle. - * (e.g. <js>"description = foo"</js> or <js>"MyServlet.description = foo"</js>). - * <p> - * This field can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/info/description</code>. - */ - String description() default ""; - - /** - * Optional servlet terms-of-service for this API. - * <p> - * It is used to populate the Swagger terms-of-service field. - * This value can be retrieved programmatically through the {@link RestServlet#getTermsOfService(RestRequest)} method. - * <p> - * The default value pulls the description from the <code>termsOfService</code> entry in the servlet resource bundle. - * (e.g. <js>"termsOfService = foo"</js> or <js>"MyServlet.termsOfService = foo"</js>). - * <p> - * This field can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/info/termsOfService</code>. - */ - String termsOfService() default ""; - - /** - * Optional contact information for the exposed API. - * <p> - * It is used to populate the Swagger contact field and to display on HTML pages. - * This value can be retrieved programmatically through the {@link RestServlet#getContact(RestRequest)} method. - * <p> - * A simplified JSON string with the following fields: - * <p class='bcode'> - * { - * name: string, - * url: string, - * email: string - * } - * </p> - * <p> - * The default value pulls the description from the <code>contact</code> entry in the servlet resource bundle. - * (e.g. <js>"contact = {name:'John Smith',email:'[email protected]'}"</js> or <js>"MyServlet.contact = {name:'John Smith',email:'[email protected]'}"</js>). - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestResource</ja>(contact=<js>"{name:'John Smith',email:'[email protected]'}"</js>) - * </p> - * <p> - * This field can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/info/contact</code>. - */ - String contact() default ""; - - /** - * Optional license information for the exposed API. - * <p> - * It is used to populate the Swagger license field and to display on HTML pages. - * This value can be retrieved programmatically through the {@link RestServlet#getLicense(RestRequest)} method. - * <p> - * A simplified JSON string with the following fields: - * <p class='bcode'> - * { - * name: string, - * url: string - * } - * </p> - * <p> - * The default value pulls the description from the <code>license</code> entry in the servlet resource bundle. - * (e.g. <js>"license = {name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'}"</js> or <js>"MyServlet.license = {name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'}"</js>). - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestResource</ja>(license=<js>"{name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'}"</js>) - * </p> - * <p> - * This field can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/info/license</code>. - */ - String license() default ""; - - /** - * Provides the version of the application API (not to be confused with the specification version). - * <p> - * It is used to populate the Swagger version field and to display on HTML pages. - * This value can be retrieved programmatically through the {@link RestServlet#getVersion(RestRequest)} method. - * <p> - * The default value pulls the description from the <code>version</code> entry in the servlet resource bundle. - * (e.g. <js>"version = 2.0"</js> or <js>"MyServlet.version = 2.0"</js>). - * <p> - * This field can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/info/version</code>. - */ - String version() default ""; - - /** - * Optional tagging information for the exposed API. - * <p> - * It is used to populate the Swagger tags field and to display on HTML pages. - * This value can be retrieved programmatically through the {@link RestServlet#getTags(RestRequest)} method. - * <p> - * A simplified JSON string with the following fields: - * <p class='bcode'> - * [ - * { - * name: string, - * description: string, - * externalDocs: { - * description: string, - * url: string - * } - * } - * ] - * </p> - * <p> - * The default value pulls the description from the <code>tags</code> entry in the servlet resource bundle. - * (e.g. <js>"tags = [{name:'Foo',description:'Foobar'}]"</js> or <js>"MyServlet.tags = [{name:'Foo',description:'Foobar'}]"</js>). - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestResource</ja>(tags=<js>"[{name:'Foo',description:'Foobar'}]"</js>) - * </p> - * <p> - * This field can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/tags</code>. - */ - String tags() default ""; - - /** - * Optional external documentation information for the exposed API. - * <p> - * It is used to populate the Swagger external documentation field and to display on HTML pages. - * This value can be retrieved programmatically through the {@link RestServlet#getExternalDocs(RestRequest)} method. - * <p> - * A simplified JSON string with the following fields: - * <p class='bcode'> - * { - * description: string, - * url: string - * } - * </p> - * <p> - * The default value pulls the description from the <code>externalDocs</code> entry in the servlet resource bundle. - * (e.g. <js>"externalDocs = {url:'http://juneau.apache.org'}"</js> or <js>"MyServlet.externalDocs = {url:'http://juneau.apache.org'}"</js>). - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <ja>@RestResource</ja>(externalDocs=<js>"{url:'http://juneau.apache.org'}"</js>) - * </p> - * <p> - * This field can contain variables (e.g. "$L{my.localized.variable}"). - * <p> - * Corresponds to the swagger field <code>/tags</code>. - */ - String externalDocs() default ""; - - /** - * Optional location of configuration file for this servlet. - * <p> - * The configuration file . - * <p> - * This field can contain variables (e.g. "$L{my.localized.variable}"). - */ - String config() default ""; - - /** - * The stylesheet to use for HTML views. - * <p> - * The name is a path to a stylesheet located in either the classpath or working directory. - * The resulting stylesheet becomes available through the servlet via the URL <js>"[servletpath]/style.css"</js>. - * <p> - * The default set of styles located in the <code>org.apache.juneau.server.styles</code> package are: - * <ul class='spaced-list'> - * <li><js>"styles/juneau.css"</js> - Theme based on Jazz look-and-feel. - * <li><js>"styles/devops.css"</js> - Theme based on IBM DevOps look-and-feel. - * </ul> - * <p> - * The classpath search starts with the child servlet class and proceeds up the class hierarchy - * chain. Since the {@link RestServlet} class is in the <code>org.apache.juneau.server</code> package - * and the predefined styles are in the <code>org.apache.juneau.server.styles</code> package, the paths to - * the predefined styles are prefixed with <js>"styles/"</js>. - * <p> - * If the stylesheet cannot be found on the classpath, an attempt to look in the working directory - * for it will be made. This allows for stylesheets to be placed on the file system in the working - * directory. - * <p> - * If the file cannot be located, the request to <js>"[servletpath]/style.css"</js> will return {@link HttpServletResponse#SC_NOT_FOUND}. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <jk>package</jk> com.foo.mypackage; - * - * <ja>@RestResource</ja>( - * stylesheet=<js>"mystyles/mycss.css"</js> - * ) - * <jk>public class</jk> MyResource <jk>extends</jk> RestServletDefault { - * } - * </p> - * <p> - * In this example, the servlet will attempt to find the <code>mycss.css</code> file in the following ordered locations: - * </p> - * <ol> - * <li><code>com.foo.mypackage.mystyles</code> package. - * <li><code>org.apache.juneau.server.mystyles</code> package (since <code>RestServletDefault</code> is in <code>org.apache.juneau.server</code>). - * <li><code>[working-dir]/mystyles</code> directory. - * </ol> - */ - String stylesheet() default ""; - - /** - * The favicon to use for HTML views. - * <p> - * The name is a path to an icon file located in either the classpath or working directory in a similar way - * to how the {@link #stylesheet()} stylesheet is resolved. - * The resulting favicon becomes available in the servlet via the URL <js>"[servletpath]/favicon.ico"</js>. - * <p> - * If the file cannot be located, the request to <js>"[servletpath]/favicon.ico"</js> will return {@link HttpServletResponse#SC_NOT_FOUND}. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <jk>package</jk> com.foo.mypackage; - * - * <ja>@RestResource</ja>( - * favicon=<js>"mydocs/myicon.ico"</js> - * ) - * <jk>public class</jk> MyResource <jk>extends</jk> RestServletDefault { - * } - * </p> - * <p> - * In this example, the servlet will attempt to find the <code>myicon.ico</code> file in the following ordered locations: - * </p> - * <ol> - * <li><code>com.foo.mypackage.mydocs</code> package. - * <li><code>org.apache.juneau.server.mydocs</code> package (since <code>RestServletDefault</code> is in <code>org.apache.juneau.server</code>). - * <li><code>[working-dir]/mydocs</code> directory. - * </ol> - */ - String favicon() default ""; - - /** - * Defines paths and locations of statically served files. - * <p> - * This is a JSON map of paths to packages/directories located on either the classpath or working directory. - * <p> - * Mappings are cumulative from parent to child. Child resources can override mappings made on parent resources. - * <p> - * If the file cannot be located, the request will return {@link HttpServletResponse#SC_NOT_FOUND}. - * <p> - * The media type on the response is determined by the {@link RestServlet#getMimetypesFileTypeMap()} method. - * - * <h6 class='topic'>Example:</h6> - * <p class='bcode'> - * <jk>package</jk> com.foo.mypackage; - * - * <ja>@RestResource</ja>( - * path=<js>"/myresource"</js>, - * staticFiles=<js>"{htdocs:'docs'}"</js> - * ) - * <jk>public class</jk> MyResource <jk>extends</jk> RestServletDefault { - * } - * </p> - * <p> - * In this example, given a GET request to <code>/myresource/htdocs/foobar.html</code>, the servlet will attempt to find the <code>foobar.html</code> file - * in the following ordered locations: - * </p> - * <ol> - * <li><code>com.foo.mypackage.docs</code> package. - * <li><code>org.apache.juneau.server.docs</code> package (since <code>RestServletDefault</code> is in <code>org.apache.juneau.server</code>). - * <li><code>[working-dir]/docs</code> directory. - * </ol> - */ - String staticFiles() default ""; - - /** - * Specifies the HTTP header name used to identify the client version. - * <p> - * The client version is used to support backwards compatibility for breaking REST interface - * changes. Used in conjunction with {@link RestMethod#clientVersion()} annotation. - * <p> - * If not specified, uses <js>"X-Client-Version"</js>. - */ - String clientVersionHeader() default ""; -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/91a388d0/juneau-server/src/main/java/org/apache/juneau/server/annotation/package.html ---------------------------------------------------------------------- diff --git a/juneau-server/src/main/java/org/apache/juneau/server/annotation/package.html b/juneau-server/src/main/java/org/apache/juneau/server/annotation/package.html deleted file mode 100755 index c0c0d41..0000000 --- a/juneau-server/src/main/java/org/apache/juneau/server/annotation/package.html +++ /dev/null @@ -1,41 +0,0 @@ -<!DOCTYPE HTML> -<!-- -/*************************************************************************************************************************** - * 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. - * - ***************************************************************************************************************************/ - --> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> - <style type="text/css"> - /* For viewing in Page Designer */ - @IMPORT url("../../../../javadoc.css"); - - /* For viewing in REST interface */ - @IMPORT url("../htdocs/javadoc.css"); - body { - margin: 20px; - } - </style> - <script> - /* Replace all @code and @link tags. */ - window.onload = function() { - document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1</code>'); - document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3</code>'); - } - </script> -</head> -<body> -<p>REST servlet annotations</p> -</body> -</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/91a388d0/juneau-server/src/main/java/org/apache/juneau/server/converters/Introspectable.java ---------------------------------------------------------------------- diff --git a/juneau-server/src/main/java/org/apache/juneau/server/converters/Introspectable.java b/juneau-server/src/main/java/org/apache/juneau/server/converters/Introspectable.java deleted file mode 100755 index 6f9d384..0000000 --- a/juneau-server/src/main/java/org/apache/juneau/server/converters/Introspectable.java +++ /dev/null @@ -1,59 +0,0 @@ -// *************************************************************************************************************************** -// * 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.server.converters; - -import static javax.servlet.http.HttpServletResponse.*; - -import org.apache.juneau.*; -import org.apache.juneau.json.*; -import org.apache.juneau.server.*; -import org.apache.juneau.utils.*; - -/** - * Converter for enablement of {@link PojoIntrospector} support on response objects returned by a <code>@RestMethod</code> method. - * <p> - * When enabled, public methods can be called on objects returned through the {@link RestResponse#setOutput(Object)} method. - * <p> - * Note that opening up public methods for calling through a REST interface can be dangerous, and should - * be done with caution. - * <p> - * Java methods are invoked by passing in the following URL parameters: - * <ul class='spaced-list'> - * <li><code>&invokeMethod</code> - The Java method name, optionally with arguments if necessary to differentiate between methods. - * <li><code>&invokeArgs</code> - The arguments as a JSON array. - * </ul> - * <p> - * See {@link PojoIntrospector} for additional information on introspecting POJO methods. - */ -public final class Introspectable implements RestConverter { - - @Override /* RestConverter */ - @SuppressWarnings({"unchecked", "rawtypes"}) - public Object convert(RestRequest req, Object o, ClassMeta cm) throws RestException { - String method = req.getQueryParameter("invokeMethod"); - String args = req.getQueryParameter("invokeArgs"); - if (method == null) - return o; - try { - if (cm.getPojoSwap() != null) - o = cm.getPojoSwap().swap(req.getBeanSession(), o); - return new PojoIntrospector(o, JsonParser.DEFAULT).invokeMethod(method, args); - } catch (Exception e) { - e.printStackTrace(); - return new RestException(SC_INTERNAL_SERVER_ERROR, - "Error occurred trying to invoke method: {0}", - e.getLocalizedMessage() - ).initCause(e); - } - } -}
