package org.neo4j.jdbc.embedded;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.jdbc.Databases;
import org.neo4j.jdbc.QueryExecutor;
import org.neo4j.kernel.EmbeddedGraphDatabase;
import org.neo4j.kernel.EmbeddedReadOnlyGraphDatabase;
import org.neo4j.test.ImpermanentGraphDatabase;
import java.util.Properties;
import java.util.WeakHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author mh
* @since 15.06.12
*/
public class EmbeddedDatabases implements Databases {
private static final Pattern urlMatcher=Pattern.compile(":([^:]*):(.+)");
enum Type {
mem {
@Override
public GraphDatabaseService create(String name, Properties properties) {
return new ImpermanentGraphDatabase();
}
}, instance {
@Override
public GraphDatabaseService create(String name, Properties properties) {
return (GraphDatabaseService) properties.remove(name);
}
}, file {
@Override
public GraphDatabaseService create(String name, Properties properties) {
if (isReadOnly(properties)) {
return new EmbeddedReadOnlyGraphDatabase(name);
} else {
return new EmbeddedGraphDatabase(name);
}
}
};
public abstract GraphDatabaseService create(String name, Properties properties);
protected boolean isReadOnly(Properties properties) {
return properties != null && properties.getProperty("readonly", "false").equalsIgnoreCase("true");
}
}
private final WeakHashMap<String, GraphDatabaseService> databases = new WeakHashMap<String, GraphDatabaseService>();
public GraphDatabaseService createDatabase(String connectionUrl, Properties properties) {
Matcher matcher=urlMatcher.matcher(connectionUrl);
if (!matcher.find())return defaultImpermanentDb();
try{
Type type=Type.valueOf(matcher.group(1));
String name=matcher.group(2);
GraphDatabaseService gds = databases.get(name);
if (gds!=null)return gds;
synchronized(urlMatcher){
gds = databases.get(name);
if (gds != null) return gds;
gds = type.create(name, properties);
databases.put(name, gds);
}
return gds;
}catch(IllegalArgumentException e){
return defaultImpermanentDb();
}
}
private GraphDatabaseService defaultImpermanentDb() {
return new ImpermanentGraphDatabase();
}
public QueryExecutor createExecutor(String connectionUrl, Properties properties) {
GraphDatabaseService gds = createDatabase(connectionUrl, properties);
return new EmbeddedQueryExecutor(gds);
}
}