1/*******************************************************************************
2* Product of NIST/ITL Advanced Networking Technologies Division (ANTD).        *
3*******************************************************************************/
4package gov.nist.javax.sip.header.extensions;
5import java.text.ParseException;
6import gov.nist.javax.sip.header.*;
7
8import javax.sip.header.ExtensionHeader;
9/*
10* This code is in the public domain.
11*/
12
13/**
14 * Replaces SIPHeader.
15 * ToDo: add support for early-only flag.
16 *
17 * @author P, Musgrave <pmusgrave@mkcnetworks.com>  <br/>
18 *
19 * @version JAIN-SIP-1.2
20 *
21 *
22 */
23
24public class Replaces
25    extends ParametersHeader implements ExtensionHeader, ReplacesHeader {
26
27    // TODO: Need a unique UID
28    private static final long serialVersionUID = 8765762413224043300L;
29
30    // TODO: When the MinSEHeader is added to javax - move this there...pmusgrave
31    public static final String NAME = "Replaces";
32
33    /**
34     * callIdentifier field
35     */
36    public CallIdentifier callIdentifier;
37    public String callId;
38
39    /**
40     * Default constructor
41     */
42    public Replaces() {
43        super(NAME);
44    }
45
46    /** Constructor given the call Identifier.
47     *@param callId string call identifier (should be localid@host)
48     *@throws IllegalArgumentException if call identifier is bad.
49     */
50    public Replaces(String callId) throws IllegalArgumentException {
51        super(NAME);
52        this.callIdentifier = new CallIdentifier(callId);
53    }
54
55    /**
56     * Encode the body part of this header (i.e. leave out the hdrName).
57     * @return String encoded body part of the header.
58     */
59    public String encodeBody() {
60        if (callId == null)
61            return null;
62        else {
63            String retVal = callId;
64            if (!parameters.isEmpty()) {
65                retVal += SEMICOLON + parameters.encode();
66            }
67            return retVal;
68        }
69    }
70
71    /**
72     * get the CallId field. This does the same thing as encodeBody
73     *
74     * @return String the encoded body part of the
75     */
76    public String getCallId() {
77        return callId;
78    }
79
80    /**
81     * get the call Identifer member.
82     * @return CallIdentifier
83     */
84    public CallIdentifier getCallIdentifer() {
85        return callIdentifier;
86    }
87
88    /**
89     * set the CallId field
90     * @param cid String to set. This is the body part of the Call-Id
91     *  header. It must have the form localId@host or localId.
92     * @throws IllegalArgumentException if cid is null, not a token, or is
93     * not a token@token.
94     */
95    public void setCallId(String cid) {
96        callId = cid;
97    }
98
99    /**
100     * Set the callIdentifier member.
101     * @param cid CallIdentifier to set (localId@host).
102     */
103    public void setCallIdentifier(CallIdentifier cid) {
104        callIdentifier = cid;
105    }
106
107    /**
108     * Get the to-tag parameter from the address parm list.
109     * @return tag field
110     */
111    public String getToTag() {
112        if (parameters == null)
113            return null;
114        return getParameter(ParameterNames.TO_TAG);
115    }
116    /**
117     * Set the to-tag member
118     * @param t tag to set. From tags are mandatory.
119     */
120    public void setToTag(String t) throws ParseException {
121        if (t == null)
122            throw new NullPointerException("null tag ");
123        else if (t.trim().equals(""))
124            throw new ParseException("bad tag", 0);
125        this.setParameter(ParameterNames.TO_TAG, t);
126    }
127    /** Boolean function
128     * @return true if the Tag exist
129     */
130    public boolean hasToTag() {
131        return hasParameter(ParameterNames.TO_TAG);
132    }
133
134    /** remove Tag member
135     */
136    public void removeToTag() {
137        parameters.delete(ParameterNames.TO_TAG);
138    }
139    /**
140     * Get the from-tag parameter from the address parm list.
141     * @return tag field
142     */
143    public String getFromTag() {
144        if (parameters == null)
145            return null;
146        return getParameter(ParameterNames.FROM_TAG);
147    }
148    /**
149     * Set the to-tag member
150     * @param t tag to set. From tags are mandatory.
151     */
152    public void setFromTag(String t) throws ParseException {
153        if (t == null)
154            throw new NullPointerException("null tag ");
155        else if (t.trim().equals(""))
156            throw new ParseException("bad tag", 0);
157        this.setParameter(ParameterNames.FROM_TAG, t);
158    }
159    /** Boolean function
160     * @return true if the Tag exist
161     */
162    public boolean hasFromTag() {
163        return hasParameter(ParameterNames.FROM_TAG);
164    }
165
166    /** remove Tag member
167     */
168    public void removeFromTag() {
169        parameters.delete(ParameterNames.FROM_TAG);
170    }
171
172
173
174    public void setValue(String value) throws ParseException {
175        // not implemented.
176        throw new ParseException(value,0);
177
178    }
179
180//  public Object clone() {
181//      CallID retval = (CallID) super.clone();
182//      if (this.callIdentifier != null)
183//          retval.setCallIdentifier( (CallIdentifier) this.callIdentifier.clone() );
184//      return retval;
185//  }
186}
187/*
188 * $Log: Replaces.java,v $
189 * Revision 1.3  2009/07/17 18:57:42  emcho
190 * Converts indentation tabs to spaces so that we have a uniform indentation policy in the whole project.
191 *
192 * Revision 1.2  2006/10/27 20:58:31  mranga
193 * Issue number:
194 * Obtained from:
195 * Submitted by:
196 * Reviewed by:   mranga
197 * doc fixups
198 * CVS: ----------------------------------------------------------------------
199 * CVS: Issue number:
200 * CVS:   If this change addresses one or more issues,
201 * CVS:   then enter the issue number(s) here.
202 * CVS: Obtained from:
203 * CVS:   If this change has been taken from another system,
204 * CVS:   then name the system in this line, otherwise delete it.
205 * CVS: Submitted by:
206 * CVS:   If this code has been contributed to the project by someone else; i.e.,
207 * CVS:   they sent us a patch or a set of diffs, then include their name/email
208 * CVS:   address here. If this is your work then delete this line.
209 * CVS: Reviewed by:
210 * CVS:   If we are doing pre-commit code reviews and someone else has
211 * CVS:   reviewed your changes, include their name(s) here.
212 * CVS:   If you have not had it reviewed then delete this line.
213 *
214 * Revision 1.1  2006/10/12 11:57:51  pmusgrave
215 * Issue number:  79, 80
216 * Submitted by:  pmusgrave@newheights.com
217 * Reviewed by:   mranga
218 *
219 * Revision 1.3  2006/07/19 15:05:20  pmusgrave
220 * Modify encodeBody so it uses callId and not CallIdentifier
221 *
222 * Revision 1.2  2006/04/17 23:41:31  pmusgrave
223 * Add Session Timer and Replaces headers
224 *
225 * Revision 1.1.1.1  2006/03/15 16:00:07  pmusgrave
226 * Source with additions
227 *
228 * Revision 1.3  2005/04/16 20:38:48  dmuresan
229 * Canonical clone() implementations for the GenericObject and GenericObjectList hierarchies
230 *
231 * Revision 1.2  2004/01/22 13:26:29  sverker
232 * Issue number:
233 * Obtained from:
234 * Submitted by:  sverker
235 * Reviewed by:   mranga
236 *
237 * Major reformat of code to conform with style guide. Resolved compiler and javadoc warnings. Added CVS tags.
238 *
239 * CVS: ----------------------------------------------------------------------
240 * CVS: Issue number:
241 * CVS:   If this change addresses one or more issues,
242 * CVS:   then enter the issue number(s) here.
243 * CVS: Obtained from:
244 * CVS:   If this change has been taken from another system,
245 * CVS:   then name the system in this line, otherwise delete it.
246 * CVS: Submitted by:
247 * CVS:   If this code has been contributed to the project by someone else; i.e.,
248 * CVS:   they sent us a patch or a set of diffs, then include their name/email
249 * CVS:   address here. If this is your work then delete this line.
250 * CVS: Reviewed by:
251 * CVS:   If we are doing pre-commit code reviews and someone else has
252 * CVS:   reviewed your changes, include their name(s) here.
253 * CVS:   If you have not had it reviewed then delete this line.
254 *
255 */
256
257