/* | |
* Licensed to the Apache Software Foundation (ASF) under one | |
* or more contributor license agreements. See the NOTICE file | |
* distributed with this work for additional information | |
* regarding copyright ownership. The ASF licenses this file | |
* to you under the Apache License, Version 2.0 (the | |
* "License"); you may not use this file except in compliance | |
* with the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, | |
* software distributed under the License is distributed on an | |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
* KIND, either express or implied. See the License for the | |
* specific language governing permissions and limitations | |
* under the License. | |
*/ | |
package org.apache.felix.obr.plugin; | |
import java.io.File; | |
import java.io.IOException; | |
import org.apache.maven.artifact.manager.WagonConfigurationException; | |
import org.apache.maven.artifact.manager.WagonManager; | |
import org.apache.maven.artifact.repository.ArtifactRepository; | |
import org.apache.maven.plugin.MojoExecutionException; | |
import org.apache.maven.plugin.MojoFailureException; | |
import org.apache.maven.plugin.logging.Log; | |
import org.apache.maven.settings.Proxy; | |
import org.apache.maven.settings.Settings; | |
import org.apache.maven.wagon.ConnectionException; | |
import org.apache.maven.wagon.ResourceDoesNotExistException; | |
import org.apache.maven.wagon.TransferFailedException; | |
import org.apache.maven.wagon.UnsupportedProtocolException; | |
import org.apache.maven.wagon.Wagon; | |
import org.apache.maven.wagon.authentication.AuthenticationException; | |
import org.apache.maven.wagon.authorization.AuthorizationException; | |
import org.apache.maven.wagon.observers.Debug; | |
import org.apache.maven.wagon.proxy.ProxyInfo; | |
import org.apache.maven.wagon.repository.Repository; | |
/** | |
* this class is used to manage all connections by wagon. | |
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a> | |
*/ | |
public class RemoteFileManager { | |
/** | |
* save the connection. | |
*/ | |
private Wagon m_wagon; | |
/** | |
* the wagon manager. | |
*/ | |
private WagonManager m_wagonManager; | |
/** | |
* artifact repository. | |
*/ | |
private ArtifactRepository m_artifactRepository; | |
/** | |
* the project settings. | |
*/ | |
private Settings m_settings; | |
/** | |
* logger instance. | |
*/ | |
private Log m_log; | |
/** | |
* initialize main information. | |
* @param ar ArtifactRepository provides by maven | |
* @param wm WagonManager provides by maven | |
* @param settings settings of the current project provides by maven | |
* @param log logger | |
*/ | |
public RemoteFileManager(ArtifactRepository ar, WagonManager wm, Settings settings, Log log) { | |
m_artifactRepository = ar; | |
m_wagonManager = wm; | |
m_settings = settings; | |
m_log = log; | |
m_wagon = null; | |
} | |
/** | |
* disconnect the current object. | |
* | |
*/ | |
public void disconnect() { | |
if (m_wagon == null) { | |
m_log.error("must be connected first!"); | |
return; | |
} | |
try { | |
m_wagon.disconnect(); | |
} catch (ConnectionException e) { | |
m_log.error("Error disconnecting wagon - ignored", e); | |
} | |
} | |
/** | |
* connect the current object to artifact repository given in constructor. | |
* @throws MojoExecutionException if connection failed | |
*/ | |
public void connect() throws MojoExecutionException { | |
String url = m_artifactRepository.getUrl(); | |
String id = m_artifactRepository.getId(); | |
Repository repository = new Repository(id, url); | |
try { | |
m_wagon = m_wagonManager.getWagon(repository); | |
//configureWagon(m_wagon, repository.getId()); | |
} catch (UnsupportedProtocolException e) { | |
throw new MojoExecutionException("Unsupported protocol: '" + repository.getProtocol() + "'", e); | |
} catch (WagonConfigurationException e) { | |
throw new MojoExecutionException("Unable to configure Wagon: '" + repository.getProtocol() + "'", e); | |
} | |
try { | |
Debug debug = new Debug(); | |
m_wagon.addTransferListener(debug); | |
ProxyInfo proxyInfo = getProxyInfo(m_settings); | |
if (proxyInfo != null) { | |
m_wagon.connect(repository, m_wagonManager.getAuthenticationInfo(id), proxyInfo); | |
} else { | |
m_wagon.connect(repository, m_wagonManager.getAuthenticationInfo(id)); | |
} | |
} catch (ConnectionException e) { | |
throw new MojoExecutionException("Error uploading file", e); | |
} catch (AuthenticationException e) { | |
throw new MojoExecutionException("Error uploading file", e); | |
} | |
} | |
/** | |
* get a file from the current repository connected. | |
* @param url url to the targeted file | |
* @return get a file descriptor on the requiered resource | |
* @throws IOException if an IO error occurs | |
* @throws TransferFailedException if the transfer failed | |
* @throws ResourceDoesNotExistException if the targeted resource doesn't exist | |
* @throws AuthorizationException if the connection authorization failed | |
*/ | |
public File get(String url) throws IOException, TransferFailedException, ResourceDoesNotExistException, AuthorizationException { | |
if (m_wagon == null) { | |
m_log.error("must be connected first!"); | |
return null; | |
} | |
File file = File.createTempFile(String.valueOf(System.currentTimeMillis()), "tmp"); | |
m_wagon.get(url, file); | |
return file; | |
} | |
/** | |
* put a file on the current repository connected. | |
* @param file file to upload | |
* @param url url to copy file | |
* @throws TransferFailedException if the transfer failed | |
* @throws ResourceDoesNotExistException if the targeted resource doesn't exist | |
* @throws AuthorizationException if the connection authorization failed | |
*/ | |
public void put(File file, String url) throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException { | |
if (m_wagon == null) { | |
m_log.error("must be connected first!"); | |
return; | |
} | |
m_wagon.put(file, url); | |
} | |
/** | |
* Convenience method to map a Proxy object from the user system settings to a ProxyInfo object. | |
* @param settings project settings given by maven | |
* @return a proxyInfo object instancied or null if no active proxy is define in the settings.xml | |
*/ | |
public static ProxyInfo getProxyInfo(Settings settings) { | |
ProxyInfo proxyInfo = null; | |
if (settings != null && settings.getActiveProxy() != null) { | |
Proxy settingsProxy = settings.getActiveProxy(); | |
proxyInfo = new ProxyInfo(); | |
proxyInfo.setHost(settingsProxy.getHost()); | |
proxyInfo.setType(settingsProxy.getProtocol()); | |
proxyInfo.setPort(settingsProxy.getPort()); | |
proxyInfo.setNonProxyHosts(settingsProxy.getNonProxyHosts()); | |
proxyInfo.setUserName(settingsProxy.getUsername()); | |
proxyInfo.setPassword(settingsProxy.getPassword()); | |
} | |
return proxyInfo; | |
} | |
/** | |
* this method indicates if the targeted file is locked or not. | |
* @param remote connection manager | |
* @param fileName name targeted | |
* @return true if thr reuiered file is locked, else false | |
* @throws MojoFailureException if the plugin failed | |
*/ | |
public boolean isLockedFile(RemoteFileManager remote, String fileName) throws MojoFailureException { | |
File file = null; | |
try { | |
file = remote.get(fileName + ".lock"); | |
} catch (TransferFailedException e) { | |
e.printStackTrace(); | |
throw new MojoFailureException("TransferFailedException"); | |
} catch (ResourceDoesNotExistException e) { | |
return false; | |
} catch (AuthorizationException e) { | |
e.printStackTrace(); | |
throw new MojoFailureException("AuthorizationException"); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
throw new MojoFailureException("IOException"); | |
} | |
if (file != null && file.length() == 0) { return false; } | |
return true; | |
} | |
} |