The second patch of an estimated 4 to complete the COPS message refactoring as descri...
[packetcable.git] / packetcable-driver / src / main / java / org / umu / cops / prpdp / COPSPdpReqStateMan.java
index 2de386c3d01b02eb92c2044e1337f81f513ea694..b2993a0825c27c21dfe5154049c4a968dd00d9d5 100644 (file)
-/*\r
- * Copyright (c) 2004 University of Murcia.  All rights reserved.\r
- * --------------------------------------------------------------\r
- * For more information, please see <http://www.umu.euro6ix.org/>.\r
- */\r
-\r
-package org.umu.cops.prpdp;\r
-\r
-import org.umu.cops.stack.*;\r
-\r
-import java.net.Socket;\r
-import java.util.Enumeration;\r
-import java.util.Hashtable;\r
-import java.util.Vector;\r
-\r
-/**\r
- * State manager class for provisioning requests, at the PDP side.\r
- */\r
-public class COPSPdpReqStateMan {\r
-\r
-    /**\r
-     * Request State created\r
-     */\r
-    public final static short ST_CREATE = 1;\r
-    /**\r
-     * Request received\r
-     */\r
-    public final static short ST_INIT = 2;\r
-    /**\r
-     * Decisions sent\r
-     */\r
-    public final static short ST_DECS = 3;\r
-    /**\r
-     * Report received\r
-     */\r
-    public final static short ST_REPORT = 4;\r
-    /**\r
-     * Request State finalized\r
-     */\r
-    public final static short ST_FINAL = 5;\r
-    /**\r
-     * New Request State solicited\r
-     */\r
-    public final static short ST_NEW = 6;\r
-    /**\r
-     * Delete Request State solicited\r
-     */\r
-    public final static short ST_DEL = 7;\r
-    /**\r
-     * SYNC request sent\r
-     */\r
-    public final static short ST_SYNC = 8;\r
-    /**\r
-     * SYNC completed\r
-     */\r
-    public final static short ST_SYNCALL = 9;\r
-    /**\r
-     * Close connection received\r
-     */\r
-    public final static short ST_CCONN = 10;\r
-    /**\r
-     * Keep-alive timeout\r
-     */\r
-    public final static short ST_NOKA = 11;\r
-    /**\r
-     * Accounting timeout\r
-     */\r
-    public final static short ST_ACCT = 12;\r
-\r
-    /**\r
-     * COPS client-type that identifies the policy client\r
-     */\r
-    protected short _clientType;\r
-\r
-    /**\r
-     *  COPS client handle used to uniquely identify a particular\r
-     *  PEP's request for a client-type\r
-     */\r
-    protected COPSHandle _handle;\r
-\r
-    /**\r
-     * Object for performing policy data processing\r
-     */\r
-    protected COPSPdpDataProcess _process;\r
-\r
-    /**\r
-     *  Current state of the request being managed\r
-     */\r
-    protected short _status;\r
-\r
-    /** COPS message transceiver used to send COPS messages */\r
-    protected COPSPdpMsgSender _sender;\r
-\r
-    /**\r
-     * Creates a request state manager\r
-     * @param clientType    Client-type\r
-     * @param clientHandle  Client handle\r
-     */\r
-    public COPSPdpReqStateMan(short clientType, String clientHandle) {\r
-        _handle = new COPSHandle(new COPSData(clientHandle));\r
-        _clientType = clientType;\r
-        _status = ST_CREATE;\r
-    }\r
-\r
-    /**\r
-     * Gets the client handle\r
-     * @return   Client's <tt>COPSHandle</tt>\r
-     */\r
-    public COPSHandle getClientHandle() {\r
-        return _handle;\r
-    }\r
-\r
-    /**\r
-     * Gets the client-type\r
-     * @return   Client-type value\r
-     */\r
-    public short getClientType() {\r
-        return _clientType;\r
-    }\r
-\r
-    /**\r
-     * Gets the status of the request\r
-     * @return      Request state value\r
-     */\r
-    public short getStatus() {\r
-        return _status;\r
-    }\r
-\r
-    /**\r
-     * Gets the policy data processing object\r
-     * @return   Policy data processing object\r
-     */\r
-    public COPSPdpDataProcess getDataProcess() {\r
-        return _process;\r
-    }\r
-\r
-    /**\r
-     * Sets the policy data processing object\r
-     * @param   process Policy data processing object\r
-     */\r
-    public void setDataProcess(COPSPdpDataProcess process) {\r
-        _process = process;\r
-    }\r
-\r
-    /**\r
-     * Called when COPS sync is completed\r
-     * @param    repMsg              COPS sync message\r
-     * @throws   COPSPdpException\r
-     */\r
-    protected void processSyncComplete(COPSSyncStateMsg repMsg)\r
-    throws COPSPdpException {\r
-\r
-        _status = ST_SYNCALL;\r
-\r
-        // maybe we should notifySyncComplete ...\r
-    }\r
-\r
-    /**\r
-     * Initializes a new request state over a socket\r
-     * @param sock  Socket to the PEP\r
-     * @throws COPSPdpException\r
-     */\r
-    protected void initRequestState(Socket sock)\r
-    throws COPSPdpException {\r
-        // Inits an object for sending COPS messages to the PEP\r
-        _sender = new COPSPdpMsgSender(_clientType, _handle, sock);\r
-\r
-        // Initial state\r
-        _status = ST_INIT;\r
-    }\r
-\r
-    /**\r
-     * Processes a COPS request\r
-     * @param msg   COPS request received from the PEP\r
-     * @throws COPSPdpException\r
-     */\r
-    protected void processRequest(COPSReqMsg msg)\r
-    throws COPSPdpException {\r
-\r
-        COPSHeader hdrmsg = msg.getHeader();\r
-        COPSHandle handlemsg = msg.getClientHandle();\r
-        COPSContext contextmsg = msg.getContext();\r
-\r
-        //** Analyze the request\r
-        //**\r
-\r
-        /* <Request> ::= <Common Header>\r
-        *                   <Client Handle>\r
-        *                   <Context>\r
-        *                   *(<Named ClientSI>)\r
-        *                   [<Integrity>]\r
-        * <Named ClientSI> ::= <*(<PRID> <EPD>)>\r
-        *\r
-        * Very important, this is actually being treated like this:\r
-        * <Named ClientSI> ::= <PRID> | <EPD>\r
-        *\r
-\r
-        // Named ClientSI\r
-        Vector clientSIs = msg.getClientSI();\r
-        Hashtable reqSIs = new Hashtable(40);\r
-        String strobjprid = new String();\r
-        for (Enumeration e = clientSIs.elements() ; e.hasMoreElements() ;) {\r
-            COPSClientSI clientSI = (COPSClientSI) e.nextElement();\r
-\r
-            COPSPrObjBase obj = new COPSPrObjBase(clientSI.getData().getData());\r
-            switch (obj.getSNum())\r
-            {\r
-                case COPSPrObjBase.PR_PRID:\r
-                    strobjprid = obj.getData().str();\r
-                    break;\r
-                case COPSPrObjBase.PR_EPD:\r
-                    reqSIs.put(strobjprid, obj.getData().str());\r
-                    // COPSDebug.out(getClass().getName(),"PRID: " + strobjprid);\r
-                    // COPSDebug.out(getClass().getName(),"EPD: " + obj.getData().str());\r
-                    break;\r
-                default:\r
-                    break;\r
-            }\r
-        }\r
-\r
-        //** Here we must retrieve a decision depending on\r
-        //** the supplied ClientSIs\r
-        // reqSIs is a hashtable with the prid and epds\r
-\r
-        // ................\r
-        //\r
-        Hashtable removeDecs = new Hashtable();\r
-        Hashtable installDecs = new Hashtable();\r
-        _process.setClientData(this, reqSIs);\r
-\r
-        removeDecs = _process.getRemovePolicy(this);\r
-        installDecs = _process.getInstallPolicy(this);\r
-\r
-        //** We create the SOLICITED decision\r
-        //**\r
-        _sender.sendDecision(removeDecs, installDecs);\r
-        _status = ST_DECS;\r
-        */\r
-    }\r
-\r
-    /**\r
-     * Processes a report\r
-     * @param msg   Report message from the PEP\r
-     * @throws COPSPdpException\r
-     */\r
-    protected void processReport(COPSReportMsg msg)\r
-    throws COPSPdpException {\r
-\r
-        //** Analyze the report\r
-        //**\r
-\r
-        /*\r
-         * <Report State> ::= <Common Header>\r
-         *                      <Client Handle>\r
-         *                      <Report Type>\r
-         *                      *(<Named ClientSI>)\r
-         *                      [<Integrity>]\r
-         * <Named ClientSI: Report> ::= <[<GPERR>] *(<report>)>\r
-         * <report> ::= <ErrorPRID> <CPERR> *(<PRID><EPD>)\r
-         *\r
-         * Important, <Named ClientSI> is not parsed\r
-        */\r
-\r
-        // COPSHeader hdrmsg = msg.getHeader();\r
-        // COPSHandle handlemsg = msg.getClientHandle();\r
-\r
-        // Report Type\r
-        COPSReportType rtypemsg = msg.getReport();\r
-\r
-        // Named ClientSI\r
-        Vector clientSIs = msg.getClientSI();\r
-        Hashtable repSIs = new Hashtable(40);\r
-        String strobjprid = new String();\r
-        for (Enumeration e = clientSIs.elements() ; e.hasMoreElements() ;) {\r
-            COPSClientSI clientSI = (COPSClientSI) e.nextElement();\r
-\r
-            COPSPrObjBase obj = new COPSPrObjBase(clientSI.getData().getData());\r
-            switch (obj.getSNum()) {\r
-            case COPSPrObjBase.PR_PRID:\r
-                strobjprid = obj.getData().str();\r
-                break;\r
-            case COPSPrObjBase.PR_EPD:\r
-                repSIs.put(strobjprid, obj.getData().str());\r
-                // COPSDebug.out(getClass().getName(),"PRID: " + strobjprid);\r
-                // COPSDebug.out(getClass().getName(),"EPD: " + obj.getData().str());\r
-                break;\r
-            default:\r
-                break;\r
-            }\r
-        }\r
-\r
-        //** Here we must act in accordance with\r
-        //** the report received\r
-        if (rtypemsg.isSuccess()) {\r
-            _status = ST_REPORT;\r
-            _process.successReport(this, repSIs);\r
-        } else if (rtypemsg.isFailure()) {\r
-            _status = ST_REPORT;\r
-            _process.failReport(this, repSIs);\r
-        } else if (rtypemsg.isAccounting()) {\r
-            _status = ST_ACCT;\r
-            _process.acctReport(this, repSIs);\r
-        }\r
-    }\r
-\r
-    /**\r
-     * Called when connection is closed\r
-     * @param error Reason\r
-     * @throws COPSPdpException\r
-     */\r
-    protected void processClosedConnection(COPSError error)\r
-    throws COPSPdpException {\r
-        if (_process != null)\r
-            _process.notifyClosedConnection(this, error);\r
-\r
-        _status = ST_CCONN;\r
-    }\r
-\r
-    /**\r
-     * Called when no keep-alive is received\r
-     * @throws COPSPdpException\r
-     */\r
-    protected void processNoKAConnection()\r
-    throws COPSPdpException {\r
-        if (_process != null)\r
-            _process.notifyNoKAliveReceived(this);\r
-\r
-        _status = ST_NOKA;\r
-    }\r
-\r
-    /**\r
-     * Deletes the request state\r
-     * @throws COPSPdpException\r
-     */\r
-    protected void finalizeRequestState()\r
-    throws COPSPdpException {\r
-        _sender.sendDeleteRequestState();\r
-        _status = ST_FINAL;\r
-    }\r
-\r
-    /**\r
-     * Asks for a COPS sync\r
-     * @throws COPSPdpException\r
-     */\r
-    protected void syncRequestState()\r
-    throws COPSPdpException {\r
-        _sender.sendSyncRequestState();\r
-        _status = ST_SYNC;\r
-    }\r
-\r
-    /**\r
-     * Opens a new request state\r
-     * @throws COPSPdpException\r
-     */\r
-    protected void openNewRequestState()\r
-    throws COPSPdpException {\r
-        _sender.sendOpenNewRequestState();\r
-        _status = ST_NEW;\r
-    }\r
-\r
-    /**\r
-     * Processes a COPS delete message\r
-     * @param dMsg  <tt>COPSDeleteMsg</tt> received from the PEP\r
-     * @throws COPSPdpException\r
-     */\r
-    protected void processDeleteRequestState(COPSDeleteMsg dMsg)\r
-    throws COPSPdpException {\r
-        if (_process != null)\r
-            _process.closeRequestState(this);\r
-\r
-        _status = ST_DEL;\r
-    }\r
-\r
-}\r
+/*
+ * Copyright (c) 2004 University of Murcia.  All rights reserved.
+ * --------------------------------------------------------------
+ * For more information, please see <http://www.umu.euro6ix.org/>.
+ */
+
+package org.umu.cops.prpdp;
+
+import org.umu.cops.stack.*;
+
+import java.net.Socket;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+
+/**
+ * State manager class for provisioning requests, at the PDP side.
+ */
+public class COPSPdpReqStateMan {
+
+    /**
+     * 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;
+
+    /**
+     * Object for performing policy data processing
+     */
+    protected COPSPdpDataProcess _process;
+
+    /**
+     *  Current state of the request being managed
+     */
+    protected short _status;
+
+    /** COPS message transceiver used to send COPS messages */
+    protected 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;
+    }
+
+    /**
+     * Processes a COPS request
+     * @param msg   COPS request received from the PEP
+     * @throws COPSPdpException
+     */
+    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();
+
+            COPSPrObjBase obj = new COPSPrObjBase(clientSI.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());
+                    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 = 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;
+        }
+    }
+
+    /**
+     * Called when connection is closed
+     * @param error Reason
+     * @throws COPSPdpException
+     */
+    protected void processClosedConnection(COPSError error)
+    throws COPSPdpException {
+        if (_process != null)
+            _process.notifyClosedConnection(this, error);
+
+        _status = ST_CCONN;
+    }
+
+    /**
+     * Called when no keep-alive is received
+     * @throws COPSPdpException
+     */
+    protected void processNoKAConnection()
+    throws COPSPdpException {
+        if (_process != null)
+            _process.notifyNoKAliveReceived(this);
+
+        _status = ST_NOKA;
+    }
+
+    /**
+     * Deletes the request state
+     * @throws COPSPdpException
+     */
+    protected void finalizeRequestState()
+    throws COPSPdpException {
+        _sender.sendDeleteRequestState();
+        _status = ST_FINAL;
+    }
+
+    /**
+     * Asks for a COPS sync
+     * @throws COPSPdpException
+     */
+    protected void syncRequestState()
+    throws COPSPdpException {
+        _sender.sendSyncRequestState();
+        _status = ST_SYNC;
+    }
+
+    /**
+     * Opens a new request state
+     * @throws COPSPdpException
+     */
+    protected void openNewRequestState()
+    throws COPSPdpException {
+        _sender.sendOpenNewRequestState();
+        _status = ST_NEW;
+    }
+
+    /**
+     * Processes a COPS delete message
+     * @param dMsg  <tt>COPSDeleteMsg</tt> received from the PEP
+     * @throws COPSPdpException
+     */
+    protected void processDeleteRequestState(COPSDeleteMsg dMsg)
+    throws COPSPdpException {
+        if (_process != null)
+            _process.closeRequestState(this);
+
+        _status = ST_DEL;
+    }
+
+}