/*
*
* Copyright (C) 2010 JFrog Ltd.
*
* 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.jfrog.wharf.ivy.cache;
import org.apache.ivy.core.settings.IvySettings;
import org.apache.ivy.plugins.resolver.DependencyResolver;
import org.apache.ivy.util.Message;
import org.jfrog.wharf.ivy.marshall.api.WharfResolverMarshaller;
import org.jfrog.wharf.ivy.model.WharfResolverMetadata;
import java.io.File;
import java.util.*;
/**
* @author Tomer Cohen
*/
public class ResolverHandler {
/**
* This is the directory where you have the right to put all of the needed files for the handler. Default is
* cacheDir/.wharf
*/
private final File baseDir;
private final IvySettings settings;
private final Map<String, WharfResolverMetadata> resolvers;
private final Map<Integer, WharfResolverMetadata> resolverFromDependencyResolverHash;
private final WharfResolverMarshaller wharfResolverMarshaller;
public ResolverHandler(File baseDir, IvySettings settings, WharfResolverMarshaller wharfResolverMarshaller) {
this.baseDir = baseDir;
this.settings = settings;
this.wharfResolverMarshaller = wharfResolverMarshaller;
this.resolvers = new HashMap<String, WharfResolverMetadata>();
this.resolverFromDependencyResolverHash = new HashMap<Integer, WharfResolverMetadata>();
// populate the set of resolvers from the baseDir/resolvers.json file
Set<WharfResolverMetadata> resolverMetadataIds = wharfResolverMarshaller.getWharfMetadatas(baseDir);
for (WharfResolverMetadata wharfResolverMetadata : resolverMetadataIds) {
resolvers.put(wharfResolverMetadata.getId(), wharfResolverMetadata);
}
}
/**
* @param resolver the ivy dependency resolver to convert to wharf resolver metadata
* @return Get a resolver ID according
*/
public WharfResolverMetadata getResolver(DependencyResolver resolver) {
// find in shortcut
if (resolver == null) {
throw new IllegalArgumentException("Cannot find null resolver");
}
int hash = resolver.hashCode();
if (resolverFromDependencyResolverHash.containsKey(hash)) {
return resolverFromDependencyResolverHash.get(hash);
}
// Need to find if in my cache then save to json file and shortcut
WharfResolverMetadata wharfResolverMetadata = new WharfResolverMetadata(resolver);
resolverFromDependencyResolverHash.put(hash, wharfResolverMetadata);
resolvers.put(wharfResolverMetadata.getId(), wharfResolverMetadata);
saveCacheResolverFile();
return wharfResolverMetadata;
}
/**
* @return set of all resolvers Ids ever used in this cache
*/
public Collection<WharfResolverMetadata> getAllResolvers() {
return resolvers.values();
}
public WharfResolverMetadata getResolver(String resolverId) {
return resolvers.get(resolverId);
}
public void saveCacheResolverFile() {
wharfResolverMarshaller.save(baseDir, new HashSet<WharfResolverMetadata>(getAllResolvers()));
}
public boolean isActiveResolver(String resolverId) {
WharfResolverMetadata resolverMetadata = getResolver(resolverId);
if (resolverMetadata == null) {
Message.error("No resolver for " + resolverId + " This cannot happen, please check cache corruption");
return false;
}
if (settings.getResolverNames().contains(resolverMetadata.name)) {
String currentResolverId = new WharfResolverMetadata(settings.getResolver(resolverMetadata.name)).getId();
return resolverId.equals(currentResolverId);
}
return false;
}
}