ISemanticData getSemanticData(String file) {
    for (IFileData ifd : all_files) {
      if (ifd.getFile().getPath().equals(file)) return getParseData(ifd);
    }

    return null;
  }
  /** ***************************************************************************** */
  private void loadFiles(String pfx, File dir, boolean reload) {
    File[] fls = dir.listFiles(new SourceFilter());

    if (fls != null) {
      for (File f : fls) {
        if (f.isDirectory()) {
          String nm = f.getName();
          String opfx = pfx;
          if (pfx == null) pfx = nm;
          else pfx += "." + nm;
          loadFiles(pfx, f, reload);
          pfx = opfx;
        } else {
          String mnm = f.getName();
          int idx = mnm.lastIndexOf(".");
          if (idx >= 0) mnm = mnm.substring(0, idx);
          if (pfx != null) mnm = pfx + "." + mnm;
          IFileData fd = PybaseFileManager.getFileManager().getNewFileData(f, mnm, this);
          ISemanticData isd = parse_data.get(fd);
          if (reload) {
            // fd.reload();
            isd = null;
          }
          all_files.add(fd);
          if (isd == null) {
            ISemanticData sd = parseFile(fd);
            if (sd != null) {
              System.err.println("PYBASE: PARSE YIELDS: " + sd.getRootNode());
              IvyXmlWriter xw = PybaseMain.getPybaseMain().beginMessage("FILEERROR");
              xw.field("PROJECT", sd.getProject().getName());
              xw.field("FILE", fd.getFile().getPath());
              xw.begin("MESSAGES");
              for (PybaseMessage m : sd.getMessages()) {
                try {
                  System.err.println("PYBASE: PARSE ERROR: " + m);
                  PybaseUtil.outputProblem(m, sd, xw);
                } catch (Throwable t) {
                  PybaseMain.logE("Pybase error message: ", t);
                }
              }
              xw.end("MESSAGES");
              PybaseMain.getPybaseMain().finishMessage(xw);
            }
          }
        }
      }
    }
  }
 private void handleRefresh(Set<IFileData> oldfiles) {
   IvyXmlWriter xw = pybase_main.beginMessage("RESOURCE");
   int ctr = 0;
   for (IFileData fd : all_files) {
     IFileData old = null;
     for (IFileData ofd : oldfiles) {
       if (ofd.getFile().equals(fd.getFile())) {
         old = ofd;
         break;
       }
     }
     if (old == null) {
       outputDelta(xw, "ADDED", fd);
       ++ctr;
     } else if (old.getLastDateLastModified() != fd.getLastDateLastModified()) {
       oldfiles.remove(old);
       outputDelta(xw, "CHANGED", fd);
       ++ctr;
     } else {
       oldfiles.remove(old);
     }
   }
   for (IFileData fd : oldfiles) {
     outputDelta(xw, "REMOVED", fd);
     ++ctr;
   }
   if (ctr > 0) {
     pybase_main.finishMessage(xw);
   }
 }
  private ISemanticData parseFile(IFileData fd) {
    PybaseParser pp = new PybaseParser(this, fd);
    ISemanticData sd = pp.parseDocument();
    if (sd != null) parse_data.put(fd, sd);
    else parse_data.remove(fd);

    System.err.println("PYBASE: PARSE " + fd.getFile());
    return sd;
  }
 private void outputDelta(IvyXmlWriter xw, String act, IFileData ifd) {
   xw.begin("DELTA");
   xw.field("KIND", act);
   xw.begin("RESOURCE");
   xw.field("TYPE", "FILE");
   xw.field("PROJECT", project_name);
   xw.field("LOCATION", ifd.getFile().getAbsolutePath());
   xw.end("RESOURCE");
   xw.end("DELTA");
 }