/* * 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.modelgenerator.xml.modelextension; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.WorkspaceModifyOperation; import org.teiid.core.designer.ModelerCoreException; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.builder.ModelBuildUtil; 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.metamodels.core.ModelAnnotation; import org.teiid.designer.metamodels.core.ModelImport; import org.teiid.designer.modelgenerator.xml.XmlImporterUiPlugin; import org.teiid.designer.ui.UiConstants; import org.teiid.designer.ui.UiPlugin; import org.teiid.designer.ui.actions.ISelectionAction; import org.teiid.designer.ui.common.eventsupport.SelectionUtilities; import org.teiid.designer.ui.editors.ModelEditorManager; import org.teiid.designer.ui.event.ModelResourceEvent; import org.teiid.designer.ui.viewsupport.ModelUtilities; /** * @since 8.0 */ public abstract class BaseExtensionReplaceAction extends Action implements ISelectionListener, Comparable, ISelectionAction, ExtensionReplaceAction { private List selectedModels; public BaseExtensionReplaceAction() { super(); setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_ERROR_TSK)); } @Override public int compareTo( final Object o ) { if (o instanceof String) { return getText().compareTo((String)o); } if (o instanceof Action) { return getText().compareTo(((Action)o).getText()); } return 0; } @Override public abstract ExtensionManager getExtensionManager(); @Override public abstract String getExtensionName(); @Override public boolean isApplicable( final ISelection selection ) { boolean result = false; final List selectedObjs = SelectionUtilities.getSelectedObjects(selection); if (!selectedObjs.isEmpty()) { for (final Iterator iter = selectedObjs.iterator(); iter.hasNext();) { final Object obj = iter.next(); if (obj instanceof IFile) { final IFile file = (IFile)obj; if (ModelUtilities.isModelFile(file)) { final ModelResource resource = ModelUtilities.getModelResource(file); try { if (ModelUtilities.isPhysical(resource) && ModelUtilities.isRelationalModel(resource)) { final List imports = resource.getModelImports(); for (final Iterator impIter = imports.iterator(); impIter.hasNext();) { final ModelImport imp = (ModelImport)impIter.next(); if (imp.getName().equals(getExtensionName())) { if (!ModelUtilities.isModelInWorkspace(imp.getUuid())) { result = true; } } } } else { result = false; break; } } catch (final ModelWorkspaceException e) { result = false; break; } catch (final CoreException e) { result = false; break; } } else { result = false; break; } } else { result = false; break; } } } return result; } void replaceExtension( final IProgressMonitor monitor ) { if (selectedModels != null) { final ArrayList<ModelResource> eventList = new ArrayList<ModelResource>(); final ArrayList<ModelResource> modelsToSave = new ArrayList<ModelResource>(); ExtensionManager manager = null; // first, rebuild the models for (final Iterator iter = selectedModels.iterator(); iter.hasNext();) { final IFile modelFile = (IFile)iter.next(); try { final ModelResource modelResource = ModelUtil.getModelResource(modelFile, true); try { if (null == manager) { manager = getExtensionManager(); manager.loadModelExtensions(modelFile.getParent(), monitor); } final ModelAnnotation modelAnnotation = modelResource.getModelAnnotation(); modelAnnotation.setExtensionPackage(manager.getPackage()); ModelBuildUtil.rebuildImports(modelResource.getEmfResource(), true); } catch (final ModelWorkspaceException theException) { UiConstants.Util.log(IStatus.ERROR, theException, theException.getMessage()); } catch (final ModelerCoreException e) { UiConstants.Util.log(IStatus.ERROR, e, e.getMessage()); } eventList.add(modelResource); if (!ModelEditorManager.isOpen(modelFile)) { modelsToSave.add(modelResource); } else { } } catch (final ModelWorkspaceException e) { UiConstants.Util.log(IStatus.ERROR, e, e.getMessage()); } } // second, save all the models that are not open in editors, or else they may never get saved. for (final ModelResource modelResource : modelsToSave) { try { modelResource.save(null, true); } catch (final ModelWorkspaceException e) { UiConstants.Util.log(IStatus.ERROR, e, e.getMessage()); } } // finally, fire events on all models so the gui can update their import lists for (final ModelResource modelResource : eventList) { final ModelResourceEvent event = new ModelResourceEvent(modelResource, ModelResourceEvent.REBUILD_IMPORTS, this); UiPlugin.getDefault().getEventBroker().processEvent(event); } } } @Override public void run() { if (selectedModels != null) { final WorkspaceModifyOperation op = new WorkspaceModifyOperation() { @Override public void execute( final IProgressMonitor theMonitor ) { final String message = XmlImporterUiPlugin.getDefault().getPluginUtil().getString("ReplaceMissingExtensionsAction.TxnMessage"); //$NON-NLS-1$ final boolean started = ModelerCore.startTxn(true, true, message, this); boolean succeeded = false; try { replaceExtension(theMonitor); succeeded = true; } catch (final Exception err) { final String msg = XmlImporterUiPlugin.getDefault().getPluginUtil().getString("ReplaceMissingExtensionsAction.errorMessage"); //$NON-NLS-1$ UiConstants.Util.log(IStatus.ERROR, err, msg); } finally { if (started) { if (succeeded) { ModelerCore.commitTxn(); } else { ModelerCore.rollbackTxn(); } } } theMonitor.done(); } }; try { new ProgressMonitorDialog(Display.getCurrent().getActiveShell()).run(true, true, op); } catch (final InterruptedException e) { } catch (final InvocationTargetException e) { UiConstants.Util.log(e.getTargetException()); } } } /** * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection) */ @Override public void selectionChanged( final IWorkbenchPart part, final ISelection selection ) { selectedModels = SelectionUtilities.getSelectedObjects(selection); boolean enable = true; if (selectedModels.isEmpty()) { enable = false; } else { for (final Iterator iter = selectedModels.iterator(); iter.hasNext();) { final Object obj = iter.next(); if (obj instanceof IFile) { if (!ModelUtilities.isModelFile((IFile)obj)) { enable = false; break; } try { final ModelResource modelResource = ModelUtil.getModelResource((IFile)obj, true); if (modelResource == null || modelResource.isReadOnly()) { enable = false; break; } } catch (final ModelWorkspaceException e) { UiConstants.Util.log(IStatus.ERROR, e, e.getMessage()); } } else { enable = false; break; } } } setEnabled(enable); } }