/** * Copyright (c) 2002-2006 IBM Corporation 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: * IBM - Initial API and implementation */ package org.eclipse.emf.edit.command; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; /** * This is a convenient common base class for all the command parameters need by the various types of commands. * It provides particular support for the encodings need by the basic EMF-based command implementations. */ public class CommandParameter { /** * This value is used to indicate that the optional positional index indicator is unspecified. */ public static final int NO_INDEX = -1; /** * This is the object that is the target or subject of the command. */ public Object owner; /** * This is the aspect of the owner that will be affected. */ public Object feature; /** * This is the collection of values involved in the command. */ public Collection<?> collection; /** * This is the single value involved in the command. */ public Object value; /** * This the index (usually the position indicator) of the command. */ public int index; /** * This creates an instance specifying only an owner. */ public CommandParameter(Object owner) { this.owner = owner; } /** * This creates an instance specifying an owner, a feature, and a value. */ public CommandParameter(Object owner, Object feature, Object value) { this.owner = owner; this.feature = feature; this.value = value; this.index = NO_INDEX; } /** * This creates an instance specifying an owner, a feature, a value, and an index. */ public CommandParameter(Object owner, Object feature, Object value, int index) { this.owner = owner; this.feature = feature; this.value = value; this.index = index; } /** * This creates an instance specifying an owner, a feature, and a collection of values. */ public CommandParameter(Object owner, Object feature, Collection<?> collection) { this.owner = owner; this.feature = feature; this.collection = collection; this.index = NO_INDEX; } /** * This creates an instance specifying an owner, a feature, a collection of values, and an index. */ public CommandParameter(Object owner, Object feature, Collection<?> collection, int index) { this.owner = owner; this.feature = feature; this.collection = collection; this.index = index; } /** * This creates an instance specifying an owner, a feature, and a value, and a collection. */ public CommandParameter(Object owner, Object feature, Object value, Collection<?> collection) { this.owner = owner; this.feature = feature; this.value = value; this.collection = collection; this.index = NO_INDEX; } /** * This creates an instance specifying an owner, a feature, a value, a collection, and an index. */ public CommandParameter(Object owner, Object feature, Object value, Collection<?> collection, int index) { this.owner = owner; this.feature = feature; this.value = value; this.collection = collection; this.index = index; } /** * This returns the specified owner. */ public Object getOwner() { return owner; } /** * This returns the specified owner as a EObject, if it is one. */ public EObject getEOwner() { return owner instanceof EObject ? (EObject)owner : null; } /** * This sets the owner to the specified value. */ public void setOwner(Object owner) { this.owner = owner; } /** * This returns the specified feature. */ public Object getFeature() { return feature; } /** * This returns the specified feature as a EStructuralFeature, if it is one. */ public EStructuralFeature getEStructuralFeature() { return feature instanceof EStructuralFeature ? (EStructuralFeature)feature : null; } /** * This returns the specified feature as a EReference, if it is one. */ public EReference getEReference() { return feature instanceof EReference ? (EReference)feature : null; } /** * This returns the specified feature as a EReference, if it is one. */ public EAttribute getEAttribute() { return feature instanceof EAttribute ? (EAttribute)feature : null; } /** * This is a safe way to get the list affected by the parameters for an add or remove specification. * It can return either the {@link org.eclipse.emf.common.util.EList}, if the owner is one, * or it tries to get the EList specified by the feature of the owner. * * <p> * It works as an excellent guard for poorly formed parameters. */ public EList<?> getOwnerList() { if (owner instanceof EObject) { EObject eOwner = (EObject)owner; if (eOwner.eClass().getEAllStructuralFeatures().contains(feature)) { EStructuralFeature eStructuralFeature = (EStructuralFeature)feature; if (eStructuralFeature.isMany()) { return (EList<?>)eOwner.eGet(eStructuralFeature); } } } else if (owner instanceof EList<?>) { return (EList<?>)owner; } return null; } /** * This returns the specified collection. */ public Collection<?> getCollection() { return collection; } /** * This returns the specified collection as a list. * If the collection isn't a list, a new copy is created. */ public List<?> getList() { return collection == null ? null : collection instanceof List<?> ? (List<?>)collection : new ArrayList<Object>(collection); } /** * This returns the specified value. */ public Object getValue() { return value; } /** * This returns the specified value as a EObject, if it is one. */ public EObject getEValue() { return value instanceof EObject ? (EObject)value : null; } /** * This returns the specified index. */ public int getIndex() { return index; } /** * This yields an encoding of the owner-child relation. */ public Collection<String> getParameters() { Collection<String> parameters = new ArrayList<String>(); EObject eObject = getEOwner(); EStructuralFeature eStructuralFeature = getEStructuralFeature(); if (eObject != null && eStructuralFeature != null) { parameters.add(eObject.eClass().getName()); parameters.add(eStructuralFeature.getEType().getName()); } return parameters; } public static String collectionToString(Collection<?> collection) { if (collection == null) { return "null"; } else { StringBuffer result = new StringBuffer(); result.append("{ "); for (Iterator<?> objects = collection.iterator(); objects.hasNext(); ) { result.append(objects.next()); if (objects.hasNext()) { result.append(", "); } } result.append(" }"); return result.toString(); } } @Override public String toString() { StringBuffer result = new StringBuffer(); result.append("CommandParameter"); result.append("\n owner = "); result.append(owner); result.append("\n feature = "); result.append(feature); if (getOwnerList() != null) { result.append("\n ownerList = "); result.append(collectionToString(getOwnerList())); } if (collection != null) { result.append("\n collection = "); result.append(collectionToString(collection)); } if (value != null) { result.append("\n value = "); result.append(value); } if (index != NO_INDEX) { result.append("\n index = "); result.append(index); } return result.toString(); } }