blob: 2a0106ee38ae600db473a53ccbaba57a12aff9fb [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2018 CEA LIST and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* CEA LIST - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.cdo.benchmarks.tests;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.gmf.runtime.emf.type.core.IHintedType;
import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
import org.eclipse.papyrus.infra.core.resource.ModelSet;
import org.eclipse.papyrus.infra.emf.gmf.command.GMFtoEMFCommandWrapper;
import org.eclipse.papyrus.infra.services.edit.service.ElementEditServiceUtils;
import org.eclipse.papyrus.infra.services.edit.service.IElementEditService;
import org.eclipse.papyrus.uml.service.types.element.UMLElementTypes;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.UMLFactory;
/**
* @author VL222926
*
*/
public class ModelConstructor<T extends IPapyrusModelCreation> {
private T creationHelper;
protected ExecutionTimeHelper timeHelper;
public ModelConstructor(final T creationHelper, final ExecutionTimeHelper timeHelper) {
this.creationHelper = creationHelper;
this.timeHelper = timeHelper;
}
/**
* r
*
* @param folderName
* @param nbElementsToCreate
* @param elementType
* @param profilesName
* @throws Exception
*/
public void createElementsInModel(final String folderName, int nbElementsToCreate, IHintedType elementType, List<String> profilesName) throws Exception {
String modelName = Long.toString(System.currentTimeMillis());
// creating model set
timeHelper.startCounting(ExecutionTimeHelper.STEP_1);
this.creationHelper.initPapyrusEnvironnement(folderName, modelName, profilesName);
timeHelper.stop();
Assert.isNotNull(creationHelper.getServicesRegistry());
Assert.isNotNull(creationHelper.getModelSet());
// creating classes
final Model model = this.creationHelper.getModelRoot();
final ModelSet modelSet = this.creationHelper.getModelSet();
final IElementEditService provider = ElementEditServiceUtils.getCommandProvider(model);
int modulo = 100;
timeHelper.startCounting(ExecutionTimeHelper.STEP_2);
for (int i = 0; i < nbElementsToCreate; i++) {
CreateElementRequest request = new CreateElementRequest(modelSet.getTransactionalEditingDomain(), model, elementType);
final ICommand cmd = provider.getEditCommand(request);
modelSet.getTransactionalEditingDomain().getCommandStack().execute(GMFtoEMFCommandWrapper.wrap(cmd));
if (i % modulo == 0) {
timeHelper.top();
}
}
timeHelper.stop();
// saving the models
timeHelper.startCounting(ExecutionTimeHelper.STEP_3);
try {
modelSet.save(new NullProgressMonitor());
// modelSet.
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
timeHelper.stop();
// accessing to an element
List<String> names = Arrays.asList(elementType.getId().split("\\."));
Collections.reverse(names);
String name = names.get(0);
int i = 0;
timeHelper.startCounting(ExecutionTimeHelper.STEP_4);
while (i + modulo <= nbElementsToCreate) {
i = i + modulo;
final NamedElement element = model.getMember(name + i);
// TODO !
Assert.isNotNull(element);
if (profilesName.size() > 0) {
Assert.isTrue(element.getAppliedStereotypes().size() > 0);
}
timeHelper.top();
}
timeHelper.stop();
name = name + "5000";
NamedElement element = null;
if (nbElementsToCreate > 5000) {
timeHelper.startCounting(ExecutionTimeHelper.STEP_5);
for (int j = 0; j < 100; j++) {// we do it 100 times
element = model.getMember(name);
}
timeHelper.stop();
}
if (nbElementsToCreate > 5000) {
if (profilesName.size() > 0) {
timeHelper.startCounting(ExecutionTimeHelper.STEP_6);
for (int j = 0; j < 100; j++) {// we do it 100 times
element.getAppliedStereotypes();
}
timeHelper.stop();
}
}
final Resource res = element.eResource();
Assert.isNotNull(res);
timeHelper.startCounting(ExecutionTimeHelper.STEP_7);
for (int k = 0; k < 100; k++) {
final EObject newModel = UMLFactory.eINSTANCE.createModel();
RecordingCommand rc = new RecordingCommand(modelSet.getTransactionalEditingDomain()) {
@Override
protected void doExecute() {
res.getContents().add(newModel);
}
};
modelSet.getTransactionalEditingDomain().getCommandStack().execute(rc);
}
timeHelper.stop();
try {
modelSet.save(new NullProgressMonitor());
// modelSet.
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.creationHelper.disposeAll();
}
}