private static LinkedHashSet<EStructuralFeature> getAllEStructuralFeatures(
			EClass eClass, LinkedHashSet<EStructuralFeature> eStructuralFeatures) {
		for (EAttribute eAttribute : eClass.getEAllAttributes()) {
			// System.out.println("\t\t\t" + eAttribute.getName());
			eStructuralFeatures.add(eAttribute);
		}
		for (EReference eReference : eClass.getEAllReferences()) {
			// System.out.println("\t\t\t" + eReference.getName());
			if (eReference.getName().startsWith("base")) {
				// System.out
				// .println("\t\t\t\t" + eReference.getEType().getName());
				EClassifier umlClassifier = eReference.getEType();
				if (umlClassifier instanceof EClass) {
					EClass umlType = (EClass) umlClassifier;
					for (EReference umlReference : umlType.getEAllReferences()) {
						if (umlReference.getName().equals("eAnnotations")) {
							continue;
						}
						// System.out.println("\t\t\t\t\t"
						// + umlReference.getName());
						eStructuralFeatures.add(umlReference);
					}
					for (EAttribute umlAttribute : umlType.getEAllAttributes()) {
						if (umlAttribute.getName().equals("eAnnotations")) {
							continue;
						}
						// System.out.println("\t\t\t\t\t"
						// + umlAttribute.getName());
						eStructuralFeatures.add(umlAttribute);
					}
					for (EClass eSuperType : umlType.getESuperTypes()) {
						getAllEStructuralFeatures(eSuperType,
								eStructuralFeatures);
					}
				}

			}
		}
		return eStructuralFeatures;
	}