blob: 1d465b1c3cb7a13ec2a28e3b475f539453db1df5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2015 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.persistence.nosql.adapters.mongo;
import java.util.Properties;
import javax.resource.cci.Connection;
import org.eclipse.persistence.eis.EISAccessor;
import org.eclipse.persistence.eis.EISConnectionSpec;
import org.eclipse.persistence.eis.EISException;
import org.eclipse.persistence.exceptions.DatabaseException;
import org.eclipse.persistence.exceptions.ValidationException;
import org.eclipse.persistence.internal.nosql.adapters.mongo.MongoConnectionFactory;
import org.eclipse.persistence.internal.nosql.adapters.mongo.MongoJCAConnectionSpec;
import com.mongodb.ReadPreference;
import com.mongodb.WriteConcern;
/**
* Provides connection information to the Mongo database.
*
* @author James
* @since EclipseLink 2.4
*/
public class MongoConnectionSpec extends EISConnectionSpec {
/** Connection spec properties. */
public static final String HOST = "mongo.host";
public static final String PORT = "mongo.port";
public static final String DB = "mongo.db";
public static final String OPTIONS = "mongo.options";
public static final String READ_PREFERENCE = "mongo.read-preference";
public static final String WRITE_CONCERN = "mongo.write-concern";
/**
* PUBLIC:
* Default constructor.
*/
public MongoConnectionSpec() {
super();
}
/**
* Connect with the specified properties and return the Connection.
*/
public Connection connectToDataSource(EISAccessor accessor, Properties properties) throws DatabaseException, ValidationException {
if ((this.connectionFactory == null) && (this.name == null)) {
this.connectionFactory = new MongoConnectionFactory();
}
if (!properties.isEmpty()) {
if (this.connectionSpec == null) {
this.connectionSpec = new MongoJCAConnectionSpec();
}
MongoJCAConnectionSpec spec = (MongoJCAConnectionSpec)this.connectionSpec;
String host = (String)properties.get(HOST);
String port = (String)properties.get(PORT);
String db = (String)properties.get(DB);
if (host != null) {
if (host.indexOf(',') == -1) {
spec.getHosts().add(host);
if (port != null) {
spec.getPorts().add(new Integer(port));
}
} else {
int startIndex = 0;
while (startIndex < (host.length() - 1)) {
int endIndex = host.indexOf(',', startIndex);
if (endIndex == -1) {
endIndex = host.length();
}
String nextHost = host.substring(startIndex, endIndex);
spec.getHosts().add(nextHost);
startIndex = endIndex + 1;
}
while (startIndex < (port.length() - 1)) {
int endIndex = port.indexOf(',', startIndex);
if (endIndex == -1) {
endIndex = port.length();
}
String nextPort = port.substring(startIndex, endIndex);
spec.getPorts().add(new Integer(nextPort));
startIndex = endIndex + 1;
}
}
}
if (db != null) {
spec.setDB(db);
}
String user = (String)properties.get("user");
Object password = properties.get("password");
if (password instanceof String) {
password = ((String) password).toCharArray();
}
if ((user != null) && (user.length() != 0)) {
spec.setUser(user);
spec.setPassword((char[])password);
}
// Allows setting of read preference as a property.
Object preference = properties.get(READ_PREFERENCE);
if (preference instanceof ReadPreference) {
spec.setReadPreference((ReadPreference)preference);
} else if (preference instanceof String) {
String constant = (String)preference;
if (constant.equals("PRIMARY")) {
spec.setReadPreference(ReadPreference.PRIMARY);
} else if (constant.equals("SECONDARY")) {
spec.setReadPreference(ReadPreference.SECONDARY );
} else {
throw new EISException("Invalid read preference property value: " + constant);
}
}
// Allows setting of write concern as a property.
Object concern = properties.get(WRITE_CONCERN);
if (concern instanceof WriteConcern) {
spec.setWriteConcern((WriteConcern)concern);
} else if (concern instanceof String) {
String constant = (String)concern;
if (constant.equals("FSYNC_SAFE")) {
spec.setWriteConcern(WriteConcern.FSYNC_SAFE);
} else if (constant.equals("JOURNAL_SAFE")) {
spec.setWriteConcern(WriteConcern.JOURNAL_SAFE);
} else if (constant.equals("MAJORITY")) {
spec.setWriteConcern(WriteConcern.MAJORITY);
} else if (constant.equals("NONE")) {
spec.setWriteConcern(WriteConcern.NONE);
} else if (constant.equals("NORMAL")) {
spec.setWriteConcern(WriteConcern.NORMAL);
} else if (constant.equals("REPLICAS_SAFE")) {
spec.setWriteConcern(WriteConcern.REPLICAS_SAFE);
} else if (constant.equals("SAFE")) {
spec.setWriteConcern(WriteConcern.SAFE);
} else {
throw new EISException("Invalid read preference property value: " + constant);
}
}
// Allows setting of options as a property.
Object options = properties.get(OPTIONS);
if (options instanceof Number) {
spec.setOptions(((Number)options).intValue());
} else if (options instanceof String) {
spec.setOptions(Integer.parseInt(((String)options)));
}
}
return super.connectToDataSource(accessor, properties);
}
}