/*******************************************************************************
* Copyright (c) 2015 Red Hat, Inc. Distributed under license by Red Hat, Inc.
* All rights reserved. This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: Red Hat, Inc.
******************************************************************************/
package com.openshift.internal.restclient.model.properties;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.openshift.internal.restclient.APIModelVersion;
import com.openshift.internal.restclient.KubernetesAPIVersion;
import com.openshift.internal.restclient.OpenShiftAPIVersion;
import com.openshift.restclient.IncompatibleApiVersionsException;
/**
* Registry of paths that override a default
*
* @author Jeff Cantrill
*/
public class ResourcePropertiesRegistry implements ResourcePropertyKeys {
private static ResourcePropertiesRegistry instance;
private final Map<VersionKey, Map<String, String []>> versionPropertyMap = new HashMap<VersionKey, Map<String, String []>>();
private ResourcePropertiesRegistry(){
}
public static final ResourcePropertiesRegistry getInstance(){
if(instance == null){
instance = new ResourcePropertiesRegistry();
}
return instance;
}
/**
* Retrieve a given resource property map for a given version
* @param apiVersion
* @param kind
*
* @return The set of paths for the properties of the resource
*/
public Map<String, String []> get(final String apiVersion, final String kind) {
final VersionKey key = new VersionKey(apiVersion, kind);
if(!versionPropertyMap.containsKey(key)){
return new HashMap<String, String []>();
}
return versionPropertyMap.get(key);
}
public KubernetesAPIVersion [] getSupportedKubernetesVersions(){
return new KubernetesAPIVersion[] {KubernetesAPIVersion.v1};
}
public OpenShiftAPIVersion[] getSupportedOpenShiftVersions(){
return new OpenShiftAPIVersion[] {OpenShiftAPIVersion.v1};
}
/**
* The maximum Kubernetes API supported by this client
* @return
* @throws IncompatibleApiVersionsException if the client can not support the server
*/
public KubernetesAPIVersion getMaxSupportedKubernetesVersion(List<KubernetesAPIVersion> serverVersions) {
return getMaxSupportedVersion(Arrays.asList(getSupportedKubernetesVersions()), serverVersions);
}
/**
* The maximum OpenShift API supported by this client
* @return
* @throws IncompatibleApiVersionsException if the client can not support the server
*/
public OpenShiftAPIVersion getMaxSupportedOpenShiftVersion(List<OpenShiftAPIVersion> serverVersions){
return getMaxSupportedVersion(Arrays.asList(getSupportedOpenShiftVersions()), serverVersions);
}
private <T extends APIModelVersion> T getMaxSupportedVersion(List<T> clientVersions, List<T> serverVersions) {
Collections.sort(clientVersions, new APIModelVersion.VersionComparitor());
Collections.sort(serverVersions, new APIModelVersion.VersionComparitor());
T maxClientVersion = clientVersions.get(clientVersions.size() - 1);
T maxServerVersion = serverVersions.get(serverVersions.size() - 1);
if(serverVersions.contains(maxClientVersion)) {
return maxClientVersion;
}
if(clientVersions.contains(maxServerVersion)) {
return maxServerVersion;
}
throw new IncompatibleApiVersionsException(clientVersions.toString(), serverVersions.toString());
}
private static class VersionKey {
private String version;
private String kind;
VersionKey(APIModelVersion version, String kind){
this(version.toString(), kind);
}
VersionKey(String version, String kind){
this.version = version.toString();
this.kind = kind;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((kind == null) ? 0 : kind.hashCode());
result = prime * result
+ ((version == null) ? 0 : version.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
VersionKey other = (VersionKey) obj;
if (kind == null) {
if (other.kind != null)
return false;
} else if (!kind.equals(other.kind))
return false;
if (version == null) {
if (other.version != null)
return false;
} else if (!version.equals(other.version))
return false;
return true;
}
}
}