blob: fef8ba1b057bdc7caecbe3624b8e29bff14a9db5 [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.export.xml.services;
import java.io.File;
import java.io.IOException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.epf.common.utils.FileUtil;
import org.eclipse.epf.common.utils.NetUtil;
import org.eclipse.epf.dataexchange.util.BaseResourceHandler;
import org.eclipse.epf.dataexchange.util.UrlInfo;
import org.eclipse.epf.library.ILibraryManager;
import org.eclipse.epf.library.ILibraryResourceManager;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.util.ResourceHelper;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.epf.uma.util.UmaUtil;
/**
* The resource handler for content in the exported library.
*
* @author Jinhua Xi
* @since 1.0
*/
public class ExportResourceHandler extends BaseResourceHandler {
private static boolean localDebug = false;
/**
* Creates a new instance.
*/
public ExportResourceHandler(File sourceLibRoot, File targetLibRoot) {
super(sourceLibRoot, targetLibRoot);
}
/**
* resolve the url. For XML export, we should reserve the resource locations.
*/
public UrlInfo resolveFileUrl(Object owner, String srcUrl) throws Exception {
return loadUrlInfoWithFixedPath(owner, srcUrl);
}
/**
* the resource path will be relative to the libary root. urls needs to be
* fixed
*
* @param owner
* the owner object in the target library
* @param srcUrl
* @return
*/
private UrlInfo loadUrlInfoWithFixedPath(Object owner, String srcUrl) {
UrlInfo info = new UrlInfo();
info.sourceUrl = srcUrl;
info.targetUrl = srcUrl;
String srcFile = getFileRelPath(owner, srcUrl);
org.eclipse.epf.xml.uma.MethodElement ownerElem = null;
if (owner instanceof org.eclipse.epf.xml.uma.MethodElement) {
ownerElem = (org.eclipse.epf.xml.uma.MethodElement) owner;
}
if (srcFile != null && ownerElem != null) {
MethodPlugin srcPlugin = getSourcePlugin(ownerElem);
ILibraryResourceManager libResMgr = ResourceHelper.getResourceMgr(srcPlugin);
String srcPluginPath = libResMgr.getPhysicalPluginPath(srcPlugin);
File srcRoot = (new File(srcPluginPath)).getParentFile();
info.sourceFile = new File(srcRoot, srcFile);
if (!info.sourceFile.isFile() || !info.sourceFile.exists()) {
String newSrcFile = null;
try {
newSrcFile = NetUtil.decodeURL(srcFile);
} catch (Exception e) {
e.printStackTrace();
}
if (newSrcFile != null) {
srcFile = newSrcFile;
info.sourceFile = new File(srcRoot, srcFile);
}
}
info.targetFile = new File(targetLibRoot, srcFile);
info.targetUrl = srcFile.replace(File.separatorChar, '/');
}
return info;
}
protected static MethodPlugin getSourcePlugin(org.eclipse.epf.xml.uma.MethodElement ownerElem) {
ILibraryManager manager = LibraryService.getInstance()
.getCurrentLibraryManager();
if (manager == null) {
throw new UnsupportedOperationException();
}
MethodElement element = manager.getMethodElement(ownerElem.getId());
if (element == null) {
throw new UnsupportedOperationException();
}
MethodPlugin plugin = UmaUtil.getMethodPlugin(element);
if (plugin == null) {
throw new UnsupportedOperationException();
}
return plugin;
}
private String getFileRelPath(Object owner, String srcUrl) {
try {
if (owner instanceof org.eclipse.epf.xml.uma.MethodElement) {
String id = ((org.eclipse.epf.xml.uma.MethodElement) owner)
.getId();
ILibraryManager manager = LibraryService.getInstance()
.getCurrentLibraryManager();
if (manager != null) {
MethodElement element = manager.getMethodElement(id);
if (element != null) {
ILibraryResourceManager libResMgr = ResourceHelper.getResourceMgr(element);
if (libResMgr != null) {
String elementPath = ResourceHelper.getFolderAbsolutePath(element);
String pluginPath = libResMgr.getPhysicalPluginPath(element);
File pluginParent = (new File(pluginPath)).getParentFile();
File file = new File(elementPath, srcUrl);
String filePath = file.getCanonicalPath();
String retPath = filePath.substring(pluginParent.getCanonicalPath().length() + 1);
if (localDebug) {
File f = new File(new File(sourceLibRoot,
ResourceHelper.getElementPath(element)), srcUrl);
String path = f.getCanonicalPath();
String oldPath = path.substring(sourceLibRoot.getCanonicalPath()
.length() + 1);
if (! oldPath.equals(retPath)) {
System.out.println("LD> oldPath: " + oldPath); //$NON-NLS-1
System.out.println("LD> retPath: " + retPath); //$NON-NLS-1
System.out.println(""); //$NON-NLS-1
}
}
return retPath;
}
File f = new File(new File(sourceLibRoot,
ResourceHelper.getElementPath(element)), srcUrl);
String path = f.getCanonicalPath();
return path.substring(sourceLibRoot.getCanonicalPath()
.length() + 1);
}
}
}
} catch (IOException e) {
// Log error here
}
return null;
}
/**
* copying the resource file from the source library to the target
*
* @param sourceFile the file path relative to the source root
*/
public void copyResource(String sourceFile, EObject obj, org.eclipse.epf.uma.MethodPlugin umaPlugin) {
ILibraryResourceManager libResMgr = ResourceHelper.getResourceMgr(umaPlugin);
String srcPluginPath = libResMgr.getPhysicalPluginPath(umaPlugin);
File srcPluginRoot = new File(srcPluginPath);
File src = new File(srcPluginRoot.getParentFile(), sourceFile);
if ( ! src.exists() ) {
sourceFile = NetUtil.decodedFileUrl(sourceFile);
src = new File(srcPluginRoot.getParentFile(), sourceFile);
if (! src.exists()) {
try {
sourceFile = NetUtil.decodeURL(sourceFile);
src = new File(srcPluginRoot.getParentFile(), sourceFile);
} catch (Exception e) {
}
}
}
if ( src.exists() ) {
File tgt = new File(targetLibRoot, sourceFile);
FileUtil.copyFile(src, tgt);
}
}
// /**
// * the resource path will be relative to the owner element. urls will not be
// * changed but resource files is relicated.
// *
// * @param owner
// * @param srcUrl
// * @return
// */
// private UrlInfo loadUrlInfoWithRelativePath(Object owner, String srcUrl) {
// UrlInfo info = new UrlInfo();
//
// try {
// info.sourceUrl = srcUrl;
// info.targetUrl = srcUrl; // no url change
//
// // get the rmc object
// if (owner instanceof org.eclipse.epf.xml.uma.MethodElement) {
// String id = ((org.eclipse.epf.xml.uma.MethodElement) owner)
// .getId();
// ILibraryManager manager = LibraryService.getInstance()
// .getCurrentLibraryManager();
// if (manager != null) {
// MethodElement element = manager.getMethodElement(id);
// if (element != null) {
// File f = new File(new File(sourceLibRoot,
// ResourceHelper.getElementPath(element)), srcUrl);
// f = f.getCanonicalFile();
//
// info.sourceFile = f;
// }
// }
// }
//
// info.targetFile = new File(targetLibRoot, srcUrl)
// .getCanonicalFile();
//
// } catch (IOException e) {
// // log error TODO
// }
// return info;
// }
}