/******************************************************************************* * Copyright (c) 2005, 2009 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.wst.jsdt.core.compiler.libraries; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.wst.jsdt.core.JavaScriptCore; import org.eclipse.wst.jsdt.internal.core.util.Util; /** * * Provisional API: This class/interface is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. */ public class SystemLibraryLocation implements LibraryLocation { public static final char[] SYSTEM_LIBARAY_NAME= {'s','y','s','t','e','m','.','j','s'}; public static final char[] LIBRARY_RUNTIME_DIRECTORY={'l','i','b','r','a','r','i','e','s'}; public static final char[] LIBRARY_PLUGIN_DIRECTORY={'l','i','b','r','a','r','i','e','s'}; private static final boolean AUTO_UPDATE_LIBS=true; private static SystemLibraryLocation fInstance; public static LibraryLocation getInstance() { if(fInstance==null) fInstance = new SystemLibraryLocation(); return fInstance; } public IPath getLibraryPathInPlugin() { return new Path("libraries"); //$NON-NLS-1$ } public char[][] getLibraryFileNames() { return new char[][] {SYSTEM_LIBARAY_NAME}; } protected String getPluginId() { return JavaScriptCore.PLUGIN_ID; } public char[][] getAllFilesInPluginDirectory(String directory){ Enumeration entries = (Platform.getBundle(getPluginId()).getEntryPaths(directory)); List allEntries = new ArrayList(); while (entries.hasMoreElements()) { Path value = new Path((String) entries.nextElement()); char[] filename = value.lastSegment().toCharArray(); if (Util.isJavaLikeFileName(filename)) { //$NON-NLS-1$ allEntries.add(filename); } } char[][] fileNames = new char[allEntries.size()][]; for (int i = 0; i < allEntries.size(); i++) { fileNames[i] = (char[]) allEntries.get(i); } return fileNames; } public SystemLibraryLocation() { super(); IPath libraryRuntimePath = Platform.getStateLocation(Platform.getBundle(JavaScriptCore.PLUGIN_ID)).append(new String(LIBRARY_RUNTIME_DIRECTORY)); try { if (!libraryRuntimePath.toFile().exists()) { libraryRuntimePath.toFile().mkdir(); } } catch (SecurityException e) { Platform.getLog(Platform.getBundle(JavaScriptCore.PLUGIN_ID)).log(new Status(IStatus.ERROR, JavaScriptCore.PLUGIN_ID, "Problem creating folder " + libraryRuntimePath, e));//$NON-NLS-1$ } char[][] libFiles = getLibraryFileNames(); for (int i = 0; i < libFiles.length; i++) { IPath workingLibLocation = libraryRuntimePath.addTrailingSeparator().append(new String(libFiles[i])); File library = workingLibLocation.toFile(); if (!library.exists()) { InputStream is = null; try { is = FileLocator.openStream(Platform.getBundle(getPluginId()), getLibraryPathInPlugin().append(new String(libFiles[i])), false); } catch (IOException e) { Platform.getLog(Platform.getBundle(getPluginId())).log(new Status(IStatus.ERROR, getPluginId(), "Could not read " + getPluginId() + ":" + getLibraryPathInPlugin().append(new String(libFiles[i])), e));//$NON-NLS-1$ //$NON-NLS-2$ } if (is != null) { try { copyFile(is, library); } catch (IOException e) { Platform.getLog(Platform.getBundle(getPluginId())).log(new Status(IStatus.ERROR, getPluginId(), "Problem writing to " + workingLibLocation, e));//$NON-NLS-1$ } } } else if (AUTO_UPDATE_LIBS) { long lastModold = library.lastModified(); URL path = null; URL entry = null; try { entry = Platform.getBundle(getPluginId()).getEntry(getLibraryPathInPlugin().append(new String(libFiles[i])).toString()); path = FileLocator.toFileURL(entry); } catch (IOException e) { // URL conversion error Platform.getLog(Platform.getBundle(JavaScriptCore.PLUGIN_ID)).log(new Status(IStatus.ERROR, getPluginId(), "Problem getting file path from " + entry, e));//$NON-NLS-1$ } catch (IllegalStateException e) { // bundle uninstalled, not really bad? } if (path != null) { File inPlugin = new File(path.getFile()); long lastModNew = inPlugin.lastModified(); if (lastModNew > lastModold) { InputStream is = null; try { is = FileLocator.openStream(Platform.getBundle(getPluginId()), getLibraryPathInPlugin().append(new String(libFiles[i])), false); } catch (IOException e) { Platform.getLog(Platform.getBundle(getPluginId())).log(new Status(IStatus.ERROR, getPluginId(), "Could not read " + getPluginId() + ":" + getLibraryPathInPlugin().append(new String(libFiles[i])), e));//$NON-NLS-1$ //$NON-NLS-2$ } if (is != null) { // Updating old library file library.delete(); try { copyFile(is, library); } catch (IOException e) { Platform.getLog(Platform.getBundle(getPluginId())).log(new Status(IStatus.ERROR, getPluginId(), "Problem writing to " + library, e));//$NON-NLS-1$ } } } } } } } public IPath getWorkingLibPath() { return new Path(getLibraryPath("")); //$NON-NLS-1$ } /* (non-Javadoc) * @see org.eclipse.wst.jsdt.core.compiler.libraries.LibraryLocation#getLibraryPath(java.lang.String) */ public String getLibraryPath(String name){ return JavaScriptCore.getPlugin().getStateLocation().append( new String(LIBRARY_RUNTIME_DIRECTORY) ).addTrailingSeparator().append(name).toString(); } public String getLibraryPath(char[] name){ return getLibraryPath(new String(name)); } protected static void copyFile(InputStream src, File dst) throws IOException { InputStream in = null; OutputStream out = null; try { in = new BufferedInputStream(src); out = new BufferedOutputStream(new FileOutputStream(dst)); byte[] buffer = new byte[4096]; int len; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } } finally { if (in != null) try { in.close(); } catch (IOException e) { // problem closing, no recovery or diagnosis possible } if (out != null) try { out.close(); } catch (IOException e) { // problem closing, no recovery or diagnosis possible } } } }