4 package org.pcmm.messages.impl;
6 import org.pcmm.messages.IMessage.MessageProperties;
7 import org.pcmm.messages.IMessageFactory;
8 import org.pcmm.objects.MMVersionInfo;
9 import org.pcmm.rcd.ICMTS;
10 import org.pcmm.rcd.IPCMMClient;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13 import org.umu.cops.stack.*;
14 import org.umu.cops.stack.COPSClientSI.CSIType;
15 import org.umu.cops.stack.COPSContext.RType;
16 import org.umu.cops.stack.COPSDecision.Command;
17 import org.umu.cops.stack.COPSDecision.DecisionFlag;
18 import org.umu.cops.stack.COPSError.ErrorTypes;
20 import java.net.InetAddress;
21 import java.util.Properties;
27 public class MessageFactory implements IMessageFactory {
29 /** Default keep-alive timer value (secs) */
30 public static final short KA_TIMER_VALUE = 30;
31 /** Default accounting timer value (secs) */
32 public static final short ACCT_TIMER_VALUE = 0;
34 private static final Logger logger = LoggerFactory.getLogger(MessageFactory.class);
36 private static final MessageFactory instance = new MessageFactory();
38 private MessageFactory() {
41 public static MessageFactory getInstance() {
48 * @see pcmm.messages.IMessageFactory#create(pcmm.messages.MessageType)
50 public COPSMsg create(final byte messageType) {
51 return create(messageType, new Properties());
57 * @see org.pcmm.messages.IMessageFactory#create(org.pcmm.messages.IMessage.
58 * MessageType, java.util.Properties)
60 public COPSMsg create(final byte messageType, final Properties properties) {
61 logger.info("Creating message of type - " + messageType);
62 // return new PCMMMessage(messageType, content);
63 switch (messageType) {
64 case COPSHeader.COPS_OP_OPN:
65 return createOPNMessage(properties);
66 case COPSHeader.COPS_OP_REQ:
67 return createREQMessage(properties);
68 case COPSHeader.COPS_OP_CAT:
69 return createCATMessage(properties);
70 case COPSHeader.COPS_OP_CC:
71 return createCCMessage(properties);
72 case COPSHeader.COPS_OP_DEC:
73 return createDECMessage(properties);
74 case COPSHeader.COPS_OP_DRQ:
76 case COPSHeader.COPS_OP_KA:
77 return createKAMessage(properties);
78 case COPSHeader.COPS_OP_RPT:
80 case COPSHeader.COPS_OP_SSC:
82 case COPSHeader.COPS_OP_SSQ:
90 * @param prop - the properties
91 * @return - the message
93 protected COPSMsg createDECMessage(final Properties prop) {
94 final COPSDecisionMsg msg = new COPSDecisionMsg();
95 // ===common part between all gate control messages
96 final COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_DEC, IPCMMClient.CLIENT_TYPE);
99 final COPSContext context = new COPSContext(RType.CONFIG, (short) 0);
103 if (prop.get(MessageProperties.DECISION_CMD_CODE) != null)
104 cmd = (Command) prop.get(MessageProperties.DECISION_CMD_CODE);
106 DecisionFlag flag = null;
107 if (prop.get(MessageProperties.DECISION_FLAG) != null)
108 flag = (DecisionFlag) prop.get(MessageProperties.DECISION_FLAG);
110 final COPSDecision decision = new COPSDecision(cmd, flag);
112 COPSData data = null;
113 if (prop.get(MessageProperties.GATE_CONTROL) != null)
114 data = (COPSData) prop.get(MessageProperties.GATE_CONTROL);
116 // TODO - Determine the proper type here.
117 final COPSClientSI si = new COPSClientSI(CSIType.SIGNALED, data);
120 final COPSHandle handle;
121 if (prop.get(MessageProperties.CLIENT_HANDLE) != null) {
122 handle = new COPSHandle(new COPSData((String) prop.get(MessageProperties.CLIENT_HANDLE)));
125 // TODO - This smells wrong to have a null handle ID
126 handle = new COPSHandle(null);
129 msg.addDecision(decision, context);
132 // TODO - determine why this block has been commented out
134 // msg.dump(System.out);
135 // } catch (IOException unae) {
138 } catch (final COPSException e) {
139 logger.error(e.getMessage());
146 * creates a Client-Open message.
150 * @return COPS message
152 protected COPSMsg createOPNMessage(final Properties prop) {
153 final COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_OPN, IPCMMClient.CLIENT_TYPE);
154 // version infor object
155 short majorVersion = MMVersionInfo.DEFAULT_MAJOR_VERSION_INFO;
156 short minorVersion = MMVersionInfo.DEFAULT_MINOR_VERSION_INFO;
157 if (prop.get(MessageProperties.MM_MAJOR_VERSION_INFO) != null)
158 majorVersion = (Short) prop.get(MessageProperties.MM_MAJOR_VERSION_INFO);
159 if (prop.get(MessageProperties.MM_MINOR_VERSION_INFO) != null)
160 minorVersion = (Short) prop.get(MessageProperties.MM_MINOR_VERSION_INFO);
161 // Mandatory MM version.
162 byte[] versionInfo = new MMVersionInfo(majorVersion, minorVersion).getAsBinaryArray();
163 final COPSClientSI clientSI = new COPSClientSI(CSIType.SIGNALED,
164 new COPSData(versionInfo, 0, versionInfo.length));
165 final COPSClientOpenMsg msg = new COPSClientOpenMsg();
168 if (prop.get(MessageProperties.PEP_ID) != null)
169 d = new COPSData((String) prop.get(MessageProperties.PEP_ID));
171 d = new COPSData(InetAddress.getLocalHost().getHostName());
172 final COPSPepId pepId = new COPSPepId(d);
176 } catch (Exception e) {
177 logger.error("Error creating OPN message", e);
183 * creates a Client-Accept message.
184 * @param prop - properties
185 * @return COPS message
187 protected COPSMsg createCATMessage(final Properties prop) {
188 final COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_CAT, IPCMMClient.CLIENT_TYPE);
189 final COPSKATimer katimer;
190 if (prop.get(MessageProperties.KA_TIMER) != null)
191 katimer = new COPSKATimer((short) prop.get(MessageProperties.KA_TIMER));
193 katimer = new COPSKATimer(KA_TIMER_VALUE);
195 final COPSAcctTimer acctTimer;
196 if (prop.get(MessageProperties.ACCEPT_TIMER) != null)
197 acctTimer = new COPSAcctTimer((short) prop.get(MessageProperties.ACCEPT_TIMER));
199 acctTimer = new COPSAcctTimer(ACCT_TIMER_VALUE);
201 final COPSClientAcceptMsg acceptMsg = new COPSClientAcceptMsg();
204 acceptMsg.add(katimer);
205 if (acctTimer.getTimerVal() != 0)
206 acceptMsg.add(acctTimer);
207 } catch (COPSException e) {
208 logger.error(e.getMessage());
214 * creates a Client-Close message.
218 * @return COPS message
220 protected COPSMsg createCCMessage(final Properties prop) {
221 final COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_CC, IPCMMClient.CLIENT_TYPE);
223 if (prop.get(MessageProperties.ERR_MESSAGE) != null) {
224 ErrorTypes code = ErrorTypes.NA;
225 final ErrorTypes error = (ErrorTypes) prop.get(MessageProperties.ERR_MESSAGE);
226 if (prop.get(MessageProperties.ERR_MESSAGE_SUB_CODE) != null)
227 code = (ErrorTypes) prop.get(MessageProperties.ERR_MESSAGE_SUB_CODE);
228 err = new COPSError(error, code);
230 err = new COPSError(ErrorTypes.UNKNOWN, ErrorTypes.NA);
232 final COPSClientCloseMsg closeMsg = new COPSClientCloseMsg();
236 } catch (COPSException e) {
237 logger.error(e.getMessage());
243 * creates a Request message
247 * @return Request message
249 protected COPSMsg createREQMessage(final Properties prop) {
250 final COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_REQ, IPCMMClient.CLIENT_TYPE);
251 final COPSReqMsg req = new COPSReqMsg();
254 if (prop.get(MessageProperties.R_TYPE) != null)
255 rType = (RType) prop.get(MessageProperties.R_TYPE);
256 else rType = RType.NA; //ICMTS.DEFAULT_R_TYPE;
259 if (prop.get(MessageProperties.M_TYPE) != null)
260 mType = (Short) prop.get(MessageProperties.M_TYPE);
261 else mType = ICMTS.DEFAULT_M_TYPE;
263 final COPSContext copsContext = new COPSContext(rType, mType);
264 final COPSHandle copsHandle;
265 if (prop.get(MessageProperties.CLIENT_HANDLE) != null)
266 copsHandle = new COPSHandle(new COPSData((String) prop.get(MessageProperties.CLIENT_HANDLE)));
268 // just a random handle
269 copsHandle = new COPSHandle(new COPSData("" + Math.random() * 82730));
272 req.add(copsContext);
274 } catch (COPSException e) {
275 logger.error(e.getMessage());
281 * creates a Keep-Alive message.
285 * @return COPS message
286 * TODO - Why is there a timer being instantiated but never used?
288 protected COPSMsg createKAMessage(final Properties prop) {
289 final COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_KA, (short) 0);
290 final COPSKAMsg kaMsg = new COPSKAMsg();
291 final COPSKATimer timer;
292 if (prop.get(MessageProperties.KA_TIMER) != null)
293 timer = new COPSKATimer((Short) prop.get(MessageProperties.KA_TIMER));
295 timer = new COPSKATimer((short)1);
298 } catch (COPSException e) {
299 logger.error(e.getMessage());