package w3c.model.www.pep.extensions.accessCounter;
import java.net.*;
import java.util.*;
import w3c.model.www.pep.*;
import w3c.model.www.pep.bags.*;
import w3c.model.www.pep.altlib.*;
abstract public class Common extends PEPExtension
final static String prefHeaderName = "AccessCounter-";
/*
The port for the extensions server is not the same
as for the Server
default port. If it were, the
single threaded
server could not repsond to the request for the extension classes as it
would still be replying to the request that forced the extension to load.
*/
protected final static String absoluteURI = "http://localhost:8887/src/classes/accessCounter";
boolean requiredExtension;
Vector sites;
abstract int getPort( Socket socket);
/*
Constructed and Initialized by:
*/
public Common () {}
public void initialize ( PEPAgent pepAgent, boolean requiredExtension) {
super.initialize(pepAgent, absoluteURI);
this.requiredExtension = requiredExtension;
sites = Vector(1, 1);
}
SiteParty lookupSite ( Socket socket) {
String host = socket.getInetAddress().getHostAddress();
int port = getPort(socket); // client and server both key on server port
Enumeration key = sites.elements();
while (key.hasMoreElements())) {
SiteParty site = (SiteParty) key.nextElement();
if (site.equals(host, port)))
return site;
}
return null;
}
/*
Message.read -> PEPAgent.handleHeaders -> parse -> complete -> PEPAgent.makeInstance -> makeInstance
*/
public PEPExtensionInstance makeInstance ( String headerNames[], int headerNameCount, InstanceContext instanceContext) {
SiteParty site;
Instance ret;
Socket socket = instanceContext.getMessage().getSocket();
if ((site = lookupSite(socket)) != null)) {
Enumeration instances = site.extensionInstances();
/* site exists so there should be exactly one instance */
ret = (Instance)instances.nextElement();
ret.setHeaderName(headerNames[0]);
site.map();
return ret;
}
String host = socket.getInetAddress().getHostAddress();
int port = getPort(socket); /* client and server both key on server port */
site = SiteParty(host, port);
site.addExtensionInstance(ret = Instance(headerNames[0])); /* this extension only uses one headerName */
sites.addElement(site);
return ret;
}
abstract public boolean outCheck ( InstanceContext instanceContext, SiteParty site);
abstract public boolean inCheck ( InstanceContext instanceContext, SiteParty site);
public boolean map ( InstanceContext instanceContext, int when, PEPMessage message, String reason) {
message.mapURI(reason, "/");
return true;
}
/*
Message.writeHeaders -> PEPAgent.generateHeaders -> accessCounter.generateHeaders
*/
public boolean generateHeaders ( InstanceContext instanceContext, int when) throws HTTPException{
PEPMessage message = instanceContext.getMessage();
if (when == PEPExtension.CONNECT && requiredExtension))
instanceContext.setRequiredExtensions();
if (when != PEPExtension.CONNECT))
return false;
Instance inst;
SiteParty site = lookupSite(message.getSocket());
if (!outCheck(instanceContext, site)))
return true;
if (site == null)) {
// makeBag(instanceContext);
if ((site = lookupSite(message.getSocket())) == null))
throw HTTPException ("internal error: can't find newly created AccessCounterBag");
}
// Enumeration key = site.extensionInstances();
Enumeration key = instanceContext.getExtensionInstances(this);
while (key.hasMoreElements())) {
inst = (Instance)key.nextElement();
message.setHeaderValue(inst.getHeaderName(), String.valueOf(inst.getCount()));
}
site.unmap();
return true;
}
/*
Message.read -> PEPAgent.handleHeaders -> accessCounter.handleHeaders
*/
public boolean handleHeaders ( InstanceContext instanceContext, int when) throws HTTPException{
if (when != PEPExtension.HEADERS))
return false;
/* look for instance - assume many SiteParties with same header */
PEPMessage message = instanceContext.getMessage();
SiteParty site = lookupSite(message.getSocket()); // get site info
inCheck(instanceContext, site);
// if (!inCheck(instanceContext, site))
// return true;
// Enumeration key = site.extensionInstances();
Enumeration key = instanceContext.getExtensionInstances(this);
while (key.hasMoreElements())) {
Instance inst = (Instance)key.nextElement();
String otherSide = message.getHeaderValue(inst.getHeaderName());
if (otherSide == null))
System.out.println("<!- Other side has didn't pass a reference count ->");
elseSystem.out.println("<!- Other side has referenced us "+otherSide+" times ->");
}
return true;
}