import java.util.Enumeration;
import java.util.Vector;
import java.io.*;
import java.util.Date;
import org.apache.slide.structure.*;
import org.apache.slide.content.*;
import org.apache.slide.common.*;
import org.apache.slide.lock.*;
import org.apache.slide.security.*;
import org.apache.slide.authenticate.CredentialsToken;
import org.apache.slide.authenticate.SecurityToken;

public class TestThread implements Runnable
{
  private NamespaceAccessToken _token = null;
  private String _key = null;

  private static boolean use_transaction=true;
  private static int count=10;

  public TestThread(NamespaceAccessToken token, String key)
  {
    _token = token;
    _key = key;
  }
        
  public void run()
  {
    try 
    {
      Structure structure = _token.getStructureHelper();
      Security security = _token.getSecurityHelper();
      Lock lock = _token.getLockHelper();
      Content content = _token.getContentHelper();
            
      CredentialsToken credToken = 
        new CredentialsToken(new String("root"));
      SlideToken slideToken = new SlideTokenImpl(credToken);
            
      SubjectNode subject = new SubjectNode();

      String myUri = null;

      NodeRevisionDescriptors revisionDescriptors = null;
      NodeRevisionDescriptor revisionDescriptor = null;

      for (int i=0; i<count; i++)
      {
        _token.begin();

		try 
		{
	        myUri="/"+_key+i;
	        
	        System.out.println(Thread.currentThread().getName()+
	                           ": Put uri = " + myUri);

	        structure.create(slideToken, subject, myUri);
	            
	        // Creating a versioned revision descriptors
	        content.create(slideToken, myUri, true);
	            
	        revisionDescriptors = content.retrieve(slideToken, myUri);
	            
	        // NodeRevisionContent
	        NodeRevisionContent nodeRevContent = new NodeRevisionContent();
	        InputStream is = null;

	        // Now creating some revisions
	        revisionDescriptor = new NodeRevisionDescriptor(0);

	        revisionDescriptor.setProperty("revision", "1");
	        is = new FileInputStream("Dev.txt");
	        nodeRevContent.setContent(is);
	        content.create(slideToken, myUri, revisionDescriptor, 
	                       nodeRevContent);
	        is.close();
		}
		catch (Exception ex) 
		{
			System.out.println(">>>> " + ex.toString());
		}
        _token.commit();
      }

      // Retrieving some revisions
      revisionDescriptor = 
        content.retrieve(slideToken, revisionDescriptors);

      for (int i=0; i<count; i++)
      {
        if (use_transaction)
	        _token.begin();

        try 
        {
	        myUri = "/"+_key+i;
	        
	        System.out.println(Thread.currentThread().getName()+
	                           ": Get uri = " + myUri);

	        NodeRevisionContent newRevContent = 
	          content.retrieve(slideToken, myUri, revisionDescriptor);
	        InputStream newIS = newRevContent.streamContent();
	        if (null != newIS)
	        {
	          byte[] buf = new byte[60];
	          int num = -1;
	          FileOutputStream fos = new FileOutputStream("out/Test"+i+".out");
			  num = newIS.read(buf);
	          while (num > 0)
	          {
			  	System.out.println(num);
	            fos.write(buf, 0, num);
	            fos.flush();
				num = newIS.read(buf);
	          }
	          fos.close();
	          newIS.close();
	        }
	    }
	    catch (Exception ex) 
	    {
	    	System.out.println(">>>> " + ex.toString());
	    }
		if (use_transaction)
		    _token.rollback();
      }
    } 
    catch (Throwable e) 
    {
      e.printStackTrace();
    } 
  }   
}