001package org.eclipse.aether.internal.impl;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 * 
012 *  http://www.apache.org/licenses/LICENSE-2.0
013 * 
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import java.util.regex.Pattern;
023
024import javax.inject.Named;
025
026import org.eclipse.aether.RepositorySystemSession;
027import org.eclipse.aether.impl.OfflineController;
028import org.eclipse.aether.repository.RemoteRepository;
029import org.eclipse.aether.transfer.RepositoryOfflineException;
030import org.eclipse.aether.util.ConfigUtils;
031
032/**
033 * 
034 */
035@Named
036public class DefaultOfflineController
037    implements OfflineController
038{
039
040    static final String CONFIG_PROP_OFFLINE_PROTOCOLS = "aether.offline.protocols";
041
042    static final String CONFIG_PROP_OFFLINE_HOSTS = "aether.offline.hosts";
043
044    private static final Pattern SEP = Pattern.compile( "\\s*,\\s*" );
045
046    public DefaultOfflineController()
047    {
048        // enables default constructor
049    }
050
051    public void checkOffline( RepositorySystemSession session, RemoteRepository repository )
052        throws RepositoryOfflineException
053    {
054        if ( isOfflineProtocol( session, repository ) || isOfflineHost( session, repository ) )
055        {
056            return;
057        }
058
059        throw new RepositoryOfflineException( repository );
060    }
061
062    private boolean isOfflineProtocol( RepositorySystemSession session, RemoteRepository repository )
063    {
064        String[] protocols = getConfig( session, CONFIG_PROP_OFFLINE_PROTOCOLS );
065        if ( protocols != null )
066        {
067            String protocol = repository.getProtocol();
068            if ( protocol.length() > 0 )
069            {
070                for ( String p : protocols )
071                {
072                    if ( p.equalsIgnoreCase( protocol ) )
073                    {
074                        return true;
075                    }
076                }
077            }
078        }
079        return false;
080    }
081
082    private boolean isOfflineHost( RepositorySystemSession session, RemoteRepository repository )
083    {
084        String[] hosts = getConfig( session, CONFIG_PROP_OFFLINE_HOSTS );
085        if ( hosts != null )
086        {
087            String host = repository.getHost();
088            if ( host.length() > 0 )
089            {
090                for ( String h : hosts )
091                {
092                    if ( h.equalsIgnoreCase( host ) )
093                    {
094                        return true;
095                    }
096                }
097            }
098        }
099        return false;
100    }
101
102    private String[] getConfig( RepositorySystemSession session, String key )
103    {
104        String value = ConfigUtils.getString( session, "", key ).trim();
105        if ( value.length() <= 0 )
106        {
107            return null;
108        }
109        return SEP.split( value );
110    }
111
112}