package org.springframework.cloud.cloudfoundry;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.springframework.cloud.ServiceInfoCreator;
import org.springframework.cloud.service.ServiceInfo;
/**
* @author Ramnivas Laddad
* @author Scott Frederick
*/
public abstract class CloudFoundryServiceInfoCreator<SI extends ServiceInfo> implements ServiceInfoCreator<SI, Map<String, Object>> {
private Tags tags;
private String[] uriSchemes;
public CloudFoundryServiceInfoCreator(Tags tags, String... uriSchemes) {
this.tags = tags;
this.uriSchemes = uriSchemes;
}
public boolean accept(Map<String, Object> serviceData) {
return tagsMatch(serviceData) || labelStartsWithTag(serviceData) ||
uriMatchesScheme(serviceData) || uriKeyMatchesScheme(serviceData);
}
@SuppressWarnings("unchecked")
protected boolean tagsMatch(Map<String, Object> serviceData) {
List<String> serviceTags = (List<String>) serviceData.get("tags");
return tags.containsOne(serviceTags);
}
protected boolean labelStartsWithTag(Map<String, Object> serviceData) {
String label = (String) serviceData.get("label");
return tags.startsWith(label);
}
protected boolean uriMatchesScheme(Map<String, Object> serviceData) {
if (uriSchemes == null) {
return false;
}
String uri = getUriFromCredentials(getCredentials(serviceData));
if (uri != null) {
for (String uriScheme : uriSchemes) {
if (uri.startsWith(uriScheme + "://")) {
return true;
}
}
}
return false;
}
protected boolean uriKeyMatchesScheme(Map<String, Object> serviceData) {
if (uriSchemes == null) {
return false;
}
Map<String, Object> credentials = getCredentials(serviceData);
if (credentials != null) {
for (String uriScheme : uriSchemes) {
if (credentials.containsKey(uriScheme + "Uri") || credentials.containsKey(uriScheme + "uri") ||
credentials.containsKey(uriScheme + "Url") || credentials.containsKey(uriScheme + "url")) {
return true;
}
}
}
return false;
}
protected String getId(Map<String, Object> serviceData) {
return (String) serviceData.get("name");
}
@SuppressWarnings("unchecked")
protected Map<String, Object> getCredentials(Map<String, Object> serviceData) {
return (Map<String, Object>) serviceData.get("credentials");
}
protected String getUriFromCredentials(Map<String, Object> credentials) {
List<String> keys = new ArrayList<String>();
keys.addAll(Arrays.asList("uri", "url"));
for (String uriScheme : uriSchemes) {
keys.add(uriScheme + "Uri");
keys.add(uriScheme + "uri");
keys.add(uriScheme + "Url");
keys.add(uriScheme + "url");
}
return getStringFromCredentials(credentials, keys.toArray(new String[keys.size()]));
}
protected String getStringFromCredentials(Map<String, Object> credentials, String... keys) {
if (credentials != null) {
for (String key : keys) {
if (credentials.containsKey(key)) {
return (String) credentials.get(key);
}
}
}
return null;
}
protected int getIntFromCredentials(Map<String, Object> credentials, String... keys) {
if (credentials != null) {
for (String key : keys) {
if (credentials.containsKey(key)) {
// allows the value to be quoted as a String or native integer type
return Integer.parseInt(credentials.get(key).toString());
}
}
}
return -1;
}
public String[] getUriSchemes() {
return uriSchemes;
}
public String getDefaultUriScheme() {
return uriSchemes[0];
}
}