/**
* Copyright (C) 2009-2011 the original author or authors.
* See the notice.md file distributed with this work for additional
* information regarding copyright ownership.
*
* 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 org.fusesource.restygwt.rebind;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.*;
import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
/**
* @author <a href="mailto:bogdan.mustiata@gmail.com">Bogdan Mustiata</a>
*/
public abstract class DirectRestBaseSourceCreator extends BaseSourceCreator {
private JClassType OVERLAY_VALUE_TYPE;
public DirectRestBaseSourceCreator(TreeLogger logger, GeneratorContext context, JClassType source, String suffix) {
super(logger, context, source, suffix);
}
@Override protected void generate() throws UnableToCompleteException {
this.OVERLAY_VALUE_TYPE = find(JavaScriptObject.class, getLogger(), context);
}
protected ClassSourceFileComposerFactory createClassSourceComposerFactory(JavaSourceCategory createWhat,
String [] annotationDeclarations,
String [] extendedInterfaces) {
String genericTypeParameters = createClassDeclarationGenericType();
ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(
packageName,
shortName + genericTypeParameters
);
if (createWhat == JavaSourceCategory.INTERFACE) {
composerFactory.makeInterface();
}
if (annotationDeclarations != null) {
for (String annotationDeclaration : annotationDeclarations) {
composerFactory.addAnnotationDeclaration(annotationDeclaration);
}
}
if (extendedInterfaces != null) {
for (String anInterface : extendedInterfaces) {
composerFactory.addImplementedInterface(anInterface);
}
}
return composerFactory;
}
private String createClassDeclarationGenericType() {
String parameters = "";
if(source instanceof JGenericType)
{
JGenericType genericType = (JGenericType)source;
StringBuilder builder = new StringBuilder();
builder.append("<");
boolean first = true;
for(JTypeParameter arg : genericType.getTypeParameters())
{
if(!first)
builder.append(",");
builder.append(arg.getName());
builder.append(" extends ");
builder.append(arg.getFirstBound().getParameterizedQualifiedSourceName());
first = false;
}
builder.append(">");
parameters = builder.toString();
}
return parameters;
}
protected boolean isOverlayMethod(JMethod method) {
final JClassType aClass = method.getReturnType().isClass();
return aClass != null && OVERLAY_VALUE_TYPE.isAssignableFrom(aClass);
}
}