Added: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/ArtifactRouterException.java URL: http://svn.apache.org/viewvc/maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/ArtifactRouterException.java?rev=1126851&view=auto ============================================================================== --- maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/ArtifactRouterException.java (added) +++ maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/ArtifactRouterException.java Tue May 24 03:31:40 2011 @@ -0,0 +1,38 @@ +package org.apache.maven.artifact.router; + +/* + * 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. + */ + +public class ArtifactRouterException + extends Exception +{ + + private static final long serialVersionUID = 1L; + + public ArtifactRouterException( final String message, final Throwable cause ) + { + super( message, cause ); + } + + public ArtifactRouterException( final String message ) + { + super( message ); + } + +}
Propchange: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/ArtifactRouterException.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/ArtifactRouterConfiguration.java URL: http://svn.apache.org/viewvc/maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/ArtifactRouterConfiguration.java?rev=1126851&view=auto ============================================================================== --- maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/ArtifactRouterConfiguration.java (added) +++ maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/ArtifactRouterConfiguration.java Tue May 24 03:31:40 2011 @@ -0,0 +1,124 @@ +package org.apache.maven.artifact.router.conf; + +/* + * 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. + */ + +import org.apache.http.auth.UsernamePasswordCredentials; + +import java.io.File; + +public final class ArtifactRouterConfiguration +{ + + private static final String CANONICAL_MIRRORS_URL = "http://repository.apache.org/router/mirrors.json"; + + private static final String CANONICAL_GROUPS_URL = "http://repository.apache.org/router/groups.json"; + + public static final String ALL_DISCOVERY_STRATEGIES = "all"; + + public static final String NO_DISCOVERY_STRATEGIES = "none"; + + private File selectedRoutesFile; + + private String routerMirrorsUrl; + + private UsernamePasswordCredentials routerCredentials; + + private boolean disabled = false; + + private String[] discoveryStrategies = { ALL_DISCOVERY_STRATEGIES }; + + private String routerGroupsUrl; + + public ArtifactRouterConfiguration setRouterCredentials( final String user, final String password ) + { + routerCredentials = new UsernamePasswordCredentials( user, password ); + return this; + } + + public UsernamePasswordCredentials getRouterCredentials() + { + return routerCredentials; + } + + public ArtifactRouterConfiguration setRouterMirrorsUrl( final String routerMirrorsUrl ) + { + this.routerMirrorsUrl = routerMirrorsUrl; + return this; + } + + public String getRouterMirrorsUrl() + { + return routerMirrorsUrl; + } + + public void setRouterGroupsUrl( String routerGroupsUrl ) + { + this.routerGroupsUrl = routerGroupsUrl; + } + + public String getRouterGroupsUrl() + { + return routerGroupsUrl; + } + + public boolean isDisabled() + { + return disabled; + } + + public ArtifactRouterConfiguration setDisabled( final boolean disabled ) + { + this.disabled = disabled; + return this; + } + + public String getCanonicalMirrorsUrl() + { + return CANONICAL_MIRRORS_URL; + } + + public String getCanonicalGroupsUrl() + { + return CANONICAL_GROUPS_URL; + } + + public String[] getDiscoveryStrategies() + { + return discoveryStrategies == null ? new String[0] : discoveryStrategies; + } + + public ArtifactRouterConfiguration setDiscoveryStrategies( final String... strategies ) + { + discoveryStrategies = strategies; + return this; + } + + public File getSelectedRoutesFile() + { + return selectedRoutesFile; + } + + public ArtifactRouterConfiguration setSelectedRoutesFile( File selectedRoutesFile ) + { + this.selectedRoutesFile = selectedRoutesFile; + return this; + } + +} Propchange: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/ArtifactRouterConfiguration.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/ArtifactRouterConfigurationException.java URL: http://svn.apache.org/viewvc/maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/ArtifactRouterConfigurationException.java?rev=1126851&view=auto ============================================================================== --- maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/ArtifactRouterConfigurationException.java (added) +++ maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/ArtifactRouterConfigurationException.java Tue May 24 03:31:40 2011 @@ -0,0 +1,38 @@ +package org.apache.maven.artifact.router.conf; + +/* + * 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. + */ + +public class ArtifactRouterConfigurationException + extends Exception +{ + + private static final long serialVersionUID = 1L; + + public ArtifactRouterConfigurationException( final String message, final Throwable cause ) + { + super( message, cause ); + } + + public ArtifactRouterConfigurationException( final String message ) + { + super( message ); + } + +} Propchange: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/ArtifactRouterConfigurationException.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/DefaultRouterConfigBuilder.java URL: http://svn.apache.org/viewvc/maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/DefaultRouterConfigBuilder.java?rev=1126851&view=auto ============================================================================== --- maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/DefaultRouterConfigBuilder.java (added) +++ maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/DefaultRouterConfigBuilder.java Tue May 24 03:31:40 2011 @@ -0,0 +1,115 @@ +package org.apache.maven.artifact.router.conf; + +/* + * 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. + */ + +import static org.codehaus.plexus.util.IOUtil.close; +import static org.codehaus.plexus.util.StringUtils.isNotBlank; + +import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.component.annotations.Requirement; +import org.codehaus.plexus.logging.Logger; + +import javax.inject.Named; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +//@Component( role = RouterConfigBuilder.class ) +@Named( "default" ) +public class DefaultRouterConfigBuilder + implements RouterConfigBuilder +{ + + private static final String KEY_ROUTER_MIRRORS_URL = "router-mirrors-url"; + + private static final String KEY_ROUTER_GROUPS_URL = "router-groups-url"; + + private static final String KEY_ROUTER_USER = "router-user"; + + private static final String KEY_ROUTER_PASSWORD = "router-password"; + + private static final String KEY_DISABLED = "disabled"; + + private static final String KEY_DISCOVERY_STRATEGIES = "discovery-strategies"; + + @Requirement + private Logger logger; + + public ArtifactRouterConfiguration build( final RouterConfigSource source ) + throws ArtifactRouterConfigurationException + { + final ArtifactRouterConfiguration config = new ArtifactRouterConfiguration(); + + if ( logger.isDebugEnabled() ) + { + logger.debug( "Loading mirror configuration from file: " + source.getSource() ); + } + + if ( source.canRead() ) + { + InputStream stream = null; + try + { + stream = source.getInputStream(); + final Properties p = new Properties(); + p.load( stream ); + + config.setRouterMirrorsUrl( p.getProperty( KEY_ROUTER_MIRRORS_URL ) ); + config.setRouterGroupsUrl( p.getProperty( KEY_ROUTER_GROUPS_URL ) ); + config.setDisabled( Boolean.parseBoolean( p.getProperty( KEY_DISABLED, "false" ) ) ); + + final String user = p.getProperty( KEY_ROUTER_USER ); + final String pass = p.getProperty( KEY_ROUTER_PASSWORD ); + + final String[] strat = + p.getProperty( KEY_DISCOVERY_STRATEGIES, ArtifactRouterConfiguration.ALL_DISCOVERY_STRATEGIES ) + .split( "\\s*,\\s*" ); + + config.setDiscoveryStrategies( strat ); + + if ( isNotBlank( user ) && isNotBlank( pass ) ) + { + config.setRouterCredentials( user, pass ); + } + } + catch ( final IOException e ) + { + throw new ArtifactRouterConfigurationException( "Failed to read router config properties from: '" + + source.getSource() + "'.", e ); + } + finally + { + close( stream ); + } + } + else + { + if ( logger.isDebugEnabled() ) + { + logger.debug( "Cannot read router configuration from: " + source.getSource() + + ". Using defaults." ); + } + } + + return config; + } + +} Propchange: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/DefaultRouterConfigBuilder.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/FileRouterConfigSource.java URL: http://svn.apache.org/viewvc/maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/FileRouterConfigSource.java?rev=1126851&view=auto ============================================================================== --- maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/FileRouterConfigSource.java (added) +++ maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/FileRouterConfigSource.java Tue May 24 03:31:40 2011 @@ -0,0 +1,63 @@ +package org.apache.maven.artifact.router.conf; + +/* + * 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. + */ + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class FileRouterConfigSource + implements RouterConfigSource +{ + + private static final String CONFIG_FILENAME = "router.properties"; + + private File configFile; + + public FileRouterConfigSource( final File src ) + { + if ( src != null && src.isDirectory() ) + { + configFile = new File( src, CONFIG_FILENAME ); + } + else + { + configFile = src; + } + } + + public Object getSource() + { + return configFile; + } + + public boolean canRead() + { + return configFile != null && configFile.exists() && configFile.canRead() && !configFile.isDirectory(); + } + + public InputStream getInputStream() + throws IOException + { + return new FileInputStream( configFile ); + } + +} Propchange: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/FileRouterConfigSource.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/RouterConfigBuilder.java URL: http://svn.apache.org/viewvc/maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/RouterConfigBuilder.java?rev=1126851&view=auto ============================================================================== --- maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/RouterConfigBuilder.java (added) +++ maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/RouterConfigBuilder.java Tue May 24 03:31:40 2011 @@ -0,0 +1,28 @@ +package org.apache.maven.artifact.router.conf; + +/* + * 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. + */ + +public interface RouterConfigBuilder +{ + + ArtifactRouterConfiguration build( final RouterConfigSource source ) + throws ArtifactRouterConfigurationException; + +} \ No newline at end of file Propchange: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/RouterConfigBuilder.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/RouterConfigSource.java URL: http://svn.apache.org/viewvc/maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/RouterConfigSource.java?rev=1126851&view=auto ============================================================================== --- maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/RouterConfigSource.java (added) +++ maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/RouterConfigSource.java Tue May 24 03:31:40 2011 @@ -0,0 +1,35 @@ +package org.apache.maven.artifact.router.conf; + +/* + * 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. + */ + +import java.io.IOException; +import java.io.InputStream; + +public interface RouterConfigSource +{ + + Object getSource(); + + boolean canRead(); + + InputStream getInputStream() + throws IOException; + +} Propchange: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/conf/RouterConfigSource.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/discovery/ArtifactRouterDiscoveryStrategy.java URL: http://svn.apache.org/viewvc/maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/discovery/ArtifactRouterDiscoveryStrategy.java?rev=1126851&view=auto ============================================================================== --- maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/discovery/ArtifactRouterDiscoveryStrategy.java (added) +++ maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/discovery/ArtifactRouterDiscoveryStrategy.java Tue May 24 03:31:40 2011 @@ -0,0 +1,30 @@ +package org.apache.maven.artifact.router.discovery; + +/* + * 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. + */ + +import org.apache.maven.artifact.router.ArtifactRouterException; + +public interface ArtifactRouterDiscoveryStrategy +{ + + String findRouter() + throws ArtifactRouterException; + +} Propchange: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/discovery/ArtifactRouterDiscoveryStrategy.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/discovery/DNSDiscoveryStrategy.java URL: http://svn.apache.org/viewvc/maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/discovery/DNSDiscoveryStrategy.java?rev=1126851&view=auto ============================================================================== --- maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/discovery/DNSDiscoveryStrategy.java (added) +++ maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/discovery/DNSDiscoveryStrategy.java Tue May 24 03:31:40 2011 @@ -0,0 +1,107 @@ +package org.apache.maven.artifact.router.discovery; + +/* + * 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. + */ + +import org.apache.maven.artifact.router.ArtifactRouterException; +import org.codehaus.plexus.component.annotations.Component; + +import javax.naming.NamingException; +import javax.naming.directory.Attributes; +import javax.naming.directory.DirContext; +import javax.naming.directory.InitialDirContext; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; + +@Component( role = ArtifactRouterDiscoveryStrategy.class, hint = "dns" ) +final class DNSDiscoveryStrategy + implements ArtifactRouterDiscoveryStrategy +{ + + public String findRouter() + throws ArtifactRouterException + { + final Map<String, String> env = new HashMap<String, String>(); + env.put( "java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory" ); + + DirContext jndiContext; + try + { + jndiContext = new InitialDirContext( new Hashtable<String, String>( env ) ); + } + catch ( final NamingException e ) + { + throw new ArtifactRouterException( "Failed to initialize JNDI context for mirror-router DNS lookups: " + + e.getMessage(), e ); + } + + InetAddress[] addresses; + try + { + final InetAddress lh = InetAddress.getLocalHost(); + addresses = InetAddress.getAllByName( lh.getHostName() ); + } + catch ( final UnknownHostException e ) + { + throw new ArtifactRouterException( "Failed to retrieve local hostnames for mirror router: " + e.getMessage(), + e ); + } + + for ( final InetAddress addr : addresses ) + { + final String hostname = addr.getCanonicalHostName(); + + final int idx = hostname.indexOf( '.' ); + if ( idx > -1 ) + { + final String domain = hostname.substring( idx + 1 ); + final Attributes attrs; + try + { + attrs = jndiContext.getAttributes( "_maven." + domain, new String[] { "TXT" } ); + } + catch ( final NamingException e ) + { + continue; + } + + String txtRecord = null; + try + { + txtRecord = (String) attrs.get( "TXT" ).get(); + } + catch ( final NamingException e ) + { + } + + if ( txtRecord != null ) + { + return txtRecord; + } + } + } + + return null; + } + +} Propchange: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/discovery/DNSDiscoveryStrategy.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/loader/ArtifactRouterLoader.java URL: http://svn.apache.org/viewvc/maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/loader/ArtifactRouterLoader.java?rev=1126851&view=auto ============================================================================== --- maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/loader/ArtifactRouterLoader.java (added) +++ maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/loader/ArtifactRouterLoader.java Tue May 24 03:31:40 2011 @@ -0,0 +1,35 @@ +package org.apache.maven.artifact.router.loader; + +/* + * 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. + */ + +import org.apache.maven.artifact.router.ArtifactRouter; +import org.apache.maven.artifact.router.ArtifactRouterException; +import org.apache.maven.artifact.router.conf.ArtifactRouterConfiguration; + +public interface ArtifactRouterLoader +{ + + ArtifactRouter load( ArtifactRouterConfiguration config ) + throws ArtifactRouterException; + + void saveSelectedMirrors( ArtifactRouter router, ArtifactRouterConfiguration config ) + throws ArtifactRouterException; + +} Propchange: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/loader/ArtifactRouterLoader.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/loader/DefaultRouterLoader.java URL: http://svn.apache.org/viewvc/maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/loader/DefaultRouterLoader.java?rev=1126851&view=auto ============================================================================== --- maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/loader/DefaultRouterLoader.java (added) +++ maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/loader/DefaultRouterLoader.java Tue May 24 03:31:40 2011 @@ -0,0 +1,404 @@ +package org.apache.maven.artifact.router.loader; + +/* + * 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. + */ + +import static org.codehaus.plexus.util.IOUtil.close; + +import org.apache.http.Header; +import org.apache.http.HeaderElement; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.Credentials; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.HttpClient; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.maven.artifact.router.MirrorRoute; +import org.apache.maven.artifact.router.ArtifactRouteSerializer; +import org.apache.maven.artifact.router.ArtifactRouterModelException; +import org.apache.maven.artifact.router.ArtifactRoutingTables; +import org.apache.maven.artifact.router.ArtifactRouter; +import org.apache.maven.artifact.router.ArtifactRouterException; +import org.apache.maven.artifact.router.conf.ArtifactRouterConfiguration; +import org.apache.maven.artifact.router.discovery.ArtifactRouterDiscoveryStrategy; +import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.component.annotations.Requirement; +import org.codehaus.plexus.logging.Logger; +import org.codehaus.plexus.util.IOUtil; + +import javax.inject.Named; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +//@Component( role = ArtifactRouterLoader.class ) +@Named( "default" ) +public class DefaultRouterLoader + implements ArtifactRouterLoader +{ + + @Requirement( role = ArtifactRouterDiscoveryStrategy.class ) + private Map<String, ArtifactRouterDiscoveryStrategy> strategies; + + @Requirement + private Logger logger; + + public ArtifactRouter load( final ArtifactRouterConfiguration config ) + throws ArtifactRouterException + { + if ( config == null ) + { + return new ArtifactRouter(); + } + + ArtifactRoutingTables routingTable = loadRoutingTable( config ); + Map<String, MirrorRoute> selectedRoutes = loadSelectedRoutes( config ); + + return new ArtifactRouter( routingTable, selectedRoutes ); + } + + public void saveSelectedMirrors( final ArtifactRouter router, final ArtifactRouterConfiguration config ) + throws ArtifactRouterException + { + if ( config == null ) + { + return; + } + + Map<String, MirrorRoute> selectedRoutes = router.getSelectedRoutes(); + File selectedRoutesFile = config.getSelectedRoutesFile(); + if ( selectedRoutesFile != null ) + { + FileWriter writer = null; + try + { + File dir = selectedRoutesFile.getParentFile(); + if ( dir != null && !dir.exists() ) + { + dir.mkdirs(); + } + + writer = new FileWriter( selectedRoutesFile ); + ArtifactRouteSerializer.serializeLoose( new LinkedHashSet<MirrorRoute>( selectedRoutes.values() ), writer ); + } + catch ( IOException e ) + { + throw new ArtifactRouterException( "Cannot write selected mirrors to: " + selectedRoutesFile, e ); + } + catch ( ArtifactRouterModelException e ) + { + throw new ArtifactRouterException( "Cannot write selected mirrors to: " + selectedRoutesFile, e ); + } + finally + { + close( writer ); + } + } + } + + protected Map<String, MirrorRoute> loadSelectedRoutes( ArtifactRouterConfiguration config ) + throws ArtifactRouterException + { + File selectedRoutesFile = config.getSelectedRoutesFile(); + if ( selectedRoutesFile != null && selectedRoutesFile.exists() && selectedRoutesFile.canRead() ) + { + FileReader reader = null; + try + { + reader = new FileReader( selectedRoutesFile ); + Set<MirrorRoute> routes = ArtifactRouteSerializer.deserializeLoose( reader ); + + Map<String, MirrorRoute> result = new LinkedHashMap<String, MirrorRoute>(); + for ( MirrorRoute route : routes ) + { + for ( String mirrorOf : route.getMirrorOfUrls() ) + { + result.put( mirrorOf, route ); + } + } + + return result; + } + catch ( IOException e ) + { + throw new ArtifactRouterException( "Cannot read selected mirrors from: " + selectedRoutesFile, e ); + } + catch ( ArtifactRouterModelException e ) + { + throw new ArtifactRouterException( "Cannot read selected mirrors from: " + selectedRoutesFile, e ); + } + finally + { + close( reader ); + } + } + + return Collections.emptyMap(); + } + + protected ArtifactRoutingTables loadRoutingTable( final ArtifactRouterConfiguration config ) + throws ArtifactRouterException + { + ArtifactRoutingTables routingTable = null; + + if ( !config.isDisabled() ) + { + final DefaultHttpClient client = new DefaultHttpClient(); + if ( config.getRouterCredentials() != null ) + { + client.setCredentialsProvider( new CredentialsProvider() + { + public void setCredentials( final AuthScope authscope, final Credentials credentials ) + { + } + + public synchronized Credentials getCredentials( final AuthScope authscope ) + { + final UsernamePasswordCredentials creds = config.getRouterCredentials(); + return creds; + } + + public void clear() + { + } + } ); + } + + try + { + if ( config.getRouterMirrorsUrl() != null ) + { + routingTable = getMirrorMapping( config.getRouterMirrorsUrl(), config, client ); + } + else + { + final String[] discoStrategies = config.getDiscoveryStrategies(); + final List<ArtifactRouterDiscoveryStrategy> strats = new ArrayList<ArtifactRouterDiscoveryStrategy>(); + if ( discoStrategies.length == 1 ) + { + final String key = discoStrategies[0]; + if ( ArtifactRouterConfiguration.NO_DISCOVERY_STRATEGIES.equalsIgnoreCase( key ) ) + { + // NOP + } + else if ( ArtifactRouterConfiguration.ALL_DISCOVERY_STRATEGIES.equalsIgnoreCase( key ) ) + { + strats.addAll( strategies.values() ); + } + else + { + final ArtifactRouterDiscoveryStrategy strat = getDiscoveryStrategy( key ); + if ( strat != null ) + { + strats.add( strat ); + } + } + } + else + { + for ( final String key : discoStrategies ) + { + final ArtifactRouterDiscoveryStrategy strat = getDiscoveryStrategy( key ); + if ( strat != null ) + { + strats.add( strat ); + } + } + } + + String routerUrl = null; + for ( final ArtifactRouterDiscoveryStrategy strategy : strats ) + { + routerUrl = strategy.findRouter(); + if ( routerUrl != null && routerUrl.trim().length() > 0 ) + { + routingTable = getMirrorMapping( routerUrl, config, client ); + if ( routingTable != null ) + { + break; + } + } + } + } + + final String centralRouterUrl = config.getCanonicalMirrorsUrl(); + if ( routingTable == null && centralRouterUrl != null && centralRouterUrl.trim().length() > 0 ) + { + routingTable = getMirrorMapping( centralRouterUrl, config, client ); + } + } + catch ( final ArtifactRouterException e ) + { + if ( logger.isDebugEnabled() ) + { + logger.error( "Failed to auto-detect mirrors: " + e.getMessage(), e ); + } + } + } + + if ( routingTable == null ) + { + routingTable = new ArtifactRoutingTables(); + } + + return routingTable; + } + + private ArtifactRouterDiscoveryStrategy getDiscoveryStrategy( final String key ) + { + ArtifactRouterDiscoveryStrategy strat = strategies.get( key ); + if ( strat == null ) + { + strat = strategies.get( key.toLowerCase() ); + } + + if ( strat == null ) + { + logger.warn( "Cannot find RouterDiscoveryStrategy with hint: '" + key + "'" ); + } + + return strat; + } + + private ArtifactRoutingTables getMirrorMapping( final String routerUrl, final ArtifactRouterConfiguration config, + final HttpClient client ) + { + if ( config.isDisabled() ) + { + return new ArtifactRoutingTables(); + } + + if ( routerUrl != null && routerUrl.trim().length() > 0 ) + { + if ( logger.isDebugEnabled() ) + { + logger.debug( "Grabbing mirror mappings from: " + routerUrl.toString() ); + } + System.out.println( "Grabbing mirror mappings from: " + routerUrl ); + + final HttpGet get = new HttpGet( routerUrl ); + get.addHeader( "Accept", "application/json;q=0.9,*/*;q=0.8" ); + + try + { + return client.execute( get, new ResponseHandler<ArtifactRoutingTables>() + { + public ArtifactRoutingTables handleResponse( final HttpResponse response ) + throws /* ClientProtocolException, */IOException + { + final int statusCode = response.getStatusLine().getStatusCode(); + if ( statusCode == 200 ) + { + InputStream stream = null; + try + { + stream = response.getEntity().getContent(); + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + IOUtil.copy( stream, baos ); + + String content = null; + final Header contentType = response.getFirstHeader( "Content-Type" ); + if ( contentType != null ) + { + final HeaderElement[] contentTypeElts = contentType.getElements(); + + if ( contentTypeElts != null ) + { + for ( final HeaderElement elt : contentTypeElts ) + { + final NameValuePair nv = elt.getParameterByName( "charset" ); + if ( nv != null ) + { + content = new String( baos.toByteArray(), nv.getValue() ); + } + } + } + } + + if ( content == null ) + { + content = new String( baos.toByteArray() ); + } + + if ( logger.isDebugEnabled() ) + { + logger.debug( "Response code/message: '" + response.getStatusLine().getStatusCode() + + " " + response.getStatusLine().getReasonPhrase() + "'\nContent is:\n\n" + + content ); + } + + return ArtifactRouteSerializer.deserialize( content ); + } + catch ( final ArtifactRouterModelException e ) + { + logger.error( "Failed to retrieve mirror mapping from: " + routerUrl, e ); + } + finally + { + close( stream ); + } + } + else if ( logger.isDebugEnabled() ) + { + logger.debug( "Response: " + response.getStatusLine().getStatusCode() + " " + + response.getStatusLine().getReasonPhrase() ); + } + + return null; + } + } ); + } + catch ( final ClientProtocolException e ) + { + if ( logger.isDebugEnabled() ) + { + logger.debug( "Failed to read proxied repositories from: '" + routerUrl + "'. Reason: " + + e.getMessage(), e ); + } + } + catch ( final IOException e ) + { + if ( logger.isDebugEnabled() ) + { + logger.debug( "Failed to read proxied repositories from: '" + routerUrl + "'. Reason: " + + e.getMessage(), e ); + } + } + } + + return null; + } + +} Propchange: maven/maven-3/branches/mirror-group-routing/maven-routem-impl/src/main/java/org/apache/maven/artifact/router/loader/DefaultRouterLoader.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: maven/maven-3/branches/mirror-group-routing/pom.xml URL: http://svn.apache.org/viewvc/maven/maven-3/branches/mirror-group-routing/pom.xml?rev=1126851&r1=1126850&r2=1126851&view=diff ============================================================================== --- maven/maven-3/branches/mirror-group-routing/pom.xml (original) +++ maven/maven-3/branches/mirror-group-routing/pom.xml Tue May 24 03:31:40 2011 @@ -37,7 +37,7 @@ <classWorldsVersion>2.4</classWorldsVersion> <commonsCliVersion>1.2</commonsCliVersion> <easyMockVersion>1.2_Java1.3</easyMockVersion> - <junitVersion>3.8.2</junitVersion> + <junitVersion>4.8.2</junitVersion> <plexusVersion>1.5.5</plexusVersion> <plexusInterpolationVersion>1.14</plexusInterpolationVersion> <plexusUtilsVersion>2.0.6</plexusUtilsVersion> @@ -141,6 +141,7 @@ <module>maven-embedder</module> <module>maven-compat</module> <module>maven-routem-api</module> + <module>maven-routem-impl</module> </modules> <scm> @@ -176,6 +177,11 @@ </dependency> <dependency> <groupId>org.apache.maven</groupId> + <artifactId>maven-routem-impl</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> <artifactId>maven-model</artifactId> <version>${project.version}</version> </dependency> Modified: maven/maven-3/branches/mirror-group-routing/pom.xml.orig URL: http://svn.apache.org/viewvc/maven/maven-3/branches/mirror-group-routing/pom.xml.orig?rev=1126851&r1=1126850&r2=1126851&view=diff ============================================================================== --- maven/maven-3/branches/mirror-group-routing/pom.xml.orig (original) +++ maven/maven-3/branches/mirror-group-routing/pom.xml.orig Tue May 24 03:31:40 2011 @@ -140,7 +140,7 @@ <module>maven-model-builder</module> <module>maven-embedder</module> <module>maven-compat</module> - <module>maven-auto-mirror-model</module> + <module>maven-routem-api</module> </modules> <scm> @@ -171,7 +171,7 @@ <!--bootstrap-start-comment--> <dependency> <groupId>org.apache.maven</groupId> - <artifactId>maven-auto-mirror-model</artifactId> + <artifactId>maven-routem-api</artifactId> <version>${project.version}</version> </dependency> <dependency> @@ -345,7 +345,7 @@ <version>${jxpathVersion}</version> </dependency> - <!-- START: Used in auto-mirror handling --> + <!-- START: Used in Route-M auto-mirror handling --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId>