/* * 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.core.refactor; import java.util.Collection; import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xsd.util.XSDResourceImpl; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.index.IndexConstants; import org.teiid.designer.core.resource.EmfResource; import org.teiid.designer.core.workspace.ModelUtil; import org.teiid.designer.core.workspace.WorkspaceResourceFinderUtil; import org.teiid.designer.metamodels.core.CoreFactory; import org.teiid.designer.metamodels.core.ModelAnnotation; /** * OrganizeImportCommand * * @since 8.0 */ public class OrganizeImportCommand implements ModelRefactorCommand { private OrganizeImportCommandHelper organizeImportCommandHelper; private CoreFactory factory; private Resource resource; private OrganizeImportHandler handler; private Collection<PathPair> paths; private final Object factoryLock = new Object(); /** * @since 4.3 */ public OrganizeImportCommand() { // for test only resetOrganizeImportHelper(); } /** * @param resource * @since 4.3 */ public void setResource( final Resource resource ) { this.resource = resource; } /** * @return Resource * @since 4.3 */ public Resource getResource() { return resource; } /** * Set the {@link OrganizeImportHandler handler} that should be used to post questions when organizing imports. Example of * questions include choosing between ambiguous resources. * * @param handler the handler */ public void setHandler( final OrganizeImportHandler handler ) { this.handler = handler; } /** * Return the {@link OrganizeImportHandler handler} that is used to post questions when organizing imports. Example of * questions include choosing between ambiguous resources. * * @return the handler */ public OrganizeImportHandler getHandler() { return handler; } /** * Return the factory that should be used. * * @return the factory; never null */ public CoreFactory getFactory() { // return organizeImportCommandHelper.getFactory(); if (this.factory == null) { synchronized (this.factoryLock) { if (this.factory == null) { this.factory = CoreFactory.eINSTANCE; } } } return this.factory; } /** * Set the CoreFactory instance that should be used. * * @param factory the factory that should be used; null signals that the default {@link CoreFactory#eINSTANCE CoreFactory * instance} should be used. */ public void setFactory( final CoreFactory factory ) { this.factory = factory; } /** * @return Returns the includeDiagramReferences. * @since 4.2 */ public boolean isIncludeDiagramReferences() { return organizeImportCommandHelper.isIncludeDiagramReferences(); } /** * @param includeDiagramReferences The includeDiagramReferences to set. * @since 4.2 */ public void setIncludeDiagramReferences( boolean includeDiagramReferences ) { organizeImportCommandHelper.setIncludeDiagramReferences(includeDiagramReferences); } /** * @see org.teiid.designer.core.refactor.ModelRefactorCommand#canExecute() * @since 4.3 */ @Override public IStatus canExecute() { if (this.resource == null) { final String msg = ModelerCore.Util.getString("OrganizeImportCommand.Organizing_imports_must_be_performed_on_a_Resource"); //$NON-NLS-1$ final IStatus status = new Status(IStatus.ERROR, OrganizeImportCommandHelper.PID, OrganizeImportCommandHelper.ERROR_MISSING_RESOURCE, msg, null); return status; } IResource iResource = WorkspaceResourceFinderUtil.findIResource(this.resource); if (iResource != null && ModelUtil.isIResourceReadOnly(iResource)) { final String msg = ModelerCore.Util.getString("OrganizeImportCommand.0", iResource.getFullPath()); //$NON-NLS-1$ final IStatus status = new Status(IStatus.ERROR, OrganizeImportCommandHelper.PID, OrganizeImportCommandHelper.ERROR_MISSING_RESOURCE, msg, null); return status; } final String msg = ModelerCore.Util.getString("OrganizeImportCommand.Ready_to_organize_import", new Object[] {this.resource.getURI()}); //$NON-NLS-1$ return new Status(IStatus.OK, OrganizeImportCommandHelper.PID, OrganizeImportCommandHelper.CAN_EXECUTE, msg, null); } /** * @see org.teiid.designer.core.refactor.ModelRefactorCommand#execute(org.eclipse.core.runtime.IProgressMonitor) * @since 4.3 */ @Override public IStatus execute( final IProgressMonitor monitor ) { resetOrganizeImportHelper(); return organizeImportCommandHelper.execute(monitor); } /** * @return List * @since 4.3 */ public List getModelImports() { return organizeImportCommandHelper.getModelImports(); } /* (non-Javadoc) * @See org.teiid.designer.core.refactor.ModelRefactorCommand#canUndo() */ @Override public boolean canUndo() { return false; } /* (non-Javadoc) * @See org.teiid.designer.core.refactor.ModelRefactorCommand#getAffectedObjects() */ @Override public Collection getAffectedObjects() { return null; } /* (non-Javadoc) * @See org.teiid.designer.core.refactor.ModelRefactorCommand#getDescription() */ @Override public String getDescription() { return null; } /* (non-Javadoc) * @See org.teiid.designer.core.refactor.ModelRefactorCommand#getLabel() */ @Override public String getLabel() { return null; } /* (non-Javadoc) * @See org.teiid.designer.core.refactor.ModelRefactorCommand#getPostExecuteMessages() */ @Override public Collection getPostExecuteMessages() { return null; } /* (non-Javadoc) * @See org.teiid.designer.core.refactor.ModelRefactorCommand#getResult() */ @Override public Collection getResult() { return null; } /* (non-Javadoc) * @See org.teiid.designer.core.refactor.ModelRefactorCommand#redo() */ @Override public void redo() { } /* (non-Javadoc) * @See org.teiid.designer.core.refactor.ModelRefactorCommand#undo() */ @Override public void undo() { } /* (non-Javadoc) * @See org.teiid.designer.core.refactor.ModelRefactorCommand#canRedo() */ @Override public boolean canRedo() { return false; } /** * @param paths * @since 4.3 */ protected void setRefactoredPaths(Collection<PathPair> paths ) { this.paths = paths; } /** * Return the pattern match string that could be used to match a UUID in an index record. All index records contain a header * portion of the form: recordType|pathInModel|UUID|nameInSource|parentObjectID| * * @param name The UUID for whichthe pattern match string is to be constructed. * @return The pattern match string of the form: recordType|*|uuid|* */ protected String getUUIDMatchPattern( final char recordType, final String uuid ) { CoreArgCheck.isNotNull(uuid); // construct the pattern string String patternStr = null; if (IndexConstants.RECORD_TYPE.DATATYPE == recordType) { patternStr = "" //$NON-NLS-1$ + recordType + IndexConstants.RECORD_STRING.RECORD_DELIMITER + IndexConstants.RECORD_STRING.MATCH_CHAR + IndexConstants.RECORD_STRING.RECORD_DELIMITER + IndexConstants.RECORD_STRING.MATCH_CHAR + IndexConstants.RECORD_STRING.RECORD_DELIMITER + IndexConstants.RECORD_STRING.MATCH_CHAR + IndexConstants.RECORD_STRING.RECORD_DELIMITER + uuid + IndexConstants.RECORD_STRING.RECORD_DELIMITER + IndexConstants.RECORD_STRING.MATCH_CHAR; } else { patternStr = "" //$NON-NLS-1$ + recordType + IndexConstants.RECORD_STRING.RECORD_DELIMITER + IndexConstants.RECORD_STRING.MATCH_CHAR + IndexConstants.RECORD_STRING.RECORD_DELIMITER + uuid + IndexConstants.RECORD_STRING.RECORD_DELIMITER + IndexConstants.RECORD_STRING.MATCH_CHAR; } return patternStr; } /** * @param resource * @return * @since 4.3 */ protected ModelAnnotation getModelAnnotation( final Resource resource ) { if (resource instanceof EmfResource) { final EmfResource emfResource = (EmfResource)resource; return emfResource.getModelAnnotation(); } return null; } /** * @param resourceUri * @return * @since 4.3 */ protected String getModelName( final URI resourceUri ) { final String modelNameWithExt = resourceUri.lastSegment(); final String extension = resourceUri.fileExtension(); if (extension != null) { final int index = modelNameWithExt.indexOf(extension); if (index > 1) { return modelNameWithExt.substring(0, index - 1); // also remove the "." } } return modelNameWithExt; } /** * @return OrganizeImportCommandHelper * @since 4.3 */ private void resetOrganizeImportHelper() { // Only reset the helper if the resource type changes if (this.resource instanceof XSDResourceImpl) { if (organizeImportCommandHelper == null || !(organizeImportCommandHelper instanceof OrganizeImportCommandHelperXsd)) { organizeImportCommandHelper = new OrganizeImportCommandHelperXsd(); } } else { if (organizeImportCommandHelper == null || !(organizeImportCommandHelper instanceof OrganizeImportCommandHelperNonXsd)) { organizeImportCommandHelper = new OrganizeImportCommandHelperNonXsd(); } } organizeImportCommandHelper.setResource(resource); organizeImportCommandHelper.setHandler(handler); organizeImportCommandHelper.setFactory(factory); organizeImportCommandHelper.setRefactoredPaths(paths); } }