package org.umu.cops.prpdp;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.umu.cops.COPSStateMan;
import org.umu.cops.stack.*;
import java.net.Socket;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
+import java.util.HashMap;
+import java.util.Map;
/**
* State manager class for provisioning requests, at the PDP side.
*/
-public class COPSPdpReqStateMan {
+public class COPSPdpReqStateMan extends COPSStateMan {
- /**
- * Request State created
- */
- public final static short ST_CREATE = 1;
- /**
- * Request received
- */
- public final static short ST_INIT = 2;
- /**
- * Decisions sent
- */
- public final static short ST_DECS = 3;
- /**
- * Report received
- */
- public final static short ST_REPORT = 4;
- /**
- * Request State finalized
- */
- public final static short ST_FINAL = 5;
- /**
- * New Request State solicited
- */
- public final static short ST_NEW = 6;
- /**
- * Delete Request State solicited
- */
- public final static short ST_DEL = 7;
- /**
- * SYNC request sent
- */
- public final static short ST_SYNC = 8;
- /**
- * SYNC completed
- */
- public final static short ST_SYNCALL = 9;
- /**
- * Close connection received
- */
- public final static short ST_CCONN = 10;
- /**
- * Keep-alive timeout
- */
- public final static short ST_NOKA = 11;
- /**
- * Accounting timeout
- */
- public final static short ST_ACCT = 12;
-
- /**
- * COPS client-type that identifies the policy client
- */
- protected short _clientType;
-
- /**
- * COPS client handle used to uniquely identify a particular
- * PEP's request for a client-type
- */
- protected COPSHandle _handle;
+ private final static Logger logger = LoggerFactory.getLogger(COPSPdpReqStateMan.class);
/**
* Object for performing policy data processing
*/
- protected COPSPdpDataProcess _process;
-
- /**
- * Current state of the request being managed
- */
- protected short _status;
+ private final COPSPdpDataProcess _process;
/** COPS message transceiver used to send COPS messages */
- protected COPSPdpMsgSender _sender;
+ protected transient COPSPdpMsgSender _sender;
/**
* Creates a request state manager
* @param clientType Client-type
* @param clientHandle Client handle
*/
- public COPSPdpReqStateMan(short clientType, String clientHandle) {
- _handle = new COPSHandle(new COPSData(clientHandle));
- _clientType = clientType;
- _status = ST_CREATE;
- }
-
- /**
- * Gets the client handle
- * @return Client's <tt>COPSHandle</tt>
- */
- public COPSHandle getClientHandle() {
- return _handle;
- }
-
- /**
- * Gets the client-type
- * @return Client-type value
- */
- public short getClientType() {
- return _clientType;
- }
-
- /**
- * Gets the status of the request
- * @return Request state value
- */
- public short getStatus() {
- return _status;
- }
-
- /**
- * Gets the policy data processing object
- * @return Policy data processing object
- */
- public COPSPdpDataProcess getDataProcess() {
- return _process;
- }
-
- /**
- * Sets the policy data processing object
- * @param process Policy data processing object
- */
- public void setDataProcess(COPSPdpDataProcess process) {
- _process = process;
- }
-
- /**
- * Called when COPS sync is completed
- * @param repMsg COPS sync message
- * @throws COPSPdpException
- */
- protected void processSyncComplete(COPSSyncStateMsg repMsg)
- throws COPSPdpException {
-
- _status = ST_SYNCALL;
-
- // maybe we should notifySyncComplete ...
- }
-
- /**
- * Initializes a new request state over a socket
- * @param sock Socket to the PEP
- * @throws COPSPdpException
- */
- protected void initRequestState(Socket sock)
- throws COPSPdpException {
- // Inits an object for sending COPS messages to the PEP
- _sender = new COPSPdpMsgSender(_clientType, _handle, sock);
-
- // Initial state
- _status = ST_INIT;
+ public COPSPdpReqStateMan(final short clientType, final COPSHandle clientHandle, final COPSPdpDataProcess process,
+ final Socket socket) {
+ super(clientType, clientHandle, socket);
+ this._process = process;
+ _sender = new COPSPdpMsgSender(_clientType, _handle, _socket);
+ _status = Status.ST_INIT;
}
/**
* Processes a COPS request
* @param msg COPS request received from the PEP
- * @throws COPSPdpException
+ * @throws COPSException
*/
- protected void processRequest(COPSReqMsg msg)
- throws COPSPdpException {
-
- COPSHeader hdrmsg = msg.getHeader();
- COPSHandle handlemsg = msg.getClientHandle();
- COPSContext contextmsg = msg.getContext();
-
- //** Analyze the request
- //**
-
- /* <Request> ::= <Common Header>
- * <Client Handle>
- * <Context>
- * *(<Named ClientSI>)
- * [<Integrity>]
- * <Named ClientSI> ::= <*(<PRID> <EPD>)>
- *
- * Very important, this is actually being treated like this:
- * <Named ClientSI> ::= <PRID> | <EPD>
- *
-
- // Named ClientSI
- Vector clientSIs = msg.getClientSI();
- Hashtable reqSIs = new Hashtable(40);
- String strobjprid = new String();
- for (Enumeration e = clientSIs.elements() ; e.hasMoreElements() ;) {
- COPSClientSI clientSI = (COPSClientSI) e.nextElement();
+ protected void processRequest(final COPSReqMsg msg) throws COPSException {
+ // TODO - Implement me - see commented out code from history prior to May 4, 2015...
+ }
- COPSPrObjBase obj = new COPSPrObjBase(clientSI.getData().getData());
- switch (obj.getSNum())
- {
+ /**
+ * Processes a report
+ * @param msg Report message from the PEP
+ * @throws COPSException
+ */
+ protected void processReport(final COPSReportMsg msg) throws COPSException {
+ if (msg.getClientSI() != null) {
+ // Report Type
+ final COPSReportType rtypemsg = msg.getReport();
+ final Map<String, String> repSIs = new HashMap<>();
+ String strobjprid = "";
+ final COPSPrObjBase obj = new COPSPrObjBase(msg.getClientSI().getData().getData());
+ switch (obj.getSNum()) {
case COPSPrObjBase.PR_PRID:
strobjprid = obj.getData().str();
break;
case COPSPrObjBase.PR_EPD:
- reqSIs.put(strobjprid, obj.getData().str());
- // COPSDebug.out(getClass().getName(),"PRID: " + strobjprid);
- // COPSDebug.out(getClass().getName(),"EPD: " + obj.getData().str());
+ // TODO FIXME - strobjprid is always empty here???
+ repSIs.put(strobjprid, obj.getData().str());
+ logger.info("PRID: " + strobjprid);
+ logger.info("EPD: " + obj.getData().str());
break;
default:
break;
}
- }
-
- //** Here we must retrieve a decision depending on
- //** the supplied ClientSIs
- // reqSIs is a hashtable with the prid and epds
-
- // ................
- //
- Hashtable removeDecs = new Hashtable();
- Hashtable installDecs = new Hashtable();
- _process.setClientData(this, reqSIs);
-
- removeDecs = _process.getRemovePolicy(this);
- installDecs = _process.getInstallPolicy(this);
-
- //** We create the SOLICITED decision
- //**
- _sender.sendDecision(removeDecs, installDecs);
- _status = ST_DECS;
- */
- }
-
- /**
- * Processes a report
- * @param msg Report message from the PEP
- * @throws COPSPdpException
- */
- protected void processReport(COPSReportMsg msg)
- throws COPSPdpException {
-
- //** Analyze the report
- //**
-
- /*
- * <Report State> ::= <Common Header>
- * <Client Handle>
- * <Report Type>
- * *(<Named ClientSI>)
- * [<Integrity>]
- * <Named ClientSI: Report> ::= <[<GPERR>] *(<report>)>
- * <report> ::= <ErrorPRID> <CPERR> *(<PRID><EPD>)
- *
- * Important, <Named ClientSI> is not parsed
- */
-
- // COPSHeader hdrmsg = msg.getHeader();
- // COPSHandle handlemsg = msg.getClientHandle();
-
- // Report Type
- COPSReportType rtypemsg = msg.getReport();
-
- // Named ClientSI
- Vector clientSIs = msg.getClientSI();
- Hashtable repSIs = new Hashtable(40);
- String strobjprid = "";
- for (Enumeration e = clientSIs.elements() ; e.hasMoreElements() ;) {
- COPSClientSI clientSI = (COPSClientSI) e.nextElement();
- COPSPrObjBase obj = new COPSPrObjBase(clientSI.getData().getData());
- switch (obj.getSNum()) {
- case COPSPrObjBase.PR_PRID:
- strobjprid = obj.getData().str();
- break;
- case COPSPrObjBase.PR_EPD:
- repSIs.put(strobjprid, obj.getData().str());
- // COPSDebug.out(getClass().getName(),"PRID: " + strobjprid);
- // COPSDebug.out(getClass().getName(),"EPD: " + obj.getData().str());
- break;
- default:
- break;
+ //** Here we must act in accordance with
+ //** the report received
+ switch (rtypemsg.getReportType()) {
+ case SUCCESS:
+ _status = Status.ST_REPORT;
+ _process.successReport(this, repSIs);
+ break;
+ case FAILURE:
+ _status = Status.ST_REPORT;
+ _process.failReport(this, repSIs);
+ break;
+ case ACCOUNTING:
+ _status = Status.ST_ACCT;
+ _process.acctReport(this, repSIs);
+ break;
}
}
-
- //** Here we must act in accordance with
- //** the report received
- switch (rtypemsg.getReportType()) {
- case SUCCESS:
- _status = ST_REPORT;
- _process.successReport(this, repSIs);
- break;
- case FAILURE:
- _status = ST_REPORT;
- _process.failReport(this, repSIs);
- break;
- case ACCOUNTING:
- _status = ST_ACCT;
- _process.acctReport(this, repSIs);
- break;
- }
}
/**
* @param error Reason
* @throws COPSPdpException
*/
- protected void processClosedConnection(COPSError error)
- throws COPSPdpException {
+ public void processClosedConnection(final COPSError error) throws COPSException {
if (_process != null)
_process.notifyClosedConnection(this, error);
- _status = ST_CCONN;
+ _status = Status.ST_CCONN;
}
/**
* Called when no keep-alive is received
* @throws COPSPdpException
*/
- protected void processNoKAConnection()
- throws COPSPdpException {
+ public void processNoKAConnection() throws COPSException {
if (_process != null)
_process.notifyNoKAliveReceived(this);
- _status = ST_NOKA;
+ _status = Status.ST_NOKA;
}
/**
* Deletes the request state
* @throws COPSPdpException
*/
- protected void finalizeRequestState()
- throws COPSPdpException {
+ protected void finalizeRequestState() throws COPSException {
_sender.sendDeleteRequestState();
- _status = ST_FINAL;
+ _status = Status.ST_FINAL;
}
/**
* Asks for a COPS sync
* @throws COPSPdpException
*/
- protected void syncRequestState()
- throws COPSPdpException {
+ public void syncRequestState() throws COPSException {
_sender.sendSyncRequestState();
- _status = ST_SYNC;
+ _status = Status.ST_SYNC;
}
/**
* Opens a new request state
* @throws COPSPdpException
*/
- protected void openNewRequestState()
- throws COPSPdpException {
+ protected void openNewRequestState() throws COPSException {
_sender.sendOpenNewRequestState();
- _status = ST_NEW;
+ _status = Status.ST_NEW;
}
/**
* @param dMsg <tt>COPSDeleteMsg</tt> received from the PEP
* @throws COPSPdpException
*/
- protected void processDeleteRequestState(COPSDeleteMsg dMsg)
- throws COPSPdpException {
+ public void processDeleteRequestState(final COPSDeleteMsg dMsg) throws COPSException {
if (_process != null)
_process.closeRequestState(this);
- _status = ST_DEL;
+ _status = Status.ST_DEL;
}
}