blob: 14dfd7ae8c1aafb596019b08490b8d7b2f45f349 [file] [log] [blame]
/*
* 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.
*/
package npanday.vendor.impl;
import npanday.PlatformUnsupportedException;
import npanday.model.settings.Framework;
import npanday.registry.RepositoryRegistry;
import npanday.vendor.InvalidVersionFormatException;
import npanday.vendor.SettingsRepository;
import npanday.vendor.Vendor;
import npanday.vendor.VendorInfo;
import npanday.vendor.VendorInfoMatchPolicy;
import npanday.vendor.VendorInfoRepository;
import npanday.vendor.VendorRequirement;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
* Provides an implementation of <code>VendorInfoRepository</code>.
*
* @author Shane Isbell
*/
public class VendorInfoRepositoryImpl
implements VendorInfoRepository, LogEnabled
{
/**
* A registry component of repository (config) files
* @component
*/
private RepositoryRegistry repositoryRegistry;
/**
* A logger for writing log messages
*/
private Logger logger;
/**
* Cache
*/
private List<VendorInfo> cachedVendorInfos;
/**
* The version the repository was at, when the cache was built up.
*/
private int cachedVendorInfosContentVersion;
/**
* Constructor. This method is intended to be invoked by the plexus-container, not by the application developer.
*/
public VendorInfoRepositoryImpl()
{
}
/**
* @see LogEnabled#enableLogging(org.codehaus.plexus.logging.Logger)
*/
public void enableLogging( Logger logger )
{
this.logger = logger;
}
public void clearCache()
{
if ( cachedVendorInfos != null )
{
cachedVendorInfos.clear();
cachedVendorInfos = null;
}
}
public VendorInfo getSingleVendorInfoByRequirement( VendorRequirement vendorRequirement )
throws PlatformUnsupportedException
{
List<VendorInfo> infos = getVendorInfosFor( vendorRequirement, false);
if (infos.size() == 0) {
throw new PlatformUnsupportedException( "NPANDAY-113-001: Could not find configuration for " + vendorRequirement );
}
if (infos.size() > 2) {
// reloadAll default
infos = getVendorInfosFor( vendorRequirement, true);
}
assert infos.size() == 1;
return infos.get(0);
}
private List<VendorInfo> getVendorInfos()
{
ensureCache();
return Collections.unmodifiableList( cachedVendorInfos );
}
private void ensureCache()
{
SettingsRepository settingsRepository = (SettingsRepository) repositoryRegistry.find( "npanday-settings" );
if (settingsRepository.isEmpty()) {
logger.warn( "NPANDAY-113-000: The settings repository does not contain any vendor information" );
}
if ( settingsRepository.getContentVersion() > cachedVendorInfosContentVersion )
{
clearCache();
}
if ( cachedVendorInfos != null && cachedVendorInfos.size() > 0 )
{
return;
}
cachedVendorInfosContentVersion = settingsRepository.getContentVersion();
cachedVendorInfos = new ArrayList<VendorInfo>();
for ( npanday.model.settings.Vendor v : settingsRepository.getVendors() )
{
List<Framework> frameworks = v.getFrameworks();
for ( Framework framework : frameworks )
{
cachedVendorInfos.add( new SettingsBasedVendorInfo( v, framework ) );
}
}
}
/**
* @see VendorInfoRepository#getMaxVersion(java.util.Set<String>)
*/
public String getMaxVersion( Set<String> versions )
throws InvalidVersionFormatException
{
return new VersionMatcher().getMaxVersion( versions );
}
/**
* @see VendorInfoRepository#getVendorInfosFor(String, String, String, boolean)
*/
public List<VendorInfo> getVendorInfosFor( String vendorName, String vendorVersion, String frameworkVersion,
boolean defaultOnly )
{
List<VendorInfo> vendorInfos = new ArrayList<VendorInfo>();
MatchPolicyFactory matchPolicyFactory = new MatchPolicyFactory();
matchPolicyFactory.init( logger );
List<VendorInfoMatchPolicy> matchPolicies = new ArrayList<VendorInfoMatchPolicy>();
if ( vendorName != null )
{
matchPolicies.add( matchPolicyFactory.createVendorNamePolicy( vendorName ) );
}
if ( vendorVersion != null )
{
matchPolicies.add( matchPolicyFactory.createVendorVersionPolicy( vendorVersion ) );
}
if ( frameworkVersion != null )
{
matchPolicies.add( matchPolicyFactory.createFrameworkVersionPolicy( frameworkVersion ) );
}
if ( defaultOnly )
{
matchPolicies.add( matchPolicyFactory.createVendorIsDefaultPolicy() );
}
for ( VendorInfo vendorInfo : getVendorInfos() )
{
if ( matchVendorInfo( vendorInfo, matchPolicies ) )
{
vendorInfos.add( vendorInfo );
}
}
return vendorInfos;
}
/**
* @see VendorInfoRepository#getVendorInfosFor(npanday.vendor.VendorRequirement, boolean)
*/
public List<VendorInfo> getVendorInfosFor( VendorRequirement vendorRequirement, boolean defaultOnly )
{
if ( vendorRequirement == null )
{
return getVendorInfos();
}
return getVendorInfosFor( ( vendorRequirement.getVendor() != null ? vendorRequirement.getVendor().getVendorName() : null ),
vendorRequirement.getVendorVersion(), vendorRequirement.getFrameworkVersion(), defaultOnly );
}
/**
* Returns true if the specified vendor info matches <i>all</i> of the specified match policies, otherwise returns
* false.
*
* @param vendorInfo the vendor info to match against the match policies
* @param matchPolicies the match policies
* @return true if the specified vendor info matches <i>all</i> of the specified match policies, otherwise returns
* false
*/
private boolean matchVendorInfo( VendorInfo vendorInfo, List<VendorInfoMatchPolicy> matchPolicies )
{
for ( VendorInfoMatchPolicy matchPolicy : matchPolicies )
{
if ( !matchPolicy.match( vendorInfo ) )
{
return false;
}
}
return true;
}
public File getGlobalAssemblyCacheDirectoryFor( Vendor vendor, String frameworkVersion, String artifactType )
throws PlatformUnsupportedException
{
return getSingleVendorInfoByRequirement( new VendorRequirement( vendor, null, frameworkVersion ) )
.getGlobalAssemblyCacheDirectoryFor(artifactType);
}
public boolean isEmpty()
{
return getVendorInfos().size() == 0;
}
public void setRepositoryRegistry( RepositoryRegistry repositoryRegistry )
{
this.repositoryRegistry = repositoryRegistry;
}
}