/*******************************************************************************
* Copyright (c) 2008 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.smooks.configuration.validate;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IResource;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.Modifier;
import org.jboss.tools.smooks.configuration.editors.utils.ProjectClassLoader;
import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils;
import org.jboss.tools.smooks.model.csv12.Binding;
import org.jboss.tools.smooks.model.csv12.Csv12Package;
import org.jboss.tools.smooks.model.javabean12.BeanType;
import org.jboss.tools.smooks.model.javabean12.Javabean12Package;
/**
* @author Dart (dpeng@redhat.com)
*
*/
public class ClassFieldEditorValidator extends AbstractValidator {
private ProjectClassLoader classLoader;
private List<Object> validationTargetList = null;
/**
* @return the classLoader
*/
public ProjectClassLoader getClassLoader(EObject obj) {
if (classLoader != null) {
return classLoader;
}
IResource resource = SmooksUIUtils.getResource(obj);
if (resource == null)
return null;
try {
classLoader = new ProjectClassLoader(JavaCore.create(resource.getProject()));
} catch (JavaModelException e) {
e.printStackTrace();
}
return classLoader;
}
protected void initValidationTargetList() {
ClassValidationTarget target1 = new ClassValidationTarget();
target1.setFeature(Javabean12Package.Literals.BEAN_TYPE__CLASS);
target1.setSupportArrayClass(true);
target1.setTarget(BeanType.class);
validationTargetList.add(target1);
ClassValidationTarget target2 = new ClassValidationTarget();
target2.setFeature(Csv12Package.Literals.BINDING__CLASS);
target2.setTarget(Binding.class);
validationTargetList.add(target2);
ClassValidationTarget target3 = new ClassValidationTarget();
validationTargetList.add(target3);
}
public List<Object> getValidationTargetList() {
if (validationTargetList == null) {
validationTargetList = new ArrayList<Object>();
initValidationTargetList();
}
return validationTargetList;
}
public List<Diagnostic> validate(Collection<?> selectionObjects) {
List<Diagnostic> list = new ArrayList<Diagnostic>();
for (Iterator<?> iterator = selectionObjects.iterator(); iterator.hasNext();) {
Object object = (Object) iterator.next();
if ((object instanceof EObject)) {
List<?> targetList = getValidationTargetList();
for (Iterator<?> iterator2 = targetList.iterator(); iterator2.hasNext();) {
ClassValidationTarget target = (ClassValidationTarget) iterator2.next();
Class<?> targetClass = target.getTarget();
EStructuralFeature feature = target.getFeature();
if (targetClass.isAssignableFrom(object.getClass()) && feature != null) {
Object value = ((EObject) object).eGet(feature);
if (value == null)
break;
String classString = value.toString();
classLoader = getClassLoader((EObject) object);
if (classString != null) {
classString = classString.trim();
} else {
continue;
}
if (target.isSupportArrayClass()) {
if (classString.endsWith("[]")) { //$NON-NLS-1$
classString = classString.substring(0, classString.length() - 2);
}
}
Class<?> clazz1 = null;
if (classString != null && classLoader != null) {
try {
clazz1 = classLoader.loadClass(classString);
} catch (ClassNotFoundException e) {
// ignore
}
}
String message = null;
if (clazz1 == null) {
message = Messages.ClassFieldEditorValidator_Warning_Cannot_Find_Class + classString + "\""; //$NON-NLS-1$
} else {
if (Modifier.isAbstract(clazz1.getModifiers())) {
message = Messages.ClassFieldEditorValidator_Warning_Abstract_Class;
} else {
try {
Constructor<?> constructor = clazz1.getConstructor(null);
} catch (SecurityException e) {
message = Messages.ClassFieldEditorValidator_Warning_Class_Cannot_Be_Instanced
+ classString
+ Messages.ClassFieldEditorValidator_Warning_Class_Cannot_Be_Instanced2;
} catch (NoSuchMethodException e) {
message = Messages.ClassFieldEditorValidator_Warning_Class_Cannot_Be_Instanced
+ classString
+ Messages.ClassFieldEditorValidator_Warning_Class_Cannot_Be_Instanced2;
}
}
}
if (message != null) {
list.add(newWaringDiagnostic(message, object, (EAttribute) feature));
}
break;
}
}
}
// if (object instanceof Binding) {
// String classString = ((Binding) object).getClass_();
// classLoader = getClassLoader((EObject) object);
// Class<?> clazz1 = null;
// if (classString != null && classLoader != null) {
// try {
// clazz1 = classLoader.loadClass(classString);
// } catch (ClassNotFoundException e) {
// // ignore
// }
// }
// String message = "Can't find class : \"" + classString + "\"";
// if (clazz1 == null) {
// list.add(newWaringDiagnostic(message, object,
// JavabeanPackage.Literals.BINDINGS_TYPE__CLASS));
// }
// }
// if (object instanceof BindingsType) {
// BindingsType bindings = (BindingsType) object;
// classLoader = getClassLoader(bindings);
// String clazz = bindings.getClass_();
// if (clazz != null) {
// clazz = clazz.trim();
// if (clazz.endsWith("[]")) {
// clazz = clazz.substring(0, clazz.length() - 2);
// }
// }
// Class<?> clazz1 = null;
// if (clazz != null && classLoader != null) {
// try {
// clazz1 = classLoader.loadClass(clazz);
// } catch (ClassNotFoundException e) {
// // ignore
// }
// }
// String message = "Can't find class : \"" + clazz + "\"";
// if (clazz1 == null) {
// list.add(newWaringDiagnostic(message, bindings,
// JavabeanPackage.Literals.BINDINGS_TYPE__CLASS));
// }
// }
if (object instanceof EObject) {
List<Diagnostic> dd = validate(((EObject) object).eContents());
if (dd != null) {
list.addAll(dd);
}
}
}
return list;
}
public List<Diagnostic> validate(Collection<?> selectedObjects, EditingDomain editingDomain) {
return validate(selectedObjects);
}
public void initValidator(Collection<?> selectedObjects, EditingDomain editingDomain) {
// TODO Auto-generated method stub
}
private class ClassValidationTarget {
private boolean supportArrayClass = false;
private EStructuralFeature feature;
private Class<?> target;
public EStructuralFeature getFeature() {
return feature;
}
public void setFeature(EStructuralFeature feature) {
this.feature = feature;
}
public Class<?> getTarget() {
return target;
}
public void setTarget(Class<?> target) {
this.target = target;
}
public boolean isSupportArrayClass() {
return supportArrayClass;
}
public void setSupportArrayClass(boolean supportArrayClass) {
this.supportArrayClass = supportArrayClass;
}
}
}