package org.emfjson.cdo.sample;
import org.eclipse.emf.cdo.net4j.CDONet4jSessionConfiguration;
import org.eclipse.emf.cdo.net4j.CDONet4jUtil;
import org.eclipse.emf.cdo.server.CDOServerUtil;
import org.eclipse.emf.cdo.server.IRepository;
import org.eclipse.emf.cdo.server.IStore;
import org.eclipse.emf.cdo.server.db.CDODBUtil;
import org.eclipse.emf.cdo.server.db.mapping.IMappingStrategy;
import org.eclipse.emf.cdo.server.net4j.CDONet4jServerUtil;
import org.eclipse.emf.cdo.session.CDOSessionConfiguration;
import org.eclipse.net4j.Net4jUtil;
import org.eclipse.net4j.connector.IConnector;
import org.eclipse.net4j.db.IDBAdapter;
import org.eclipse.net4j.db.IDBConnectionProvider;
import org.eclipse.net4j.db.h2.H2Adapter;
import org.eclipse.net4j.jvm.IJVMConnector;
import org.eclipse.net4j.jvm.JVMUtil;
import org.eclipse.net4j.util.container.ContainerUtil;
import org.eclipse.net4j.util.container.IManagedContainer;
import org.h2.jdbcx.JdbcDataSource;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
import static org.eclipse.emf.cdo.server.CDOServerUtil.createRepository;
public class CDOServer {
private final IManagedContainer container;
private final IRepository repository;
private final DataSource dataSource;
private final String name;
private IJVMConnector connector;
public CDOServer(String name) {
this.name = name;
this.container = getContainer();
this.dataSource = createDataSource();
this.repository = createRepository(getName(), createStore(), createProperties());
}
public void start() {
container.activate();
CDOServerUtil.addRepository(container, repository);
JVMUtil.getAcceptor(container, getName());
connector = JVMUtil.getConnector(container, getName());
}
public void stop() {
container.deactivate();
connector.close();
}
public DataSource getDataSource() {
return dataSource;
}
public DataSource createDataSource() {
final JdbcDataSource dataSource = new JdbcDataSource();
dataSource.setURL("jdbc:h2:mem:" + getName() + ";DB_CLOSE_DELAY=-1");
return dataSource;
}
public IDBAdapter getAdapter() {
return new H2Adapter();
}
public String getName() {
return name;
}
public IConnector getConnector() {
if (connector == null && container.isActive()) {
connector = JVMUtil.getConnector(container, getName());
}
return connector;
}
protected IStore createStore() {
final IDBAdapter dbAdapter = getAdapter();
final IMappingStrategy mappingStrategy = CDODBUtil.createHorizontalMappingStrategy(true, true);
final IDBConnectionProvider dbConnectionProvider = dbAdapter.createConnectionProvider(getDataSource());
return CDODBUtil.createStore(mappingStrategy, dbAdapter, dbConnectionProvider);
}
protected Map<String, String> createProperties() {
final Map<String, String> props = new HashMap<>();
props.put(IRepository.Props.OVERRIDE_UUID, getName());
props.put(IRepository.Props.SUPPORTING_AUDITS, "true");
props.put(IRepository.Props.SUPPORTING_BRANCHES, "true");
props.put(IRepository.Props.ID_GENERATION_LOCATION, "STORE");
props.put(IRepository.Props.ENSURE_REFERENTIAL_INTEGRITY, "true");
return props;
}
protected IManagedContainer getContainer() {
final IManagedContainer container = ContainerUtil.createContainer();
Net4jUtil.prepareContainer(container);
JVMUtil.prepareContainer(container);
CDONet4jUtil.prepareContainer(container);
CDONet4jServerUtil.prepareContainer(container);
return container;
}
public CDOSessionConfiguration getSessionConfiguration() {
CDONet4jSessionConfiguration configuration = CDONet4jUtil.createNet4jSessionConfiguration();
configuration.setConnector(getConnector());
configuration.setRepositoryName(getName());
return configuration;
}
}