001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *   http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied.  See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019package org.apache.maven.resolver.examples.manual;
020
021import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
022import org.eclipse.aether.RepositorySystem;
023import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
024import org.eclipse.aether.impl.DefaultServiceLocator;
025import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
026import org.eclipse.aether.spi.connector.transport.TransporterFactory;
027import org.eclipse.aether.transport.file.FileTransporterFactory;
028import org.eclipse.aether.transport.http.HttpTransporterFactory;
029import org.slf4j.Logger;
030import org.slf4j.LoggerFactory;
031
032/**
033 * A factory for repository system instances that employs Maven Artifact Resolver's built-in service locator
034 * infrastructure to wire up the system's components.
035 */
036public class ManualRepositorySystemFactory {
037    private static final Logger LOGGER = LoggerFactory.getLogger(ManualRepositorySystemFactory.class);
038
039    public static RepositorySystem newRepositorySystem() {
040        /*
041         * Aether's components implement org.eclipse.aether.spi.locator.Service to ease manual wiring and using the
042         * prepopulated DefaultServiceLocator, we only need to register the repository connector and transporter
043         * factories.
044         */
045        DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
046        locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
047        locator.addService(TransporterFactory.class, FileTransporterFactory.class);
048        locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
049
050        locator.setErrorHandler(new DefaultServiceLocator.ErrorHandler() {
051            @Override
052            public void serviceCreationFailed(Class<?> type, Class<?> impl, Throwable exception) {
053                LOGGER.error("Service creation failed for {} with implementation {}", type, impl, exception);
054            }
055        });
056
057        return locator.getService(RepositorySystem.class);
058    }
059}