| /******************************************************************************* |
| * Copyright (c) 2010 BSI Business Systems Integration AG. |
| * 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: |
| * BSI Business Systems Integration AG - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.scout.sdk.util.resources; |
| |
| import java.awt.Desktop; |
| import java.io.BufferedInputStream; |
| import java.io.BufferedOutputStream; |
| import java.io.BufferedReader; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.FileOutputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.InputStreamReader; |
| import java.io.OutputStream; |
| import java.net.URI; |
| import java.util.LinkedList; |
| import java.util.List; |
| import java.util.zip.ZipEntry; |
| import java.util.zip.ZipInputStream; |
| import java.util.zip.ZipOutputStream; |
| |
| import org.eclipse.core.resources.IContainer; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IFolder; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IResourceProxy; |
| import org.eclipse.core.resources.IResourceProxyVisitor; |
| import org.eclipse.core.resources.ProjectScope; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.core.runtime.preferences.IScopeContext; |
| import org.eclipse.jdt.core.IOpenable; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.internal.core.util.Util; |
| import org.eclipse.jface.text.Document; |
| import org.eclipse.osgi.service.datalocation.Location; |
| import org.eclipse.scout.commons.FileUtility; |
| import org.eclipse.scout.commons.IOUtility; |
| import org.eclipse.scout.sdk.util.internal.SdkUtilActivator; |
| import org.eclipse.scout.sdk.util.log.ScoutStatus; |
| |
| /** |
| * <h3>{@link ResourceUtility}</h3> ... |
| * |
| * @author Andreas Hoegger |
| * @since 3.8.0 14.03.2012 |
| */ |
| @SuppressWarnings("restriction") |
| public final class ResourceUtility { |
| |
| public final static int BUF_SIZE = 8192; |
| |
| private ResourceUtility() { |
| } |
| |
| public static IResource[] getAllResources(IResourceFilter filter) throws CoreException { |
| return getAllResources(ResourcesPlugin.getWorkspace().getRoot(), filter); |
| } |
| |
| public static IResource[] getAllResources(IResource startResource, final IResourceFilter filter) throws CoreException { |
| final List<IResource> collector = new LinkedList<IResource>(); |
| startResource.accept(new IResourceProxyVisitor() { |
| @Override |
| public boolean visit(IResourceProxy proxy) throws CoreException { |
| if (proxy.isAccessible()) { |
| if (filter.accept(proxy)) { |
| collector.add(proxy.requestResource()); |
| } |
| return true; |
| } |
| return false; |
| } |
| }, IResource.NONE); |
| |
| return collector.toArray(new IResource[collector.size()]); |
| } |
| |
| /** |
| * Tries to open the given url in the system default browser. |
| * |
| * @param url |
| * the url to show |
| */ |
| public static void showUrlInBrowser(String url) { |
| try { |
| if (Desktop.isDesktopSupported()) { |
| Desktop d = Desktop.getDesktop(); |
| if (d.isSupported(Desktop.Action.BROWSE)) { |
| d.browse(new URI(url)); |
| } |
| } |
| } |
| catch (Throwable e) { |
| SdkUtilActivator.logWarning("Could not open web browser. ", e); |
| } |
| } |
| |
| public static boolean exists(IResource resource) { |
| return resource != null && resource.exists(); |
| } |
| |
| /** |
| * Builds a Path containing the given elements. |
| * |
| * @param segments |
| * @return |
| */ |
| public static IPath toPath(String... segments) { |
| IPath path = null; |
| if (segments != null) { |
| if (segments.length > 0) { |
| path = new Path(segments[0]); |
| for (int i = 1; i < segments.length; i++) { |
| path = path.append(new Path(segments[i])); |
| } |
| } |
| } |
| return path; |
| } |
| |
| /** |
| * Returns this document's default line delimiter. |
| * <p> |
| * This default line delimiter should be used by clients who want unique delimiters (e.g. 'CR's) in the document. |
| * </p> |
| * |
| * @return the default line delimiter or <code>null</code> if none. |
| */ |
| public static String getLineSeparator(Document doc) { |
| if (doc != null) { |
| String delim = doc.getDefaultLineDelimiter(); |
| if (delim != null) { |
| return delim; |
| } |
| } |
| return getLineSeparator(); |
| } |
| |
| /** |
| * Gets the content of the given file as string. |
| * |
| * @param f |
| * the file to get the content from |
| * @return a string containing the content of the given file |
| */ |
| public static String getContent(IFile f) throws CoreException { |
| BufferedReader reader = null; |
| try { |
| reader = new BufferedReader(new InputStreamReader(f.getContents())); |
| StringBuilder sb = new StringBuilder(); |
| String line = null; |
| String nl = getLineSeparator(f); |
| while ((line = reader.readLine()) != null) { |
| sb.append(line); |
| sb.append(nl); |
| } |
| return sb.toString(); |
| } |
| catch (IOException e) { |
| throw new CoreException(new ScoutStatus(e)); |
| } |
| finally { |
| if (reader != null) { |
| try { |
| reader.close(); |
| } |
| catch (IOException e) { |
| //nop |
| } |
| } |
| } |
| } |
| |
| /** |
| * gets the install location of the running eclipse. |
| * |
| * @return the location or null if no location could be found. |
| */ |
| public static File getEclipseInstallLocation() { |
| Location l = Platform.getInstallLocation(); |
| File ret = null; |
| if (l != null) { |
| ret = new File(l.getURL().getPath()); |
| } |
| return ret; |
| } |
| |
| /** |
| * Adds all files below the given baseDir into the zip stream. |
| * |
| * @param baseDir |
| * The base dir. All files (recursively) in this folder will be added to the zip. |
| * @param zOut |
| * The zip where the files will be added. |
| * @throws IOException |
| */ |
| public static void addFolderToZip(File baseDir, ZipOutputStream zOut) throws IOException { |
| addFolderToZipRec(baseDir, baseDir, zOut); |
| } |
| |
| private static void addFolderToZipRec(File baseDir, File file, ZipOutputStream zOut) throws IOException { |
| if ((!file.exists()) || (!file.isDirectory())) { |
| throw new IOException("source directory " + file + " does not exist or is not a folder"); |
| } |
| for (File f : file.listFiles()) { |
| if (f.exists() && (!f.isHidden())) { |
| if (f.isDirectory()) { |
| addFolderToZipRec(baseDir, f, zOut); |
| } |
| else { |
| String name = f.getAbsolutePath(); |
| String prefix = baseDir.getAbsolutePath(); |
| if (prefix.endsWith("/") || prefix.endsWith("\\")) { |
| prefix = prefix.substring(0, prefix.length() - 1); |
| } |
| name = name.substring(prefix.length() + 1); |
| name = name.replace('\\', '/'); |
| |
| zOut.putNextEntry(new ZipEntry(name)); |
| copy(f, zOut); |
| zOut.closeEntry(); |
| } |
| } |
| } |
| } |
| |
| /** |
| * returns the line separator defined in preference {@link org.eclipse.core.runtime.Platform#PREF_LINE_SEPARATOR} on |
| * the workspace. |
| * If this is null, returns the system line separator. |
| * |
| * @return The line separator to use. |
| */ |
| public static String getLineSeparator() { |
| return Util.getLineSeparator(null, null); |
| } |
| |
| /** |
| * returns the line separator defined in preference {@link org.eclipse.core.runtime.Platform#PREF_LINE_SEPARATOR} on |
| * the project or workspace of the given resource. |
| * If this is null, returns the platform separator. |
| * |
| * @return The line separator to use. |
| */ |
| public static String getLineSeparator(IResource r) { |
| if (r != null) { |
| IScopeContext[] scopeContext = new IScopeContext[]{new ProjectScope(r.getProject())}; |
| String lineSeparator = Platform.getPreferencesService().getString(Platform.PI_RUNTIME, Platform.PREF_LINE_SEPARATOR, null, scopeContext); |
| if (lineSeparator != null) return lineSeparator; |
| } |
| return getLineSeparator(); |
| } |
| |
| /** |
| * Finds and returns the recommended line separator for this element. |
| * The element's buffer is first searched and the first line separator in this buffer is returned if any. |
| * Otherwise the preference {@link org.eclipse.core.runtime.Platform#PREF_LINE_SEPARATOR} on this element's project or |
| * workspace is returned. |
| * Finally if no such preference is set, the system line separator is returned. |
| * |
| * @return the recommended line separator for this element |
| */ |
| public static String getLineSeparator(IOpenable o) { |
| try { |
| return o.findRecommendedLineSeparator(); |
| } |
| catch (JavaModelException e) { |
| return getLineSeparator(); |
| } |
| } |
| |
| /** |
| * copies all data from the given file to the output stream |
| * |
| * @param from |
| * source file |
| * @param to |
| * data target |
| * @throws IOException |
| */ |
| public static void copy(File from, OutputStream to) throws IOException { |
| InputStream input = null; |
| try { |
| input = new BufferedInputStream(new FileInputStream(from), BUF_SIZE); |
| copy(input, to); |
| } |
| finally { |
| if (input != null) { |
| try { |
| input.close(); |
| } |
| catch (IOException e) { |
| } |
| } |
| } |
| } |
| |
| /** |
| * recursively creates all parent directories of the given file |
| * |
| * @param toCreate |
| * The file for which the parent directories should be created. |
| * @param monitor |
| * @throws CoreException |
| */ |
| public static void mkdirs(IFile toCreate, IProgressMonitor monitor) throws CoreException { |
| if (toCreate == null || toCreate.exists()) { |
| return; |
| } |
| mkdirs(toCreate.getParent(), monitor); |
| } |
| |
| /** |
| * create the given directory and all of its parents. |
| * |
| * @param toCreate |
| * the directory to create. |
| * @param monitor |
| * @throws CoreException |
| */ |
| public static void mkdirs(IContainer toCreate, IProgressMonitor monitor) throws CoreException { |
| if (toCreate == null || toCreate.exists()) { |
| return; |
| } |
| else { |
| IContainer parent = toCreate.getParent(); |
| if (parent instanceof IFolder) { |
| mkdirs(parent, monitor); |
| } |
| if (toCreate instanceof IFolder) { |
| ((IFolder) toCreate).create(true, true, monitor); |
| } |
| } |
| } |
| |
| /** |
| * move the given file into the given folder. |
| * |
| * @param from |
| * the file to move |
| * @param destFolder |
| * the destination folder. |
| * @throws IOException |
| */ |
| public static void moveFile(File from, File destFolder) throws IOException { |
| if (from == null || !from.isFile()) { |
| throw new IOException("source file is not valid"); |
| } |
| if (destFolder == null) { |
| throw new IOException("destination folder is not valid"); |
| } |
| destFolder.mkdirs(); |
| boolean success = from.renameTo(destFolder); |
| if (!success) { |
| // fallback: copy file |
| FileUtility.copyFile(from, new File(destFolder, from.getName())); |
| IOUtility.deleteFile(from.getAbsolutePath()); |
| } |
| } |
| |
| public static void extractZip(File zipFile, File destinationFolder) throws IOException { |
| ZipInputStream zipInputStream = null; |
| ZipEntry zipEntry; |
| try { |
| zipInputStream = new ZipInputStream(new BufferedInputStream(new FileInputStream(zipFile))); |
| zipEntry = zipInputStream.getNextEntry(); |
| while (zipEntry != null) { |
| if (!zipEntry.isDirectory()) { |
| String entryName = zipEntry.getName(); |
| |
| File destFile = new File(destinationFolder, entryName); |
| destFile.getParentFile().mkdirs(); |
| OutputStream fos = null; |
| try { |
| fos = new BufferedOutputStream(new FileOutputStream(destFile)); |
| copy(zipInputStream, fos); |
| } |
| finally { |
| if (fos != null) { |
| try { |
| fos.close(); |
| } |
| catch (Exception e) { |
| } |
| } |
| } |
| } |
| zipInputStream.closeEntry(); |
| zipEntry = zipInputStream.getNextEntry(); |
| } |
| } |
| finally { |
| if (zipInputStream != null) { |
| try { |
| zipInputStream.close(); |
| } |
| catch (Exception e) { |
| } |
| } |
| } |
| } |
| |
| /** |
| * copies all data from the input stream to the output stream. |
| * |
| * @param from |
| * data source |
| * @param to |
| * data target |
| * @throws IOException |
| */ |
| public static void copy(InputStream from, OutputStream to) throws IOException { |
| copy(from, to, BUF_SIZE); |
| } |
| |
| /** |
| * copies all data from the input stream to the output stream. |
| * |
| * @param from |
| * data source |
| * @param to |
| * data target |
| * @param bufferSize |
| * buffer size to use |
| * @throws IOException |
| */ |
| public static void copy(InputStream from, OutputStream to, int bufferSize) throws IOException { |
| byte[] b = new byte[bufferSize]; |
| int len; |
| while ((len = from.read(b, 0, b.length)) != -1) { |
| to.write(b, 0, len); |
| } |
| to.flush(); |
| } |
| } |