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

org.apache.juneau.rest.RestOperations 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.rest;

import static org.apache.juneau.internal.ClassUtils.*;
import static org.apache.juneau.internal.CollectionUtils.*;

import java.util.*;

import org.apache.juneau.*;
import org.apache.juneau.cp.*;
import org.apache.juneau.http.response.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.rest.annotation.*;

/**
 * Encapsulates the set of {@link RestOp}-annotated methods within a single {@link Rest}-annotated object.
 *
 * 
See Also:
    *
*/ public class RestOperations { //----------------------------------------------------------------------------------------------------------------- // Static //----------------------------------------------------------------------------------------------------------------- /** * Represents a null value for the {@link Rest#restOperationsClass()} annotation. */ @SuppressWarnings("javadoc") public final class Void extends RestOperations { public Void(Builder builder) throws Exception { super(builder); } } /** * Static creator. * * @param beanStore The bean store to use for creating beans. * @return A new builder for this object. */ public static Builder create(BeanStore beanStore) { return new Builder(beanStore); } //----------------------------------------------------------------------------------------------------------------- // Builder //----------------------------------------------------------------------------------------------------------------- /** * Builder class. */ @FluentSetters public static class Builder extends BeanBuilder { TreeMap> map; Set set; /** * Constructor. * * @param beanStore The bean store to use for creating beans. */ protected Builder(BeanStore beanStore) { super(RestOperations.class, beanStore); map = new TreeMap<>(); set = set(); } @Override /* BeanBuilder */ protected RestOperations buildDefault() { return new RestOperations(this); } //------------------------------------------------------------------------------------------------------------- // Properties //------------------------------------------------------------------------------------------------------------- /** * Adds a method context to this builder. * * @param value The REST method context to add. * @return Adds a method context to this builder. */ public Builder add(RestOpContext value) { return add(value.getHttpMethod(), value); } /** * Adds a method context to this builder. * * @param httpMethodName The HTTP method name. * @param value The REST method context to add. * @return Adds a method context to this builder. */ public Builder add(String httpMethodName, RestOpContext value) { httpMethodName = httpMethodName.toUpperCase(); if (! map.containsKey(httpMethodName)) map.put(httpMethodName, new TreeSet<>()); map.get(httpMethodName).add(value); set.add(value); return this; } // @Override /* GENERATED - org.apache.juneau.BeanBuilder */ public Builder impl(Object value) { super.impl(value); return this; } @Override /* GENERATED - org.apache.juneau.BeanBuilder */ public Builder type(Class value) { super.type(value); return this; } // } //----------------------------------------------------------------------------------------------------------------- // Instance //----------------------------------------------------------------------------------------------------------------- private final Map> map; private RestOpContext[] list; /** * Constructor. * * @param builder The builder containing the settings for this object. */ public RestOperations(Builder builder) { Map> m = map(); for (Map.Entry> e : builder.map.entrySet()) m.put(e.getKey(), listFrom(e.getValue())); this.map = m; this.list = array(builder.set, RestOpContext.class); } /** * Finds the method that should handle the specified call. * * @param session The HTTP call. * @return The method that should handle the specified call. * @throws MethodNotAllowed If no methods implement the requested HTTP method. * @throws PreconditionFailed At least one method was found but it didn't match one or more matchers. * @throws NotFound HTTP method match was found but matching path was not. */ public RestOpContext findOperation(RestSession session) throws MethodNotAllowed, PreconditionFailed, NotFound { String m = session.getMethod(); int rc = 0; if (map.containsKey(m)) { for (RestOpContext oc : map.get(m)) { int mrc = oc.match(session); if (mrc == 2) return oc; rc = Math.max(rc, mrc); } } if (map.containsKey("*")) { for (RestOpContext oc : map.get("*")) { int mrc = oc.match(session); if (mrc == 2) return oc; rc = Math.max(rc, mrc); } } // If no paths matched, see if the path matches any other methods. // Note that we don't want to match against "/*" patterns such as getOptions(). if (rc == 0) { for (RestOpContext oc : list) { if (! oc.getPathPattern().endsWith("/*")) { int orc = oc.match(session); if (orc == 2) throw new MethodNotAllowed(); } } } if (rc == 1) throw new PreconditionFailed("Method ''{0}'' not found on resource on path ''{1}'' with matching matcher.", m, session.getPathInfo()); throw new NotFound("Java method matching path ''{0}'' not found on resource ''{1}''.", session.getPathInfo(), className(session.getResource())); } /** * Returns the list of method contexts in this object. * * @return An unmodifiable list of method contexts in this object. */ public List getOpContexts() { return ulist(list); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy