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