package Cases;

import java.io.File;
import java.io.IOException;
import neustore.base.DBIndex;//because we create a object of index.java
import neustore.base.LRUBuffer;//because we create an object of it
import XMLContent.*;
import neustore.base.DiskAddress;
import AttributeIndex.*;
import ElementIndex.*;
import StructureIndex.*;

// This test case emulates inserting a small XML document

/*
 The document is:

<root>
 <a>1</a>
 <a foo="1">2</a>
 <b foo="2" bar="3">
    <c>Hello, world!</c>
    <c>The quick brown <d>fox</d></c>
 </b>
</root>
*/


public class TestCase5 {

public static void main(String[] args)throws IOException {

     // create files 
	String filenameEI="TEST_EI";
        String filenameSI="TEST_SI";
        String filenameCI="TEST_CI";
        String filenameAI="TEST_AI";

	File fileEI= new File(filenameEI);
        File fileSI= new File(filenameSI);
        File fileCI= new File(filenameCI);
        File fileAI= new File(filenameAI);

	if(fileEI.delete()|| fileSI.delete()||fileCI.delete()||fileAI.delete())
	{
		 System.out.println("The old file with that name has been deleted");
		 
	}
	else
	{
		System.out.println("The file was not found");
	}
	
        // create system buffer: 8 pages, 2K each
	LRUBuffer buffer= new LRUBuffer(8,2048);
	

        // Create all structures	

        ElementIndex elements = new ElementIndex(buffer,filenameEI,1);
	AttributeIndex atts = new AttributeIndex(buffer,filenameAI,1);
	StructureIndex structure = new StructureIndex(buffer, filenameSI,1);
        XMLContent content = new XMLContent(buffer, filenameCI, 1);

        // Commence insertions

         // <root>
          int rootIdx = elements.insertElementName("root");
          StructureIndexRecord rootRecord = new 
                  StructureIndexRecord(1,rootIdx,1,0,0,1,-1,0, null); 
          DiskAddress rootAddy = structure.insert(rootRecord);
          int flag = elements.nsertElementEntry(rootIdx, rootAddy);

        // <a>1</a>
          int aIdx = elements.nsertElementName("a");
          DiskAddress aContAddy = content.insertContent("1");
          StructureIndexRecord aRecord_1 = new
                  StructureIndexRecord(2,aIdx,2,3,1,2,1,1, aContAddy);
          DiskAddress aAddy_1 = structure.insert(aRecord_1);
          flag = elements.insertElementEntry(aIdx, aAddy_1);

        // <a foo="1">2</a>
          aContAddy = content.insertContent("2");
          StructureIndexRecord aRecord_2 = new
                  StructureIndexRecord(3,aIdx,4,5,2,2,1,1, aContAddy);
          DiskAddress aAddy_2 = structure.insert(aRecord_2);
          flag = elements.insertElementEntry(aIdx, aAddy_2);
          attributes.insertEntry(3,"foo","1");
 
        // <b foo="2" bar="3">
          int bIdx = elements.nsertElementName("b");
          StructureIndexRecord bRecord = new
                  StructureIndexRecord(4,bIdx,6,0,3,2,1,0, new DiskAddress(0,0));
          DiskAddress bAddy = structure.insert(bRecord);
          flag = elements.insertElementEntry(bIdx, bAddy);
          attributes.insertEntry(4,"foo","2");
          attributes.insertEntry(4,"bar","3");

       // <c>Hello, world!</c>
          int cIdx = elements.nsertElementName("c");
          DiskAddress cContAddy = content.insertContent("Hello, World!");
          StructureIndexRecord cRecord_1 = new
                  StructureIndexRecord(5,cIdx,7,8,1,3,4,1, cContAddy);
          DiskAddress cAddy_1 = structure.insert(cRecord_1);
          flag = elements.insertElementEntry(cIdx, cAddy_1);

       // <c>

          StructureIndexRecord cRecord_2 = new
                  StructureIndexRecord(6,aIdx,9,0,2,3,4,0, new DiskAddress(0,0));
          DiskAddress cAddy_2 = structure.insert(cRecord_2);
          flag = elements.insertElementEntry(cIdx, cAddy_2);

       // <d> the quick brown </d>
          int dIdx = elements.nsertElementName("d");
          DiskAddress dContAddy = content.insertContent("The quick brown ");
          StructureIndexRecord dRecord_1 = new
                  StructureIndexRecord(7,dIdx,10,11,1,4,6,1, dContAddy);
          DiskAddress dAddy_1 = structure.insert(dRecord_1);
          flag = elements.insertElementEntry(dIdx, dAddy_1);

          // <d> fox </d>
          dContAddy = content.insertContent("fox");
          StructureIndexRecord dRecord_2 = new
                  StructureIndexRecord(8,dIdx,12,13,2,4,6,1, dContAddy);
          DiskAddress dAddy_2 = structure.insert(dRecord_2);
          flag = elements.insertElementEntry(dIdx, dAddy_2);


          // Fix postorders

          structure.updatePostOrder(6,14);
          structure.updatePostOrder(4,15);
          structure.updatePostOrder(1,16);


}

}