/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.ui.viewsupport; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IStatus; import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.teiid.designer.core.metamodel.MetamodelDescriptor; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.core.workspace.ModelUtil; import org.teiid.designer.ui.UiConstants; import org.teiid.designer.ui.common.viewsupport.StatusInfo; /** * ModelResourceSelectionValidator is an ISelectionStatusValidator that will pass * validation on only Model files. If a MetamodelDescriptor is provided via the * constructor, then this validator will only pass ModelResources of the same * metamodel type. * * @since 8.0 */ public class ModelResourceSelectionValidator implements ISelectionStatusValidator { private final static IStatus OK_STATUS = new StatusInfo(UiConstants.PLUGIN_ID); private final static String NOTHING_SELECTED = UiConstants.Util.getString( "ModelResourceSelectionValidator.noSelection"); //$NON-NLS-1$ private final static String MULTI_SELECTION = UiConstants.Util.getString( "ModelResourceSelectionValidator.noMultiSelection"); //$NON-NLS-1$ private final static String MUST_SELECT_MODEL = UiConstants.Util.getString( "ModelResourceSelectionValidator.mustSelectModel"); //$NON-NLS-1$ private final static String MUST_SELECT_MODELS = UiConstants.Util.getString( "ModelResourceSelectionValidator.mustSelectModels"); //$NON-NLS-1$ private final static String MUST_MATCH_METAMODEL = "ModelResourceSelectionValidator.mustSelectSameMetamodel"; //$NON-NLS-1$ private final static String MUST_MATCH_METAMODELS = "ModelResourceSelectionValidator.mustSelectSameMetamodels"; //$NON-NLS-1$ private MetamodelDescriptor metamodelDescriptor = null; private boolean allowMultiSelection = false; /** * Construct an instance of ModelResourceMetamodelValidator that will only pass * selections of metamodel files. */ public ModelResourceSelectionValidator(boolean allowMultiSelection) { this(null, allowMultiSelection); } /** * Construct an instance of ModelResourceMetamodelValidator that will only pass * ModelResources of the same metamodel. */ public ModelResourceSelectionValidator( MetamodelDescriptor descriptorToMatch, boolean allowMultiSelection) { this.metamodelDescriptor = descriptorToMatch; this.allowMultiSelection = allowMultiSelection; } /* (non-Javadoc) * @see org.eclipse.ui.dialogs.ISelectionStatusValidator#validate(java.lang.Object[]) */ @Override public IStatus validate(Object[] selection) { IStatus result = OK_STATUS; if ( selection == null || selection.length == 0 ) { return new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR, NOTHING_SELECTED); } if ( ! allowMultiSelection && selection.length > 1 ) { return new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR, MULTI_SELECTION); } if ( selection.length == 1 ) { // single selection logic if ( this.metamodelDescriptor != null ) { result = checkMetamodel(selection[0], false); } else { result = checkModelFile(selection[0], false); } } else { // multi-selection logic for ( int i=0 ; i<selection.length ; ++i ) { if ( this.metamodelDescriptor != null ) { result = checkMetamodel(selection[i], true); } else { result = checkModelFile(selection[i], true); } if ( result != OK_STATUS ) { break; } } } return result; } /** * Check that the specified Object is a File. * @param obj * @param generateMultiSelectMessage * @return */ private IStatus checkFile(Object obj, boolean generateMultiSelectMessage) { if ( obj instanceof IFile ) { return OK_STATUS; } if ( generateMultiSelectMessage ) { return new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR, MUST_SELECT_MODELS); } return new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR, MUST_SELECT_MODEL); } /** * Check that the specified Object is a model file. This method calls checkFile(). * @param obj * @param generateMultiSelectMessage * @return */ private IStatus checkModelFile(Object obj, boolean generateMultiSelectMessage) { IStatus result = checkFile(obj, generateMultiSelectMessage); if ( result == OK_STATUS ) { if ( ! ModelUtilities.isModelFile((IFile) obj)) { if ( generateMultiSelectMessage ) { return new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR, MUST_SELECT_MODELS); } return new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR, MUST_SELECT_MODEL); } } return result; } /** * Check that the specified Object is of the same metamodel type that was specified * upon construction of this validator. This method calls checkModelFile(). * @param obj * @param generateMultiSelectMessage * @return */ private IStatus checkMetamodel(Object obj, boolean generateMultiSelectMessage) { IStatus result = checkModelFile(obj, generateMultiSelectMessage); if ( result == OK_STATUS ){ boolean exceptionOccurred = false; ModelResource modelResource = null; try { modelResource = ModelUtil.getModelResource((IFile) obj, true); } catch (Exception ex) { UiConstants.Util.log(IStatus.ERROR, ex, ex.getClass().getName()); if ( generateMultiSelectMessage ) { String message = UiConstants.Util.getString(MUST_MATCH_METAMODELS, this.metamodelDescriptor.getDisplayName()); result = new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR, message); } else { String message = UiConstants.Util.getString(MUST_MATCH_METAMODEL, this.metamodelDescriptor.getDisplayName()); result = new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR, message); } exceptionOccurred = true; } if (!exceptionOccurred) { MetamodelDescriptor descriptor = null; try { descriptor = modelResource.getPrimaryMetamodelDescriptor(); } catch (Exception ex) { UiConstants.Util.log(IStatus.ERROR, ex, ex.getClass().getName()); exceptionOccurred = true; if ( generateMultiSelectMessage ) { String message = UiConstants.Util.getString(MUST_MATCH_METAMODELS, this.metamodelDescriptor.getDisplayName()); result = new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR, message); } else { String message = UiConstants.Util.getString(MUST_MATCH_METAMODEL, this.metamodelDescriptor.getDisplayName()); result = new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR, message); } } if (!exceptionOccurred) { if (! this.metamodelDescriptor.equals(descriptor)) { if ( generateMultiSelectMessage ) { String message = UiConstants.Util.getString(MUST_MATCH_METAMODELS, this.metamodelDescriptor.getDisplayName()); result = new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR, message); } else { String message = UiConstants.Util.getString(MUST_MATCH_METAMODEL, this.metamodelDescriptor.getDisplayName()); result = new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR, message); } } } } } return result; } }