/******************************************************************************* * 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.beans.PropertyDescriptor; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; 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.jboss.tools.smooks.configuration.editors.utils.JavaPropertyUtils; import org.jboss.tools.smooks.configuration.editors.utils.ProjectClassLoader; import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils; import org.jboss.tools.smooks.model.javabean12.Javabean12Package; /** * @author Dart * */ public class PropertyValidator extends AbstractValidator { private ProjectClassLoader classLoader; private List<Object> validationTargetList = null; public PropertyValidator() { super(); // TODO Auto-generated constructor stub } /* * (non-Javadoc) * * @see * org.jboss.tools.smooks.configuration.validate.ISmooksValidator#initValidator * (java.util.Collection, org.eclipse.emf.edit.domain.EditingDomain) */ public void initValidator(Collection<?> selectedObjects, EditingDomain editingDomain) { } 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; } public List<Object> getValidationTargetList() { if (validationTargetList == null) { validationTargetList = new ArrayList<Object>(); initValidationTargetList(); } return validationTargetList; } protected void initValidationTargetList() { // PropertySetterValidateTarget target = new PropertySetterValidateTarget(); // target.setPropertyFeature(JavabeanPackage.Literals.VALUE_TYPE__PROPERTY); // target.setSetterMethodFeature(JavabeanPackage.Literals.VALUE_TYPE__SETTER_METHOD); // target.setTargetClass(ValueType.class); // validationTargetList.add(target); PropertySetterValidateTarget target2 = new PropertySetterValidateTarget(); target2.setPropertyFeature(Javabean12Package.Literals.VALUE_TYPE__PROPERTY); target2.setSetterMethodFeature(Javabean12Package.Literals.VALUE_TYPE__SETTER_METHOD); target2.setTargetClass(org.jboss.tools.smooks.model.javabean12.ValueType.class); validationTargetList.add(target2); // PropertySetterValidateTarget target4 = new PropertySetterValidateTarget(); // target4.setPropertyFeature(JavabeanPackage.Literals.WIRING_TYPE__PROPERTY); // target4.setSetterMethodFeature(JavabeanPackage.Literals.WIRING_TYPE__SETTER_METHOD); // target4.setTargetClass(WiringType.class); // validationTargetList.add(target4); PropertySetterValidateTarget target6 = new PropertySetterValidateTarget(); target6.setPropertyFeature(Javabean12Package.Literals.WIRING_TYPE__PROPERTY); target6.setSetterMethodFeature(Javabean12Package.Literals.WIRING_TYPE__SETTER_METHOD); target6.setTargetClass(org.jboss.tools.smooks.model.javabean12.WiringType.class); validationTargetList.add(target6); // PropertySetterValidateTarget target8 = new PropertySetterValidateTarget(); // target8.setPropertyFeature(JavabeanPackage.Literals.EXPRESSION_TYPE__PROPERTY); // target8.setSetterMethodFeature(JavabeanPackage.Literals.EXPRESSION_TYPE__SETTER_METHOD); // target8.setTargetClass(ExpressionType.class); // validationTargetList.add(target8); PropertySetterValidateTarget target10 = new PropertySetterValidateTarget(); target10.setPropertyFeature(Javabean12Package.Literals.EXPRESSION_TYPE__PROPERTY); target10.setSetterMethodFeature(Javabean12Package.Literals.EXPRESSION_TYPE__SETTER_METHOD); target10.setTargetClass(org.jboss.tools.smooks.model.javabean12.ExpressionType.class); validationTargetList.add(target10); } 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();) { PropertySetterValidateTarget target = (PropertySetterValidateTarget) iterator2.next(); Class<?> targetClass = target.getTargetClass(); EStructuralFeature pFeature = target.getPropertyFeature(); boolean isProperty = false; if (targetClass.isInstance(object) && pFeature != null ) { Object pValue = ((EObject) object).eGet(pFeature); String propertyValueString = null; if (pValue != null) { propertyValueString = pValue.toString(); isProperty = true; } if (pValue == null ) { break; } classLoader = getClassLoader((EObject) object); EStructuralFeature classFeature = SmooksUIUtils .getClassFeature(((EObject) object).eContainer()); if (classFeature == null) { break; } Object classData = (((EObject) object).eContainer()).eGet(classFeature); if (classData == null) { break; } String classString = classData.toString(); Class<?> clazz1 = null; if (classString != null && classLoader != null) { try { clazz1 = classLoader.loadClass(classString); } catch (ClassNotFoundException e) { // ignore } } if (clazz1 == null) { break; } if (propertyValueString != null) { propertyValueString = propertyValueString.trim(); } if (isProperty && propertyValueString.length() != 0 && propertyValueString != null) { boolean correct = false; PropertyDescriptor[] pds = JavaPropertyUtils.getPropertyDescriptor(clazz1); for (int i = 0; i < pds.length; i++) { PropertyDescriptor propertyDescriptor = pds[i]; if (propertyDescriptor.getName().equals(propertyValueString)) { correct = true; break; } } if (!correct) { String message = Messages.PropertyValidator_Warning_Property_Cannot_Be_Found + propertyValueString + Messages.PropertyValidator_Warning_Property_Cannot_Be_Found2; list.add(newWaringDiagnostic(message, object, (EAttribute) pFeature)); } } } } } 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) { try { return validate(selectedObjects); } catch (Exception e) { e.printStackTrace(); } return Collections.emptyList(); } private class PropertySetterValidateTarget { private Class<?> targetClass; private EStructuralFeature feature; private EStructuralFeature setterMethodFeature; /** * @return the setterMethodFeature */ public EStructuralFeature getSetterMethodFeature() { return setterMethodFeature; } /** * @param setterMethodFeature * the setterMethodFeature to set */ public void setSetterMethodFeature(EStructuralFeature setterMethodFeature) { this.setterMethodFeature = setterMethodFeature; } /** * @return the targetClass */ public Class<?> getTargetClass() { return targetClass; } /** * @param targetClass * the targetClass to set */ public void setTargetClass(Class<?> targetClass) { this.targetClass = targetClass; } /** * @return the feature */ public EStructuralFeature getPropertyFeature() { return feature; } /** * @param feature * the feature to set */ public void setPropertyFeature(EStructuralFeature feature) { this.feature = feature; } } }