/** * Copyright (C) 2013 Red Hat, Inc. (jdcasey@commonjava.org) * * 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.commonjava.cartographer.discover.indy; import org.apache.commons.lang.StringUtils; import org.commonjava.cartographer.CartoException; import org.commonjava.cartographer.INTERNAL.graph.discover.SourceManagerImpl; import org.commonjava.cartographer.conf.CartoAliasConfig; import org.commonjava.cartographer.spi.graph.discover.DiscoverySourceManager; import org.commonjava.indy.client.core.Indy; import org.commonjava.indy.client.core.IndyClientException; import org.commonjava.indy.model.core.dto.EndpointView; import org.commonjava.indy.model.core.dto.EndpointViewListing; import org.commonjava.propulsor.lifecycle.AppLifecycleException; import org.commonjava.propulsor.lifecycle.StartupAction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sun.net.www.ApplicationLaunchException; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; import java.util.Map; import static org.apache.commons.lang.StringUtils.isEmpty; import static org.commonjava.cartographer.rest.util.ResponseUtils.throwError; @ApplicationScoped public class CartoAliasingStartupAction implements StartupAction { @Inject private CartoAliasConfig config; @Inject private DiscoverySourceManager sourceManager; @Override public void start() throws AppLifecycleException { Logger logger = LoggerFactory.getLogger( getClass() ); logger.info( "STARTUP/begin: Alias initialization" ); String baseUrl = config.getIndyUrl(); if ( !isEmpty( baseUrl ) ) { logger.info( "Retrieving endpoints from Indy at: {} in order to auto-alias...", baseUrl ); try { Indy indy = new Indy( baseUrl ).connect(); EndpointViewListing endpoints = indy.stats().getAllEndpoints(); for ( EndpointView epv : endpoints.getItems() ) { logger.info( "Alias Indy '{}' => {}", epv.getKey(), epv.getResourceUri() ); sourceManager.addSourceAlias( epv.getKey(), epv.getResourceUri() ); } } catch ( IndyClientException e ) { throw new AppLifecycleException( "Failed to read repositories from Indy at: %s. Reason: %s", e, baseUrl, e.getMessage() ); } catch ( CartoException e ) { throw new AppLifecycleException( "Failed to add alias from Indy at: %s. Reason: %s", e, baseUrl, e.getMessage() ); } } else { logger.info( "No Indy server configured. Skipping auto-aliasing step." ); } Map<String, String> explicitAliases = config.getExplicitAliases(); List<String> errors = new ArrayList<>(); if ( explicitAliases != null ) { logger.info( "Adding explicit aliases from configuration..." ); explicitAliases.forEach( ( alias, url ) -> { logger.info( "Alias '{}' => {}", alias, url ); try { sourceManager.addSourceAlias( alias, url ); } catch ( CartoException e ) { errors.add( String.format( "%s -> %s (Reason: %s)", e, alias, url, e.getMessage() ) ); } } ); } if ( !errors.isEmpty() ) { throw new AppLifecycleException( "Failed to add aliases:\n %s", StringUtils.join( errors, "\n " ) ); } logger.info( "STARTUP/done: Alias initialization complete." ); } @Override public String getId() { return null; } @Override public int getPriority() { return 0; } }