// ControlResource.java
// $Id: ControlResource.java,v 1.1 2008/09/16 14:12:01 sfwang Exp $
// (c) COPYRIGHT MIT and INRIA, 1996.
// Please first read the full copyright statement in file COPYRIGHT.html

package org.w3c.jigsaw.http;

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.NoSuchElementException;
import java.util.Properties;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import java.net.URL;

import org.w3c.util.ObservableProperties;

import org.w3c.tools.resources.AbstractContainer;
import org.w3c.tools.resources.AttributeHolder;
import org.w3c.tools.resources.DummyResourceReference;
import org.w3c.tools.resources.Resource;
import org.w3c.tools.resources.ResourceReference;
import org.w3c.tools.resources.ServerInterface;

class ControlResourceEnumeration implements Enumeration {
    private static final String ids[] = {
	"checkpoint",
	"save",
	"restart",
	"shutdown"
    };
    int idx = 0;

    public boolean hasMoreElements() {
	return false;
    }

    public Object nextElement() {
//	if ( idx >= ids.length )
	throw new NoSuchElementException("control resource enumeration");
//	return ids[idx++];
    }

    ControlResourceEnumeration() {
	this.idx = 0;
    }
}

public class ControlResource extends AbstractContainer {
    protected httpd server = null;

    protected ResourceReference self = null;

    public void registerResource(String n, Resource c, Hashtable d) {
	throw new RuntimeException("static container");
    }
			       
    public void delete(String name) {
	throw new RuntimeException("static container");
    }	

    public ResourceReference createDefaultResource(String name) {
	throw new RuntimeException("static container");
    }	

    protected void saveProperties() {
	ObservableProperties props = server.getProperties();
	File propfile = new File(props.getString(httpd.PROPS_P, null));
	// Did we guessed were the place to save the property file ?
	if ( propfile == null) {
	    throw new RuntimeException("Unable to save properties: property "+
				       httpd.PROPS_P+" undefined.");
	} else {
	    try {
		FileOutputStream fout = new FileOutputStream(propfile);
		server.getProperties().store (fout, "Jigsaw written") ;
		fout.close() ;
	    } catch (IOException ex) {
		// FIXME
	    }
	}  
	server.errlog ("Properties " + propfile + " have been saved.");
    }

    public ResourceReference lookup(String name) {
	if ( name.equalsIgnoreCase("checkpoint") ) {
	    server.startCheckpoint();
	} else if ( name.equalsIgnoreCase("save") ) {
	    saveProperties();
	    server.checkpoint();
	} else if ( name.equalsIgnoreCase("restart") ) {
	    server.restart();
	} else if ( name.equalsIgnoreCase("stop") ) {
	    server.shutdown();
	}
	if (self == null)
	    self = new DummyResourceReference(this);
	return self;
    }

    /**
     * Get the server this resource is served by.
     * @return The first instance of Jigsaw this resource was attached to.
     */
    public ServerInterface getServer() {
	return server;
    }

    private String computeHelpUrl() {
	try {
	    URL url = new URL(getServer().getDocumentationURL());
	    URL docurl = new URL(url.getProtocol(),
				 url.getHost(),
				 url.getPort(),
				 "/Doc/Overview.html");
	    return docurl.toExternalForm();
	} catch (Exception ex) {
	    ex.printStackTrace();
	    return null;
	}
    }

    synchronized public Object getValue (int idx, Object def) {
	if ((idx == ATTR_HELP_URL) && (values[ATTR_HELP_URL] == null))
	    values[ATTR_HELP_URL] = computeHelpUrl();
	return super.getValue(idx, def);
    }

    public Enumeration enumerateResourceIdentifiers(boolean all) {
	return new ControlResourceEnumeration();
    }

    public ControlResource(httpd server) {
	this.server = server;
    }

   
}


