| /****************************************************************************** |
| * Copyright (c) 2002, 2005 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 API and implementation |
| ****************************************************************************/ |
| |
| package org.eclipse.gmf.runtime.common.ui.util; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.File; |
| import java.io.InputStream; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IResourceStatus; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.OperationCanceledException; |
| import org.eclipse.core.runtime.Path; |
| |
| import org.eclipse.gmf.runtime.common.core.util.Log; |
| import org.eclipse.gmf.runtime.common.core.util.Trace; |
| import org.eclipse.gmf.runtime.common.ui.internal.CommonUIDebugOptions; |
| import org.eclipse.gmf.runtime.common.ui.internal.CommonUIPlugin; |
| import org.eclipse.gmf.runtime.common.ui.internal.CommonUIStatusCodes; |
| |
| /** |
| * This class provides general methods for operating on files. |
| * @author wdiu |
| */ |
| public class FileUtil { |
| /** |
| * Creates a file resource given the file handle and contents. |
| * |
| * @param fileHandle the file handle to create a file resource with |
| * @param contents the initial contents of the new file resource, or |
| * <code>null</code> if none (equivalent to an empty stream) |
| * @param monitor the progress monitor to show visual progress with |
| * @exception CoreException if the operation fails |
| */ |
| static public void createFile( |
| IFile fileHandle, |
| InputStream contents, |
| IProgressMonitor monitor) |
| throws CoreException { |
| if (contents == null) |
| contents = new ByteArrayInputStream(new byte[0]); |
| |
| try { |
| // Create a new file resource in the workspace |
| fileHandle.create(contents, false, monitor); |
| } catch (CoreException e) { |
| // If the file already existed locally, just refresh to get contents |
| if (e.getStatus().getCode() == IResourceStatus.PATH_OCCUPIED) |
| fileHandle.refreshLocal(IResource.DEPTH_ZERO, null); |
| else { |
| Trace.catching(CommonUIPlugin.getDefault(), CommonUIDebugOptions.EXCEPTIONS_CATCHING, CommonUIPlugin.getDefault().getClass(), "createFile", e); //$NON-NLS-1$ |
| Log.error(CommonUIPlugin.getDefault(), CommonUIStatusCodes.SERVICE_FAILURE, "createFile", e); //$NON-NLS-1$ |
| Trace.throwing(CommonUIPlugin.getDefault(), CommonUIDebugOptions.EXCEPTIONS_THROWING, CommonUIPlugin.getDefault().getClass(), "createFile", e); //$NON-NLS-1$ |
| throw e; |
| } |
| } |
| |
| if (monitor.isCanceled()) |
| throw new OperationCanceledException(); |
| } |
| |
| /** |
| * Deletes a file resource given the file handle. |
| * |
| * @param fileHandle the file handle to delete. |
| * @param monitor the progress monitor to show visual progress with |
| * @exception CoreException if the operation fails |
| */ |
| static public void deleteFile(IFile fileHandle, IProgressMonitor monitor) |
| throws CoreException { |
| try { |
| // Delete a file resource in the workspace |
| fileHandle.delete(true, monitor); |
| } catch (CoreException e) { |
| Trace.catching(CommonUIPlugin.getDefault(), CommonUIDebugOptions.EXCEPTIONS_CATCHING, CommonUIPlugin.getDefault().getClass(), "createFile", e); //$NON-NLS-1$ |
| Log.error(CommonUIPlugin.getDefault(), CommonUIStatusCodes.SERVICE_FAILURE, "createFile", e); //$NON-NLS-1$ |
| Trace.throwing(CommonUIPlugin.getDefault(), CommonUIDebugOptions.EXCEPTIONS_THROWING, CommonUIPlugin.getDefault().getClass(), "createFile", e); //$NON-NLS-1$ |
| throw e; |
| } |
| |
| if (monitor.isCanceled()) |
| throw new OperationCanceledException(); |
| } |
| |
| private static final String RELATIVE_STR = ".."; //$NON-NLS-1$ |
| |
| /** |
| * Build the relative path according to the url path and model path |
| * |
| * @param urlPathstr |
| * the url path, make sure the url is a file path, otherwise do |
| * not change. |
| * @param modelPathstr |
| * the model's path |
| * @return the relative path |
| */ |
| public static String getRelativePath(String urlPathstr, String modelPathstr) { |
| StringBuffer res = new StringBuffer(); |
| IPath urlPath = new Path(urlPathstr); |
| IPath modelPath = new Path(modelPathstr); |
| if (urlPathstr.indexOf("://") > 0) { //$NON-NLS-1$ |
| return urlPathstr; |
| } |
| int matchingSegments = urlPath.matchingFirstSegments(modelPath); |
| int backSegments = modelPath.segmentCount() - matchingSegments - 1; |
| while (backSegments > 0) { |
| res.append(RELATIVE_STR); |
| res.append(File.separatorChar); |
| backSegments--; |
| } |
| int segCount = urlPath.segmentCount(); |
| for (int i = matchingSegments; i < segCount; i++) { |
| if (i > matchingSegments) { |
| res.append(File.separatorChar); |
| } |
| res.append(urlPath.segment(i)); |
| } |
| return res.toString(); |
| } |
| |
| |
| /** |
| * make the absolute path from relative url path and base model path |
| * |
| * @param strurlPath |
| * the URL Path String |
| * @param strmodelPath |
| * the absolute Model Path |
| * @return the relative path String |
| */ |
| public static String getAbsolutePath(String strurlPath, String strmodelPath) { |
| IPath urlPath = new Path(strurlPath); |
| |
| // RATLC00535293 - if the file path is already absolute, just return it |
| if (urlPath.isAbsolute()) |
| return strurlPath; |
| |
| IPath modelPath = new Path(strmodelPath); |
| int rel_level = 0; |
| for (int i = 0; i < urlPath.segmentCount(); i++) { |
| if (urlPath.segment(i).equals(RELATIVE_STR)) { |
| rel_level++; |
| } |
| } |
| urlPath = urlPath.removeFirstSegments(rel_level); |
| modelPath = modelPath.removeLastSegments(rel_level + 1); |
| urlPath = modelPath.append(urlPath); |
| return urlPath.toOSString(); |
| } |
| } |