//------------------------------------------------------------------------------ // Copyright (c) 2005, 2006 IBM Corporation and others. // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // which accompanies this distribution, and is available at // http://www.eclipse.org/legal/epl-v10.html // // Contributors: // IBM Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.library.util; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.text.MessageFormat; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.epf.common.utils.FileUtil; import org.eclipse.epf.library.ILibraryManager; import org.eclipse.epf.library.LibraryResources; import org.eclipse.epf.library.LibraryService; import org.eclipse.epf.persistence.MultiFileSaveUtil; import org.eclipse.epf.persistence.util.PersistenceUtil; import org.eclipse.epf.resourcemanager.ResourceManager; import org.eclipse.epf.uma.Process; import org.eclipse.epf.uma.ProcessComponent; import org.eclipse.epf.uma.Task; import org.eclipse.epf.uma.TaskDescriptor; import org.xml.sax.SAXException; /** * utility class to handle element replace or renaming for import/export * * @author ??? * @since 1.0 * */ public class ImportExportUtil { /** * * @param procComp * @param dir * @throws IOException * @throws ParserConfigurationException * @throws FactoryConfigurationError * @throws SAXException */ public static void replace(ProcessComponent procComp, String dir) throws IOException, ParserConfigurationException, FactoryConfigurationError, SAXException { File newProcCompFile = new File(dir, MultiFileSaveUtil.DEFAULT_MODEL_FILENAME); if (!newProcCompFile.exists()) { throw new FileNotFoundException( MessageFormat .format( LibraryResources.ImportExportUtil_MSG8, new Object[] { newProcCompFile })); } String oldModelFileStr = procComp.eResource().getURI().toFileString(); String oldProcCompDir = new File(oldModelFileStr).getParent(); String suffix = MultiFileSaveUtil.getBackupFileSuffix(); File tempDir = null; try { // copy dir a temp dir inside the target dir // tempDir = new File(oldProcCompDir, suffix); if (!tempDir.mkdir()) { throw new IOException( MessageFormat .format( LibraryResources.ImportExportUtil_MSG9, new Object[] { tempDir })); } FileUtil.copyDir(new File(dir), tempDir); newProcCompFile = new File(tempDir, MultiFileSaveUtil.DEFAULT_MODEL_FILENAME); // load the new model.xmi // ResourceSet resourceSet = procComp .eResource().getResourceSet(); Resource newResource = resourceSet.getResource(URI .createFileURI(newProcCompFile.getAbsolutePath()), true); // fix configuration references // ProcessComponent newProcComp = (ProcessComponent) PersistenceUtil .getMethodElement(newResource); Process newProc = newProcComp.getProcess(); newProc .setDefaultContext(procComp.getProcess() .getDefaultContext()); newProc.getValidContext().clear(); newProc.getValidContext().addAll( procComp.getProcess().getValidContext()); // fix all steps // for (Iterator iter = newProcComp.eAllContents(); iter.hasNext();) { Object element = iter.next(); if (element instanceof TaskDescriptor) { TaskDescriptor taskDesc = (TaskDescriptor) element; Task task = taskDesc.getTask(); String taskName = task == null ? "NONE" : "'" + task.getName() + "'"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ System.out.println("Task: " + taskName); //$NON-NLS-1$ if (task != null) { taskDesc.getSelectedSteps().clear(); taskDesc.getSelectedSteps().addAll(task.getSteps()); } } } // replace GUID of new ProcessComponent and its ResourceManager with // old ones // // // read the model.xmi file // DocumentBuilder builder = // DocumentBuilderFactory.newInstance().newDocumentBuilder(); // Document doc = builder.parse(newProcCompFile); // set GUID of new ResourceManager to old GUID ResourceManager resMgr = MultiFileSaveUtil .getResourceManager(procComp.eResource()); if (resMgr != null) { MultiFileSaveUtil.getResourceManager(newResource).setGuid( resMgr.getGuid()); } // NodeList list = // doc.getElementsByTagName("org.eclipse.epf.uma.resourcemanager:ResourceManager"); // Element e = (Element) list.item(0); // e.setAttribute("xmi:id", guid); // e.setAttribute("guid", guid); // set GUID of new ProcessComponent to old GUID newProcComp.setGuid(procComp.getGuid()); // guid = procComp.getGuid(); // list = // doc.getElementsByTagName("org.eclipse.epf.uma:ProcessComponent"); // e = (Element) list.item(0); // e.setAttribute("xmi:id", guid); // e.setAttribute("guid", guid); // save the new model.xmi ILibraryManager manager = LibraryService.getInstance() .getCurrentLibraryManager(); Map saveOptions = manager != null ? manager.getSaveOptions() : new HashMap(); newResource.save(saveOptions); // back up old model.xmi File file = new File(oldModelFileStr); FileUtil.moveFile(file, new File(oldModelFileStr + ".bak" + suffix)); //$NON-NLS-1$ FileUtil.moveFile(newProcCompFile, new File(oldModelFileStr)); // XMLUtil.saveDocument(doc, oldModelFileStr); File newContentFile = new File(tempDir, MultiFileSaveUtil.DEFAULT_CONTENT_FILENAME); // back up old content.xmi String contentFileStr = oldProcCompDir + File.separator + MultiFileSaveUtil.DEFAULT_CONTENT_FILENAME; File oldContentFile = new File(contentFileStr); FileUtil.moveFile(oldContentFile, new File(contentFileStr + ".bak" + suffix)); //$NON-NLS-1$ // copy new content.xmi if (newContentFile.exists()) { FileUtil.moveFile(newContentFile, oldContentFile); } } finally { if (tempDir != null) { FileUtil.deleteAllFiles(tempDir.getAbsolutePath()); tempDir.delete(); } } } }