package org.eclipse.emf.emfstore.client.test.server;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.emfstore.client.model.ProjectSpace;
import org.eclipse.emf.emfstore.client.model.Usersession;
import org.eclipse.emf.emfstore.client.test.SetupHelper;
import org.eclipse.emf.emfstore.common.model.Project;
import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.modelgenerator.ModelGenerator;
import org.eclipse.emf.emfstore.modelgenerator.common.ModelGeneratorConfiguration;
import org.eclipse.emf.emfstore.modelgenerator.common.ModelGeneratorUtil;
import org.eclipse.emf.emfstore.modelgenerator.modelchanger.ModelChanger;
import org.eclipse.emf.emfstore.server.exceptions.EmfStoreException;
import org.eclipse.emf.emfstore.server.model.ProjectInfo;
import org.eclipse.emf.emfstore.server.model.versioning.ChangePackage;
import org.eclipse.emf.emfstore.server.model.versioning.PrimaryVersionSpec;
import org.eclipse.emf.emfstore.server.model.versioning.VersionSpec;
import org.junit.Before;
import org.junit.Test;
public class ModelGeneratorTest extends ServerTests {
// private Project fullProject;
private ProjectInfo projectInfo;
private ProjectSpace projectSpace;
private String modelKey = "http://org/eclipse/example/bowling";
private int width = 10;
private int depth = 2;
private String projectName = "generated";
private String projectDescription = "TestProject2";
@Override
@Before
public void beforeTest() throws EmfStoreException {
super.beforeTest();
projectSpace = org.eclipse.emf.emfstore.client.model.ModelFactory.eINSTANCE.createProjectSpace();
projectSpace.setProject(org.eclipse.emf.emfstore.common.model.ModelFactory.eINSTANCE.createProject());
projectSpace.setProjectName(projectName);
projectSpace.setProjectDescription(projectDescription);
projectSpace.setLocalOperations(org.eclipse.emf.emfstore.client.model.ModelFactory.eINSTANCE
.createOperationComposite());
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getLoadOptions().putAll(ModelUtil.getResourceLoadOptions());
projectSpace.initResources(resourceSet);
Usersession session = org.eclipse.emf.emfstore.client.model.ModelFactory.eINSTANCE.createUsersession();
session.setServerInfo(SetupHelper.getServerInfo());
session.setUsername("super");
session.setPassword("super");
session.setSessionId(getSessionId());
projectSpace.setUsersession(session);
projectSpace.eResource().getContents().add(session);
projectSpace.eResource().getContents().add(session.getServerInfo());
EPackage pckge = ModelGeneratorUtil.getEPackage(modelKey);
for (int i = 0; i < width; i++) {
EClass validClass = getValidEClass(projectSpace.getProject(), pckge, new ArrayList<EClass>());
ModelGeneratorConfiguration config = new ModelGeneratorConfiguration(pckge, validClass, width, depth);
EObject obj = ModelGenerator.generateModel(config);
projectSpace.getProject().addModelElement(obj);
}
// count num of projects
assertTrue(getConnectionManager().getProjectList(getSessionId()).size() == getProjectsOnServerBeforeTest());
// add project to Server
projectSpace.shareProject(session);
projectInfo = projectSpace.getProjectInfo();
// check that number increased
assertTrue(getConnectionManager().getProjectList(getSessionId()).size() == getProjectsOnServerBeforeTest() + 1);
}
private EClass getValidEClass(EObject root, EPackage pckge, List<EClass> ignoredClasses) {
List<EClass> allEClasses = new LinkedList<EClass>();
for (EReference reference : root.eClass().getEAllContainments()) {
allEClasses.addAll(ModelGeneratorUtil.getAllEContainments(reference));
}
// only allow EClasses that appear in the specified EPackage
allEClasses.retainAll(ModelGeneratorUtil.getAllEClasses(pckge));
// don't allow any EClass or sub class of all EClasses specified in ignoredClasses
for (EClass eClass : ignoredClasses) {
allEClasses.remove(eClass);
allEClasses.removeAll(ModelGeneratorUtil.getAllSubEClasses(eClass));
}
if (allEClasses.isEmpty()) {
// no valid EClass left
return null;
}
Collections.shuffle(allEClasses, new Random(System.currentTimeMillis()));
return allEClasses.get(0);
}
@Test
public void generateModelTest() throws EmfStoreException {
Project pro = getConnectionManager().getProject(getSessionId(), projectSpace.getProjectId(),
VersionSpec.HEAD_VERSION);
assertEqual(projectSpace.getProject(), pro);
}
@Test
public void changeModelTest() throws EmfStoreException {
// try {
System.out.println("BEFORE CHANGES:" + projectSpace.getProject().getAllModelElements().size());
// System.out.println(ModelUtil.eObjectToString(projectSpace.getProject()));
ModelChanger.generateChanges(projectSpace.getProject(), System.currentTimeMillis(), true);
System.out.println("VERSION BEFORE commit:" + projectInfo.getVersion().getIdentifier());
PrimaryVersionSpec version = projectSpace.commit();
System.out.println("VERSION AFTER commit:" + version.getIdentifier());
ChangePackage cpServer = getConnectionManager().getChanges(getSessionId(), projectInfo.getProjectId(),
projectInfo.getVersion(), VersionSpec.HEAD_VERSION).get(0);
ChangePackage changePackage = projectSpace.getChanges(projectInfo.getVersion(), version).get(0);
// System.out.println("CHANGES LOCAL:");
// System.out.println(ModelUtil.eObjectToString(changePackage));
// System.out.println("CHANGES SERVER:");
// System.out.println(ModelUtil.eObjectToString(cpServer));
Project pro = getConnectionManager().getProject(getSessionId(), projectSpace.getProjectId(),
VersionSpec.HEAD_VERSION);
System.out.println("APPLIED CHANGES:" + projectSpace.getProject().getAllModelElements().size());
// System.out.println(ModelUtil.eObjectToString(projectSpace.getProject()));
System.out.println("FROM SERVER:" + pro.getAllModelElements().size());
// System.out.println(ModelUtil.eObjectToString(pro));
assertEqual(projectSpace.getProject(), pro);
// } catch (SerializationException e) {
// e.printStackTrace();
// }
}
}