4 package org.pcmm.messages.impl;
6 import java.io.IOException;
7 import java.net.InetAddress;
8 import java.net.UnknownHostException;
9 import java.util.Properties;
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;
42 public class MessageFactory implements IMessageFactory {
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;
49 private Logger logger = LoggerFactory.getLogger(getClass().getName());
51 private static MessageFactory instance;
53 private MessageFactory() {
56 public static MessageFactory getInstance() {
58 instance = new MessageFactory();
65 * @see pcmm.messages.IMessageFactory#create(pcmm.messages.MessageType)
67 public COPSMsg create(byte messageType) {
68 return create(messageType, new Properties());
74 * @see org.pcmm.messages.IMessageFactory#create(org.pcmm.messages.IMessage.
75 * MessageType, java.util.Properties)
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:
92 case COPSHeader.COPS_OP_KA:
93 return createKAMessage(properties);
94 case COPSHeader.COPS_OP_RPT:
96 case COPSHeader.COPS_OP_SSC:
98 case COPSHeader.COPS_OP_SSQ:
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);
114 COPSHandle handle = new COPSHandle();
116 COPSContext context = new COPSContext(COPSContext.CONFIG, (short) 0);
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));
128 if (prop.get(MessageProperties.CLIENT_HANDLE) != null)
129 handle.setId(new COPSData((String) prop.get(MessageProperties.CLIENT_HANDLE)));
131 msg.addDecision(decision, context);
134 // msg.dump(System.out);
135 // } catch (IOException unae) {
138 } catch (COPSException e) {
139 logger.error(e.getMessage());
146 * creates a Client-Open message.
150 * @return COPS message
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();
169 if (prop.get(MessageProperties.PEP_ID) != null)
170 d = new COPSData((String) prop.get(MessageProperties.PEP_ID));
172 d = new COPSData(InetAddress.getLocalHost().getHostName());
177 } catch (COPSException e) {
178 logger.error(e.getMessage());
179 } catch (UnknownHostException e) {
180 logger.error(e.getMessage());
186 * creates a Client-Accept message.
190 * @return COPS message
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));
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));
203 acctTimer = new COPSAcctTimer(ACCT_TIMER_VALUE);
204 COPSClientAcceptMsg acceptMsg = new COPSClientAcceptMsg();
207 acceptMsg.add(katimer);
208 if (acctTimer.getTimerVal() != 0)
209 acceptMsg.add(acctTimer);
210 } catch (COPSException e) {
211 logger.error(e.getMessage());
217 * creates a Client-Close message.
221 * @return COPS message
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);
233 err = new COPSError(COPSError.COPS_ERR_UNKNOWN, (short) 0);
234 COPSClientCloseMsg closeMsg = new COPSClientCloseMsg();
238 } catch (COPSException e) {
239 logger.error(e.getMessage());
245 * creates a Request message
249 * @return Request message
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)));
265 // just a random handle
266 copsHandle.setId(new COPSData("" + Math.random() * 82730));
269 req.add(copsContext);
271 } catch (COPSException e) {
272 logger.error(e.getMessage());
278 * creates a Keep-Alive message.
282 * @return COPS message
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));
291 timer = new COPSKATimer();
294 } catch (COPSException e) {
295 logger.error(e.getMessage());