This project has retired. For details please refer to its Attic page.
Source code
001package org.apache.archiva.admin.repository.proxyconnector;
002/*
003 * Licensed to the Apache Software Foundation (ASF) under one
004 * or more contributor license agreements.  See the NOTICE file
005 * distributed with this work for additional information
006 * regarding copyright ownership.  The ASF licenses this file
007 * to you under the Apache License, Version 2.0 (the
008 * "License"); you may not use this file except in compliance
009 * with the License.  You may obtain a copy of the License at
010 *
011 *   http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing,
014 * software distributed under the License is distributed on an
015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
016 * KIND, either express or implied.  See the License for the
017 * specific language governing permissions and limitations
018 * under the License.
019 */
020
021import org.apache.archiva.admin.model.AuditInformation;
022import org.apache.archiva.admin.model.RepositoryAdminException;
023import org.apache.archiva.admin.model.beans.ProxyConnector;
024import org.apache.archiva.admin.model.proxyconnector.ProxyConnectorAdmin;
025import org.apache.archiva.admin.model.proxyconnector.ProxyConnectorOrderComparator;
026import org.apache.archiva.admin.repository.AbstractRepositoryAdmin;
027import org.apache.archiva.configuration.Configuration;
028import org.apache.archiva.configuration.ProxyConnectorConfiguration;
029import org.apache.archiva.configuration.functors.ProxyConnectorSelectionPredicate;
030import org.apache.archiva.metadata.model.facets.AuditEvent;
031import org.apache.archiva.repository.RepositoryRegistry;
032import org.apache.commons.collections4.IterableUtils;
033import org.apache.commons.lang3.StringUtils;
034import org.springframework.stereotype.Service;
035
036import javax.inject.Inject;
037import java.util.ArrayList;
038import java.util.Collections;
039import java.util.HashMap;
040import java.util.Iterator;
041import java.util.List;
042import java.util.Map;
043
044/**
045 * @author Olivier Lamy
046 * @since 1.4-M1
047 */
048@Service ( "proxyConnectorAdmin#default" )
049public class DefaultProxyConnectorAdmin
050    extends AbstractRepositoryAdmin
051    implements ProxyConnectorAdmin
052{
053
054    @Inject
055    RepositoryRegistry repositoryRegistry;
056
057    @Override
058    public List<ProxyConnector> getProxyConnectors()
059        throws RepositoryAdminException
060    {
061        List<ProxyConnectorConfiguration> proxyConnectorConfigurations =
062            getArchivaConfiguration().getConfiguration().getProxyConnectors();
063        List<ProxyConnector> proxyConnectors = new ArrayList<>( proxyConnectorConfigurations.size() );
064        for ( ProxyConnectorConfiguration configuration : proxyConnectorConfigurations )
065        {
066            proxyConnectors.add( getProxyConnector( configuration ) );
067        }
068        Collections.sort( proxyConnectors, ProxyConnectorOrderComparator.getInstance() );
069        return proxyConnectors;
070    }
071
072    @Override
073    public ProxyConnector getProxyConnector( String sourceRepoId, String targetRepoId )
074        throws RepositoryAdminException
075    {
076        for ( ProxyConnector proxyConnector : getProxyConnectors() )
077        {
078            if ( StringUtils.equals( sourceRepoId, proxyConnector.getSourceRepoId() ) && StringUtils.equals(
079                targetRepoId, proxyConnector.getTargetRepoId() ) )
080            {
081                return proxyConnector;
082            }
083        }
084        return null;
085    }
086
087    @Override
088    public Boolean addProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation )
089        throws RepositoryAdminException
090    {
091        if ( getProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId() ) != null )
092        {
093            throw new RepositoryAdminException(
094                "Unable to add proxy connector, as one already exists with source repository id ["
095                    + proxyConnector.getSourceRepoId() + "] and target repository id ["
096                    + proxyConnector.getTargetRepoId() + "]." );
097        }
098
099        validateProxyConnector( proxyConnector );
100
101        proxyConnector.setBlackListPatterns( unescapePatterns( proxyConnector.getBlackListPatterns() ) );
102        proxyConnector.setWhiteListPatterns( unescapePatterns( proxyConnector.getWhiteListPatterns() ) );
103
104        Configuration configuration = getArchivaConfiguration().getConfiguration();
105
106        ProxyConnectorConfiguration proxyConnectorConfiguration = getProxyConnectorConfiguration( proxyConnector );
107        configuration.addProxyConnector( proxyConnectorConfiguration );
108        saveConfiguration( configuration );
109        triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null,
110                           AuditEvent.ADD_PROXY_CONNECTOR, auditInformation );
111        return Boolean.TRUE;
112
113    }
114
115    // FIXME take care of proxyConnectorRules !
116    @Override
117    public Boolean deleteProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation )
118        throws RepositoryAdminException
119    {
120        Configuration configuration = getArchivaConfiguration().getConfiguration();
121        ProxyConnectorConfiguration proxyConnectorConfiguration =
122            findProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId(), configuration );
123        if ( proxyConnectorConfiguration == null )
124        {
125            throw new RepositoryAdminException(
126                "unable to find ProxyConnector with source " + proxyConnector.getSourceRepoId() + " and target "
127                    + proxyConnector.getTargetRepoId() );
128        }
129        configuration.removeProxyConnector( proxyConnectorConfiguration );
130        saveConfiguration( configuration );
131        triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null,
132                           AuditEvent.DELETE_PROXY_CONNECTOR, auditInformation );
133        return Boolean.TRUE;
134    }
135
136    // FIXME care take of proxyConnectorRules !
137    @Override
138    public Boolean updateProxyConnector( ProxyConnector proxyConnector, AuditInformation auditInformation )
139        throws RepositoryAdminException
140    {
141        Configuration configuration = getArchivaConfiguration().getConfiguration();
142        ProxyConnectorConfiguration proxyConnectorConfiguration =
143            findProxyConnector( proxyConnector.getSourceRepoId(), proxyConnector.getTargetRepoId(), configuration );
144        configuration.removeProxyConnector( proxyConnectorConfiguration );
145        configuration.addProxyConnector( getProxyConnectorConfiguration( proxyConnector ) );
146        saveConfiguration( configuration );
147        triggerAuditEvent( proxyConnector.getSourceRepoId() + "-" + proxyConnector.getTargetRepoId(), null,
148                           AuditEvent.MODIFY_PROXY_CONNECTOR, auditInformation );
149        return Boolean.TRUE;
150    }
151
152    protected List<String> unescapePatterns( List<String> patterns )
153    {
154        if ( patterns != null )
155        {
156            List<String> rawPatterns = new ArrayList<>( patterns.size() );
157            for ( String pattern : patterns )
158            {
159                rawPatterns.add( StringUtils.replace( pattern, "\\\\", "\\" ) );
160            }
161            return rawPatterns;
162        }
163
164        return Collections.emptyList();
165    }
166
167    @Override
168    public Map<String, List<ProxyConnector>> getProxyConnectorAsMap()
169        throws RepositoryAdminException
170    {
171        Map<String, List<ProxyConnector>> proxyConnectorMap = new HashMap<>();
172
173        Iterator<ProxyConnector> it = getProxyConnectors().iterator();
174        while ( it.hasNext() )
175        {
176            ProxyConnector proxyConfig = it.next();
177            String key = proxyConfig.getSourceRepoId();
178
179            List<ProxyConnector> connectors = proxyConnectorMap.get( key );
180            if ( connectors == null )
181            {
182                connectors = new ArrayList<>( 1 );
183                proxyConnectorMap.put( key, connectors );
184            }
185
186            connectors.add( proxyConfig );
187
188            Collections.sort( connectors, ProxyConnectorOrderComparator.getInstance() );
189        }
190
191        return proxyConnectorMap;
192    }
193
194    private ProxyConnectorConfiguration findProxyConnector( String sourceId, String targetId,
195                                                            Configuration configuration )
196    {
197        if ( StringUtils.isBlank( sourceId ) )
198        {
199            return null;
200        }
201
202        if ( StringUtils.isBlank( targetId ) )
203        {
204            return null;
205        }
206
207        ProxyConnectorSelectionPredicate selectedProxy = new ProxyConnectorSelectionPredicate( sourceId, targetId );
208        return IterableUtils.find( configuration.getProxyConnectors(), selectedProxy );
209    }
210
211    protected ProxyConnectorConfiguration getProxyConnectorConfiguration( ProxyConnector proxyConnector )
212    {
213        return proxyConnector == null
214            ? null
215            : getModelMapper().map( proxyConnector, ProxyConnectorConfiguration.class );
216    }
217
218    protected ProxyConnector getProxyConnector( ProxyConnectorConfiguration proxyConnectorConfiguration )
219    {
220        return proxyConnectorConfiguration == null
221            ? null
222            : getModelMapper().map( proxyConnectorConfiguration, ProxyConnector.class );
223    }
224
225    protected void validateProxyConnector( ProxyConnector proxyConnector )
226        throws RepositoryAdminException
227    {
228        // validate source a Managed target a Remote
229        if ( repositoryRegistry.getManagedRepository( proxyConnector.getSourceRepoId() ) == null )
230        {
231            throw new RepositoryAdminException(
232                "non valid ProxyConnector sourceRepo with id " + proxyConnector.getSourceRepoId()
233                    + " is not a ManagedRepository" );
234        }
235        if ( repositoryRegistry.getRemoteRepository( proxyConnector.getTargetRepoId() ) == null )
236        {
237            throw new RepositoryAdminException(
238                "non valid ProxyConnector sourceRepo with id " + proxyConnector.getTargetRepoId()
239                    + " is not a RemoteRepository" );
240        }
241
242        // FIXME validate NetworkProxyConfiguration too when available
243    }
244}