Skip to main content

This CGIT instance is deprecated, and repositories have been moved to Gitlab or Github. See the repository descriptions for specific locations.

aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/baseadaptor/AdaptorUtil.java')
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/baseadaptor/AdaptorUtil.java280
1 files changed, 280 insertions, 0 deletions
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/baseadaptor/AdaptorUtil.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/baseadaptor/AdaptorUtil.java
new file mode 100644
index 000000000..3ff383ca4
--- /dev/null
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/baseadaptor/AdaptorUtil.java
@@ -0,0 +1,280 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2010 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.osgi.internal.baseadaptor;
+
+import java.io.*;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import org.eclipse.core.runtime.internal.adaptor.EclipseAdaptorMsg;
+import org.eclipse.osgi.baseadaptor.BaseData;
+import org.eclipse.osgi.framework.debug.Debug;
+import org.eclipse.osgi.framework.internal.core.Constants;
+import org.eclipse.osgi.framework.util.Headers;
+import org.eclipse.osgi.framework.util.ObjectPool;
+import org.eclipse.osgi.util.NLS;
+import org.osgi.framework.*;
+
+/**
+ * A utility class with some generally useful static methods for adaptor hook implementations
+ */
+public class AdaptorUtil {
+ /** The NULL tag used in bundle storage */
+ public static final byte NULL = 0;
+ /** The OBJECT tag used in bundle storage */
+ public static final byte OBJECT = 1;
+
+ /**
+ * Does a recursive copy of one directory to another.
+ * @param inDir input directory to copy.
+ * @param outDir output directory to copy to.
+ * @throws IOException if any error occurs during the copy.
+ */
+ public static void copyDir(File inDir, File outDir) throws IOException {
+ String[] files = inDir.list();
+ if (files != null && files.length > 0) {
+ outDir.mkdir();
+ for (int i = 0; i < files.length; i++) {
+ File inFile = new File(inDir, files[i]);
+ File outFile = new File(outDir, files[i]);
+ if (inFile.isDirectory()) {
+ copyDir(inFile, outFile);
+ } else {
+ InputStream in = new FileInputStream(inFile);
+ readFile(in, outFile);
+ }
+ }
+ }
+ }
+
+ /**
+ * Read a file from an InputStream and write it to the file system.
+ *
+ * @param in InputStream from which to read. This stream will be closed by this method.
+ * @param file output file to create.
+ * @exception IOException
+ */
+ public static void readFile(InputStream in, File file) throws IOException {
+ FileOutputStream fos = null;
+ try {
+ fos = new FileOutputStream(file);
+
+ byte buffer[] = new byte[1024];
+ int count;
+ while ((count = in.read(buffer, 0, buffer.length)) > 0) {
+ fos.write(buffer, 0, count);
+ }
+ } catch (IOException e) {
+ if (Debug.DEBUG_GENERAL) {
+ Debug.println("Unable to read file"); //$NON-NLS-1$
+ Debug.printStackTrace(e);
+ }
+
+ throw e;
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException ee) {
+ // nothing to do here
+ }
+ }
+
+ if (fos != null) {
+ try {
+ fos.close();
+ } catch (IOException ee) {
+ // nothing to do here
+ }
+ }
+ }
+ }
+
+ /**
+ * This function performs the equivalent of "rm -r" on a file or directory.
+ *
+ * @param file file or directory to delete
+ * @return false is the specified files still exists, true otherwise.
+ */
+ public static boolean rm(File file) {
+ if (file.exists()) {
+ if (file.isDirectory()) {
+ String list[] = file.list();
+ if (list != null) {
+ int len = list.length;
+ for (int i = 0; i < len; i++) {
+ // we are doing a lot of garbage collecting here
+ rm(new File(file, list[i]));
+ }
+ }
+ }
+ if (Debug.DEBUG_GENERAL) {
+ if (file.isDirectory()) {
+ Debug.println("rmdir " + file.getPath()); //$NON-NLS-1$
+ } else {
+ Debug.println("rm " + file.getPath()); //$NON-NLS-1$
+ }
+ }
+
+ boolean success = file.delete();
+
+ if (Debug.DEBUG_GENERAL) {
+ if (!success) {
+ Debug.println(" rm failed!!"); //$NON-NLS-1$
+ }
+ }
+
+ return (success);
+ }
+ return (true);
+ }
+
+ public static String readString(DataInputStream in, boolean intern) throws IOException {
+ byte type = in.readByte();
+ if (type == NULL)
+ return null;
+ return intern ? in.readUTF().intern() : in.readUTF();
+ }
+
+ public static void writeStringOrNull(DataOutputStream out, String string) throws IOException {
+ if (string == null)
+ out.writeByte(NULL);
+ else {
+ out.writeByte(OBJECT);
+ out.writeUTF(string);
+ }
+ }
+
+ public static Version loadVersion(DataInputStream in) throws IOException {
+ String versionString = readString(in, false);
+ try {
+ //return Version.parseVersion(versionString);
+ return (Version) ObjectPool.intern(Version.parseVersion(versionString));
+ } catch (IllegalArgumentException e) {
+ return new InvalidVersion(versionString);
+ }
+ }
+
+ /**
+ * Register a service object.
+ * @param name the service class name
+ * @param service the service object
+ * @param context the registering bundle context
+ * @return the service registration object
+ */
+ public static ServiceRegistration<?> register(String name, Object service, BundleContext context) {
+ Dictionary<String, Object> properties = new Hashtable<String, Object>(7);
+ Dictionary<String, String> headers = context.getBundle().getHeaders();
+ properties.put(Constants.SERVICE_VENDOR, headers.get(Constants.BUNDLE_VENDOR));
+ properties.put(Constants.SERVICE_RANKING, new Integer(Integer.MAX_VALUE));
+ properties.put(Constants.SERVICE_PID, context.getBundle().getBundleId() + "." + service.getClass().getName()); //$NON-NLS-1$
+ return context.registerService(name, service, properties);
+ }
+
+ public static Dictionary<String, String> loadManifestFrom(BaseData bundledata) throws BundleException {
+ URL url = bundledata.getEntry(Constants.OSGI_BUNDLE_MANIFEST);
+ if (url == null)
+ return null;
+ try {
+ return Headers.parseManifest(url.openStream());
+ } catch (IOException e) {
+ throw new BundleException(NLS.bind(EclipseAdaptorMsg.ECLIPSE_DATA_ERROR_READING_MANIFEST, bundledata.getLocation()), BundleException.MANIFEST_ERROR, e);
+ }
+ }
+
+ public static boolean canWrite(File installDir) {
+ if (installDir.canWrite() == false)
+ return false;
+
+ if (!installDir.isDirectory())
+ return false;
+
+ File fileTest = null;
+ try {
+ // we use the .dll suffix to properly test on Vista virtual directories
+ // on Vista you are not allowed to write executable files on virtual directories like "Program Files"
+ fileTest = File.createTempFile("writtableArea", ".dll", installDir); //$NON-NLS-1$ //$NON-NLS-2$
+ } catch (IOException e) {
+ //If an exception occured while trying to create the file, it means that it is not writtable
+ return false;
+ } finally {
+ if (fileTest != null)
+ fileTest.delete();
+ }
+ return true;
+ }
+
+ @SuppressWarnings("deprecation")
+ public static URL encodeFileURL(File file) throws MalformedURLException {
+ try {
+ Method toURI = File.class.getMethod("toURI", (Class[]) null); //$NON-NLS-1$
+ Object uri = toURI.invoke(file, (Object[]) null);
+ Method toURL = uri.getClass().getMethod("toURL", (Class[]) null); //$NON-NLS-1$
+ return (URL) toURL.invoke(uri, (Object[]) null);
+ } catch (NoSuchMethodException e) {
+ // use toURL.
+ } catch (IllegalAccessException e) {
+ // use toURL.
+ } catch (InvocationTargetException e) {
+ if (e.getTargetException() instanceof MalformedURLException)
+ throw (MalformedURLException) e.getTargetException();
+ // use toURL
+ }
+ // TODO should we do this by hand ourselves?
+ return file.toURL();
+ }
+
+ public static byte[] getBytes(InputStream in, int length, int BUF_SIZE) throws IOException {
+ byte[] classbytes;
+ int bytesread = 0;
+ int readcount;
+ try {
+ if (length > 0) {
+ classbytes = new byte[length];
+ for (; bytesread < length; bytesread += readcount) {
+ readcount = in.read(classbytes, bytesread, length - bytesread);
+ if (readcount <= 0) /* if we didn't read anything */
+ break; /* leave the loop */
+ }
+ } else /* does not know its own length! */{
+ length = BUF_SIZE;
+ classbytes = new byte[length];
+ readloop: while (true) {
+ for (; bytesread < length; bytesread += readcount) {
+ readcount = in.read(classbytes, bytesread, length - bytesread);
+ if (readcount <= 0) /* if we didn't read anything */
+ break readloop; /* leave the loop */
+ }
+ byte[] oldbytes = classbytes;
+ length += BUF_SIZE;
+ classbytes = new byte[length];
+ System.arraycopy(oldbytes, 0, classbytes, 0, bytesread);
+ }
+ }
+ if (classbytes.length > bytesread) {
+ byte[] oldbytes = classbytes;
+ classbytes = new byte[bytesread];
+ System.arraycopy(oldbytes, 0, classbytes, 0, bytesread);
+ }
+ } finally {
+ try {
+ in.close();
+ } catch (IOException ee) {
+ // nothing to do here
+ }
+ }
+ return classbytes;
+ }
+}

Back to the top