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

org.fusesource.fabric.agent.mvn.MavenSettingsImpl Maven / Gradle / Ivy

/**
 * Copyright (C) FuseSource, Inc.
 * http://fusesource.com
 *
 * Licensed 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.fusesource.fabric.agent.mvn;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;

/**
 * Default implementation of Settings.
 *
 * @author Alin Dreghiciu
 * @see MavenSettings
 * @since August 10, 2007
 */
public class MavenSettingsImpl
        implements MavenSettings {

    /**
     * Logger.
     */
    private static final Log LOGGER = LogFactory.getLog(MavenSettingsImpl.class);
    /**
     * Path of local repository tag.
     */
    private static final String LOCAL_REPOSITORY_TAG = "localRepository";
    /**
     * Path to server tag.
     */
    private static final String SERVER_TAG = "servers/server";

    /**
     * Path to profiles tag.
     */
    private static final String PROFILE_TAG = "profiles/profile";

    /**
     * Path to repository tag.
     */
    private static final String REPOSITORY_TAG = "repositories/repository";

    /**
     * Path to activeProfiles tag.
     */
    private static final String ACTIVE_PROFILES_TAG = "activeProfiles/activeProfile";

    /**
     * Path to proxy tag.
     */
    private static final String PROXY_TAG = "proxies/proxy";

    /**
     * Fallback Maven repositories.
     */
    private static final String FALLBACK_REPOSITORIES =
            "http://osgi.sonatype.org/content/groups/pax-runner,"
                    + "http://repo1.maven.org/maven2,"
                    + "http://repository.ops4j.org/maven2,"
                    + "http://repository.springsource.com/maven/bundles/release,"
                    + "http://repository.springsource.com/maven/bundles/external";

    /**
     * The settings.xml DOM Document. Null if there is no settings.xml.
     */
    private Document m_document;
    /**
     * The settings.xml file url. Can be null if no settings.xml was resolved.
     */
    private URL m_settingsURL;
    /**
     * Forces uses of fallback repositories instead of default repositories.
     */
    private final boolean m_useFallbackRepositories;
    /**
     * The local repository spec.
     */
    private String m_localRepository;
    /**
     * Comma separated list of repositories. Null if there is no settings xml or settings.xml does not contain
     * repositories.
     */
    private String m_repositories;
    /**
     * Map of known proxies for various protocols
     */
    private Map> m_proxySettings;

    /**
     * Creates new settings with the following resolution:
* 1. looks for the specified url * 2. if not found looks for ${user.home}/.m2/settings.xml * 3. if not found looks for ${maven.home}/conf/settings.xml * 4. if not found looks for ${M2_HOME}/conf/settings.xml * * @param settingsURL prefered settings.xml file * @param useFallbackRepositories if fallback repositories should be used instead of default repositories */ public MavenSettingsImpl(final URL settingsURL, final boolean useFallbackRepositories) { m_settingsURL = settingsURL; m_useFallbackRepositories = useFallbackRepositories; if (m_settingsURL == null) { m_settingsURL = safeGetFile(System.getProperty("user.home") + "/.m2/settings.xml"); if (m_settingsURL == null) { m_settingsURL = safeGetFile(System.getProperty("maven.home") + "/conf/settings.xml"); if (m_settingsURL == null) { try { m_settingsURL = safeGetFile(System.getenv("M2_HOME") + "/conf/settings.xml"); } catch (Error e) { // ignore error - probably running on Java 1.4.x } } } } } /** * See {@link #MavenSettingsImpl(java.net.URL, boolean)}. * Forces use of default repositories. * * @param settingsURL prefered settings.xml file */ public MavenSettingsImpl(final URL settingsURL) { this(settingsURL, false); } /** * Returns the local repository directory from settings.xml. If there is no settings.xml file, or the settings.xml * does not caontain an tag or the value of that tag is empty it will return the hardcoded * standard location: ${user.home}/.m2/repository * * @return the local repository directory */ public String getLocalRepository() { if (m_localRepository == null) { /* readSettings(); if( m_document != null ) { Element settingsElement = XmlUtils.getElement( m_document, LOCAL_REPOSITORY_TAG ); if( settingsElement != null ) { m_localRepository = XmlUtils.getTextContent( settingsElement ); } } */ if (m_localRepository == null || m_localRepository.trim().length() == 0) { m_localRepository = System.getProperty("user.home") + "/.m2/repository"; } } return m_localRepository; } /** * Gets the list of repositories from settings.xml. * If there is no settings.xml file or there are no repositories in settings.xml the list returned will be null. *

* If there are repositories in settings.xml and those repositories have user and password the user and password * will be included in the repository url as for example http://user:[email protected]/maven2. *

* Repositories are organized in profiles. * Active profiles are selected by looking at activeProfiles tag (just under ) * * @return a comma separated list of repositories from settings.xml */ public String getRepositories() { if (m_repositories == null) { /* readSettings(); if( m_document != null ) { Set activeProfiles = getActiveProfiles(); Map repositories = null; List order = null; List profiles = XmlUtils.getElements( m_document, PROFILE_TAG ); // first look for profiles if( profiles != null ) { for( Element profile : profiles ) { Element profileIdElement = XmlUtils.getElement( profile, "id" ); if( profileIdElement != null ) { String profileId = XmlUtils.getTextContent( profileIdElement ); if( profileId != null ) { if( activeProfiles.contains( profileId ) ) { List repos = XmlUtils.getElements( profile, REPOSITORY_TAG ); if( repos != null ) { for( Element repo : repos ) { Element element = XmlUtils.getElement( repo, "id" ); if( element != null ) { String id = XmlUtils.getTextContent( element ); element = XmlUtils.getElement( repo, "layout" ); String layout = null; if( element != null ) { layout = XmlUtils.getTextContent( element ); } // take only repositories with a default layout (skip legacy ones) if( layout == null || "default".equals( layout ) ) { String snapshots = XmlUtils.getTextContentOfElement( repo, "snapshots/enabled" ); String releases = XmlUtils.getTextContentOfElement( repo, "releases/enabled" ); element = XmlUtils.getElement( repo, "url" ); if( element != null ) { String url = XmlUtils.getTextContent( element ); if( url != null ) { if( repositories == null ) { repositories = new HashMap(); order = new ArrayList(); } if( snapshots != null && Boolean.valueOf( snapshots ) ) { url += MavenConstants.SEPARATOR_OPTIONS + MavenConstants.OPTION_ALLOW_SNAPSHOTS; } if( releases != null && !Boolean.valueOf( releases ) ) { url += MavenConstants.SEPARATOR_OPTIONS + MavenConstants.OPTION_DISALLOW_RELEASES; } repositories.put( id, url ); order.add( id ); } } } } } } } else { LOGGER.debug( "Profile " + "[" + profileId + "] is inactive (ignored)." ); } } } } // then look for user / passwords but only if we have repositories if( repositories != null ) { List servers = XmlUtils.getElements( m_document, SERVER_TAG ); if( servers != null ) { for( Element server : servers ) { Element element = XmlUtils.getElement( server, "id" ); if( element != null ) { String id = XmlUtils.getTextContent( element ); // if we do not find a corresponding repository don't go furter String repository = repositories.get( id ); if( repository != null && repository.contains( "://" ) ) { element = XmlUtils.getElement( server, "username" ); if( element != null ) { String username = XmlUtils.getTextContent( element ); // if there is no username stop the search if( username != null ) { element = XmlUtils.getElement( server, "password" ); if( element != null ) { String password = XmlUtils.getTextContent( element ); if( password != null ) { username = username + ":" + password; } } // PAXURL-86: treat string as // literal String repo = "://" + username + "@"; repo = Matcher.quoteReplacement(repo); repositories.put(id, repository.replaceFirst("://", repo)); } } } } } } } // build the list of repositories final StringBuilder builder = new StringBuilder(); if( order != null ) { for( String repositoryId : order ) { if( builder.length() > 0 ) { builder.append( "," ); } builder.append( repositories.get( repositoryId ) ); } } m_repositories = builder.toString(); } } */ // PAXURL-92 Have the ability to only use a local repository, by // not requiring the use of a DEFAULT_REPOSITORY. Helps with // users who have proxies and want to lockdown their repos. if (m_useFallbackRepositories) { if (m_repositories == null || m_repositories.length() == 0) { m_repositories = FALLBACK_REPOSITORIES; } else { m_repositories = m_repositories + "," + FALLBACK_REPOSITORIES; } } } return m_repositories; } /* private Set getActiveProfiles() { Set ret = new HashSet(); List activeProfiles = XmlUtils.getElements( m_document, ACTIVE_PROFILES_TAG ); if( activeProfiles != null ) { for( Element active : activeProfiles ) { ret.add( XmlUtils.getTextContent( active ) ); } } return ret; } private void readSettings() { if( m_document == null && m_settingsURL != null ) { try { m_document = XmlUtils.parseDoc( m_settingsURL.openStream() ); } catch( ParserConfigurationException e ) { throw new RuntimeException( "Could not parse settings [" + m_settingsURL + "]", e ); } catch( SAXException e ) { throw new RuntimeException( "Could not parse settings [" + m_settingsURL + "]", e ); } catch( IOException e ) { throw new RuntimeException( "Could not parse settings [" + m_settingsURL + "]", e ); } } } */ private static URL safeGetFile(final String filePath) { if (filePath != null) { File file = new File(filePath); if (file.exists() && file.canRead() && file.isFile()) { try { return file.toURL(); } catch (MalformedURLException e) { // do nothing } } } return null; } /* private String getSetting( Element element, String settingName, String defaultSetting ) { final String setting = XmlUtils.getTextContentOfElement( element, settingName ); if( setting == null ) { return defaultSetting; } return setting; } */ /** * Returns the active proxy settings from settings.xml * * @return the active proxy settings */ public Map> getProxySettings() { if (m_proxySettings == null) { m_proxySettings = new HashMap>(); /* readSettings(); if( m_document != null ) { List proxies = XmlUtils.getElements( m_document, PROXY_TAG ); if( proxies != null ) { for( Element proxy : proxies ) { String active = getSetting( proxy, "active", "false" ); String protocol = getSetting( proxy, "protocol", "http" ); if( !m_proxySettings.containsKey( protocol ) || "true".equalsIgnoreCase( active ) ) { Map proxyDetails = new HashMap(); proxyDetails.put( "user", getSetting( proxy, "username", "" ) ); proxyDetails.put( "pass", getSetting( proxy, "password", "" ) ); proxyDetails.put( "host", getSetting( proxy, "host", "127.0.0.1" ) ); proxyDetails.put( "port", getSetting( proxy, "port", "8080" ) ); proxyDetails.put( "nonProxyHosts", getSetting( proxy, "nonProxyHosts", "" ) ); m_proxySettings.put( protocol, proxyDetails ); } } } } */ } return Collections.unmodifiableMap(m_proxySettings); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy