/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.verification.vrules;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.jboss.tools.common.model.*;
import org.jboss.tools.common.model.util.EclipseJavaUtil;
import org.jboss.tools.common.verification.vrules.*;
import org.jboss.tools.common.verification.vrules.layer.VObjectImpl;
public class JSFCheckClass extends JSFDefaultCheck {
public VResult[] check(VObject object) {
XModelObject o = ((VObjectImpl)object).getModelObject();
String objectAttribute = rule.getProperty("objectAttribute"); //$NON-NLS-1$
String attr = getAttribute();
if(objectAttribute == null || objectAttribute.length() == 0) objectAttribute = attr;
if(attr == null) return null;
String value = o.getAttributeValue(objectAttribute);
if(value.length() == 0 || isJavaLang(value)) return null;
if(isPrimitive(value)) return allowsPrimitive() ? null : fire(object, attr, attr, value);
IType type = object.getModel().getValidType(value);
if(type != null) {
String mustImpl = null;
try {
mustImpl = checkImplements(object, type);
} catch (JavaModelException e) {
//ignore
}
if(mustImpl != null) return fireImplements(object, attr, attr, value, mustImpl);
String mustExtend = null;
try {
mustExtend = checkExtends(object, type);
} catch (JavaModelException e) {
//ignore
}
if(mustExtend != null) return fireExtends(object, attr, attr, value, mustExtend);
return null;
}
return fire(object, attr, attr, value);
}
private String checkImplements(VObject object, IType type) throws JavaModelException {
if(object == null || type == null) return null;
if("java.lang.Class".equals(type.getFullyQualifiedName())) return null; //$NON-NLS-1$
String impl = rule.getProperty("implements"); //$NON-NLS-1$
if(impl == null || impl.length() == 0) return null;
String[] is = type.getSuperInterfaceNames();
for (int i = 0; i < is.length; i++) {
String f = EclipseJavaUtil.resolveType(type, is[i]);
if(f != null && f.equals(impl)) return null;
}
if(type.isInterface()) return impl;
String f = type.getSuperclassName();
if(f == null || f.length() == 0 || "java.lang.Object".equals(f)) return impl; //$NON-NLS-1$
f = EclipseJavaUtil.resolveType(type, f);
if(f == null || f.length() == 0 || "java.lang.Object".equals(f)) return impl; //$NON-NLS-1$
type = object.getModel().getValidType(f);
if(type == null) return impl;
return checkImplements(object, type);
}
private String checkExtends(VObject object, IType type) throws JavaModelException {
if(object == null || type == null) return null;
if(type.isInterface()) return null;
if("java.lang.Class".equals(type.getFullyQualifiedName())) return null; //$NON-NLS-1$
String ext = rule.getProperty("extends"); //$NON-NLS-1$
if(ext == null || ext.length() == 0) return null;
String f = type.getSuperclassName();
if(f == null || f.length() == 0 || "java.lang.Object".equals(f)) return ext; //$NON-NLS-1$
if(f.equals(ext)) return null;
f = EclipseJavaUtil.resolveType(type, f);
if(f == null || f.length() == 0 || "java.lang.Object".equals(f)) return ext; //$NON-NLS-1$
if(f.equals(ext)) return null;
type = object.getModel().getValidType(f);
if(type == null) return ext;
return checkExtends(object, type);
}
protected String getAttribute() {
return rule.getProperty("attribute"); //$NON-NLS-1$
}
private boolean allowsPrimitive() {
return "true".equals(rule.getProperty("allow-primitive")); //$NON-NLS-1$ //$NON-NLS-2$
}
private boolean isPrimitive(String value) {
return ".int.boolean.char.byte.double.float.long.short.".indexOf("." + value + ".") >= 0; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
private boolean isJavaLang(String value) {
if(value.indexOf('.') < 0) {
return ".String.Integer.Boolean.Character.Byte.Double.Float.Long.Short.".indexOf("." + value + ".") >= 0; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} else if(value.startsWith("java.lang.")) { //$NON-NLS-1$
return isJavaLang(value.substring(10));
} else {
return false;
}
}
protected VResult[] fire(VObject object, String id, String attr, String value) {
Object[] os = new Object[] {attr, value};
VResult result = rule.getResultFactory().getResult(id, object, attr, object, attr, os);
return new VResult[] {result};
}
protected VResult[] fireImplements(VObject object, String id, String attr, String value, String interfaceName) {
Object[] os = new Object[] {attr, value, interfaceName};
VResult result = rule.getResultFactory().getResult(id + ".implements", object, attr, object, attr, os); //$NON-NLS-1$
return new VResult[] {result};
}
protected VResult[] fireExtends(VObject object, String id, String attr, String value, String superName) {
Object[] os = new Object[] {attr, value, superName};
VResult result = rule.getResultFactory().getResult(id + ".extends", object, attr, object, attr, os); //$NON-NLS-1$
return new VResult[] {result};
}
}