package org.objectstyle.wolips.eomodeler.actions;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.AbstractOperation;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.objectstyle.wolips.eomodeler.core.model.EOEntity;
import org.objectstyle.wolips.eomodeler.core.model.EOModelException;
import org.objectstyle.wolips.eomodeler.core.model.EOModelVerificationFailure;
import org.objectstyle.wolips.eomodeler.core.model.EORelationship;
public class NewManyToManyRelationshipOperation extends AbstractOperation {
private EOEntity _sourceEntity;
private String _name;
private boolean _createRelationship;
private EOEntity _destinationEntity;
private String _inverseName;
private boolean _createInverseRelationship;
private String _joinEntityName;
private boolean _flatten;
private EOEntity _joinEntity;
public NewManyToManyRelationshipOperation(EOEntity sourceEntity, EOEntity destinationEntity, boolean createRelationship, String name, boolean createInverseRelationship, String inverseName, String joinEntityName, boolean flatten) {
super("Add Relationship");
_sourceEntity = sourceEntity;
_destinationEntity = destinationEntity;
_createRelationship = createRelationship;
_name = name;
_createInverseRelationship = createInverseRelationship;
_inverseName = inverseName;
_joinEntityName = joinEntityName;
_flatten = flatten;
}
@Override
public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
try {
_joinEntity = _sourceEntity.joinInManyToManyWith(_destinationEntity, _createRelationship, _name, _createInverseRelationship, _inverseName, _joinEntityName, _flatten);
return Status.OK_STATUS;
} catch (EOModelException e) {
throw new ExecutionException("Failed to add new object.", e);
}
}
@Override
public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
return execute(monitor, info);
}
@Override
public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
HashSet<EOModelVerificationFailure> failures = new HashSet<EOModelVerificationFailure>();
Set<EORelationship> referencingRelationships = _joinEntity.getReferencingRelationships();
for (EORelationship relationship : referencingRelationships) {
if (!relationship.isFlattened()) {
if (_flatten) {
for (EORelationship flattenedRelationship : relationship.getReferencingFlattenedRelationships()) {
flattenedRelationship._removeFromModelParent(failures);
}
}
relationship._removeFromModelParent(failures);
}
}
_joinEntity._removeFromModelParent(failures);
return Status.OK_STATUS;
}
}