blob: ed2af5674548ab9d5246ccece6cb16d5f9626f9b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012-2013 EclipseSource Muenchen GmbH 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:
* Edgar Mueller
* Maximilian Koegel
******************************************************************************/
package org.eclipse.emf.emfstore.internal.server.conflictDetection;
import static org.eclipse.emf.emfstore.internal.server.model.versioning.operations.util.OperationUtil.isCreateDelete;
import java.text.MessageFormat;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.emfstore.internal.common.model.ModelElementId;
import org.eclipse.emf.emfstore.internal.common.model.ModelElementIdToEObjectMapping;
import org.eclipse.emf.emfstore.internal.common.model.Project;
import org.eclipse.emf.emfstore.internal.common.model.impl.ESModelElementIdToEObjectMappingImpl;
import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.internal.server.model.versioning.AbstractChangePackage;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.AbstractOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.CompositeOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.CreateDeleteOperation;
import org.eclipse.emf.emfstore.server.ESCloseableIterable;
/**
* @author emueller
* @author koegel
*/
public class ModelElementIdToEObjectMappingImpl implements ModelElementIdToEObjectMapping {
private final Map<String, EObject> idToEObjectMapping;
private final ModelElementIdToEObjectMapping delegateMapping;
private ESModelElementIdToEObjectMappingImpl apiImpl;
/**
* Constructor.
*
* @param mapping
* an initial mapping from {EObject}s to their {@link ModelElementId}s
*/
public ModelElementIdToEObjectMappingImpl(ModelElementIdToEObjectMapping mapping) {
delegateMapping = mapping;
idToEObjectMapping = new LinkedHashMap<String, EObject>();
}
/**
* Constructor.
*
* @param mapping
* an initial mapping from {EObject}s to their {@link ModelElementId}s
* @param changePackages
* a list of {@link AbstractChangePackage}s whose involved model elements should
* be added to the mapping
*/
public ModelElementIdToEObjectMappingImpl(ModelElementIdToEObjectMapping mapping,
List<AbstractChangePackage> changePackages) {
this(mapping);
for (final AbstractChangePackage changePackage : changePackages) {
put(changePackage);
}
}
/**
* Constructor.
*
* @param mapping
* an initial mapping from {EObject}s to their
* {@link org.eclipse.emf.emfstore.common.model.ESModelElementId ESModelElementId}s
* @param operationsList1 list of operations for which involved model elements should
* be added to the mapping
* @param operationsList2 list of operations for which involved model elements should
* be added to the mapping
*/
public ModelElementIdToEObjectMappingImpl(ModelElementIdToEObjectMapping mapping,
List<AbstractOperation> operationsList1, List<AbstractOperation> operationsList2) {
this(mapping);
this.put(operationsList1);
this.put(operationsList2);
}
/**
* Constructor.
*
* @param project the project which contains the initial mapping from {EObject}s to their
* {@link org.eclipse.emf.emfstore.common.model.ESModelElementId ESModelElementId}s
* @param changePackage a {@link AbstractChangePackage}s whose involved model elements should
* be added to the mapping
*/
public ModelElementIdToEObjectMappingImpl(Project project, AbstractChangePackage changePackage) {
this(project);
this.put(changePackage);
}
/**
* Adds all model elements that are involved in operations contained in the {@link AbstractChangePackage} and their
* respective IDs into the mapping.
*
* @param changePackages
* the {@link AbstractChangePackage} whose model elements should be added to the mapping
*/
public void put(List<AbstractChangePackage> changePackages) {
for (final AbstractChangePackage changePackage : changePackages) {
put(changePackage);
}
}
/**
* Adds all model elements that are involved in operations contained in the {@link AbstractChangePackage} and their
* respective IDs into the mapping.
*
* @param changePackage
* the {@link AbstractChangePackage} whose model elements should be added to the mapping
*/
public void put(AbstractChangePackage changePackage) {
final ESCloseableIterable<AbstractOperation> operations = changePackage.operations();
try {
for (final AbstractOperation operation : operations.iterable()) {
scanOperationIntoMapping(operation);
}
} finally {
operations.close();
}
}
/**
* Put the given elements from the operations to the mapping.
*
* @param operations the operations
*/
public void put(Iterable<AbstractOperation> operations) {
for (final AbstractOperation op : operations) {
scanOperationIntoMapping(op);
}
}
private void scanOperationIntoMapping(AbstractOperation operation) {
if (operation instanceof CompositeOperation) {
final CompositeOperation composite = (CompositeOperation) operation;
for (final AbstractOperation subOp : composite.getSubOperations()) {
scanOperationIntoMapping(subOp);
}
return;
}
if (isCreateDelete(operation)) {
final CreateDeleteOperation createDeleteOperation = (CreateDeleteOperation) operation;
if (createDeleteOperation.getEObjectToIdMap().keySet().contains(null)) {
// illegal state
ModelUtil.logWarning(MessageFormat.format(
Messages.ModelElementIdToEObjectMappingImpl_CreateDeleteOp_NullKey,
createDeleteOperation.getIdentifier()));
}
for (final EObject modelElement : createDeleteOperation.getEObjectToIdMap().keySet()) {
idToEObjectMapping.put(createDeleteOperation.getEObjectToIdMap().get(modelElement).toString(),
modelElement);
}
}
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.common.model.ESIdToEObjectMapping#get(java.lang.Object)
*/
public EObject get(ModelElementId modelElementId) {
final EObject eObject = delegateMapping.get(modelElementId);
if (eObject != null) {
return eObject;
}
if (modelElementId == null) {
return null;
}
return idToEObjectMapping.get(modelElementId.toString());
}
/**
*
* {@inheritDoc}
*
*/
public ESModelElementIdToEObjectMappingImpl toAPI() {
if (apiImpl == null) {
apiImpl = createAPI();
}
return apiImpl;
}
/**
*
* {@inheritDoc}
*
*/
public ESModelElementIdToEObjectMappingImpl createAPI() {
return new ESModelElementIdToEObjectMappingImpl(this);
}
}