content: package oscfg.diagram.edit.commands;
  
  import org.eclipse.core.commands.ExecutionException;
  import org.eclipse.core.runtime.IAdaptable;
  import org.eclipse.core.runtime.IProgressMonitor;
  import org.eclipse.emf.ecore.EObject;
  import org.eclipse.gmf.runtime.common.core.command.CommandResult;
  import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
  import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientReferenceRelationshipRequest;
  import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
  
  import oscfg.InterruptSource;
  import oscfg.diagram.edit.policies.OscfgBaseItemSemanticEditPolicy;
  
  /**
   * @generated
   */
  public class InterruptSourceSourceISRReorientCommand extends EditElementCommand {
  
  	/**
  	 * @generated
  	 */
  	private final int reorientDirection;
  
  	/**
  	 * @generated
  	 */
  	private final EObject referenceOwner;
  
  	/**
  	 * @generated
  	 */
  	private final EObject oldEnd;
  
  	/**
  	 * @generated
  	 */
  	private final EObject newEnd;
  
  	/**
  	 * @generated
  	 */
  	public InterruptSourceSourceISRReorientCommand(
  			ReorientReferenceRelationshipRequest request) {
  		super(request.getLabel(), null, request);
  		reorientDirection = request.getDirection();
  		referenceOwner = request.getReferenceOwner();
  		oldEnd = request.getOldRelationshipEnd();
  		newEnd = request.getNewRelationshipEnd();
  	}
  
  	/**
  	 * @generated
  	 */
  	public boolean canExecute() {
  		if (false == referenceOwner instanceof InterruptSource) {
  			return false;
  		}
  		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {
  			return canReorientSource();
  		}
  		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {
  			return canReorientTarget();
  		}
  		return false;
  	}
  
  	/**
  	 * @generated
  	 */
  	protected boolean canReorientSource() {
  		if (!(oldEnd instanceof oscfg.ISR && newEnd instanceof InterruptSource)) {
  			return false;
  		}
  		return OscfgBaseItemSemanticEditPolicy.getLinkConstraints()
  				.canExistInterruptSourceSourceISR_4011(getNewSource(),
  						getOldTarget());
  	}
  
  	/**
  	 * @generated
  	 */
  	protected boolean canReorientTarget() {
  		if (!(oldEnd instanceof oscfg.ISR && newEnd instanceof oscfg.ISR)) {
  			return false;
  		}
  		return OscfgBaseItemSemanticEditPolicy.getLinkConstraints()
  				.canExistInterruptSourceSourceISR_4011(getOldSource(),
  						getNewTarget());
  	}
  
  	/**
  	 * @generated
  	 */
  	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,
  			IAdaptable info) throws ExecutionException {
  		if (!canExecute()) {
  			throw new ExecutionException(
  					"Invalid arguments in reorient link command"); //$NON-NLS-1$
  		}
  		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {
  			return reorientSource();
  		}
  		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {
  			return reorientTarget();
  		}
  		throw new IllegalStateException();
  	}
  
  	/**
  	 * @generated
  	 */
  	protected CommandResult reorientSource() throws ExecutionException {
  		getOldSource().setSourceISR(null);
  		getNewSource().setSourceISR(getOldTarget());
  		return CommandResult.newOKCommandResult(referenceOwner);
  	}
  
  	/**
  	 * @generated
  	 */
  	protected CommandResult reorientTarget() throws ExecutionException {
  		getOldSource().setSourceISR(getNewTarget());
  		return CommandResult.newOKCommandResult(referenceOwner);
  	}
  
  	/**
  	 * @generated
  	 */
  	protected InterruptSource getOldSource() {
  		return (InterruptSource) referenceOwner;
  	}
  
  	/**
  	 * @generated
  	 */
  	protected InterruptSource getNewSource() {
  		return (InterruptSource) newEnd;
  	}
  
  	/**
  	 * @generated
  	 */
  	protected oscfg.ISR getOldTarget() {
  		return (oscfg.ISR) oldEnd;
  	}
  
  	/**
  	 * @generated
  	 */
  	protected oscfg.ISR getNewTarget() {
  		return (oscfg.ISR) newEnd;
  	}
  }
  