/* * Copyright (c) 2015, 2016 Eike Stepper (Berlin, Germany) and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eike Stepper - initial API and implementation */ package org.eclipse.emf.cdo.internal.explorer.repositories; import org.eclipse.emf.cdo.server.CDOServerUtil; import org.eclipse.emf.cdo.server.IRepository; import org.eclipse.emf.cdo.server.db.CDODBUtil; import org.eclipse.emf.cdo.server.db.IDBStore; import org.eclipse.emf.cdo.server.db.mapping.IMappingStrategy; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.net4j.Net4jUtil; import org.eclipse.net4j.acceptor.IAcceptor; import org.eclipse.net4j.db.DBUtil; import org.eclipse.net4j.db.IDBAdapter; import org.eclipse.net4j.db.IDBConnectionProvider; import org.eclipse.net4j.util.container.IManagedContainer; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; import org.h2.jdbcx.JdbcDataSource; import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Properties; /** * @author Eike Stepper */ public class LocalCDORepository extends CDORepositoryImpl { public static final String PROP_TCP_DISABLED = "tcpDisabled"; public static final String PROP_TCP_PORT = "tcpPort"; private boolean tcpDisabled; private int tcpPort; private IRepository repository; private IAcceptor tcpAcceptor; public LocalCDORepository() { } public boolean isRemote() { return false; } public boolean isClone() { return false; } public boolean isLocal() { return true; } public final String getConnectorType() { return "jvm"; } public final String getConnectorDescription() { return "local"; } public String getURI() { if (tcpDisabled) { return getConnectorType() + "://" + getConnectorDescription() + "/" + getName(); } return "tcp://localhost:" + tcpPort + "/" + getName(); } public final boolean isTCPDisabled() { return tcpDisabled; } public final int getTCPPort() { return tcpPort; } @Override protected void init(File folder, String type, Properties properties) { super.init(folder, type, properties); tcpDisabled = Boolean.parseBoolean(properties.getProperty(PROP_TCP_DISABLED)); if (!tcpDisabled) { tcpPort = Integer.parseInt(properties.getProperty(PROP_TCP_PORT)); } } @Override protected void collectProperties(Properties properties) { super.collectProperties(properties); properties.setProperty(PROP_TCP_DISABLED, Boolean.toString(tcpDisabled)); properties.setProperty(PROP_TCP_PORT, Integer.toString(tcpPort)); } @Override protected CDOSession openSession() { String repositoryName = getName(); File folder = new File(getFolder(), "db"); JdbcDataSource dataSource = new JdbcDataSource(); dataSource.setURL("jdbc:h2:" + folder); IMappingStrategy mappingStrategy = CDODBUtil.createHorizontalMappingStrategy(getVersioningMode().isSupportingAudits(), getVersioningMode().isSupportingBranches(), false); mappingStrategy.setProperties(getMappingStrategyProperties()); IDBAdapter dbAdapter = DBUtil.getDBAdapter("h2"); IDBConnectionProvider connectionProvider = DBUtil.createConnectionProvider(dataSource); IDBStore store = CDODBUtil.createStore(mappingStrategy, dbAdapter, connectionProvider); repository = CDOServerUtil.createRepository(repositoryName, store, getRepositoryProperties()); IManagedContainer container = getContainer(); CDOServerUtil.addRepository(container, repository); Net4jUtil.getAcceptor(container, getConnectorType(), getConnectorDescription()); if (!tcpDisabled) { tcpAcceptor = Net4jUtil.getAcceptor(container, "tcp", "0.0.0.0:" + tcpPort); } return super.openSession(); } protected Map<String, String> getRepositoryProperties() { Map<String, String> props = new HashMap<String, String>(); props.put(IRepository.Props.OVERRIDE_UUID, ""); props.put(IRepository.Props.SUPPORTING_AUDITS, Boolean.toString(getVersioningMode().isSupportingAudits())); props.put(IRepository.Props.SUPPORTING_BRANCHES, Boolean.toString(getVersioningMode().isSupportingBranches())); props.put(IRepository.Props.ID_GENERATION_LOCATION, getIDGeneration().getLocation().toString()); return props; } protected Map<String, String> getMappingStrategyProperties() { Map<String, String> props = new HashMap<String, String>(); props.put(IMappingStrategy.Props.QUALIFIED_NAMES, "true"); props.put(CDODBUtil.PROP_COPY_ON_BRANCH, "true"); return props; } @Override protected void closeSession() { super.closeSession(); LifecycleUtil.deactivate(tcpAcceptor); tcpAcceptor = null; LifecycleUtil.deactivate(repository); repository = null; } }