package org.eclipse.papyrus.cdo.uml.benchmarks.creation.tests.cleanexamples;

import org.eclipse.emf.cdo.net4j.CDONet4jSession;
import org.eclipse.emf.cdo.net4j.CDONet4jSessionConfiguration;
import org.eclipse.emf.cdo.net4j.CDONet4jUtil;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.net4j.Net4jUtil;
import org.eclipse.net4j.connector.IConnector;
import org.eclipse.net4j.signal.ISignalProtocol;
import org.eclipse.net4j.tcp.TCPUtil;
import org.eclipse.net4j.util.container.IPluginContainer;
import org.eclipse.net4j.util.om.OMPlatform;
import org.eclipse.net4j.util.security.PasswordCredentialsProvider;
import org.eclipse.uml2.uml.UMLFactory;
import org.junit.Assert;

public class CDORemoteTests_OneCommit_OneTransaction_NoSubPackage {

  private static final UMLFactory FACTORY = UMLFactory.eINSTANCE;
  
//  @Test
	public void create_10000_Elements() throws Exception {
		create_Elements(10000);
	}

//	@Test
	public void create_50000_Elements() throws Exception {
		create_Elements(50000);
	}

//	@Test
	public void create_500000_Elements() throws Exception {
		create_Elements(500000);
	}

//	@Test
	public void create_1000000_Elements() throws Exception {
		create_Elements(1000000);
	}


	private void create_Elements(int size) throws Exception {
		System.out.println("Class Tests Name:" + getClass().getSimpleName());
		System.out.println("Creation in Remote CDO file");
		System.out.println("Creating " + size + " elements with the factory " + FACTORY.getClass().getName() + "...");
		String fileName = size + "_Elements";
		String timsestamp = Long.toString(System.currentTimeMillis());
		fileName = fileName + "_" + timsestamp;
		
		CDOSession session = openSession();
		CDOTransaction transaction = session.openTransaction();
		Resource myResource = transaction.getOrCreateResource("/home/Administrator/" + fileName);
		
		
		///////////////////////////////// CREATE //////////////////////////////////////////////////////
		long start = System.currentTimeMillis();

		// 1. create the root package
		org.eclipse.uml2.uml.Package rootPackage = FACTORY.createPackage();
		rootPackage.setName("RootPackage_" + fileName);
		myResource.getContents().add(rootPackage);

		// 2. create the elements
		for (long i = 0; i < size; i++) {
			org.eclipse.uml2.uml.Class aclass = FACTORY.createClass();
			final StringBuilder builder = new StringBuilder("Class_");
			builder.append(i);
			aclass.setName(builder.toString());
			rootPackage.getPackagedElements().add(aclass);
		}

		long end = System.currentTimeMillis();
		System.out.println("Done: " + (end - start) + " ms ");

		///////////////////////////////// SAVE //////////////////////////////////////////////////////
		System.out.println("Committing...");
		start = System.currentTimeMillis();
		
		transaction.commit();
		session.close();
		
		end = System.currentTimeMillis();
		System.out.println("Done: " + (end - start) + " ms");


		
		///////////////////////////////// LOAD //////////////////////////////////////////////////////
		CDOSession session2 = openSession();
		CDOView view = session2.openView();
		Resource resource2 = view.getResource("/home/Administrator/" + fileName);
		
		System.out.println("Loading root object...");
		start = System.currentTimeMillis();
		org.eclipse.uml2.uml.Package p = (org.eclipse.uml2.uml.Package) resource2.getContents().get(0);
		end = System.currentTimeMillis();
		Assert.assertNotNull(p);
		System.out.println("Done: " + (end - start) + " ms");
		System.out.println("\n\n\n");
		
		session2.close();
	}
	
	//================== CDO ==============================================
	
	static {
    if (!OMPlatform.INSTANCE.isOSGiRunning()) {
      Net4jUtil.prepareContainer(IPluginContainer.INSTANCE); // Register Net4j factories
      TCPUtil.prepareContainer(IPluginContainer.INSTANCE); // Register TCP factories
      CDONet4jUtil.prepareContainer(IPluginContainer.INSTANCE); // Register CDO factories
      IPluginContainer.INSTANCE.activate();
    }
  }

	private static final String HOST_AND_PORT = "localhost:2036";
	private static final String USER_NAME = "Administrator";
	private static final String PASSWORD = "0000";
	private static final String PAPYRUS_CDO_SECURED_REPOSITORY = "PapyrusCDOSecuredRepository";


	private CDOSession openSession() throws Exception {
	  IConnector connector = TCPUtil.getConnector(IPluginContainer.INSTANCE, HOST_AND_PORT);

		CDONet4jSessionConfiguration configuration = CDONet4jUtil.createNet4jSessionConfiguration();
		configuration.setConnector(connector);
		configuration.setRepositoryName(PAPYRUS_CDO_SECURED_REPOSITORY);
		configuration.setCredentialsProvider(new PasswordCredentialsProvider(USER_NAME, PASSWORD));
		CDONet4jSession	session = configuration.openNet4jSession();
		session.options().getNet4jProtocol().setTimeout(ISignalProtocol.NO_TIMEOUT);

		return session;
	}
}
