25d26f996065ffd86d41fb4bb123dd7cf11826f8
[packetcable.git] / protocol_plugins.packetcable / src / main / java / org / pcmm / messages / impl / MessageFactory.java
1 /**
2  * @header@
3  */
4 package org.pcmm.messages.impl;
5
6 import java.io.IOException;
7 import java.net.InetAddress;
8 import java.net.UnknownHostException;
9 import java.util.Properties;
10
11 import org.pcmm.messages.IMessage.MessageProperties;
12 import org.pcmm.messages.IMessageFactory;
13 import org.pcmm.objects.MMVersionInfo;
14 import org.pcmm.rcd.ICMTS;
15 import org.pcmm.rcd.IPCMMClient;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
18 import org.umu.cops.stack.COPSAcctTimer;
19 import org.umu.cops.stack.COPSClientAcceptMsg;
20 import org.umu.cops.stack.COPSClientCloseMsg;
21 import org.umu.cops.stack.COPSClientOpenMsg;
22 import org.umu.cops.stack.COPSClientSI;
23 import org.umu.cops.stack.COPSContext;
24 import org.umu.cops.stack.COPSData;
25 import org.umu.cops.stack.COPSDecision;
26 import org.umu.cops.stack.COPSDecisionMsg;
27 import org.umu.cops.stack.COPSError;
28 import org.umu.cops.stack.COPSException;
29 import org.umu.cops.stack.COPSHandle;
30 import org.umu.cops.stack.COPSHeader;
31 import org.umu.cops.stack.COPSKAMsg;
32 import org.umu.cops.stack.COPSKATimer;
33 import org.umu.cops.stack.COPSMsg;
34 import org.umu.cops.stack.COPSObjHeader;
35 import org.umu.cops.stack.COPSPepId;
36 import org.umu.cops.stack.COPSReqMsg;
37
38 /**
39  * 
40  * 
41  */
42 public class MessageFactory implements IMessageFactory {
43
44         /** Default keep-alive timer value (secs) */
45         public static final short KA_TIMER_VALUE = 30;
46         /** Default accounting timer value (secs) */
47         public static final short ACCT_TIMER_VALUE = 0;
48
49         private Logger logger = LoggerFactory.getLogger(getClass().getName());
50
51         private static MessageFactory instance;
52
53         private MessageFactory() {
54         }
55
56         public static MessageFactory getInstance() {
57                 if (instance == null)
58                         instance = new MessageFactory();
59                 return instance;
60         }
61
62         /*
63          * (non-Javadoc)
64          * 
65          * @see pcmm.messages.IMessageFactory#create(pcmm.messages.MessageType)
66          */
67         public COPSMsg create(byte messageType) {
68                 return create(messageType, new Properties());
69         }
70
71         /*
72          * (non-Javadoc)
73          * 
74          * @see org.pcmm.messages.IMessageFactory#create(org.pcmm.messages.IMessage.
75          * MessageType, java.util.Properties)
76          */
77         public COPSMsg create(byte messageType, Properties properties) {
78                 // return new PCMMMessage(messageType, content);
79                 switch (messageType) {
80                 case COPSHeader.COPS_OP_OPN:
81                         return createOPNMessage(properties);
82                 case COPSHeader.COPS_OP_REQ:
83                         return createREQMessage(properties);
84                 case COPSHeader.COPS_OP_CAT:
85                         return createCATMessage(properties);
86                 case COPSHeader.COPS_OP_CC:
87                         return createCCMessage(properties);
88                 case COPSHeader.COPS_OP_DEC:
89                         return createDECMessage(properties);
90                 case COPSHeader.COPS_OP_DRQ:
91                 break;
92                 case COPSHeader.COPS_OP_KA:
93                         return createKAMessage(properties);
94                 case COPSHeader.COPS_OP_RPT:
95                 break;
96                 case COPSHeader.COPS_OP_SSC:
97                 break;
98                 case COPSHeader.COPS_OP_SSQ:
99                 break;
100                 }
101                 return null;
102         }
103
104         /**
105          * 
106          * @param prop
107          * @return
108          */
109         protected COPSMsg createDECMessage(Properties prop) {
110                 COPSDecisionMsg msg = new COPSDecisionMsg();
111                 // ===common part between all gate control messages
112                 COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_DEC, IPCMMClient.CLIENT_TYPE);
113                 // handle
114                 COPSHandle handle = new COPSHandle();
115                 // context
116                 COPSContext context = new COPSContext(COPSContext.CONFIG, (short) 0);
117                 // decision
118                 COPSDecision decision = new COPSDecision();
119                 if (prop.get(MessageProperties.DECISION_CMD_CODE) != null)
120                         decision.setCmdCode((byte) prop.get(MessageProperties.DECISION_CMD_CODE));
121                 if (prop.get(MessageProperties.DECISION_FLAG) != null)
122                         decision.setFlags((short) prop.get(MessageProperties.DECISION_FLAG));
123                 COPSClientSI si = new COPSClientSI(COPSObjHeader.COPS_DEC, (byte) 4);
124                 if (prop.get(MessageProperties.GATE_CONTROL) != null)
125                         si.setData((COPSData) prop.get(MessageProperties.GATE_CONTROL));
126                 try {
127                         msg.add(hdr);
128                         if (prop.get(MessageProperties.CLIENT_HANDLE) != null)
129                                 handle.setId(new COPSData((String) prop.get(MessageProperties.CLIENT_HANDLE)));
130                         msg.add(handle);
131                         msg.addDecision(decision, context);
132                         msg.add(si);
133                         // try {
134                         // msg.dump(System.out);
135                         // } catch (IOException unae) {
136                         // }
137
138                 } catch (COPSException e) {
139                         logger.error(e.getMessage());
140                 }
141
142                 return msg;
143         }
144
145         /**
146          * creates a Client-Open message.
147          * 
148          * @param prop
149          *            properties
150          * @return COPS message
151          */
152         protected COPSMsg createOPNMessage(Properties prop) {
153                 COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_OPN, IPCMMClient.CLIENT_TYPE);
154                 COPSPepId pepId = new COPSPepId();
155                 // version infor object
156                 short majorVersion = MMVersionInfo.DEFAULT_MAJOR_VERSION_INFO;
157                 short minorVersion = MMVersionInfo.DEFAULT_MINOR_VERSION_INFO;
158                 if (prop.get(MessageProperties.MM_MAJOR_VERSION_INFO) != null)
159                         majorVersion = (Short) prop.get(MessageProperties.MM_MAJOR_VERSION_INFO);
160                 if (prop.get(MessageProperties.MM_MINOR_VERSION_INFO) != null)
161                         minorVersion = (Short) prop.get(MessageProperties.MM_MINOR_VERSION_INFO);
162                 // Mandatory MM version.
163                 COPSClientSI clientSI = new COPSClientSI((byte) 1);
164                 byte[] versionInfo = new MMVersionInfo(majorVersion, minorVersion).getAsBinaryArray();
165                 clientSI.setData(new COPSData(versionInfo, 0, versionInfo.length));
166                 COPSClientOpenMsg msg = new COPSClientOpenMsg();
167                 try {
168                         COPSData d = null;
169                         if (prop.get(MessageProperties.PEP_ID) != null)
170                                 d = new COPSData((String) prop.get(MessageProperties.PEP_ID));
171                         else
172                                 d = new COPSData(InetAddress.getLocalHost().getHostName());
173                         pepId.setData(d);
174                         msg.add(hdr);
175                         msg.add(pepId);
176                         msg.add(clientSI);
177                 } catch (COPSException e) {
178                         logger.error(e.getMessage());
179                 } catch (UnknownHostException e) {
180                         logger.error(e.getMessage());
181                 }
182                 return msg;
183         }
184
185         /**
186          * creates a Client-Accept message.
187          * 
188          * @param prop
189          *            properties
190          * @return COPS message
191          */
192         protected COPSMsg createCATMessage(Properties prop) {
193                 COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_CAT, IPCMMClient.CLIENT_TYPE);
194                 COPSKATimer katimer = null;
195                 COPSAcctTimer acctTimer = null;
196                 if (prop.get(MessageProperties.KA_TIMER) != null)
197                         katimer = new COPSKATimer((short) prop.get(MessageProperties.KA_TIMER));
198                 else
199                         katimer = new COPSKATimer((short) KA_TIMER_VALUE);
200                 if (prop.get(MessageProperties.ACCEPT_TIMER) != null)
201                         acctTimer = new COPSAcctTimer((short) prop.get(MessageProperties.ACCEPT_TIMER));
202                 else
203                         acctTimer = new COPSAcctTimer(ACCT_TIMER_VALUE);
204                 COPSClientAcceptMsg acceptMsg = new COPSClientAcceptMsg();
205                 try {
206                         acceptMsg.add(hdr);
207                         acceptMsg.add(katimer);
208                         if (acctTimer.getTimerVal() != 0)
209                                 acceptMsg.add(acctTimer);
210                 } catch (COPSException e) {
211                         logger.error(e.getMessage());
212                 }
213                 return acceptMsg;
214         }
215
216         /**
217          * creates a Client-Close message.
218          * 
219          * @param prop
220          *            properties
221          * @return COPS message
222          */
223         protected COPSMsg createCCMessage(Properties prop) {
224                 COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_CC, IPCMMClient.CLIENT_TYPE);
225                 COPSError err = null;
226                 if (prop.get(MessageProperties.ERR_MESSAGE) != null) {
227                         short code = (short) 0;
228                         short error = (short) prop.get(MessageProperties.ERR_MESSAGE);
229                         if (prop.get(MessageProperties.ERR_MESSAGE_SUB_CODE) != null)
230                                 code = (short) prop.get(MessageProperties.ERR_MESSAGE_SUB_CODE);
231                         err = new COPSError(error, code);
232                 } else
233                         err = new COPSError(COPSError.COPS_ERR_UNKNOWN, (short) 0);
234                 COPSClientCloseMsg closeMsg = new COPSClientCloseMsg();
235                 try {
236                         closeMsg.add(cHdr);
237                         closeMsg.add(err);
238                 } catch (COPSException e) {
239                         logger.error(e.getMessage());
240                 }
241                 return closeMsg;
242         }
243
244         /**
245          * creates a Request message
246          * 
247          * @param prop
248          *            properties
249          * @return Request message
250          */
251         protected COPSMsg createREQMessage(Properties prop) {
252                 COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_REQ, IPCMMClient.CLIENT_TYPE);
253                 COPSReqMsg req = new COPSReqMsg();
254                 short rType = ICMTS.DEFAULT_R_TYPE;
255                 short mType = ICMTS.DEFAULT_M_TYPE;
256                 if (prop.get(MessageProperties.R_TYPE) != null)
257                         rType = (Short) prop.get(MessageProperties.R_TYPE);
258                 if (prop.get(MessageProperties.M_TYPE) != null)
259                         mType = (Short) prop.get(MessageProperties.M_TYPE);
260                 COPSContext copsContext = new COPSContext(rType, mType);
261                 COPSHandle copsHandle = new COPSHandle();
262                 if (prop.get(MessageProperties.CLIENT_HANDLE) != null)
263                         copsHandle.setId(new COPSData((String) prop.get(MessageProperties.CLIENT_HANDLE)));
264                 else
265                         // just a random handle
266                         copsHandle.setId(new COPSData("" + Math.random() * 82730));
267                 try {
268                         req.add(cHdr);
269                         req.add(copsContext);
270                         req.add(copsHandle);
271                 } catch (COPSException e) {
272                         logger.error(e.getMessage());
273                 }
274                 return req;
275         }
276
277         /**
278          * creates a Keep-Alive message.
279          * 
280          * @param prop
281          *            properties
282          * @return COPS message
283          */
284         protected COPSMsg createKAMessage(Properties prop) {
285                 COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_KA, (short) 0);
286                 COPSKAMsg kaMsg = new COPSKAMsg();
287                 COPSKATimer timer = null;
288                 if (prop.get(MessageProperties.KA_TIMER) != null)
289                         timer = new COPSKATimer((Short) prop.get(MessageProperties.KA_TIMER));
290                 else
291                         timer = new COPSKATimer();
292                 try {
293                         kaMsg.add(cHdr);
294                 } catch (COPSException e) {
295                         logger.error(e.getMessage());
296                 }
297                 return kaMsg;
298         }
299 }