/* $Id: Spooler.java,v 1.1 2004/01/09 16:55:42 burkhard Exp $
 * Created on 30.09.2003
 */
package de.skyrix.zsp.logic.cache;

import de.skyrix.zsp.logic.DAVItem;
import de.skyrix.zsp.logic.Proxy;
import de.skyrix.zsp.logic.ZidestoreConnection;
import de.skyrix.zsp.logic.httpclient.HttpRequest;
import de.skyrix.zsp.logic.httpclient.HttpResponse;
import de.skyrix.zsp.logic.parser.ElementCreationParser;

/**
 * 
 * @author sell
 *
 */
public class Spooler extends Thread {
	private SpoolerQueue queue = null;
	private ZidestoreConnection connection = null;

	/**Constructs a Spooler instance.
	 * 
	 * @param queue - reference to the <code>SpoolerQueue</code> to use.
	 * @throws IllegalArgumentException if queue is <code>null</code>.
	 */
	public Spooler(SpoolerQueue queue) {
		if (queue == null)
			throw new IllegalArgumentException("SpoolerQueue must not be null!");

		this.queue = queue;
		connection = new ZidestoreConnection();
		setPriority(MIN_PRIORITY);
		start();
	}

	public void run() {
		while (true) {
      SpoolerQueue.ServerJob currentJob = null; 
			try {
				if (!queue.hasNext())
					System.out.println("Skipping, queue is empty.");
				if (!Proxy.isOnline())
					System.out.println("Skipping, not online.");

				while (queue.hasNext() && Proxy.isOnline()) {
					currentJob = queue.next();
          
          System.out.println("next item read from Q: "+currentJob);
          
          DAVItem item = currentJob.getItem();
          String url = item.getLocation();
          
          if (item.isNew()) {
            url = item.getLocation().substring(0, item.getLocation().lastIndexOf("/"));
            url+= "/NEW";
          }
          
          HttpRequest request = connection.createRequest(url, "PROPPATCH");
          ElementCreationParser ec = new ElementCreationParser();
          String body = ec.createProppatchQuery(item);
          request.setData(body);
          
          HttpResponse response = connection.sendData(request);
          if (response.getStatusCode() == 207) {
            System.out.println("ok, message created, now removing from filesystem.");
            
            String folder = item.getLocation().substring(0, item.getLocation().lastIndexOf("/"));
            CacheManager.getInstance().removeMessage(folder, item.getID());            
          }          

          currentJob = null;
					sleep(1000);
				}
			}
			catch (Exception e) {
        e.printStackTrace();
			}
      
      if (currentJob != null) {
        //readd the job if transmission to server failed
        queue.addJob(currentJob);
        currentJob = null;
      }

			try {
				System.out.println("Sleeping 5 seconds...");
				sleep(5000);
			}
			catch (Exception e) {
				System.err.println("Unable to sleep!!!");
			}
		}
	}
}
