| 
001 /*002  * Copyright 2008-2017 the original author or authors.
 003  *
 004  * Licensed under the Apache License, Version 2.0 (the "License");
 005  * you may not use this file except in compliance with the License.
 006  * You may obtain a copy of the License at
 007  *
 008  *     http://www.apache.org/licenses/LICENSE-2.0
 009  *
 010  * Unless required by applicable law or agreed to in writing, software
 011  * distributed under the License is distributed on an "AS IS" BASIS,
 012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 013  * See the License for the specific language governing permissions and
 014  * limitations under the License.
 015  */
 016 package org.codehaus.griffon.runtime.core.controller;
 017
 018 import griffon.core.artifact.GriffonController;
 019 import griffon.core.controller.ActionMetadata;
 020 import griffon.core.controller.ActionParameter;
 021
 022 import javax.annotation.Nonnull;
 023 import javax.annotation.Nullable;
 024 import java.lang.annotation.Annotation;
 025 import java.lang.reflect.Method;
 026 import java.util.Arrays;
 027
 028 import static griffon.util.GriffonNameUtils.requireNonBlank;
 029 import static java.lang.System.arraycopy;
 030 import static java.util.Objects.requireNonNull;
 031
 032 /**
 033  * @author Andres Almiray
 034  * @since 2.11.0
 035  */
 036 public class DefaultActionMetadata implements ActionMetadata {
 037     private final String actionName;
 038     private final String fullyQualifiedName;
 039     private final Class<?> returnType;
 040     private final Annotation[] annotations;
 041     private final ActionParameter[] parameters;
 042     private final boolean contextual;
 043
 044     public DefaultActionMetadata(@Nonnull GriffonController controller, @Nonnull String actionName, @Nonnull Method method) {
 045         this.actionName = requireNonBlank(actionName, "Argument 'actionName' must not be blank");
 046         requireNonNull(controller, "Argument 'controller' must not be null");
 047         requireNonNull(method, "Argument 'method' must not be null");
 048         this.fullyQualifiedName = controller.getTypeClass().getName() + "." + actionName;
 049         this.returnType = method.getReturnType();
 050
 051         Annotation[] declaredAnnotations = method.getDeclaredAnnotations();
 052         annotations = new Annotation[declaredAnnotations.length];
 053         arraycopy(declaredAnnotations, 0, annotations, 0, annotations.length);
 054
 055         this.parameters = new ActionParameter[method.getParameterCount()];
 056         Class<?>[] parameterTypes = method.getParameterTypes();
 057         Annotation[][] parameterAnnotations = method.getParameterAnnotations();
 058         if (this.parameters.length > 0) {
 059             boolean c = false;
 060             for (int index = 0; index < this.parameters.length; index++) {
 061                 this.parameters[index] = createActionParameter(index, parameterTypes[index], parameterAnnotations[index]);
 062                 c |= this.parameters[index].isContextual();
 063             }
 064             this.contextual = c;
 065         } else {
 066             this.contextual = false;
 067         }
 068     }
 069
 070     @Nonnull
 071     protected ActionParameter createActionParameter(int index, @Nonnull Class<?> type, @Nullable Annotation[] annotations) {
 072         return new DefaultActionParameter(this, index, type, annotations);
 073     }
 074
 075     @Nonnull
 076     @Override
 077     public Annotation[] getAnnotations() {
 078         return annotations;
 079     }
 080
 081     @Nonnull
 082     @Override
 083     public Class<?> getReturnType() {
 084         return returnType;
 085     }
 086
 087     @Nonnull
 088     @Override
 089     public ActionParameter[] getParameters() {
 090         return parameters;
 091     }
 092
 093     @Nonnull
 094     @Override
 095     public String getActionName() {
 096         return actionName;
 097     }
 098
 099     @Nonnull
 100     @Override
 101     public String getFullyQualifiedName() {
 102         return fullyQualifiedName;
 103     }
 104
 105     @Override
 106     public boolean hasContextualArgs() {
 107         return contextual;
 108     }
 109
 110     @Override
 111     public String toString() {
 112         final StringBuilder sb = new StringBuilder("DefaultActionMetadata{");
 113         sb.append("actionName='").append(actionName).append('\'');
 114         sb.append(", fullyQualifiedName='").append(fullyQualifiedName).append('\'');
 115         sb.append(", returnType=").append(returnType);
 116         sb.append(", annotations=").append(Arrays.toString(annotations));
 117         sb.append(", parameters=").append(Arrays.toString(parameters));
 118         sb.append('}');
 119         return sb.toString();
 120     }
 121 }
 |