package org.springframework.cloud.cloudfoundry; import java.util.Map; import org.springframework.cloud.service.common.RelationalServiceInfo; import org.springframework.cloud.util.UriInfo; import static org.springframework.cloud.service.common.RelationalServiceInfo.JDBC_PREFIX; /** * * @author Ramnivas Laddad * */ public abstract class RelationalServiceInfoCreator<SI extends RelationalServiceInfo> extends CloudFoundryServiceInfoCreator<SI> { public RelationalServiceInfoCreator(Tags tags, String... uriSchemes) { super(tags, uriSchemes); } @Override public boolean accept(Map<String, Object> serviceData) { return jdbcUrlMatchesScheme(serviceData) || super.accept(serviceData); } protected boolean jdbcUrlMatchesScheme(Map<String, Object> serviceData) { if (getUriSchemes() == null) { return false; } Map<String, Object> credentials = getCredentials(serviceData); String jdbcUrl = getStringFromCredentials(credentials, "jdbcUrl"); if (jdbcUrl != null) { for (String uriScheme : getUriSchemes()) { if (jdbcUrl.startsWith(JDBC_PREFIX + uriScheme + ":")) { return true; } } } return false; } public abstract SI createServiceInfo(String id, String uri, String jdbcUrl); public SI createServiceInfo(Map<String, Object> serviceData) { String id = getId(serviceData); Map<String,Object> credentials = getCredentials(serviceData); String jdbcUrl = getStringFromCredentials(credentials, "jdbcUrl"); String uri = getUriFromCredentials(credentials); if (uri == null) { String host = getStringFromCredentials(credentials, "hostname", "host"); int port = getIntFromCredentials(credentials, "port"); String username = getStringFromCredentials(credentials, "user", "username"); String password = (String) credentials.get("password"); String database = (String) credentials.get("name"); if (host != null) { uri = new UriInfo(getDefaultUriScheme(), host, port, username, password, database).toString(); } } if (uri == null) { uri = jdbcUrl; } return createServiceInfo(id, uri, jdbcUrl); } }