blob: 240cb914df2616e4756217e13d50056cfc3533c2 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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.export.services;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.epf.common.utils.FileUtil;
import org.eclipse.epf.library.ILibraryResourceManager;
import org.eclipse.epf.library.util.ResourceHelper;
import org.eclipse.epf.uma.CapabilityPattern;
import org.eclipse.epf.uma.DeliveryProcess;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.ProcessComponent;
import org.eclipse.epf.uma.util.UmaUtil;
/**
* Utility class to handle diagram export/import
* @author Weiping Lu
* @since 1.2
*
*/
public class DiagramHandler {
//To do: need to consider element rename issue.
// -> Resovle the involved file names after all resource names are settled.
// -> Let a sub class to take of it?
private File sourceLibRoot;
private File targetLibRoot;
private Map<String, MapEntryValue> elementMap = new HashMap<String, MapEntryValue>();
private static boolean debug = false;
/**
* Creates a new instance.
*/
public DiagramHandler(File sourceLibRoot, File targetLibRoot) {
this.sourceLibRoot = sourceLibRoot;
this.targetLibRoot = targetLibRoot;
}
protected Map<String, MapEntryValue> getElementMap() {
return elementMap;
}
private boolean needToProcess(MethodElement elem) {
boolean b = elem instanceof CapabilityPattern ||
elem instanceof DeliveryProcess;
return b;
}
public void registerElement(MethodElement elem) {
registerElement(elem, false);
}
public void registerElement(MethodElement elem, boolean processEntry) {
if (! needToProcess(elem)) {
return;
}
if (elementMap.containsKey(elem.getGuid())) {
return;
}
MapEntryValue mapEntryValue = new MapEntryValue();
mapEntryValue.element = elem;
elementMap.put(elem.getGuid(), mapEntryValue);
if (processEntry) {
processEntry(elem, mapEntryValue);
}
}
public void postRegisterElements() {
for (Iterator<MapEntryValue> it = elementMap.values().iterator(); it.hasNext();) {
MapEntryValue value = it.next();
processEntry(value.element, value);
}
}
private void processEntry(MethodElement elem, MapEntryValue mapEntryValue) {
File[] files = getFiles(elem);
File sourceFile = files[0];
File targetFile = files[1];
if (sourceFile != null && sourceFile.exists()) {
mapEntryValue.sourceFile = sourceFile;
}
if (targetFile.exists()) {
if (mapEntryValue.sourceFile == null || needCopy(mapEntryValue.sourceFile, targetFile)) {
mapEntryValue.targetFile = targetFile;
}
mapEntryValue.existing = true;
} else {
if (mapEntryValue.sourceFile != null) {
mapEntryValue.targetFile = targetFile;
}
}
if (debug) {
System.out.println("LD> mapEntryValue: "); //$NON-NLS-1$
System.out.println(mapEntryValue.toDebugString("LD> ")); //$NON-NLS-1$
System.out.println(""); //$NON-NLS-1$
}
}
public List getModifiedFiles() {
List ret = new ArrayList();
for (Iterator<MapEntryValue> it = elementMap.values().iterator(); it.hasNext();) {
MapEntryValue value = it.next();
if (value.existing && value.targetFile != null) {
ret.add(value.targetFile.getAbsolutePath());
}
}
return ret;
}
/**
* copy all the files to the destination
*
*/
public void execute() {
try {
execute_();
} catch (Throwable e) {
if (debug) {
e.printStackTrace();
}
}
}
private void execute_() {
for (Iterator<MapEntryValue> it = elementMap.values().iterator(); it.hasNext(); ) {
MapEntryValue value = it.next();
if (value.targetFile == null) {
continue;
} else if (value.sourceFile != null) {
File parentFile = value.targetFile.getParentFile();
FileUtil.copyFile(value.sourceFile, value.targetFile);
if (debug) {
System.out.println("LD: File copied: " + value.sourceFile); //$NON-NLS-1$
}
} else {
value.targetFile.delete();
}
}
}
/**
* Checks to see if the copy action is needed.
*/
public static boolean needCopy(File source, File dest) {
boolean ret = true;
if (dest.exists()) {
ret = (dest.lastModified() != source.lastModified())
|| (dest.length() != source.length());
}
return ret;
}
protected static class MapEntryValue {
public MethodElement element;
public File sourceFile;
public File targetFile;
public boolean existing = false;
public String toDebugString(String prompt) {
String str = prompt + "element: " + element.getName(); //$NON-NLS-1$
str += "\n" + prompt + "sourceFile: " + sourceFile; //$NON-NLS-1$ //$NON-NLS-2$
str += "\n" + prompt + "targetFile: " + targetFile; //$NON-NLS-1$ //$NON-NLS-2$
str += "\n" + prompt + "existing: " + existing; //$NON-NLS-1$ //$NON-NLS-2$
return str;
}
}
protected File[] getFiles(MethodElement elem) {
return getFiles(elem, true);
}
//[0]: sourceFile
//[1]: targetFile
protected File[] getFiles(MethodElement elem, boolean export) {
File[] files = new File[2];
String elementPath = ResourceHelper.getElementPath(elem);
if (debug) {
System.out.println("LD> elementPath: " + elementPath); //$NON-NLS-1$
}
if (elementPath == null || elementPath.length() == 0) {
if (debug) {
System.out.println("LD> elementPath is null or empty!"); //$NON-NLS-1$
}
return files;
}
String diagramPath = elementPath + elem.getName() + File.separator +
"diagram.xmi"; //$NON-NLS-1$
if (debug) {
System.out.println("LD> diagramPath 0: " + diagramPath); //$NON-NLS-1$
}
File srcRoot = sourceLibRoot;
File tgtRoot = targetLibRoot;
if (export) {
srcRoot = getRoot(elem);
} else {
tgtRoot = getRoot(elem);
}
if (export) {
Resource res = elem.eResource();
if (res != null) {
File modelFile = new File(res.getURI().toFileString());
File folder = modelFile.getParentFile();
String folderPath = folder.getAbsolutePath();
int ix = srcRoot.getAbsolutePath().length();
if (folderPath.length() > ix
&& folderPath.substring(0, ix).equalsIgnoreCase(
srcRoot.getAbsolutePath())) {
diagramPath = folderPath.substring(ix + 1) + File.separator
+ "diagram.xmi"; //$NON-NLS-1$
}
}
} else {
ProcessComponent pc = UmaUtil.getProcessComponent(elem);
if (pc != null && ! pc.getName().equals(elem.getName())) {
diagramPath = elementPath + pc.getName() + File.separator
+ "diagram.xmi"; //$NON-NLS-1$
}
}
files[0] = new File(srcRoot, diagramPath);
files[1] = new File(tgtRoot, diagramPath);
return files;
}
public void visitElementMap(int passId) {
}
public File getSourceLibRoot() {
return sourceLibRoot;
}
protected File getRoot(MethodElement elem) {
ILibraryResourceManager libResMgr = ResourceHelper.getResourceMgr(elem);
String pluginPath = libResMgr.getPhysicalPluginPath(elem);
File root = (new File(pluginPath)).getParentFile();
return root;
}
public File getTargetLibRoot() {
return targetLibRoot;
}
}