blob: 3c389f90bb97d02b7ef0344b12e4f460c9f6f862 [file] [log] [blame]
//------------------------------------------------------------------------------
// 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();
}
}
}
}