001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.internal.wizards.datatransfer;
011:
012: import java.io.BufferedInputStream;
013: import java.io.BufferedOutputStream;
014: import java.io.File;
015: import java.io.FileOutputStream;
016: import java.io.IOException;
017: import java.io.InputStream;
018: import java.io.OutputStream;
019:
020: import org.eclipse.core.resources.IContainer;
021: import org.eclipse.core.resources.IFile;
022: import org.eclipse.core.resources.IResource;
023: import org.eclipse.core.runtime.CoreException;
024: import org.eclipse.core.runtime.IPath;
025: import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
026:
027: /**
028: * Helper class for exporting resources to the file system.
029: */
030: public class FileSystemExporter {
031: private static final int DEFAULT_BUFFER_SIZE = 16 * 1024;
032:
033: /**
034: * Creates the specified file system directory at <code>destinationPath</code>.
035: * This creates a new file system directory.
036: *
037: * @param destinationPath location to which files will be written
038: */
039: public void createFolder(IPath destinationPath) {
040: new File(destinationPath.toOSString()).mkdir();
041: }
042:
043: /**
044: * Writes the passed resource to the specified location recursively.
045: *
046: * @param resource the resource to write out to the file system
047: * @param destinationPath location where the resource will be written
048: * @exception CoreException if the operation fails
049: * @exception IOException if an I/O error occurs when writing files
050: */
051: public void write(IResource resource, IPath destinationPath)
052: throws CoreException, IOException {
053: if (resource.getType() == IResource.FILE) {
054: writeFile((IFile) resource, destinationPath);
055: } else {
056: writeChildren((IContainer) resource, destinationPath);
057: }
058: }
059:
060: /**
061: * Exports the passed container's children
062: */
063: protected void writeChildren(IContainer folder,
064: IPath destinationPath) throws CoreException, IOException {
065: if (folder.isAccessible()) {
066: IResource[] children = folder.members();
067: for (int i = 0; i < children.length; i++) {
068: IResource child = children[i];
069: writeResource(child, destinationPath.append(child
070: .getName()));
071: }
072: }
073: }
074:
075: /**
076: * Writes the passed file resource to the specified destination on the local
077: * file system
078: */
079: protected void writeFile(IFile file, IPath destinationPath)
080: throws IOException, CoreException {
081: OutputStream output = null;
082: InputStream contentStream = null;
083:
084: try {
085: contentStream = new BufferedInputStream(file
086: .getContents(false));
087: output = new BufferedOutputStream(new FileOutputStream(
088: destinationPath.toOSString()));
089: // for large files, need to make sure the chunk size can be handled by the VM
090: int available = contentStream.available();
091: available = available <= 0 ? DEFAULT_BUFFER_SIZE
092: : available;
093: int chunkSize = Math.min(DEFAULT_BUFFER_SIZE, available);
094: byte[] readBuffer = new byte[chunkSize];
095: int n = contentStream.read(readBuffer);
096:
097: while (n > 0) {
098: // only write the number of bytes read
099: output.write(readBuffer, 0, n);
100: n = contentStream.read(readBuffer);
101: }
102: } finally {
103: if (contentStream != null) {
104: // wrap in a try-catch to ensure attempt to close output stream
105: try {
106: contentStream.close();
107: } catch (IOException e) {
108: IDEWorkbenchPlugin
109: .log(
110: "Error closing input stream for file: " + file.getLocation(), e); //$NON-NLS-1$
111: }
112: }
113: if (output != null) {
114: // propogate this error to the user
115: output.close();
116: }
117: }
118: }
119:
120: /**
121: * Writes the passed resource to the specified location recursively
122: */
123: protected void writeResource(IResource resource,
124: IPath destinationPath) throws CoreException, IOException {
125: if (resource.getType() == IResource.FILE) {
126: writeFile((IFile) resource, destinationPath);
127: } else {
128: createFolder(destinationPath);
129: writeChildren((IContainer) resource, destinationPath);
130: }
131: }
132: }
|