/* * 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.transformation.ui.textimport; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.ecore.EObject; import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.metamodel.MetamodelDescriptor; import org.teiid.designer.core.metamodel.aspect.AspectManager; import org.teiid.designer.core.metamodel.aspect.uml.UmlDiagramAspect; import org.teiid.designer.core.metamodel.aspect.uml.UmlPackage; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.core.workspace.ModelUtil; import org.teiid.designer.core.workspace.ModelWorkspaceException; import org.teiid.designer.relational.ui.wizards.RelationalObjectProcessor; import org.teiid.designer.transformation.ui.UiConstants; import org.teiid.designer.ui.common.viewsupport.StatusInfo; import org.teiid.designer.ui.viewsupport.ModelUtilities; /** * @since 8.0 */ public class VirtualTablelLocationSelectionValidator implements ISelectionStatusValidator, UiConstants { private StatusInfo stStatus; private static final String WRONG_CLASS_ERROR_MSG = Util.getString("VirtualTableLocationSelectionValidator.wrongClassErrorMessage.text"); //$NON-NLS-1$ private static final String CONTAINER_READONLY_ERROR_MSG = Util.getString("VirtualTableLocationSelectionValidator.containerReadOnlyErrorMessage.text"); //$NON-NLS-1$ private static final String CONTAINER_OBJECT_READONLY_ERROR_MSG = Util.getString("VirtualTableLocationSelectionValidator.containerObjectReadOnlyErrorMessage.text"); //$NON-NLS-1$ private static final String CONTAINER_MODEL_READONLY_ERROR_MSG = Util.getString("VirtualTableLocationSelectionValidator.containerModelReadOnlyErrorMessage.text"); //$NON-NLS-1$ private static final String NOTHING_SELECTED = Util.getString("VirtualTableLocationSelectionValidator.wrongClassErrorMessage.text"); //$NON-NLS-1$ /* (non-Javadoc) * @see org.eclipse.ui.dialogs.ISelectionStatusValidator#validate(java.lang.Object[]) */ @Override public IStatus validate(Object[] selection) { // deal with empty selection if ( selection == null || selection.length == 0 ) { return new StatusInfo(PLUGIN_ID, IStatus.ERROR, NOTHING_SELECTED); } // check class boolean bAllAreValid = true; for( int i = 0; i < selection.length; i++ ) { if ( isVirtualContainer( selection[ i ] ) || isVirtualModelResource( selection[ i ] ) || isContainer( selection[ i ] ) ) { // ok } else { bAllAreValid = false; stStatus = new StatusInfo( PLUGIN_ID, IStatus.ERROR, WRONG_CLASS_ERROR_MSG ); break; } } // if containers are valid, make sure they are modifiable if ( bAllAreValid ) { for( int i = 0; i < selection.length; i++ ) { if ( containerIsModifiable( selection[ i ] ) ) { // ok } else { final Object theSelection = selection[i]; String msg = CONTAINER_READONLY_ERROR_MSG; if ( theSelection instanceof ModelResource ) { msg = CONTAINER_MODEL_READONLY_ERROR_MSG; } else if ( theSelection instanceof IFile ) { msg = CONTAINER_MODEL_READONLY_ERROR_MSG; } else if ( isVirtualContainer(selection[i]) ) { msg = CONTAINER_OBJECT_READONLY_ERROR_MSG; } bAllAreValid = false; stStatus = new StatusInfo( PLUGIN_ID, IStatus.ERROR, msg ); break; } } } if ( bAllAreValid ) { stStatus = new StatusInfo( PLUGIN_ID, IStatus.OK, "" ); //$NON-NLS-1$ } return stStatus; } private boolean isVirtualContainer( Object oSelection ) { boolean bResult = false; if( oSelection instanceof EObject ) { ModelResource mr = ModelUtilities.getModelResourceForModelObject((EObject)oSelection); if( mr != null && ModelUtilities.isVirtual(mr) ) { try { MetamodelDescriptor descriptor = mr.getPrimaryMetamodelDescriptor(); if ((descriptor != null) && descriptor.getNamespaceURI().equals(RelationalObjectProcessor.RELATIONAL_PACKAGE_URI)) { // Now check the eObject type for "Relational Package" UmlDiagramAspect dAspect = AspectManager.getUmlDiagramAspect((EObject)oSelection); if( dAspect instanceof UmlPackage ) { bResult = true; } } } catch( ModelWorkspaceException mwe ) { ModelerCore.Util.log( IStatus.ERROR, mwe, mwe.getMessage() ); } } } return bResult; } private boolean isVirtualModelResource( Object oSelection ) { boolean bResult = false; if ( oSelection instanceof IResource ) { try { IResource resource = (IResource)oSelection; if ( ModelUtilities.isModelFile( resource ) ) { ModelResource mr = ModelUtil.getModelResource( (IFile)resource, true ); if (mr != null&& ModelUtilities.isVirtual(mr) ) { MetamodelDescriptor descriptor = mr.getPrimaryMetamodelDescriptor(); if ((descriptor != null) && descriptor.getNamespaceURI().equals(RelationalObjectProcessor.RELATIONAL_PACKAGE_URI)) { bResult = true; } } } } catch( ModelWorkspaceException mwe ) { ModelerCore.Util.log(IStatus.ERROR, mwe, mwe.getMessage()); } } return bResult; } private boolean isContainer( Object oSelection ) { return (oSelection instanceof IContainer); } private boolean containerIsModifiable( Object oSelection ) { boolean bResult = false; ModelResource mr = null; if ( isVirtualModelResource( oSelection ) ) { try { mr = ModelUtil.getModelResource( (IFile)oSelection, true ); } catch( ModelWorkspaceException mwe ) { ModelerCore.Util.log(IStatus.ERROR, mwe, mwe.getMessage()); } } else if ( isVirtualContainer( oSelection ) ) { mr = ModelUtilities.getModelResourceForModelObject( (EObject)oSelection ); } else if ( isContainer( oSelection ) ) { return ( ! ModelUtil.isIResourceReadOnly(((IContainer) oSelection)) ); } bResult = !ModelUtilities.isReadOnly( mr ); return bResult; } }