blob: 6a1c596b0ca5f542b04ca0eb777c166aae83021d [file] [log] [blame]
/*
* Copyright 2010 Google Inc.
*
* Licensed 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 com.google.web.bindery.requestfactory.gwt.rebind.model;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.web.bindery.requestfactory.shared.JsonRpcWireName;
import com.google.web.bindery.requestfactory.vm.impl.OperationKey;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Represents a method declaration that causes data to be transported. This can
* be a method declared in a RequestContext or a getter or setter on an
* EntityProxy.
*/
public class RequestMethod implements AcceptsModelVisitor {
/**
* Builds a {@link ContextMethod}.
*/
public static class Builder {
private RequestMethod toReturn = new RequestMethod();
public void addExtraSetter(JMethod method) {
if (toReturn.extraSetters == null) {
toReturn.extraSetters = new ArrayList<JMethod>();
}
toReturn.extraSetters.add(method);
}
public RequestMethod build() {
if (toReturn.extraSetters == null) {
toReturn.extraSetters = Collections.emptyList();
} else {
toReturn.extraSetters = Collections.unmodifiableList(toReturn.extraSetters);
}
try {
return toReturn;
} finally {
toReturn = null;
}
}
public void setCollectionElementType(JClassType elementType) {
toReturn.collectionElementType = elementType;
}
public void setCollectionType(CollectionType collectionType) {
toReturn.collectionType = collectionType;
}
public void setDataType(JClassType dataType) {
toReturn.dataType = dataType;
}
public void setDeclarationMethod(JClassType contextType, JMethod declarationMethod) {
toReturn.declarationMethod = declarationMethod;
JClassType returnClass = declarationMethod.getReturnType().isClassOrInterface();
JsonRpcWireName annotation = returnClass == null ? null
: returnClass.getAnnotation(JsonRpcWireName.class);
if (annotation == null) {
StringBuilder sb = new StringBuilder("(");
for (JType type : declarationMethod.getParameterTypes()) {
sb.append(type.getJNISignature());
}
// Return type ignored
sb.append(")V");
toReturn.operation =
new OperationKey(contextType.getQualifiedBinaryName(), declarationMethod.getName(), sb
.toString()).get();
} else {
toReturn.operation = annotation.value();
toReturn.apiVersion = annotation.version();
}
}
public void setEntityType(EntityProxyModel entityType) {
toReturn.entityType = entityType;
}
public void setInstanceType(EntityProxyModel instanceType) {
toReturn.instanceType = instanceType;
}
public void setMapKeyType(JClassType elementType) {
toReturn.mapKeyType = elementType;
}
public void setMapValueType(JClassType elementType) {
toReturn.mapValueType = elementType;
}
public void setValueType(boolean valueType) {
toReturn.valueType = valueType;
}
}
/**
* Indicates the type of collection that a Request will return.
*/
public enum CollectionType {
LIST, SET, MAP
}
private String apiVersion;
private JClassType collectionElementType;
private CollectionType collectionType;
private JClassType dataType;
private JMethod declarationMethod;
private EntityProxyModel entityType;
private List<JMethod> extraSetters = new ArrayList<JMethod>();
private EntityProxyModel instanceType;
private String operation;
private JClassType mapValueType;
private JClassType mapKeyType;
private boolean valueType;
private RequestMethod() {
}
public void accept(ModelVisitor visitor) {
if (visitor.visit(this)) {
// Empty
}
visitor.endVisit(this);
}
public String getApiVersion() {
return apiVersion;
}
/**
* If the method returns a collection, this method will return the element
* type.
*
* @return
*/
public JClassType getCollectionElementType() {
return collectionElementType;
}
public CollectionType getCollectionType() {
return collectionType;
}
public JClassType getDataType() {
return dataType;
}
public JMethod getDeclarationMethod() {
return declarationMethod;
}
/**
* If the type returned from {@link #getDataType()} refers to an EntityProxy
* subtype, or a collection of EntityProxy subtypes, returns the
* EntityProxyModel describing the entity.
*/
public EntityProxyModel getEntityType() {
return entityType;
}
public List<JMethod> getExtraSetters() {
return extraSetters;
}
/**
* If the method is intended to be invoked on an instance of an EntityProxy,
* returns the EntityProxyModel describing that type.
*/
public EntityProxyModel getInstanceType() {
return instanceType;
}
public JClassType getMapKeyType() {
return mapKeyType;
}
public JClassType getMapValueType() {
return mapValueType;
}
public String getOperation() {
return operation;
}
public boolean isCollectionType() {
return collectionType != null;
}
public boolean isEntityType() {
return entityType != null;
}
public boolean isInstance() {
return instanceType != null;
}
public boolean isValueType() {
return valueType;
}
/**
* For debugging use only.
*/
@Override
public String toString() {
return getDeclarationMethod().toString();
}
}