/* * 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.Collections; import java.util.Iterator; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; 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.EObject; import org.eclipse.xsd.XSDAnnotation; import org.eclipse.xsd.XSDNamedComponent; import org.eclipse.xsd.util.XSDResourceImpl; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.metamodel.aspect.AspectManager; import org.teiid.designer.core.metamodel.aspect.ImportsAspect; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.core.workspace.ModelWorkspaceException; import org.teiid.designer.core.workspace.WorkspaceResourceFinderUtil; /** * OrganizeImportCommandHelperXsd * @since 8.0 */ public class OrganizeImportCommandHelperXsd extends OrganizeImportCommandHelper{ protected OrganizeImportCommandHelperXsd() { super(); } /** * @see org.teiid.designer.core.refactor.ModelRefactorCommand#execute(org.eclipse.core.runtime.IProgressMonitor) */ @Override protected IStatus execute( final IProgressMonitor monitor) { return process(monitor); } /** * * @return Iterator * @since 4.3 */ private Iterator getResourceSchemaContents() { if( ((XSDResourceImpl)this.getResource()).getSchema() != null ) { return ((XSDResourceImpl)this.getResource()).getSchema().getContents().iterator(); } return Collections.EMPTY_LIST.iterator(); } /** * * @param monitor * @return IStatus * @since 4.3 */ private IStatus process(IProgressMonitor monitor) { // Get all the content for (Iterator iter = getResourceSchemaContents(); iter.hasNext();) { // For each of the EObjects, get the import Aspect EObject eobject = (EObject) iter.next(); // Skip annotations if (eobject instanceof XSDAnnotation) { continue; } // Break if named component found since all imports, includes, and redefines must appear before these if (eobject instanceof XSDNamedComponent) { break; } ImportsAspect importsAspect = AspectManager.getModelImportsAspect(eobject); if (importsAspect != null) { // If imports Aspect is not null, get the import path // MyDefect : Refactored for defect 17255 IPath importPath = this.getHelper().findPath(eobject, importsAspect); // MyDefect : 16368 updated and added new code. if(importPath != null) { ModelResource oldResource = ModelerCore.getModelWorkspace().findModelResource(importPath); if(oldResource != null) { try { oldResource.unload(); oldResource.close(); // create a new model resource for the resource at the new path IFile newIFile = createAndSaveResource(monitor, importPath); if (newIFile != null) { importsAspect.setModelLocation(eobject, URI.createFileURI(newIFile.getLocation().toFile().getAbsolutePath())); //importsAspect.setModelPath(eobject, importPath); } this.getResource().setModified(true); } catch (ModelWorkspaceException e) { final Object[] params = new Object[]{this.getResource().getURI(),e.getLocalizedMessage()}; final String msg = ModelerCore.Util.getString("OrganizeImportCommand.Error_while_organizing_imports",params); //$NON-NLS-1$ return new Status(IStatus.ERROR, PID, ERROR_ORGANIZING_IMPORTS, msg, e); } } } } } // Return the result with sucess return new Status(IStatus.OK,PLUGINID,EXECUTE_WITH_NO_PROBLEMS,ModelerCore.Util.getString("OrganizeImportCommand.complete"),null); //$NON-NLS-1$ } /** * * @param monitor * @param importPath * @throws ModelWorkspaceException * @since 4.3 */ private IFile createAndSaveResource(IProgressMonitor monitor, IPath importPath) throws ModelWorkspaceException { // Create a new model resource for the resource at the new path IFile tmpFile = (IFile) WorkspaceResourceFinderUtil.findIResourceByPath(importPath); if (tmpFile != null) { ModelResource newResource = ModelerCore.create(tmpFile); newResource.save(monitor, true); } return tmpFile; } }