blob: b85b8568f5a63aa08a613b052dc1fff5fb23a4cb [file] [log] [blame]
/*
* Copyright (c) 2011-2013, 2015 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.examples.server.offline;
import org.eclipse.emf.cdo.common.CDOCommonRepository.Type;
import org.eclipse.emf.cdo.common.util.RepositoryStateChangedEvent;
import org.eclipse.emf.cdo.common.util.RepositoryTypeChangedEvent;
import org.eclipse.emf.cdo.examples.company.CompanyPackage;
import org.eclipse.emf.cdo.server.CDOServerUtil;
import org.eclipse.emf.cdo.server.IRepository;
import org.eclipse.emf.cdo.server.ISession;
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.net4j.acceptor.IAcceptor;
import org.eclipse.net4j.db.IDBAdapter;
import org.eclipse.net4j.db.IDBConnectionProvider;
import org.eclipse.net4j.db.h2.H2Adapter;
import org.eclipse.net4j.util.container.ContainerEventAdapter;
import org.eclipse.net4j.util.container.IContainer;
import org.eclipse.net4j.util.container.IManagedContainer;
import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
import org.eclipse.net4j.util.om.OMPlatform;
import org.eclipse.net4j.util.om.log.PrintLogHandler;
import org.h2.jdbcx.JdbcDataSource;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
/**
* @author Eike Stepper
* @author Martin Fluegge
* @since 4.0
*/
public abstract class AbstractOfflineExampleServer
{
public static final String TRANSPORT_TYPE = "tcp";
protected int port;
protected String name;
protected transient IManagedContainer container;
protected transient IRepository repository;
protected transient IAcceptor acceptor;
static
{
// OMPlatform.INSTANCE.setDebugging(true);
// OMPlatform.INSTANCE.addTraceHandler(PrintTraceHandler.CONSOLE);
OMPlatform.INSTANCE.addLogHandler(PrintLogHandler.CONSOLE);
CompanyPackage.eINSTANCE.getClass(); // Register EPackage in standalone
}
public AbstractOfflineExampleServer(String name, int port, int dbBrowserPort)
{
this.name = name;
this.port = port;
container = OfflineExampleUtil.createContainer();
container.getElement("org.eclipse.emf.cdo.server.browsers", "default", dbBrowserPort + ""); //$NON-NLS-1$ //$NON-NLS-2$
}
public void init()
{
IStore store = createStore();
Map<String, String> props = createProperties();
repository = createRepository(store, props);
CDOServerUtil.addRepository(container, repository);
repository.addListener(new IListener()
{
public void notifyEvent(IEvent event)
{
if (event instanceof RepositoryTypeChangedEvent)
{
RepositoryTypeChangedEvent e = (RepositoryTypeChangedEvent)event;
System.out.println("Type changed from " + e.getOldType() + " to " + e.getNewType());
}
else if (event instanceof RepositoryStateChangedEvent)
{
RepositoryStateChangedEvent e = (RepositoryStateChangedEvent)event;
System.out.println("State changed from " + e.getOldState() + " to " + e.getNewState());
}
}
});
repository.getSessionManager().addListener(new ContainerEventAdapter<ISession>()
{
@Override
protected void onAdded(IContainer<ISession> sessionManager, ISession session)
{
System.out.println("Registered " + session);
}
@Override
protected void onRemoved(IContainer<ISession> sessionManager, ISession session)
{
System.out.println("Unregistered " + session);
}
});
connect();
}
public void run() throws Exception
{
for (;;)
{
System.out.println();
System.out.println("Enter a command:");
showMenu();
System.out.println();
String command = new BufferedReader(new InputStreamReader(System.in)).readLine();
if (handleCommand(command))
{
break;
}
}
}
public void done()
{
LifecycleUtil.deactivate(acceptor);
LifecycleUtil.deactivate(repository);
container.deactivate();
}
protected void showMenu()
{
System.out.println("0 - exit");
System.out.println("1 - connect repository to network");
System.out.println("2 - disconnect repository from network");
System.out.println("3 - dump repository infos");
}
protected boolean handleCommand(String command)
{
if ("1".equals(command))
{
if (acceptor == null)
{
connect();
}
else
{
System.out.println("Already connected");
}
}
else if ("2".equals(command))
{
if (acceptor != null)
{
disconnect();
}
else
{
System.out.println("Already disconnected");
}
}
else if ("3".equals(command))
{
System.out.println();
System.out.println(repository.getName() + ": " + repository.getType()
+ (repository.getType() == Type.BACKUP ? "|" + repository.getState() : ""));
}
else if ("0".equals(command))
{
System.out.println("Exiting...");
return true;
}
else
{
System.out.println("Unknown command");
}
return false;
}
protected void connect()
{
System.out.println("Connecting to network...");
acceptor = createAcceptor();
System.out.println("Connected");
}
protected IAcceptor createAcceptor()
{
return (IAcceptor)container.getElement("org.eclipse.net4j.acceptors", AbstractOfflineExampleServer.TRANSPORT_TYPE,
"0.0.0.0:" + port);
}
protected void disconnect()
{
System.out.println("Disconnecting from network...");
LifecycleUtil.deactivate(acceptor);
acceptor = null;
System.out.println("Disconnected");
}
protected IStore createStore()
{
JdbcDataSource dataSource = new JdbcDataSource();
dataSource.setURL("jdbc:h2:database/" + name);
IMappingStrategy mappingStrategy = CDODBUtil.createHorizontalMappingStrategy(true, true);
IDBAdapter dbAdapter = new H2Adapter();
IDBConnectionProvider dbConnectionProvider = dbAdapter.createConnectionProvider(dataSource);
return CDODBUtil.createStore(mappingStrategy, dbAdapter, dbConnectionProvider);
}
protected Map<String, String> createProperties()
{
Map<String, String> props = new HashMap<String, String>();
props.put(IRepository.Props.OVERRIDE_UUID, name);
props.put(IRepository.Props.SUPPORTING_AUDITS, "true");
props.put(IRepository.Props.SUPPORTING_BRANCHES, "true");
return props;
}
protected abstract IRepository createRepository(IStore store, Map<String, String> props);
}