package com.marklogic.client.spring;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import com.marklogic.client.DatabaseClient;
import com.marklogic.client.DatabaseClientFactory;
import com.marklogic.client.helper.DatabaseClientConfig;
import com.marklogic.client.helper.LoggingObject;
/**
* Hooks into Spring container lifecycle so that the DatabaseClient is initialized when the container starts up and
* released when the container shuts down.
* <p>
* Note that ML7 has a DatabaseClientFactory.Bean that removes the need for most of this code, although it does not have
* a "destroy" method that would handle releasing the DatabaseClient that it begins.
*/
public class DatabaseClientManager extends LoggingObject implements FactoryBean<DatabaseClient>, DisposableBean {
private DatabaseClientConfig config;
private DatabaseClient client;
public DatabaseClientManager() {
super();
}
public DatabaseClientManager(DatabaseClientConfig config) {
this();
this.config = config;
}
@Override
public DatabaseClient getObject() {
if (client == null) {
if (logger.isInfoEnabled()) {
logger.info("Connecting to REST server with: " + config);
}
client = DatabaseClientFactory.newClient(config.getHost(), config.getPort(), config.getDatabase(),
config.getUsername(), config.getPassword(), config.getAuthentication(), config.getSslContext(),
config.getSslHostnameVerifier());
}
return client;
}
@Override
public Class<?> getObjectType() {
return DatabaseClient.class;
}
@Override
public boolean isSingleton() {
return true;
}
@Override
public void destroy() {
if (client != null) {
if (logger.isInfoEnabled()) {
logger.info("Releasing client with username: " + config.getUsername());
}
client.release();
}
}
public void setConfig(DatabaseClientConfig config) {
this.config = config;
}
}