Skip to content

Commit

Permalink
add datastoreFactory to define converter and index
Browse files Browse the repository at this point in the history
  • Loading branch information
Yang Lei authored and dougrt committed Jan 29, 2015
1 parent f70a36a commit 66479da
Show file tree
Hide file tree
Showing 7 changed files with 164 additions and 7 deletions.
1 change: 1 addition & 0 deletions acmeair-services-morphia/.classpath
Expand Up @@ -22,4 +22,5 @@
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-core/3.1.2.RELEASE/spring-core-3.1.2.RELEASE.jar"/>
<classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/spring-expression/3.1.2.RELEASE/spring-expression-3.1.2.RELEASE.jar"/>
<classpathentry kind="var" path="M2_REPO/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar"/>
</classpath>
7 changes: 5 additions & 2 deletions acmeair-services-morphia/pom.xml
Expand Up @@ -37,12 +37,15 @@
<artifactId>mongo-java-driver</artifactId>
<version>2.11.1</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,27 @@
package com.acmeair.morphia;

import java.math.BigDecimal;

import com.github.jmkgreen.morphia.converters.SimpleValueConverter;
import com.github.jmkgreen.morphia.converters.TypeConverter;
import com.github.jmkgreen.morphia.mapping.MappedField;
import com.github.jmkgreen.morphia.mapping.MappingException;

public class BigDecimalConverter extends TypeConverter implements SimpleValueConverter{

public BigDecimalConverter() {
super(BigDecimal.class);
}

@Override
public Object encode(Object value, MappedField optionalExtraInfo) {
return value.toString();
}

@Override
public Object decode(Class targetClass, Object fromDBObject, MappedField optionalExtraInfo) throws MappingException {
if (fromDBObject == null) return null;

return new BigDecimal(fromDBObject.toString());
}
}
@@ -0,0 +1,27 @@
package com.acmeair.morphia;

import java.math.BigInteger;

import com.github.jmkgreen.morphia.converters.SimpleValueConverter;
import com.github.jmkgreen.morphia.converters.TypeConverter;
import com.github.jmkgreen.morphia.mapping.MappedField;
import com.github.jmkgreen.morphia.mapping.MappingException;

public class BigIntegerConverter extends TypeConverter implements SimpleValueConverter{

public BigIntegerConverter() {
super(BigInteger.class);
}

@Override
public Object encode(Object value, MappedField optionalExtraInfo) {
return value.toString();
}

@Override
public Object decode(Class targetClass, Object fromDBObject, MappedField optionalExtraInfo) throws MappingException {
if (fromDBObject == null) return null;

return new BigInteger(fromDBObject.toString());
}
}
@@ -0,0 +1,91 @@
package com.acmeair.morphia;

import java.util.Properties;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

import com.acmeair.entities.Booking;
import com.acmeair.entities.Flight;
import com.acmeair.entities.FlightSegment;
import com.github.jmkgreen.morphia.Datastore;
import com.github.jmkgreen.morphia.Morphia;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientURI;
import com.mongodb.WriteConcern;

public class DatastoreFactory {

private static String mongourl = null;

static {
String vcapJSONString = System.getenv("VCAP_SERVICES");
if (vcapJSONString != null) {
System.out.println("Reading VCAP_SERVICES");
Object jsonObject = JSONValue.parse(vcapJSONString);
JSONObject json = (JSONObject)jsonObject;
System.out.println("jsonObject = " + json.toJSONString());
for (Object key: json.keySet())
{
if (((String)key).contains("mongo"))
{
System.out.println("Found mongo service:" +key);
JSONArray mongoServiceArray = (JSONArray)json.get(key);
JSONObject mongoService = (JSONObject) mongoServiceArray.get(0);
JSONObject credentials = (JSONObject)mongoService.get("credentials");
mongourl = (String)credentials.get("url");
if (mongourl==null)
mongourl= (String)credentials.get("uri");
System.out.println("service url = " + mongourl);
break;
}
}
}


}

public static Datastore getDatastore(Datastore ds)
{
Datastore result =ds;

if (mongourl!=null)
{
try{
Properties prop = new Properties();
prop.load(DatastoreFactory.class.getResource("/acmeair-mongo.properties").openStream());
boolean fsync = new Boolean(prop.getProperty("mongo.fsync"));
int w = new Integer(prop.getProperty("mongo.w"));
int connectionsPerHost = new Integer(prop.getProperty("mongo.connectionsPerHost"));
int threadsAllowedToBlockForConnectionMultiplier = new Integer(prop.getProperty("mongo.threadsAllowedToBlockForConnectionMultiplier"));

// To match the local options
MongoClientOptions.Builder builder = new MongoClientOptions.Builder()
.writeConcern(new WriteConcern(w, 0, fsync))
.connectionsPerHost(connectionsPerHost)
.threadsAllowedToBlockForConnectionMultiplier(threadsAllowedToBlockForConnectionMultiplier);

MongoClientURI mongoURI = new MongoClientURI(mongourl, builder);
MongoClient mongo = new MongoClient(mongoURI);
Morphia morphia = new Morphia();
result = morphia.createDatastore( mongo ,mongoURI.getDatabase());
System.out.println("create mongo datastore with options:"+result.getMongo().getMongoOptions());
}catch (Exception e)
{
e.printStackTrace();
}
}
// The converter is added for handing JDK 7 issue
result.getMapper().getConverters().addConverter(new BigDecimalConverter());
result.getMapper().getConverters().addConverter(new BigIntegerConverter());

// Enable index
result.ensureIndex(Booking.class, "pkey.customerId");
result.ensureIndex(Flight.class, "pkey.flightSegmentId,scheduledDepartureTime");
result.ensureIndex(FlightSegment.class, "originPort,destPort");

return result;
}
}
@@ -1,5 +1,9 @@
mongo.host=localhost
mongo.port=27017
mongo.database=acmeair
mongo.fsync=false
mongo.w=0
mongo.connectionsPerHost=20
mongo.threadsAllowedToBlockForConnectionMultiplier=10


Expand Up @@ -12,10 +12,10 @@
<context:property-placeholder location="classpath:/acmeair-mongo.properties"/>

<bean id="mongoOptions" class="com.mongodb.MongoOptions">
<property name="fsync" value="false" />
<property name="w" value="0" />
<property name="connectionsPerHost" value="100" />
<property name="threadsAllowedToBlockForConnectionMultiplier" value="10" />
<property name="fsync" value="${mongo.fsync}" />
<property name="w" value="${mongo.w}" />
<property name="connectionsPerHost" value="${mongo.connectionsPerHost}" />
<property name="threadsAllowedToBlockForConnectionMultiplier" value="${mongo.threadsAllowedToBlockForConnectionMultiplier}" />
<!-- property name="socketKeepAlive" value="true" /-->
<!--property name="maxWaitTime" value="2000" /-->
</bean>
Expand All @@ -32,9 +32,13 @@

<bean id="morphia" class="com.github.jmkgreen.morphia.Morphia"/>

<bean id="datastore" factory-bean="morphia" factory-method="createDatastore">
<bean id="localDatastore" factory-bean="morphia" factory-method="createDatastore">
<constructor-arg ref="mongo"/>
<constructor-arg value="${mongo.database}"/>
</bean>

<bean id="datastore" class="com.acmeair.morphia.DatastoreFactory" factory-method="getDatastore">
<constructor-arg type="com.github.jmkgreen.morphia.Datastore" ref="localDatastore"/>
</bean>

</beans>

0 comments on commit 66479da

Please sign in to comment.