com.gwtplatform.mvp.rebind.TabInfoMethod Maven / Gradle / Ivy
/*
* Copyright 2011 ArcBees 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.gwtplatform.mvp.rebind;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.core.ext.typeinfo.JParameter;
import com.google.gwt.user.rebind.SourceWriter;
import com.gwtplatform.mvp.client.TabData;
import com.gwtplatform.mvp.client.annotations.TabInfo;
/**
* Represents a static method, in the presenter, that returns tab information.
*/
public class TabInfoMethod {
private final TreeLogger logger;
private final ClassCollection classCollection;
private final GinjectorInspector ginjectorInspector;
private final PresenterInspector presenterInspector;
private TabInfo annotation;
private Integer tabPriority;
private String functionName;
private JParameter[] parameters;
private boolean returnString; // Either returns a String or a TabInfo
public TabInfoMethod(TreeLogger logger,
ClassCollection classCollection,
GinjectorInspector ginjectorInspector,
PresenterInspector presenterInspector) {
this.logger = logger;
this.classCollection = classCollection;
this.ginjectorInspector = ginjectorInspector;
this.presenterInspector = presenterInspector;
}
public void init(JMethod method) throws UnableToCompleteException {
annotation = method.getAnnotation(TabInfo.class);
assert annotation != null;
tabPriority = annotation.priority();
if (tabPriority < 0) {
tabPriority = null;
}
functionName = method.getName();
if (!method.isStatic()) {
logger.log(TreeLogger.ERROR, getErrorPrefix() + " is not static. This is not supported.");
throw new UnableToCompleteException();
}
if (annotation.label().length() != 0) {
logger.log(TreeLogger.ERROR, getErrorPrefix()
+ ". The annotation defines a 'label', this is not permitted.", null);
throw new UnableToCompleteException();
}
JClassType classReturnType = method.getReturnType().isClassOrInterface();
if (classReturnType == classCollection.stringClass) {
returnString = true;
} else if (classReturnType.isAssignableFrom(classCollection.tabDataClass)) {
returnString = false;
} else {
logger.log(TreeLogger.ERROR, getErrorPrefix() + " must return either a String or a "
+ TabData.class.getSimpleName());
throw new UnableToCompleteException();
}
parameters = method.getParameters();
if (parameters.length > 0) {
for (JParameter parameter : parameters) {
final JClassType parameterType = parameter.getType().isClassOrInterface();
if (!ginjectorInspector.getGinjectorClass().equals(parameterType) &&
ginjectorInspector.findGetMethod(parameterType) == null) {
logger.log(TreeLogger.ERROR, getErrorPrefix() + " has a parameter that is not provided by "
+ ginjectorInspector.getGinjectorClassName() + ". This is illegal.");
throw new UnableToCompleteException();
}
}
}
if (tabPriority != null && !returnString) {
logger.log(TreeLogger.ERROR, getErrorPrefix()
+ ". The annotation defines a 'tabPriority' but the method returns TabData, "
+ "this is not permitted.", null);
throw new UnableToCompleteException();
}
if (tabPriority == null && returnString) {
logger.log(TreeLogger.ERROR, getErrorPrefix()
+ ". The annotation does not define a 'tabPriority' but the method returns a String, "
+ "this is not permitted.", null);
throw new UnableToCompleteException();
}
}
private String getErrorPrefix() {
return "In presenter " + presenterInspector.getPresenterClassName()
+ ", method " + functionName + " annotated with @" + TabInfo.class.getSimpleName();
}
/**
* Writes the {@code getTabDataInternal} method definition in the generated proxy.
*
* @param writer The {@code SourceWriter}
*/
public void writeGetTabDataInternalMethod(SourceWriter writer) throws UnableToCompleteException {
if (returnString) {
// Presenter static method returning a string
assert tabPriority != null;
writer.println();
writer.println("protected TabData getTabDataInternal("
+ ginjectorInspector.getGinjectorClassName() + " ginjector) {");
writer.indent();
writer.print("return new TabDataBasic(");
writer.print(presenterInspector.getPresenterClassName() + ".");
writeTabInfoFunctionCall(writer);
writer.println(", " + tabPriority + ");");
writer.outdent();
writer.println("}");
} else {
// Presenter static method returning tab data
writer.println();
writer.println("protected TabData getTabDataInternal("
+ ginjectorInspector.getGinjectorClassName() + " ginjector) {");
writer.indent();
writer.print("return ");
writer.print(presenterInspector.getPresenterClassName() + ".");
writeTabInfoFunctionCall(writer);
writer.println(";");
writer.outdent();
writer.println("}");
}
}
private void writeTabInfoFunctionCall(SourceWriter writer) throws UnableToCompleteException {
writer.print(functionName + "(");
for (int i = 0; i < parameters.length; i++) {
if (i > 0) {
writer.print(", ");
}
writer.print("ginjector");
JParameter parameter = parameters[i];
final JClassType returnType = parameter.getType().isClassOrInterface();
if (!returnType.equals(ginjectorInspector.getGinjectorClass())) {
writer.print(".");
writer.print(ginjectorInspector.findGetMethod(returnType));
writer.print("()");
}
}
writer.print(")");
}
public String getTabContainerClassName() {
return annotation.container().getCanonicalName();
}
public String getNameToken() {
return annotation.nameToken();
}
}