public ConfigClassRegistry(final ExmlConfiguration config) throws IOException {
    this.config = config;

    sourcePathInputSource = PathInputSource.fromFiles(config.getSourcePath(), new String[0], true);

    ParserOptions parserOptions = new CCRParserOptions();
    jangarooParser =
        new JangarooParser(parserOptions, new StdOutCompileLog()) {
          @Override
          protected InputSource findSource(String qname) {
            InputSource inputSource = super.findSource(qname);
            if (inputSource != null) {
              // A regular source file (not a generated file) has been found. Use it.
              return inputSource;
            }
            // Just in case the requested class is a class
            // that is generated from an EXML file, regenerate the file before
            // it is too late. This will only affect generated files, so it is pretty safe.
            tryGenerateClass(qname);
            // Just in case the source was not found on the first attempt, fetch it again.
            return super.findSource(qname);
          }
        };
    List<File> fullClassPath = new ArrayList<File>(config.getClassPath());
    fullClassPath.add(config.getOutputDirectory());
    InputSource classPathInputSource =
        PathInputSource.fromFiles(
            fullClassPath,
            new String[] {"", JangarooParser.JOO_API_IN_JAR_DIRECTORY_PREFIX},
            false);
    jangarooParser.setUp(sourcePathInputSource, classPathInputSource);
    exmlConfigPackageXsdGenerator = new ExmlConfigPackageXsdGenerator();
  }
 private ConfigClass findActionScriptConfigClass(String name) {
   CompilationUnit compilationsUnit = jangarooParser.getCompilationUnit(name);
   if (compilationsUnit != null) {
     try {
       return buildConfigClass(compilationsUnit);
     } catch (RuntimeException e) {
       throw new ExmlcException(
           "while building config class '" + name + "': " + e.getMessage(), e);
     }
   }
   return null;
 }
 private void tryGenerateClass(String qname) {
   ExmlSourceFile exmlSourceFile = getExmlSourceFilesByConfigClassName().get(qname);
   if (exmlSourceFile != null) {
     exmlSourceFile.generateConfigClass();
   } else {
     // is there an EXML file for the qname interpreted as a target class name?
     InputSource exmlInputSource =
         sourcePathInputSource.getChild(
             JangarooParser.getInputSourceFileName(
                 qname, sourcePathInputSource, Exmlc.EXML_SUFFIX));
     if (exmlInputSource != null) {
       String configClassName = computeConfigClassNameFromTargetClassName(qname);
       exmlSourceFile = getExmlSourceFilesByConfigClassName().get(configClassName);
       if (exmlSourceFile != null) {
         exmlSourceFile.generateTargetClass();
       }
     }
   }
 }