public Properties(final BufferedReader r) {
        RW.readTag(r, "Roots:");

        myRoots = (Set<String>) RW.readMany(r, RW.myStringReader, new HashSet<String>());

        RW.readTag(r, "Sources:");

        mySources = new HashMap<FileWrapper, FileWrapper>();

        for (FileWrapper fw :
            (Set<FileWrapper>) RW.readMany(r, myFileWrapperReader, new HashSet<FileWrapper>())) {
          mySources.put(fw, fw);
        }

        RW.readTag(r, "Output:");
        final String s = RW.readString(r);
        myOutput = s.equals("") ? null : s;

        myOutputStatus = RW.readStringAttribute(r, "OutputStatus:");
      }
 FileWrapper(final BufferedReader r) {
   myName = RW.readString(r);
   myModificationTime = RW.readLong(r);
 }
    public GenericClasspathItemWrapper(final BufferedReader r) {
      myType = RW.readString(r);

      RW.readTag(r, "Classpath:");
      myClassPath = (List<String>) RW.readMany(r, RW.myStringReader, new ArrayList<String>());
    }