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();
  }
 public void generateXsd(Writer output) throws IOException, TemplateException {
   exmlConfigPackageXsdGenerator.generateXsdFile(
       getSourceConfigClasses(), config.getConfigClassPackage(), output);
   if (getConfig().getValidationMode() != ValidationMode.OFF) {
     try {
       new ExmlValidator(getConfig()).validateAllExmlFiles();
     } catch (Exception e) {
       throw new ExmlcException("unable to start validation", e);
     }
   }
 }
 private void scanAsFiles(Map<String, File> sourceFilesByName) {
   InputSource configPackageInputSource =
       sourcePathInputSource.getChild(
           config.getConfigClassPackage().replace('.', File.separatorChar));
   if (configPackageInputSource != null) {
     for (InputSource source : configPackageInputSource.list()) {
       File file = ((FileInputSource) source).getFile();
       if (file.isFile() && file.getName().endsWith(Jooc.AS_SUFFIX)) {
         try {
           File sourceDir = getConfig().findSourceDir(file);
           String qName = CompilerUtils.qNameFromFile(sourceDir, file);
           ConfigClass actionScriptConfigClass = findActionScriptConfigClass(qName);
           if (actionScriptConfigClass != null) {
             addSourceConfigClass(sourceFilesByName, file, actionScriptConfigClass);
           }
         } catch (IOException e) {
           throw new ExmlcException("could not read AS file", e);
         }
       }
     }
   }
 }