Skip to content

Commit

Permalink
Modify cloud:data-source to work with PostgreSQL relational database …
Browse files Browse the repository at this point in the history
…service

Change-Id: Ie90ebb2bbec951bc20afd3d0ec4b90c61e1933c7
  • Loading branch information
Thomas Risberg committed Sep 12, 2011
1 parent 82477f2 commit 284cf15
Show file tree
Hide file tree
Showing 12 changed files with 148 additions and 85 deletions.
1 change: 1 addition & 0 deletions cloudfoundry-runtime/.gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.springBeans
.settings/
*.log
/*.iml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
* Base information for all database service types
*
* @author Xin Li
* @author Thomas Risberg
*
**/

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@
public abstract class AbstractServiceInfo {
private String serviceName;
private String plan;
private String label;

public AbstractServiceInfo(Map<String, Object> serviceInfo) {
serviceName = (String) serviceInfo.get("name");
plan = (String) serviceInfo.get("plan");
label = (String) serviceInfo.get("label");
}

public String getServiceName() {
Expand All @@ -25,6 +27,10 @@ public String getPlan() {
return plan;
}

public String getLabel() {
return label;
}

public abstract String getHost();
public abstract int getPort();
public abstract String getPassword();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
*
* @author Ramnivas Laddad
* @author Scott Andrews
* @author Thomas Risberg
*
*/
public class CloudEnvironment {

Expand All @@ -42,10 +44,10 @@ private static void labelledServiceType(Class<? extends AbstractServiceInfo> ser
}

static {
labelledServiceType(MysqlServiceInfo.class, "mysql-5.1");
labelledServiceType(RdbmsServiceInfo.class, "mysql-5.1");
labelledServiceType(RdbmsServiceInfo.class, "postgresql-9.0");
labelledServiceType(RedisServiceInfo.class, "redis-2.2");
labelledServiceType(MongoServiceInfo.class, "mongodb-1.8");
labelledServiceType(PostgresqlServiceInfo.class, "postgresql-9.0");

// the old rabbitmq service
labelledServiceType(RabbitServiceInfo.class, "rabbitmq-2.4");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.cloudfoundry.runtime.env;

import java.util.Map;


/**
* Information to access RDBMS service.
*
* @author Thomas Risberg
*
*/

public class RdbmsServiceInfo extends AbstractDataSourceServiceInfo {

private AbstractDataSourceServiceInfo delegate;

public RdbmsServiceInfo(Map<String, Object> serviceInfo) {
super(serviceInfo);
if (getLabel() != null && getLabel().startsWith("postgres")) {
this.delegate = new PostgresqlServiceInfo(serviceInfo);
}
else {
this.delegate = new MysqlServiceInfo(serviceInfo);
}

}

@Override
public String getUrl() {
return delegate.getUrl();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

import org.cloudfoundry.runtime.env.CloudPropertiesFactoryBean;
import org.cloudfoundry.runtime.env.MongoServiceInfo;
import org.cloudfoundry.runtime.env.MysqlServiceInfo;
import org.cloudfoundry.runtime.env.RdbmsServiceInfo;
import org.cloudfoundry.runtime.env.RabbitServiceInfo;
import org.cloudfoundry.runtime.env.RedisServiceInfo;
import org.cloudfoundry.runtime.service.CloudServicesScanner;
import org.cloudfoundry.runtime.service.document.CloudMongoDbFactoryBean;
import org.cloudfoundry.runtime.service.keyvalue.CloudRedisConnectionFactoryBean;
import org.cloudfoundry.runtime.service.messaging.CloudRabbitConnectionFactoryBean;
import org.cloudfoundry.runtime.service.relational.CloudMySqlDataSourceFactory;
import org.cloudfoundry.runtime.service.relational.CloudDataSourceFactory;
import org.springframework.beans.factory.xml.AbstractSimpleBeanDefinitionParser;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
import org.w3c.dom.Element;
Expand All @@ -21,6 +21,8 @@
* @author Costin Leau
* @author Ramnivas Laddad
* @author Scott Andrews
* @author Thomas Risberg
*
*/
public class CloudNamespaceHandler extends NamespaceHandlerSupport {

Expand All @@ -33,7 +35,7 @@ public void init() {
this.registerBeanDefinitionParser("mongo-db-factory",
new CloudServiceFactoryParser(CloudMongoDbFactoryBean.class, MongoServiceInfo.class));
this.registerBeanDefinitionParser("data-source",
new CloudServiceFactoryParser(CloudMySqlDataSourceFactory.class, MysqlServiceInfo.class));
new CloudServiceFactoryParser(CloudDataSourceFactory.class, RdbmsServiceInfo.class));

this.registerBeanDefinitionParser("properties", new AbstractSimpleBeanDefinitionParser() {
@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.cloudfoundry.runtime.service.relational;

import javax.sql.DataSource;

import org.cloudfoundry.runtime.env.CloudEnvironment;
import org.cloudfoundry.runtime.env.RdbmsServiceInfo;
import org.cloudfoundry.runtime.service.AbstractCloudServiceFactory;

/**
* Spring factory bean for datasource service.
*
* @author Ramnivas Laddad
* @author Thomas Risberg
*
*/
public class CloudDataSourceFactory extends AbstractCloudServiceFactory<DataSource, RdbmsServiceInfo> {

public CloudDataSourceFactory(CloudEnvironment cloudEnvironment) {
super(new RdbmsServiceCreator(cloudEnvironment));
}

public CloudDataSourceFactory() {
super(new RdbmsServiceCreator(new CloudEnvironment()));
}

@Override
public Class<? extends DataSource> getObjectType() {
return DataSource.class;
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package org.cloudfoundry.runtime.service.relational;

import org.cloudfoundry.runtime.env.*;
import org.cloudfoundry.runtime.service.AbstractDataSourceCreator;
import org.springframework.util.Assert;

import javax.sql.DataSource;

/**
* Simplified access to RDBMS service.
*
* @author Thomas Risberg
*
*/
public class RdbmsServiceCreator extends AbstractDataSourceCreator<RdbmsServiceInfo> {

private AbstractDataSourceCreator delegate;
private CloudEnvironment cloudEnvironment;

public RdbmsServiceCreator(CloudEnvironment cloudEnvironment) {
super(cloudEnvironment, RdbmsServiceInfo.class);
this.cloudEnvironment = cloudEnvironment;
}

@Override
public DataSource createService(AbstractDataSourceServiceInfo serviceInfo) {
if (serviceInfo.getLabel() != null && serviceInfo.getLabel().startsWith("postgres")) {
this.delegate = new PostgresqlServiceCreator(cloudEnvironment);
}
else {
this.delegate = new MysqlServiceCreator(cloudEnvironment);
}
return super.createService(serviceInfo);
}

@Override
public String getDriverClassName() {
Assert.notNull(delegate, "DataSourceCreator delegate was not populated");
return delegate.getDriverClassName();
}

@Override
public String getValidationQuery() {
Assert.notNull(delegate, "DataSourceCreator delegate was not populated");
return delegate.getValidationQuery();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public void getServiceInfoMysql() {
null,
null,
null));
MysqlServiceInfo info = testRuntime.getServiceInfo("mysql-1", MysqlServiceInfo.class);
RdbmsServiceInfo info = testRuntime.getServiceInfo("mysql-1", RdbmsServiceInfo.class);
assertEquals("mysql-1", info.getServiceName());
assertEquals("jdbc:mysql://"+ hostname + ":" + port + "/database-123", info.getUrl());
assertEquals(username, info.getUserName());
Expand All @@ -109,7 +109,7 @@ public void getServiceInfoPostgresql() {
null,
null,
null));
PostgresqlServiceInfo info = testRuntime.getServiceInfo("postgresql-1", PostgresqlServiceInfo.class);
RdbmsServiceInfo info = testRuntime.getServiceInfo("postgresql-1", RdbmsServiceInfo.class);
assertEquals("postgresql-1", info.getServiceName());
assertEquals("jdbc:postgresql://" + hostname + ":" + port + "/db-123", info.getUrl());
assertEquals(username, info.getUserName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.cloudfoundry.runtime.env.CloudEnvironment;
import org.cloudfoundry.runtime.env.MysqlServiceInfo;
import org.cloudfoundry.runtime.env.PostgresqlServiceInfo;
import org.cloudfoundry.runtime.env.RdbmsServiceInfo;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
Expand All @@ -18,30 +19,27 @@

public class CloudDataSourceFactoryTest {
@Mock private CloudEnvironment mockRuntime;
@Mock private MysqlServiceInfo mockMysqlServiceInfo;
@Mock private PostgresqlServiceInfo mockPostgresqlServiceInfo;
private CloudMySqlDataSourceFactory mysqlFactory;
private CloudPostgresqlDataSourceFactory postgresqlFactory;
@Mock private RdbmsServiceInfo mockRdbmsServiceInfo;
private CloudDataSourceFactory rdbmsFactory;

@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mysqlFactory = new CloudMySqlDataSourceFactory(mockRuntime);
postgresqlFactory = new CloudPostgresqlDataSourceFactory(mockRuntime);
rdbmsFactory = new CloudDataSourceFactory(mockRuntime);
}

@Test
public void cloudMySQLDataSourceCreation() throws Exception {
when(mockRuntime.getServiceInfo("mysql-1", MysqlServiceInfo.class))
.thenReturn(mockMysqlServiceInfo);
when(mockMysqlServiceInfo.getUrl()).thenReturn("jdbc:mysql://10.20.30.40:3306/database-123");
when(mockMysqlServiceInfo.getUserName()).thenReturn("myuser");
when(mockMysqlServiceInfo.getPassword()).thenReturn("mypass");
when(mockRuntime.getServiceInfo("mysql-1", RdbmsServiceInfo.class))
.thenReturn(mockRdbmsServiceInfo);
when(mockRdbmsServiceInfo.getUrl()).thenReturn("jdbc:mysql://10.20.30.40:3306/database-123");
when(mockRdbmsServiceInfo.getUserName()).thenReturn("myuser");
when(mockRdbmsServiceInfo.getPassword()).thenReturn("mypass");

mysqlFactory.setServiceName("mysql-1");
mysqlFactory.afterPropertiesSet();
rdbmsFactory.setServiceName("mysql-1");
rdbmsFactory.afterPropertiesSet();

DataSource dataSource = mysqlFactory.getObject();
DataSource dataSource = rdbmsFactory.getObject();
assertNotNull(dataSource);

assertEquals("jdbc:mysql://10.20.30.40:3306/database-123", ReflectionTestUtils.getField(dataSource, "url"));
Expand All @@ -53,16 +51,16 @@ public void cloudMySQLDataSourceCreation() throws Exception {

@Test
public void cloudPostgreSQLDataSourceCreation() throws Exception {
when(mockRuntime.getServiceInfo("postgres-1", PostgresqlServiceInfo.class))
.thenReturn(mockPostgresqlServiceInfo);
when(mockPostgresqlServiceInfo.getUrl()).thenReturn("jdbc:postgresql://10.20.30.40:5432/database-123");
when(mockPostgresqlServiceInfo.getUserName()).thenReturn("pguser");
when(mockPostgresqlServiceInfo.getPassword()).thenReturn("pgpass");
when(mockRuntime.getServiceInfo("postgres-1", RdbmsServiceInfo.class))
.thenReturn(mockRdbmsServiceInfo);
when(mockRdbmsServiceInfo.getUrl()).thenReturn("jdbc:postgresql://10.20.30.40:5432/database-123");
when(mockRdbmsServiceInfo.getUserName()).thenReturn("pguser");
when(mockRdbmsServiceInfo.getPassword()).thenReturn("pgpass");

postgresqlFactory.setServiceName("postgres-1");
postgresqlFactory.afterPropertiesSet();
rdbmsFactory.setServiceName("postgres-1");
rdbmsFactory.afterPropertiesSet();

DataSource dataSource = postgresqlFactory.getObject();
DataSource dataSource = rdbmsFactory.getObject();
assertNotNull(dataSource);

assertEquals("jdbc:postgresql://10.20.30.40:5432/database-123", ReflectionTestUtils.getField(dataSource, "url"));
Expand Down

0 comments on commit 284cf15

Please sign in to comment.