DynamicModelParser.java 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package de.jplag.emf.model.parser;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.eclipse.emf.ecore.EObject;
  5. import org.eclipse.emf.ecore.EPackage;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import de.jplag.emf.dynamic.parser.DynamicEcoreParser;
  9. import de.jplag.emf.util.EMFUtil;
  10. /**
  11. * Parser for EMF metamodels based on dynamically created tokens.
  12. * @author Timur Saglam
  13. */
  14. public class DynamicModelParser extends DynamicEcoreParser {
  15. private static final Logger logger = LoggerFactory.getLogger(DynamicModelParser.class.getSimpleName());
  16. private static final List<EPackage> metapackages = new ArrayList<>();
  17. private static final String ALL_EXTENSIONS = "*";
  18. /**
  19. * Creates the parser.
  20. */
  21. public DynamicModelParser() {
  22. EMFUtil.registerModelExtension(ALL_EXTENSIONS);
  23. }
  24. @Override
  25. protected void parseModelFile(String filePath) {
  26. // implicit assumption: Metamodel gets parsed first!
  27. if (filePath.endsWith(de.jplag.emf.Language.FILE_ENDING)) {
  28. parseMetamodelFile(filePath);
  29. } else {
  30. if (metapackages.isEmpty()) {
  31. logger.warn("Loading model instances without any metamodel!");
  32. }
  33. super.parseModelFile(filePath);
  34. }
  35. }
  36. private void parseMetamodelFile(String filePath) {
  37. metapackages.clear();
  38. List<EObject> model = EMFUtil.loadModel(filePath);
  39. if (model == null) {
  40. errors++;
  41. } else {
  42. for (EObject object : model) {
  43. if (object instanceof EPackage ePackage) {
  44. metapackages.add(ePackage);
  45. } else {
  46. logger.error("Error, not a metapackage: " + object);
  47. }
  48. }
  49. EMFUtil.registerEPackageURIs(metapackages);
  50. }
  51. }
  52. }