All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.osgi.storage.url.reference.ReferenceURLConnection Maven / Gradle / Ivy

Go to download

AspectJ tools most notably contains the AspectJ compiler (AJC). AJC applies aspects to Java classes during compilation, fully replacing Javac for plain Java classes and also compiling native AspectJ or annotation-based @AspectJ syntax. Furthermore, AJC can weave aspects into existing class files in a post-compile binary weaving step. This library is a superset of AspectJ weaver and hence also of AspectJ runtime.

There is a newer version: 1.9.22.1
Show newest version
/*******************************************************************************
 * Copyright (c) 2003, 2012 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.osgi.storage.url.reference;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.Files;
import org.eclipse.osgi.framework.util.FilePath;
import org.eclipse.osgi.internal.location.LocationHelper;
import org.eclipse.osgi.internal.messages.Msg;
import org.eclipse.osgi.util.NLS;

/**
 * URLConnection for the reference protocol.
 */

public class ReferenceURLConnection extends URLConnection {
	private final String installPath;
	private volatile File reference;

	protected ReferenceURLConnection(URL url, String installPath) {
		super(url);
		this.installPath = installPath;
	}

	@Override
	public synchronized void connect() throws IOException {
		if (!connected) {
			// TODO assumes that reference URLs are always based on file: URLs.
			// There are not solid usecases to the contrary. Yet.
			// Construct the ref File carefully so as to preserve UNC paths etc.
			String path = getURL().getPath();
			if (!path.startsWith("file:")) { //$NON-NLS-1$
				throw new IOException(NLS.bind(Msg.ADAPTOR_URL_CREATE_EXCEPTION, path));
			}
			path = path.substring(5);
			File file = new File(path);

			if (!file.isAbsolute()) {
				if (installPath != null)
					file = makeAbsolute(installPath, file);
			}

			file = LocationHelper.decodePath(file);

			checkRead(file);

			reference = file;
			connected = true;
		}
	}

	private void checkRead(File file) throws IOException {
		if (!file.exists())
			throw new FileNotFoundException(file.toString());
		if (!Files.isReadable(file.toPath())) {
			if (file.isFile()) {
				// Try to open the file to ensure that this is possible: see bug 260217
				// If access is denied, a FileNotFoundException with (access denied) message is
				// thrown
				// Here file.canRead() cannot be used, because on Windows it does not
				// return correct values - bug 6203387 in Sun's bug database
				InputStream is = new FileInputStream(file);
				is.close();
			} else if (file.isDirectory()) {
				// There is no straightforward way to check if a directory
				// has read permissions - same issues for File.canRead() as above;
				// try to list the files in the directory
				File[] files = file.listFiles();
				// File.listFiles() returns null if the directory does not exist
				// (which is not the current case, because we check that it exists and is
				// directory),
				// or if an IO error occurred during the listing of the files, including if the
				// access is denied
				if (files == null)
					throw new FileNotFoundException(file.toString() + " (probably access denied)"); //$NON-NLS-1$
			} else {
				// TODO not sure if we can get here.
			}
		}
	}

	@Override
	public boolean getDoInput() {
		return true;
	}

	@Override
	public boolean getDoOutput() {
		return false;
	}

	@Override
	public InputStream getInputStream() throws IOException {
		if (!connected) {
			connect();
		}

		return new ReferenceInputStream(reference);
	}

	private static File makeAbsolute(String base, File relative) {
		if (relative.isAbsolute())
			return relative;
		return new File(new FilePath(base + relative.getPath()).toString());
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy