Program: 146677
Project: 146677
Buggy source:
private TreeElement cache(){
  if (recordId == TreeReference.INDEX_TEMPLATE) {
    return empty;
  }
synchronized (parent.treeCache) {
    TreeElement element=parent.treeCache.retrieve(recordId);
    if (element != null) {
      return element;
    }
    if (recordId == -1) {
      Vector<Integer> ids=parent.storage.getIDsForValue("String_Node_Str",caseId);
      recordId=ids.elementAt(0).intValue();
    }
    TreeElement cacheBuilder=new TreeElement("String_Node_Str");
    Case c=parent.getCase(recordId);
    caseId=c.getCaseId();
    cacheBuilder=new TreeElement("String_Node_Str");
    cacheBuilder.setMult(this.mult);
    cacheBuilder.setAttribute(null,"String_Node_Str",c.getCaseId());
    cacheBuilder.setAttribute(null,"String_Node_Str",c.getTypeId());
    cacheBuilder.setAttribute(null,"String_Node_Str",c.isClosed() ? "String_Node_Str" : "String_Node_Str");
    cacheBuilder.setAttribute(null,"String_Node_Str",c.getUserId() == null ? "String_Node_Str" : c.getUserId());
    final boolean[] done=new boolean[]{false};
    if (!parent.reportMode) {
      TreeElement scratch=new TreeElement("String_Node_Str");
      String name=c.getName();
      scratch.setAnswer(new StringData(name == null ? "String_Node_Str" : name));
      cacheBuilder.addChild(scratch);
      scratch=new TreeElement("String_Node_Str");
      scratch.setAnswer(new DateData(c.getDateOpened()));
      cacheBuilder.addChild(scratch);
      scratch=new TreeElement(LAST_MODIFIED_KEY);
      scratch.setAnswer(new DateData(c.getLastModified()));
      cacheBuilder.addChild(scratch);
      for (Enumeration en=c.getProperties().keys(); en.hasMoreElements(); ) {
        String key=(String)en.nextElement();
        if (LAST_MODIFIED_KEY.equals(key)) {
          continue;
        }
        scratch=new TreeElement(parent.intern(key));
        Object temp=c.getProperty(key);
        if (temp instanceof String) {
          scratch.setValue(new UncastData((String)temp));
        }
 else {
          scratch.setValue(PreloadUtils.wrapIndeterminedObject(temp));
        }
        cacheBuilder.addChild(scratch);
      }
      TreeElement index=new TreeElement("String_Node_Str"){
        public TreeElement getChild(        String name,        int multiplicity){
          TreeElement child=super.getChild(CaseChildElement.this.parent.intern(name),multiplicity);
          if (!done[0]) {
            return child;
          }
          if (multiplicity >= 0 && child == null) {
            TreeElement emptyNode=new TreeElement(CaseChildElement.this.parent.intern(name));
            emptyNode.setAttribute(null,"String_Node_Str","String_Node_Str");
            this.addChild(emptyNode);
            emptyNode.setParent(this);
            return emptyNode;
          }
          return child;
        }
        public Vector getChildrenWithName(        String name){
          Vector children=super.getChildrenWithName(CaseChildElement.this.parent.intern(name));
          if (!done[0]) {
            return children;
          }
          if (children.size() == 0) {
            TreeElement emptyNode=new TreeElement(name);
            emptyNode.setAttribute(null,"String_Node_Str","String_Node_Str");
            this.addChild(emptyNode);
            emptyNode.setParent(this);
            children.addElement(emptyNode);
          }
          return children;
        }
      }
;
      Vector<CaseIndex> indices=c.getIndices();
      for (      CaseIndex i : indices) {
        scratch=new TreeElement(i.getName());
        scratch.setAttribute(null,"String_Node_Str",this.parent.intern(i.getTargetType()));
        scratch.setValue(new UncastData(i.getTarget()));
        index.addChild(scratch);
      }
      cacheBuilder.addChild(index);
      TreeElement attachments=new TreeElement("String_Node_Str"){
        public TreeElement getChild(        String name,        int multiplicity){
          TreeElement child=super.getChild(CaseChildElement.this.parent.intern(name),multiplicity);
          if (!done[0]) {
            return child;
          }
          if (multiplicity >= 0 && child == null) {
            TreeElement emptyNode=new TreeElement(CaseChildElement.this.parent.intern(name));
            this.addChild(emptyNode);
            emptyNode.setParent(this);
            return emptyNode;
          }
          return child;
        }
      }
;
      for (      String attachment : c.getAttachments()) {
        scratch=new TreeElement(attachment);
        scratch.setValue(new UncastData(c.getAttachmentSource(attachment)));
        attachments.addChild(scratch);
      }
      cacheBuilder.addChild(attachments);
    }
    cacheBuilder.setParent(this.parent);
    done[0]=true;
    parent.treeCache.register(recordId,cacheBuilder);
    return cacheBuilder;
  }
}

Fixed version (ground truth):
private TreeElement cache(){
  if (recordId == TreeReference.INDEX_TEMPLATE) {
    return empty;
  }
synchronized (parent.treeCache) {
    TreeElement element=parent.treeCache.retrieve(recordId);
    if (element != null) {
      return element;
    }
    if (recordId == -1) {
      Vector<Integer> ids=parent.storage.getIDsForValue("String_Node_Str",caseId);
      recordId=ids.elementAt(0).intValue();
    }
    TreeElement cacheBuilder=new TreeElement("String_Node_Str");
    Case c=parent.getCase(recordId);
    caseId=c.getCaseId();
    cacheBuilder=new TreeElement("String_Node_Str");
    cacheBuilder.setMult(this.mult);
    cacheBuilder.setAttribute(null,"String_Node_Str",c.getCaseId());
    cacheBuilder.setAttribute(null,"String_Node_Str",c.getTypeId());
    cacheBuilder.setAttribute(null,"String_Node_Str",c.isClosed() ? "String_Node_Str" : "String_Node_Str");
    cacheBuilder.setAttribute(null,"String_Node_Str",c.getUserId() == null ? "String_Node_Str" : c.getUserId());
    final boolean[] done=new boolean[]{false};
    if (!parent.reportMode) {
      TreeElement scratch=new TreeElement("String_Node_Str");
      String name=c.getName();
      scratch.setAnswer(new StringData(name == null ? "String_Node_Str" : name));
      cacheBuilder.addChild(scratch);
      scratch=new TreeElement("String_Node_Str");
      scratch.setAnswer(new DateData(c.getDateOpened()));
      cacheBuilder.addChild(scratch);
      scratch=new TreeElement(LAST_MODIFIED_KEY);
      scratch.setAnswer(new DateData(c.getLastModified()));
      cacheBuilder.addChild(scratch);
      for (Enumeration en=c.getProperties().keys(); en.hasMoreElements(); ) {
        String key=(String)en.nextElement();
        if (LAST_MODIFIED_KEY.equals(key)) {
          continue;
        }
        scratch=new TreeElement(parent.intern(key));
        Object temp=c.getProperty(key);
        if (temp instanceof String) {
          scratch.setValue(new UncastData((String)temp));
        }
 else {
          scratch.setValue(PreloadUtils.wrapIndeterminedObject(temp));
        }
        cacheBuilder.addChild(scratch);
      }
      TreeElement index=new TreeElement("String_Node_Str"){
        public TreeElement getChild(        String name,        int multiplicity){
          TreeElement child=super.getChild(CaseChildElement.this.parent.intern(name),multiplicity);
          if (!done[0]) {
            return child;
          }
          if (multiplicity >= 0 && child == null) {
            TreeElement emptyNode=new TreeElement(CaseChildElement.this.parent.intern(name));
            emptyNode.setAttribute(null,"String_Node_Str","String_Node_Str");
            emptyNode.setAttribute(null,"String_Node_Str","String_Node_Str");
            this.addChild(emptyNode);
            emptyNode.setParent(this);
            return emptyNode;
          }
          return child;
        }
        public Vector getChildrenWithName(        String name){
          Vector children=super.getChildrenWithName(CaseChildElement.this.parent.intern(name));
          if (!done[0]) {
            return children;
          }
          if (children.size() == 0) {
            TreeElement emptyNode=new TreeElement(name);
            emptyNode.setAttribute(null,"String_Node_Str","String_Node_Str");
            emptyNode.setAttribute(null,"String_Node_Str","String_Node_Str");
            this.addChild(emptyNode);
            emptyNode.setParent(this);
            children.addElement(emptyNode);
          }
          return children;
        }
      }
;
      Vector<CaseIndex> indices=c.getIndices();
      for (      CaseIndex i : indices) {
        scratch=new TreeElement(i.getName());
        scratch.setAttribute(null,"String_Node_Str",this.parent.intern(i.getTargetType()));
        scratch.setAttribute(null,"String_Node_Str",this.parent.intern(i.getRelationship()));
        scratch.setValue(new UncastData(i.getTarget()));
        index.addChild(scratch);
      }
      cacheBuilder.addChild(index);
      TreeElement attachments=new TreeElement("String_Node_Str"){
        public TreeElement getChild(        String name,        int multiplicity){
          TreeElement child=super.getChild(CaseChildElement.this.parent.intern(name),multiplicity);
          if (!done[0]) {
            return child;
          }
          if (multiplicity >= 0 && child == null) {
            TreeElement emptyNode=new TreeElement(CaseChildElement.this.parent.intern(name));
            this.addChild(emptyNode);
            emptyNode.setParent(this);
            return emptyNode;
          }
          return child;
        }
      }
;
      for (      String attachment : c.getAttachments()) {
        scratch=new TreeElement(attachment);
        scratch.setValue(new UncastData(c.getAttachmentSource(attachment)));
        attachments.addChild(scratch);
      }
      cacheBuilder.addChild(attachments);
    }
    cacheBuilder.setParent(this.parent);
    done[0]=true;
    parent.treeCache.register(recordId,cacheBuilder);
    return cacheBuilder;
  }
}