Smell 'Unnamed Data Type' added and code improved
diff --git a/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/EqualAttributesinSiblingClasses.class b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/EqualAttributesinSiblingClasses.class
new file mode 100644
index 0000000..6526b0e
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/EqualAttributesinSiblingClasses.class
Binary files differ
diff --git a/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedAttribute.class b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedAttribute.class
new file mode 100644
index 0000000..874e774
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedAttribute.class
Binary files differ
diff --git a/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedClass.class b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedClass.class
new file mode 100644
index 0000000..4a21e15
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedClass.class
Binary files differ
diff --git a/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedDataType.class b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedDataType.class
new file mode 100644
index 0000000..111408e
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedDataType.class
Binary files differ
diff --git a/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedInterface.class b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedInterface.class
new file mode 100644
index 0000000..3b07aaf
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedInterface.class
Binary files differ
diff --git a/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedOperation.class b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedOperation.class
new file mode 100644
index 0000000..98460d8
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedOperation.class
Binary files differ
diff --git a/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedPackage.class b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedPackage.class
new file mode 100644
index 0000000..266a2cf
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedPackage.class
Binary files differ
diff --git a/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedParameter.class b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedParameter.class
new file mode 100644
index 0000000..4525ecf
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/bin/org/eclipse/emf/refactor/smells/uml24/UnnamedParameter.class
Binary files differ
diff --git a/org.eclipse.emf.refactor.smells.uml24/plugin.xml b/org.eclipse.emf.refactor.smells.uml24/plugin.xml
index 9bc4bd3..6590eb5 100644
--- a/org.eclipse.emf.refactor.smells.uml24/plugin.xml
+++ b/org.eclipse.emf.refactor.smells.uml24/plugin.xml
@@ -1,6 +1,68 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>

 <plugin>

 <extension point="org.eclipse.emf.refactor.smells">

-<modelsmell id="org.eclipse.emf.refactor.smells.uml24.concretesuperclass" modelsmell_description="There is an abstract Class having a concrete super Class" modelsmell_finderclass="org.eclipse.emf.refactor.smells.uml24.ConcreteSuperclass" modelsmell_metamodel="http://www.eclipse.org/uml2/4.0.0/UML" modelsmell_name="Concrete Superclass"/>

+<modelsmell 

+      id="org.eclipse.emf.refactor.smells.uml24.concretesuperclass" 

+      modelsmell_description="There is an abstract Class having a concrete super Class" 

+      modelsmell_finderclass="org.eclipse.emf.refactor.smells.uml24.ConcreteSuperclass" 

+      modelsmell_metamodel="http://www.eclipse.org/uml2/4.0.0/UML" 

+      modelsmell_name="Concrete Superclass">

+</modelsmell>

+<modelsmell

+      id="org.eclipse.emf.refactor.smells.uml24.equalattributesinsiblingclasses"

+      modelsmell_description="Each sibling class of the owning class of the attribute contains an equal attribute."

+      modelsmell_finderclass="org.eclipse.emf.refactor.smells.uml24.EqualAttributesinSiblingClasses"

+      modelsmell_metamodel="http://www.eclipse.org/uml2/4.0.0/UML"

+      modelsmell_name="Equal Attributes in Sibling Classes">

+</modelsmell>

+<modelsmell

+      id="org.eclipse.emf.refactor.smells.uml24.unnamedclass"

+      modelsmell_description="The model contains a class without a name."

+      modelsmell_finderclass="org.eclipse.emf.refactor.smells.uml24.UnnamedClass"

+      modelsmell_metamodel="http://www.eclipse.org/uml2/4.0.0/UML"

+      modelsmell_name="Unnamed Class">

+</modelsmell>

+<modelsmell

+      id="org.eclipse.emf.refactor.smells.uml24.unnamedattribute"

+      modelsmell_description="The model contains an attribute without a name."

+      modelsmell_finderclass="org.eclipse.emf.refactor.smells.uml24.UnnamedAttribute"

+      modelsmell_metamodel="http://www.eclipse.org/uml2/4.0.0/UML"

+      modelsmell_name="Unnamed Attribute">

+</modelsmell>

+<modelsmell

+      id="org.eclipse.emf.refactor.smells.uml24.unnamedoperation"

+      modelsmell_description="The model contains an operation without a name."

+      modelsmell_finderclass="org.eclipse.emf.refactor.smells.uml24.UnnamedOperation"

+      modelsmell_metamodel="http://www.eclipse.org/uml2/4.0.0/UML"

+      modelsmell_name="Unnamed Operation">

+</modelsmell>

+<modelsmell

+      id="org.eclipse.emf.refactor.smells.uml24.unnamedinterface"

+      modelsmell_description="The model contains an interface without a name."

+      modelsmell_finderclass="org.eclipse.emf.refactor.smells.uml24.UnnamedInterface"

+      modelsmell_metamodel="http://www.eclipse.org/uml2/4.0.0/UML"

+      modelsmell_name="Unnamed Interface">

+</modelsmell>

+<modelsmell

+      id="org.eclipse.emf.refactor.smells.uml24.unnamedparameter"

+      modelsmell_description="The model contains a non-return parameter without a name."

+      modelsmell_finderclass="org.eclipse.emf.refactor.smells.uml24.UnnamedParameter"

+      modelsmell_metamodel="http://www.eclipse.org/uml2/4.0.0/UML"

+      modelsmell_name="Unnamed Parameter">

+</modelsmell>

+<modelsmell

+      id="org.eclipse.emf.refactor.smells.uml24.unnamedpackage"

+      modelsmell_description="The model contains a package without a name."

+      modelsmell_finderclass="org.eclipse.emf.refactor.smells.uml24.UnnamedPackage"

+      modelsmell_metamodel="http://www.eclipse.org/uml2/4.0.0/UML"

+      modelsmell_name="Unnamed Package">

+</modelsmell>

+<modelsmell

+      id="org.eclipse.emf.refactor.smells.uml24.unnameddatatype"

+      modelsmell_description="The model contains a data type without a name."

+      modelsmell_finderclass="org.eclipse.emf.refactor.smells.uml24.UnnamedDataType"

+      modelsmell_metamodel="http://www.eclipse.org/uml2/4.0.0/UML"

+      modelsmell_name="Unnamed Data Type">

+</modelsmell>

 </extension>

 </plugin>

diff --git a/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/EqualAttributesinSiblingClasses.java b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/EqualAttributesinSiblingClasses.java
new file mode 100644
index 0000000..522f049
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/EqualAttributesinSiblingClasses.java
@@ -0,0 +1,174 @@
+package org.eclipse.emf.refactor.smells.uml24;

+

+import java.util.ArrayList;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.emf.common.util.TreeIterator;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.refactor.smells.interfaces.IModelSmellFinder;

+import org.eclipse.uml2.uml.Class;

+import org.eclipse.uml2.uml.Model;

+import org.eclipse.uml2.uml.Property;

+

+

+public final class EqualAttributesinSiblingClasses implements IModelSmellFinder {

+

+	@Override

+	public LinkedList<LinkedList<EObject>> findSmell(EObject root) {

+		LinkedList<LinkedList<EObject>> results = new LinkedList<LinkedList<EObject>>();

+		List<Property> attributes = getAllClassAttributes(root);

+		for (Property attribute : attributes) {

+			Class owningClass = attribute.getClass_();

+			List<Class> superClasses = owningClass.getSuperClasses();

+			for (Class superClass : superClasses) {

+				if (eachSubClassContainsAttribute(superClass, attribute)) {

+					LinkedList<EObject> result = new LinkedList<EObject>();

+					result.add(attribute.getClass_());

+					result.add(attribute);

+					results.add(result);

+				}

+			}

+		}

+		return results;

+	}

+

+	private boolean eachSubClassContainsAttribute(Class superClass, Property attribute) {

+		List<Class> subClasses = new ArrayList<Class>();

+		List<Class> allClasses = getAllClasses(superClass.getModel());

+		for (Class modelClass : allClasses) {

+			if (modelClass != attribute.getClass_() && modelClass.getSuperClasses().contains(superClass)) {

+				subClasses.add(modelClass);

+			}

+		}

+		if (subClasses.isEmpty()) return false;

+		for (Class subClass : subClasses) {

+			if (! classContainsEqualAttribute(subClass, attribute)) {

+				return false;

+			}

+		}

+		return true;

+	}

+	

+	private boolean classContainsEqualAttribute(Class cls, Property attribute) {

+		if (attribute.getClass_().equals(cls)) return true;

+		boolean classHasEqualAttribute = false;

+		for (Property attr : cls.getOwnedAttributes()) {

+			if (! haveSameNames(attr, attribute)) continue;

+			if (! haveSameType(attr, attribute)) continue;

+			if (! haveSameVisibilities(attr, attribute)) continue;

+			if (! haveSameMultiplicities(attr, attribute)) continue;

+			if (! haveSameAggregations(attr, attribute)) continue;

+			if (! haveSameDefaultValues(attr, attribute)) continue;

+			if (! haveSameDerivedProperties(attr, attribute)) continue;

+			if (! haveSameLeafProperties(attr, attribute)) continue;

+			if (! haveSameReadOnlyProperties(attr, attribute)) continue;

+			if (! haveSameUniqueProperties(attr, attribute)) continue;

+			if (! haveSameOrderedProperties(attr, attribute)) continue;

+			if (! haveSameStaticProperties(attr, attribute)) continue;

+			if (! haveSameDerivedUnionProperties(attr, attribute)) continue;

+			if ((attr.getAssociation() != null) && (attribute.getAssociation() != null)) {

+				if (getOtherSideUpper(attr) != getOtherSideUpper(attribute)) continue;

+			}

+			classHasEqualAttribute = true;

+			break;

+		}

+		return classHasEqualAttribute;

+	}

+	

+	private int getOtherSideUpper(Property attribute) {

+		int upper = 0;

+		for (Property ae : attribute.getAssociation().getMemberEnds()) {

+			if (! ae.equals(attribute)) upper = ae.getUpper();

+		}

+		return upper;

+	}

+

+	private boolean haveSameDerivedUnionProperties(Property att1, Property att2) {

+		return (att1.isDerivedUnion() == att2.isDerivedUnion());

+	}

+	

+	private boolean haveSameStaticProperties(Property att1, Property att2) {

+		return (att1.isStatic() == att2.isStatic());

+	}

+

+	private boolean haveSameOrderedProperties(Property att1, Property att2) {

+		return (att1.isOrdered() == att2.isOrdered());

+	}

+	

+	private boolean haveSameUniqueProperties(Property att1, Property att2) {

+		return (att1.isUnique() == att2.isUnique());

+	}

+	

+	private boolean haveSameReadOnlyProperties(Property att1, Property att2) {

+		return (att1.isReadOnly() == att2.isReadOnly());

+	}

+	

+	private boolean haveSameLeafProperties(Property att1, Property att2) {

+		return (att1.isLeaf() == att2.isLeaf());

+	}

+	

+	private boolean haveSameDerivedProperties(Property att1, Property att2) {

+		return (att1.isDerived() == att2.isDerived());

+	}

+

+	private boolean haveSameDefaultValues(Property att1, Property att2) {

+		if ((att1.getDefault() == null) && (att2.getDefault() == null)) return true;

+		if ((att1.getDefault() != null) 

+				&& (att2.getDefault() != null)

+				&& (att1.getDefault().equals(att2.getDefault()))) return true;

+		return false;

+	}

+

+	private boolean haveSameAggregations(Property att1, Property att2) {

+		return att1.getAggregation().equals(att2.getAggregation());

+	}

+

+	private boolean haveSameMultiplicities(Property att1, Property att2) {

+		return ((att1.getLower() == att2.getLower()) 

+				&& (att1.getUpper() == att2.getUpper()));

+	}

+

+	private boolean haveSameVisibilities(Property att1, Property att2) {

+		return att1.getVisibility().equals(att2.getVisibility());

+	}

+

+	private boolean haveSameNames(Property att1, Property att2) {

+		return att1.getName().equals(att2.getName());

+	}

+

+	private boolean haveSameType(Property att1, Property att2) {

+		if ((att1.getType() == null) && (att2.getType() == null)) return true;

+		if ((att1.getType() != null) 

+				&& (att2.getType() != null)

+				&& (att1.getType().equals(att2.getType()))) return true;

+		return false;

+	}

+

+	private ArrayList<Class> getAllClasses(Model model) {

+		ArrayList<Class> classes = new ArrayList<Class>();

+		TreeIterator<EObject> iter = model.eResource().getAllContents();

+		while (iter.hasNext()) {

+			EObject eObject = iter.next();

+			if (eObject instanceof Class) {

+				classes.add((Class) eObject);

+			}			

+		}		

+		return classes;

+	}

+

+	private List<Property> getAllClassAttributes(EObject root) {

+		List<Property> attributes = new ArrayList<Property>();

+		TreeIterator<EObject> iter = root.eAllContents();

+		while (iter.hasNext()) {

+			EObject eObject = iter.next();

+			if (eObject instanceof Property) {

+				Property prop = (Property) eObject;

+				if (prop.getClass_() != null) {

+					attributes.add(prop);

+				}

+			}

+		}

+		return attributes;

+	}	

+}
\ No newline at end of file
diff --git a/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedAttribute.java b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedAttribute.java
new file mode 100644
index 0000000..3085206
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedAttribute.java
@@ -0,0 +1,46 @@
+package org.eclipse.emf.refactor.smells.uml24;

+

+import java.util.ArrayList;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.emf.common.util.TreeIterator;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.refactor.smells.interfaces.IModelSmellFinder;

+import org.eclipse.uml2.uml.Classifier;

+import org.eclipse.uml2.uml.Property;

+

+public final class UnnamedAttribute implements IModelSmellFinder {

+

+	@Override

+	public LinkedList<LinkedList<EObject>> findSmell(EObject root) {

+		LinkedList<LinkedList<EObject>> results = new LinkedList<LinkedList<EObject>>();

+		// begin custom code

+		List<Property> properties = getAllProperties(root);

+		for (Property prop : properties) {

+			if (prop.getName() == null || prop.getName().equals("")) {

+				LinkedList<EObject> result = new LinkedList<EObject>();

+				result.add(prop);

+				results.add(result);

+			}

+		}

+		// end custom code

+		return results;

+	}

+

+	private List<Property> getAllProperties(EObject root) {

+		List<Property> properties = new ArrayList<Property>();

+		TreeIterator<EObject> iter = root.eAllContents();

+		while (iter.hasNext()) {

+			EObject eObject = iter.next();

+			if (eObject instanceof Classifier) {

+				Classifier cl = (Classifier) eObject;

+				for (Property prop : cl.getAttributes()) {

+					properties.add(prop);

+				}

+			}

+		}

+		return properties;

+	}

+	

+}
\ No newline at end of file
diff --git a/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedClass.java b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedClass.java
new file mode 100644
index 0000000..4eddbfc
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedClass.java
@@ -0,0 +1,43 @@
+package org.eclipse.emf.refactor.smells.uml24;

+

+import java.util.ArrayList;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.emf.common.util.TreeIterator;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.refactor.smells.interfaces.IModelSmellFinder;

+import org.eclipse.uml2.uml.Class;

+

+public final class UnnamedClass implements IModelSmellFinder {

+

+	@Override

+	public LinkedList<LinkedList<EObject>> findSmell(EObject root) {

+		LinkedList<LinkedList<EObject>> results = new LinkedList<LinkedList<EObject>>();

+		// begin custom code

+		List<Class> classes = getAllClasses(root);

+		for (Class cl : classes) {

+			if (cl.getName() == null || cl.getName().equals("")) {

+				LinkedList<EObject> result = new LinkedList<EObject>();

+				result.add(cl);

+				results.add(result);

+			}

+		}

+		// end custom code

+		return results;

+	}

+

+	private List<Class> getAllClasses(EObject root) {

+		List<Class> classes = new ArrayList<Class>();

+		TreeIterator<EObject> iter = root.eAllContents();

+		while (iter.hasNext()) {

+			EObject eObject = iter.next();

+			if (eObject instanceof Class) {

+				Class cl = (Class) eObject;

+				classes.add(cl);

+			}

+		}

+		return classes;

+	}

+	

+}
\ No newline at end of file
diff --git a/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedDataType.java b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedDataType.java
new file mode 100644
index 0000000..a481d60
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedDataType.java
@@ -0,0 +1,43 @@
+package org.eclipse.emf.refactor.smells.uml24;

+

+import java.util.ArrayList;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.emf.common.util.TreeIterator;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.refactor.smells.interfaces.IModelSmellFinder;

+import org.eclipse.uml2.uml.DataType;

+

+public final class UnnamedDataType implements IModelSmellFinder {

+

+	@Override

+	public LinkedList<LinkedList<EObject>> findSmell(EObject root) {

+		LinkedList<LinkedList<EObject>> results = new LinkedList<LinkedList<EObject>>();

+		// begin custom code

+		List<DataType> dataTypes = getAllDataTypes(root);

+		for (DataType dataType : dataTypes) {

+			if (dataType.getName() == null || dataType.getName().equals("")) {

+				LinkedList<EObject> result = new LinkedList<EObject>();

+				result.add(dataType);

+				results.add(result);

+			}

+		}

+		// end custom code

+		return results;

+	}

+

+	private List<DataType> getAllDataTypes(EObject root) {

+		List<DataType> dataTypes = new ArrayList<DataType>();

+		TreeIterator<EObject> iter = root.eAllContents();

+		while (iter.hasNext()) {

+			EObject eObject = iter.next();

+			if (eObject instanceof DataType) {

+				DataType dataType = (DataType) eObject;

+				dataTypes.add(dataType);

+			}

+		}

+		return dataTypes;

+	}

+	

+}
\ No newline at end of file
diff --git a/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedInterface.java b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedInterface.java
new file mode 100644
index 0000000..942d9c4
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedInterface.java
@@ -0,0 +1,43 @@
+package org.eclipse.emf.refactor.smells.uml24;

+

+import java.util.ArrayList;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.emf.common.util.TreeIterator;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.refactor.smells.interfaces.IModelSmellFinder;

+import org.eclipse.uml2.uml.Interface;

+

+public final class UnnamedInterface implements IModelSmellFinder {

+

+	@Override

+	public LinkedList<LinkedList<EObject>> findSmell(EObject root) {

+		LinkedList<LinkedList<EObject>> results = new LinkedList<LinkedList<EObject>>();

+		// begin custom code

+		List<Interface> interfaces = getAllInterfaces(root);

+		for (Interface interf : interfaces) {

+			if (interf.getName() == null || interf.getName().equals("")) {

+				LinkedList<EObject> result = new LinkedList<EObject>();

+				result.add(interf);

+				results.add(result);

+			}

+		}

+		// end custom code

+		return results;

+	}

+

+	private List<Interface> getAllInterfaces(EObject root) {

+		List<Interface> interfaces = new ArrayList<Interface>();

+		TreeIterator<EObject> iter = root.eAllContents();

+		while (iter.hasNext()) {

+			EObject eObject = iter.next();

+			if (eObject instanceof Interface) {

+				Interface cl = (Interface) eObject;

+				interfaces.add(cl);

+			}

+		}

+		return interfaces;

+	}

+	

+}
\ No newline at end of file
diff --git a/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedOperation.java b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedOperation.java
new file mode 100644
index 0000000..ee8a9d9
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedOperation.java
@@ -0,0 +1,43 @@
+package org.eclipse.emf.refactor.smells.uml24;

+

+import java.util.ArrayList;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.emf.common.util.TreeIterator;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.refactor.smells.interfaces.IModelSmellFinder;

+import org.eclipse.uml2.uml.Operation;

+

+public final class UnnamedOperation implements IModelSmellFinder {

+

+	@Override

+	public LinkedList<LinkedList<EObject>> findSmell(EObject root) {

+		LinkedList<LinkedList<EObject>> results = new LinkedList<LinkedList<EObject>>();

+		// begin custom code

+		List<Operation> operations = getAllOperations(root);

+		for (Operation op : operations) {

+			if (op.getName() == null || op.getName().equals("")) {

+				LinkedList<EObject> result = new LinkedList<EObject>();

+				result.add(op);

+				results.add(result);

+			}

+		}

+		// end custom code

+		return results;

+	}

+

+	private List<Operation> getAllOperations(EObject root) {

+		List<Operation> operations = new ArrayList<Operation>();

+		TreeIterator<EObject> iter = root.eAllContents();

+		while (iter.hasNext()) {

+			EObject eObject = iter.next();

+			if (eObject instanceof Operation) {

+				Operation op = (Operation) eObject;

+				operations.add(op);

+			}

+		}

+		return operations;

+	}

+	

+}
\ No newline at end of file
diff --git a/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedPackage.java b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedPackage.java
new file mode 100644
index 0000000..ed195f4
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedPackage.java
@@ -0,0 +1,43 @@
+package org.eclipse.emf.refactor.smells.uml24;

+

+import java.util.ArrayList;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.emf.common.util.TreeIterator;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.refactor.smells.interfaces.IModelSmellFinder;

+import org.eclipse.uml2.uml.Package;

+

+public final class UnnamedPackage implements IModelSmellFinder {

+

+	@Override

+	public LinkedList<LinkedList<EObject>> findSmell(EObject root) {

+		LinkedList<LinkedList<EObject>> results = new LinkedList<LinkedList<EObject>>();

+		// begin custom code

+		List<Package> packages = getAllPackages(root);

+		for (Package p : packages) {

+			if (p.getName() == null || p.getName().equals("")) {

+				LinkedList<EObject> result = new LinkedList<EObject>();

+				result.add(p);

+				results.add(result);

+			}

+		}

+		// end custom code

+		return results;

+	}

+

+	private List<Package> getAllPackages(EObject root) {

+		List<Package> packages = new ArrayList<Package>();

+		TreeIterator<EObject> iter = root.eAllContents();

+		while (iter.hasNext()) {

+			EObject eObject = iter.next();

+			if (eObject instanceof Package) {

+				Package p = (Package) eObject;

+				packages.add(p);

+			}

+		}

+		return packages;

+	}

+	

+}
\ No newline at end of file
diff --git a/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedParameter.java b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedParameter.java
new file mode 100644
index 0000000..140d108
--- /dev/null
+++ b/org.eclipse.emf.refactor.smells.uml24/src/org/eclipse/emf/refactor/smells/uml24/UnnamedParameter.java
@@ -0,0 +1,45 @@
+package org.eclipse.emf.refactor.smells.uml24;

+

+import java.util.ArrayList;

+import java.util.LinkedList;

+import java.util.List;

+

+import org.eclipse.emf.common.util.TreeIterator;

+import org.eclipse.emf.ecore.EObject;

+import org.eclipse.emf.refactor.smells.interfaces.IModelSmellFinder;

+import org.eclipse.uml2.uml.Parameter;

+import org.eclipse.uml2.uml.ParameterDirectionKind;

+

+public final class UnnamedParameter implements IModelSmellFinder {

+

+	@Override

+	public LinkedList<LinkedList<EObject>> findSmell(EObject root) {

+		LinkedList<LinkedList<EObject>> results = new LinkedList<LinkedList<EObject>>();

+		// begin custom code

+		List<Parameter> parameters = getAllParameters(root);

+		for (Parameter par : parameters) {

+			if (par.getDirection() != ParameterDirectionKind.RETURN_LITERAL)

+			if (par.getName() == null || par.getName().equals("")) {

+				LinkedList<EObject> result = new LinkedList<EObject>();

+				result.add(par);

+				results.add(result);

+			}

+		}

+		// end custom code

+		return results;

+	}

+

+	private List<Parameter> getAllParameters(EObject root) {

+		List<Parameter> parameters = new ArrayList<Parameter>();

+		TreeIterator<EObject> iter = root.eAllContents();

+		while (iter.hasNext()) {

+			EObject eObject = iter.next();

+			if (eObject instanceof Parameter) {

+				Parameter par = (Parameter) eObject;

+				parameters.add(par);

+			}

+		}

+		return parameters;

+	}

+	

+}
\ No newline at end of file