package org.eclipse.emf.examples.jet.article2.model;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Class modelling a Java typesafe enumeration class.
*
* @author Remko Popma
* @version $Revision: 1.3 $ ($Date: 2008/05/29 14:56:38 $)
*/
public class TypesafeEnum
{
private String mPackageName = "";
private String mClassName = "";
private String mAuthor = "";
private String mVersion = "";
private ArrayList<Instance> mInstances = new ArrayList<Instance>();
private ArrayList<Attribute> mAttributes = new ArrayList<Attribute>();
private Instance mDefaultInstance = null;
/**
* Constructs an uninitialized <code>TypesafeEnum</code>.
*/
public TypesafeEnum()
{
super();
}
/**
* Convenience method that returns a comma-separated list of attribute types
* and names. The result of this method can be used as the parameter list for
* the constructor of an instance.
*
* @return a comma-separated list of attributes, formatted like
* <code>attrib1-type attrib1-name, attrib2-type attrib2-name (, ...)</code>
*/
public String constructorParameterDescription()
{
return parameterDescription(attributes());
}
/**
* Convenience method that returns a comma-separated list of the key attribute
* types and names. The result of this method can be used as the parameter
* list for the lookup method.
*
* @return a comma-separated list of key attributes, formatted like
* <code>key-attrib1-type key-attrib1-name, key-attrib2-type key-attrib2-name (, ...)</code>
*/
public String keyParameterDescription()
{
return parameterDescription(keyAttributes());
}
private String parameterDescription(Iterator<Attribute> attributes)
{
StringBuffer result = new StringBuffer();
for (Iterator<Attribute> i = attributes; i.hasNext();)
{
Attribute attrib = i.next();
result.append(attrib.getType()).append(' ');
result.append(attrib.getUncappedName());
if (i.hasNext())
{
result.append(", ");
}
}
return result.toString();
}
/**
* Returns whether this <code>TypesafeEnum</code> has a default instance.
*
* @return whether this <code>TypesafeEnum</code> has a default instance
*/
public boolean hasDefaultInstance()
{
return getDefaultInstance() != null;
}
/**
* Returns the default instance of this <code>TypesafeEnum</code>, or
* <code>null</code> if this type does not have a default instance.
*
* @return the default instance or <code>null</code>
*/
public Instance getDefaultInstance()
{
return mDefaultInstance;
}
/**
* Sets the default instance of this <code>TypesafeEnum</code>.
*
* @param newDefault
* the new default instance
*/
public void setDefaultInstance(Instance newDefault)
{
mDefaultInstance = newDefault;
}
/**
* Returns the author to use in the type comment of this type
*
* @return the author to use in the type comment of this type
*/
public String getAuthor()
{
return mAuthor;
}
/**
* Returns the class name of this type.
*
* @return the class name of this type
*/
public String getClassName()
{
return mClassName;
}
/**
* Returns the package name of this type.
*
* @return the package name of this type
*/
public String getPackageName()
{
return mPackageName;
}
/**
* Returns the version string to use in the type comment of this type.
*
* @return the version string to use in the type comment of this type
*/
public String getVersion()
{
return mVersion;
}
/**
* Sets the author to use in the type comment of this type.
*
* @param author
* the author to use in the type comment of this type
*/
public void setAuthor(String author)
{
mAuthor = author;
}
/**
* Sets the class name of this type.
*
* @param className
* the class name of this type
*/
public void setClassName(String className)
{
mClassName = className;
}
/**
* Sets the package name of this type.
*
* @param packageName
* the package name of this type
*/
public void setPackageName(String packageName)
{
mPackageName = packageName;
}
/**
* Sets the version string to use in the type comment of this type.
*
* @param version
* the version string to use in the type comment of this type
*/
public void setVersion(String version)
{
mVersion = version;
}
/**
* Returns an <code>Iterator</code> over the instances of this type.
*
* @return an <code>Iterator</code> over the instances of this type
*/
public Iterator<Instance> instances()
{
return mInstances.iterator();
}
/**
* Returns an <code>Iterator</code> over the attributes of this type.
*
* @return an <code>Iterator</code> over the attributes of this type
*/
public Iterator<Attribute> attributes()
{
return mAttributes.iterator();
}
/**
* Returns an <code>Iterator</code> over the attributes of this type that
* have been marked as key attributes (uniquely identifying instances).
*
* @return an <code>Iterator</code> over the key attributes
*/
public Iterator<Attribute> keyAttributes()
{
ArrayList<Attribute> result = new ArrayList<Attribute>();
for (Iterator<Attribute> i = attributes(); i.hasNext();)
{
Attribute attrib = i.next();
if (attrib.isKey())
{
result.add(attrib);
}
}
return result.iterator();
}
/**
* Adds an instance to this <code>TypesafeEnum</code>, and sets the type of
* the specified <code>Instance</code> to this object.
*
* @param instance
* the instance to add
*/
public void addInstance(Instance instance)
{
mInstances.add(instance);
instance.setType(this);
}
/**
* Removes the specified <code>Instance</code> from this
* <code>TypesafeEnum</code>, and sets the type of the specified instance
* to <code>null</code>.
*
* @param instance
* the instance to remove
* @return whether the instance was in this type
*/
public boolean removeInstance(Instance instance)
{
boolean result = mInstances.remove(instance);
if (result)
{
instance.setType(null);
}
return result;
}
/**
* Returns the number of instances in this type.
*
* @return the number of instances in this type
*/
public int instanceCount()
{
return mInstances.size();
}
/**
* Adds the specified <code>Attribute</code> to this
* <code>TypesafeEnum</code>.
*
* @param attribute
* the attribute to add
*/
public void addAttribute(Attribute attribute)
{
mAttributes.add(attribute);
}
/**
* Removes the specified <code>Attribute</code> from this
* <code>TypesafeEnum</code>.
*
* @param attribute
* the attribute to remove
* @return whether the specified attribute existed in this type
*/
public boolean removeAttribute(Attribute attribute)
{
return mAttributes.remove(attribute);
}
/**
* Returns the number of attributes in this type.
*
* @return the number of attributes in this type
*/
public int attributeCount()
{
return mAttributes.size();
}
/**
* Returns whether this is the last attribute in the list.
*
* @param attribute
* @return whether this is the last attribute in the list
*/
public boolean isLast(Attribute attribute)
{
return mAttributes.indexOf(attribute) == attributeCount() - 1;
}
/**
* Returns whether this is the first attribute in the list.
*
* @param attribute
* @return whether this is the first attribute in the list
*/
public boolean isFirst(Attribute attribute)
{
return mAttributes.indexOf(attribute) == 0;
}
/**
* Returns whether this is the last instance in the list.
*
* @param instance
* @return whether this is the last instance in the list
*/
public boolean isLast(Instance instance)
{
return mInstances.indexOf(instance) == instanceCount() - 1;
}
/**
* Returns whether this is the first instance in the list.
*
* @param instance
* @return whether this is the first instance in the list
*/
public boolean isFirst(Instance instance)
{
return mInstances.indexOf(instance) == 0;
}
/**
* @param attributeName
* @return whether there is an attribute with a specific name
*/
public boolean hasAttribute(String attributeName)
{
for (Iterator<Attribute> i = attributes(); i.hasNext();)
{
if (i.next().getName().equals(attributeName))
{
return true;
}
}
return false;
}
/**
* Returns the attributes in this typesafe enum as an array.
*
* @return the attributes in this typesafe enum as an array
*/
public Attribute[] attributeArray()
{
return mAttributes.toArray(new Attribute [mAttributes.size()]);
}
}