blob: 91aca9595067a3423b556b3c8a4dd4c2582e1853 [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.gwt.editor.rebind.model;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JField;
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.editor.client.Editor;
import com.google.gwt.editor.client.IsEditor;
import com.google.gwt.editor.client.Editor.Path;
/**
* Encapsulates the various ways an Editor might be accessed.
*/
class EditorAccess {
private static final String EDITOR_SUFFIX = "Editor";
public static EditorAccess root(JClassType rootType) {
return new EditorAccess("", rootType, "");
}
/**
* Constructs an EditorAccess for an IsEditor type.
*/
public static EditorAccess via(EditorAccess access, JClassType type) {
return new EditorAccess(access.getPath(), type, access.getExpresson()
+ ".asEditor()");
}
public static EditorAccess via(JField field) {
String path = field.getName();
Path pathAnnotation = field.getAnnotation(Editor.Path.class);
if (pathAnnotation != null) {
path = pathAnnotation.value();
} else if (path.endsWith(EDITOR_SUFFIX)) {
path = path.substring(0, path.length() - EDITOR_SUFFIX.length());
}
return new EditorAccess(path, field.getType().isClassOrInterface(),
field.getName());
}
public static EditorAccess via(JMethod method) {
String path = method.getName();
Path pathAnnotation = method.getAnnotation(Editor.Path.class);
if (pathAnnotation != null) {
path = pathAnnotation.value();
} else if (path.endsWith(EDITOR_SUFFIX)) {
path = path.substring(0, path.length() - EDITOR_SUFFIX.length());
}
return new EditorAccess(path, method.getReturnType().isClassOrInterface(),
method.getName() + "()");
}
private static boolean isEditor(JType type) {
JClassType classType = type.isClassOrInterface();
if (classType == null) {
return false;
}
TypeOracle oracle = classType.getOracle();
return oracle.findType(IsEditor.class.getName()).isAssignableFrom(classType);
}
private final boolean isEditor;
private final String expression;
private final String path;
private final JClassType type;
private EditorAccess(String path, JClassType type, String expression) {
this.expression = expression;
this.path = path;
this.type = type;
isEditor = isEditor(type);
}
public JClassType getEditorType() {
return type;
}
public String getExpresson() {
return expression;
}
public String getPath() {
return path;
}
/**
* Returns <code> true if the editor accessed by this EditorAccess
* implements the IsEditor interface.
*/
public boolean isEditor() {
return isEditor;
}
/**
* For debugging use only.
*/
@Override
public String toString() {
return path + " = " + type.getParameterizedQualifiedSourceName();
}
}