/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.communication.fileaccess.internal; import java.io.IOException; import java.net.URI; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import de.rcenvironment.core.communication.common.CommunicationException; import de.rcenvironment.core.communication.fileaccess.api.RemoteFileConnection; import de.rcenvironment.core.communication.fileaccess.spi.RemoteFileConnectionFactory; /** * Supportive class to get {@link RemoteFileConnection} objects. The class looks for the right one * by means of the contact information. * * @author Doreen Seider */ public final class RemoteFileConnectionSupport { private static final String ERROR_SERVICE_NOT_REGISTERED = "A remote input stream factory service is not registered."; private static final Log LOGGER = LogFactory.getLog(RemoteFileConnectionSupport.class); private static BundleContext bundleContext; /** Only called by OSGi. */ @Deprecated public RemoteFileConnectionSupport() {} /** * Activation method called by OSGi. * * @param context The injected {@link BundleContext}. **/ public void activate(BundleContext context) { bundleContext = context; } /** * Returns a new {@link RemoteFileConnection} instance. * * @param uri The URI for which a {@link RemoteFileConnection} instance should be created. * @return A new {@link RemoteFileConnection} object. * @throws CommunicationException Thrown if the {@link RemoteFileConnection} object could not be * created. * @throws IOException if the file does not exist remotely. */ public static RemoteFileConnection getRemoteFileConnection(URI uri) throws CommunicationException, IOException { // try to get the remote input stream access object by getting and calling the remote input // stream access factory // service ServiceReference<?>[] factoryReferences = null; try { factoryReferences = bundleContext.getAllServiceReferences(RemoteFileConnectionFactory.class.getName(), null); } catch (InvalidSyntaxException e) { // Will not happen LOGGER.error("Failed to get a remote input stream factory service: Invalid protocol filter syntax."); } RemoteFileConnectionFactory remoteFileConnectionFactory; if (factoryReferences != null && factoryReferences.length > 0) { remoteFileConnectionFactory = (RemoteFileConnectionFactory) bundleContext.getService(factoryReferences[0]); if (remoteFileConnectionFactory == null) { throw new CommunicationException(ERROR_SERVICE_NOT_REGISTERED); } } else { throw new CommunicationException(ERROR_SERVICE_NOT_REGISTERED); } return remoteFileConnectionFactory.createRemoteFileConnection(uri); } }