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;
+ protected 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;
+ public COPSPdpReqStateMan(final short clientType, final COPSHandle clientHandle, final COPSPdpDataProcess process) {
+ super(clientType, clientHandle);
+ this._process = process;
}
- /**
- * 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 {
+ @Override
+ protected void initRequestState(final 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;
+ _status = Status.ST_INIT;
}
/**
* @param msg COPS request received from the PEP
* @throws COPSPdpException
*/
- protected void processRequest(COPSReqMsg msg)
- throws COPSPdpException {
+ protected void processRequest(final COPSReqMsg msg) throws COPSPdpException {
- COPSHeader hdrmsg = msg.getHeader();
- COPSHandle handlemsg = msg.getClientHandle();
- COPSContext contextmsg = msg.getContext();
+ // TODO - Implement me
+// COPSHeader hdrmsg = msg.getHeader();
+// COPSHandle handlemsg = msg.getClientHandle();
+// COPSContext contextmsg = msg.getContext();
//** Analyze the request
//**
* @param msg Report message from the PEP
* @throws COPSPdpException
*/
- protected void processReport(COPSReportMsg msg)
- throws COPSPdpException {
+ protected void processReport(final COPSReportMsg msg) throws COPSPdpException {
//** Analyze the report
//**
// 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());
+ 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:
- repSIs.put(strobjprid, obj.getData().str());
- // COPSDebug.out(getClass().getName(),"PRID: " + strobjprid);
- // COPSDebug.out(getClass().getName(),"EPD: " + obj.getData().str());
- break;
- default:
- break;
+ case COPSPrObjBase.PR_PRID:
+ strobjprid = obj.getData().str();
+ break;
+ case COPSPrObjBase.PR_EPD:
+ repSIs.put(strobjprid, obj.getData().str());
+ logger.info("PRID: " + strobjprid);
+ logger.info("EPD: " + obj.getData().str());
+ break;
+ default:
+ 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;
+ //** 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;
+ }
}
+
+
}
/**
* @param error Reason
* @throws COPSPdpException
*/
- protected void processClosedConnection(COPSError error)
- throws COPSPdpException {
+ protected void processClosedConnection(final COPSError error) throws COPSPdpException {
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 {
+ protected void processNoKAConnection() throws COPSPdpException {
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 {
+ protected 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 {
+ protected void processDeleteRequestState(final COPSDeleteMsg dMsg) throws COPSPdpException {
if (_process != null)
_process.closeRequestState(this);
- _status = ST_DEL;
+ _status = Status.ST_DEL;
}
}