FileDocCategorySizeDatePackage
SessionDescriptionImpl.javaAPI DocphoneME MR2 API (J2ME)25065Wed May 02 18:00:42 BST 2007gov.nist.javax.sdp

SessionDescriptionImpl.java

/*
 * Portions Copyright  2000-2007 Sun Microsystems, Inc. All Rights
 * Reserved.  Use is subject to license terms.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt).
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions.
 */
/*
 * SessionDescriptionImpl.java
 *
 * Created on January 10, 2002, 3:11 PM
 */

package gov.nist.javax.sdp;

import java.util.*;
import gov.nist.javax.sdp.fields.*;
import gov.nist.core.*;
/**
 * Implementation of the SessionDescription interface.
 *
 * 
 * a href="{@docRoot}/uncopyright.html">This code is in the public domain.</a>
 *
 */
public class SessionDescriptionImpl {
    /** Descriptive label for current time. */
    private TimeDescriptionImpl currentTimeDescription;
    /** Descriptive lavel for current media. */
    private MediaDescriptionImpl currentMediaDescription;
    /** Protocol version. */
    protected ProtoVersionField versionImpl;
    /** Session originator. */
    protected OriginField originImpl;
    /** Current session name. */
    protected SessionNameField sessionNameImpl;
    /** Descriptive session information. */
    protected InformationField infoImpl;
    /** Current URi. */
    protected URIField uriImpl;
    /** Current connection. */
    protected ConnectionField connectionImpl;
    /** Key field. */
    protected KeyField keyImpl;
    /** Vector of time descriptions. */
    protected Vector timeDescriptions;
    /** Vector of media types. */
    protected Vector mediaDescriptions;
    /** Vector of time zone adjustments. */
    protected Vector zoneAdjustments;
    /** Vector of email addresses. */
    protected Vector emailList;
    /** Vector of phone numbers. */
    protected Vector phoneList;
    /** Vector of bandwidths. */
    protected Vector bandwidthList;
    /** Vector of connection attributes. */
    protected Vector attributesList;
 
    /** Creates new SessionDescriptionImpl */
    public SessionDescriptionImpl() {
	zoneAdjustments = new Vector();
	emailList = new Vector();
	phoneList = new Vector();
	bandwidthList = new Vector();
	timeDescriptions = new Vector();
	mediaDescriptions = new Vector();
	attributesList = new Vector();
 
    }
 
    /**
     * Adds a new SDP field.
     * @param sdpField the new field to be processed
     * @exception ParseException if a parsing error occurs.
     */
    public void addField(SDPField sdpField) throws ParseException {
	try {
	    if (sdpField instanceof ProtoVersionField) {
		versionImpl = (ProtoVersionField)sdpField;
	    } else if (sdpField instanceof OriginField) {
		originImpl = (OriginField) sdpField;
	    } else if (sdpField instanceof SessionNameField) {
		sessionNameImpl = (SessionNameField) sdpField;
	    } else if (sdpField instanceof InformationField) {
		if (currentMediaDescription != null)
		    currentMediaDescription.setInformationField
			((InformationField) sdpField);
		else this.infoImpl = (InformationField) sdpField;
	    } else if (sdpField instanceof URIField) {
		uriImpl = (URIField) sdpField;
	    } else if (sdpField instanceof ConnectionField) {
		if (currentMediaDescription != null)
		    currentMediaDescription.setConnectionField
			((ConnectionField) sdpField);
		else this.connectionImpl = (ConnectionField) sdpField;
	    } else if (sdpField instanceof KeyField) {
		if (currentMediaDescription != null)
		    currentMediaDescription.setKey((KeyField)sdpField);
		else keyImpl = (KeyField) sdpField;
	    } else if (sdpField instanceof EmailField) {
		emailList.addElement(sdpField);
	    } else if (sdpField instanceof PhoneField) {
		phoneList.addElement(sdpField);
	    } else if (sdpField instanceof TimeField) {
		currentTimeDescription = new TimeDescriptionImpl
		    ((TimeField)sdpField);
		timeDescriptions.addElement(currentTimeDescription);
	    } else if (sdpField instanceof RepeatField) {
		if (currentTimeDescription == null) {
		    throw new ParseException("no time specified", 0);
		} else {
		    currentTimeDescription.addRepeatField
			((RepeatField) sdpField);
		}
	    } else if (sdpField instanceof ZoneField) {
		zoneAdjustments.addElement(sdpField);
	    } else if (sdpField instanceof BandwidthField) {
		if (currentMediaDescription != null) {
		    currentMediaDescription.addBandwidthField
			((BandwidthField) sdpField);
		} else {
		    bandwidthList.addElement(sdpField);
		} 
	    } else if (sdpField instanceof AttributeField) {
		if (currentMediaDescription != null) {
		    AttributeField af = (AttributeField) sdpField;
		    String s = af.getName();
		    currentMediaDescription.addAttribute
			((AttributeField) sdpField);
		} else { 
		    attributesList.addElement(sdpField);
		}
	    } else if (sdpField instanceof MediaField) {
		currentMediaDescription = new MediaDescriptionImpl();
		mediaDescriptions.addElement(currentMediaDescription);
		currentMediaDescription.setMediaField((MediaField)sdpField);
	    }
	} catch (SdpException ex) {
	    throw new ParseException(sdpField.encode(), 0);
	}
    }
 
 
    /**
     * Public clone declaration.
     * @throws CloneNotSupportedException if clone method is not supported
     * @return Object
     */
    public Object clone() {
	Class myClass = this.getClass();
	SessionDescriptionImpl hi;
	try {
	    hi = (SessionDescriptionImpl) myClass.newInstance();
	} catch (InstantiationException ex) {
	    return null;
	} catch (IllegalAccessException ex) {
	    return null;
	}
	hi.versionImpl = (ProtoVersionField) this.versionImpl.clone();
	hi.originImpl = (OriginField) this.originImpl.clone();
	hi.sessionNameImpl = (SessionNameField) this.sessionNameImpl.clone();
	hi.infoImpl = (InformationField) this.infoImpl.clone();
	hi.uriImpl = (URIField) this.uriImpl.clone();
	hi.connectionImpl = (ConnectionField) this.connectionImpl.clone();
	hi.keyImpl = (KeyField) this.keyImpl.clone();
	hi.timeDescriptions = cloneVector(this.timeDescriptions);
 
	hi.emailList = cloneVector(this.emailList);
	hi.phoneList = cloneVector(this.phoneList);
	hi.zoneAdjustments = cloneVector(this.zoneAdjustments);
	hi.bandwidthList = cloneVector(this.bandwidthList);
	hi.attributesList = cloneVector(this.attributesList);
	hi.mediaDescriptions = cloneVector(this.mediaDescriptions);
	return hi;
    }
 
    /**
     * Returns the version of SDP in use.
     * This corresponds to the v= field of the SDP data.
     * @return the integer version (-1 if not set).
     */
    public ProtoVersionField getVersion() {
	return versionImpl;
    }
 
    /**
     * Sets the version of SDP in use.
     * This corresponds to the v= field of the SDP data.
     * @param v version - the integer version.
     * @throws SdpException if the version is null
     */
    public void setVersion(ProtoVersionField v)
	throws SdpException {
	if (v == null)
	    throw new SdpException("The parameter is null");
	if (v instanceof ProtoVersionField) {
	    versionImpl = (ProtoVersionField)v;
	} else
	    throw new SdpException
		("The parameter must be an instance of VersionField");
    }
 
    /**
     * Returns information about the originator of the session.
     * This corresponds to the o= field of the SDP data.
     * @return the originator data.
     */
    public OriginField getOrigin() {
	return originImpl;
    }
 
    /**
     * Sets information about the originator of the session.
     * This corresponds to the o= field of the SDP data.
     * @param origin origin - the originator data.
     * @throws SdpException if the origin is null
     */
    public void setOrigin(OriginField origin)
	throws SdpException {
	if (origin == null)
	    throw new SdpException("The parameter is null");
	if (origin instanceof OriginField) {
	    OriginField o = (OriginField)origin;
	    originImpl = o;
	} else
	    throw new SdpException("The parameter must be "
				   + "an instance of OriginField");
    }
 
    /**
     * Returns the name of the session.
     * This corresponds to the s= field of the SDP data.
     * @return the session name.
     */
    public SessionNameField getSessionName() {
	return sessionNameImpl;
    }
 
 
    /**
     * Sets the name of the session.
     * This corresponds to the s= field of the SDP data.
     * @param sessionName name - the session name.
     * @throws SdpException if the sessionName is null
     */
    public void setSessionName(SessionNameField sessionName)
	throws SdpException {
	if (sessionName == null) 
	    throw new SdpException("The parameter is null");
	if (sessionName instanceof SessionNameField) {
	    SessionNameField s = (SessionNameField)sessionName;
	    sessionNameImpl = s;
	} else
	    throw new SdpException("The parameter must be "
				   + "an instance of SessionNameField");
    }
 
    /**
     * Returns value of the info field (i=) of this object.
     * @return info
     */
    public InformationField getInfo() {
	return infoImpl;
    }
 
    /**
     * Sets the i= field of this object.
     * @param i s - new i= value; if null removes the field
     * @throws SdpException if the info is null
     */
    public void setInfo(InformationField i)
	throws SdpException {
	if (i == null)
	    throw new SdpException("The parameter is null");
	if (i instanceof InformationField) {
	    InformationField info = (InformationField)i;
	    infoImpl = info;
	} else 
	    throw new SdpException("The parameter must be "
				   + "an instance of InformationField");
    }
 
    /**
     * Returns a uri to the location of more details about the session.
     * This corresponds to the u=
     * field of the SDP data.
     * @return the uri.
     */
    public URIField getURI() {
	return uriImpl;
    }
 
    /**
     * Sets the uri to the location of more details about the session. This
     * corresponds to the u=
     * field of the SDP data.
     * @param uri uri - the uri.
     * @throws SdpException if the uri is null
     */
    public void setURI(URIField uri)
	throws SdpException {
	if (uri == null)
	    throw new SdpException("The parameter is null");
	if (uri instanceof URIField) {
	    URIField u = (URIField)uri;
	    uriImpl = u;
	} else
	    throw new SdpException
		("The parameter must be an instance of URIField");
    }
 
    /**
     * Returns an email address to contact for further information
     * about the session.
     * This corresponds to the e= field of the SDP data.
     * @param create boolean to set
     * @throws SdpException
     * @return the email address.
     */
    public Vector getEmails(boolean create)
	throws SdpParseException {
	if (emailList == null) {
	    if (create)
		emailList = new Vector();
	}
	return emailList;
    }
 
    /**
     * Sets a an email address to contact for further information
     * about the session.
     * This corresponds to the e= field of the SDP data.
     * @param emails email - the email address.
     * @throws SdpException if the vector is null
     */
    public void setEmails(Vector emails)
	throws SdpException {
	if (emails == null)
	    throw new SdpException("The parameter is null");
	else 
	    emailList = emails;
    }
 
    /**
     * Returns a phone number to contact for further information about
     * the session. This corresponds to the p= field of the SDP data.
     * @param create boolean to set
     * @throws SdpException
     * @return the phone number.
     */
    public Vector getPhones(boolean create)
	throws SdpException {
	if (phoneList == null) {
	    if (create)
		phoneList = new Vector();
	}
	return phoneList;
    }
 
    /**
     * Sets a phone number to contact for further information about
     * the session. This corresponds to the p= field of the SDP data.
     * @param phones phone - the phone number.
     * @throws SdpException if the vector is null
     */
    public void setPhones(Vector phones)
	throws SdpException {
	if (phones == null)
	    throw new SdpException("The parameter is null");
	else
	    phoneList = phones;
    }
 
    /**
     * Returns a TimeField indicating the start, stop, repetition and time zone
     * information of the
     * session. This corresponds to the t= field of the SDP data.
     * @param create boolean to set
     * @throws SdpException
     * @return the Time Field.
     */
    public Vector getTimeDescriptions(boolean create)
	throws SdpException {
	if (timeDescriptions == null) {
	    if (create)
		timeDescriptions = new Vector();
	}
	return timeDescriptions;
    }
 
    /**
     * Sets a TimeField indicating the start, stop, repetition and time zone
     * information of the
     * session. This corresponds to the t= field of the SDP data.
     * @param times time - the TimeField.
     * @throws SdpException if the vector is null
     */
    public void setTimeDescriptions(Vector times)
	throws SdpException {
	if (times == null)
	    throw new SdpException("The parameter is null");
	else {
	    timeDescriptions = times;
	}
    }
 
    /**
     * Returns the time zone adjustments for the Session
     * @param create boolean to set
     * @throws SdpException
     * @return a Hashtable containing the zone adjustments, where the key is the
     * Adjusted Time
     * Zone and the value is the offset.
     */
    public Vector getZoneAdjustments(boolean create)
	throws SdpException {
	if (zoneAdjustments == null) {
	    if (create)
		zoneAdjustments = new Vector();
	}
	return zoneAdjustments;
    }
 
    /**
     * Sets the time zone adjustment for the TimeField.
     * @param zoneAdjustments zoneAdjustments - a Hashtable containing the zone
     * adjustments, where the key
     * is the Adjusted Time Zone and the value is the offset.
     * @throws SdpException if the vector is null
     */
    public void setZoneAdjustments(Vector zoneAdjustments)
	throws SdpException {
	if (zoneAdjustments == null)
	    throw new SdpException("The parameter is null");
	else this.zoneAdjustments = zoneAdjustments;
    }
 
    /**
     * Returns the connection information associated with this object. This may
     * be null for SessionDescriptions if all Media objects have a connection
     * object and may be null
     * for Media objects if the corresponding session connection is non-null.
     * @return connection
     */
    public ConnectionField getConnection() {
	return connectionImpl;
    }
 
    /**
     * Sets the connection data for this entity.
     * @param conn to set
     * @throws SdpException if the parameter is null
     */
    public void setConnection(ConnectionField conn)
	throws SdpException {
	if (conn == null)
	    throw new SdpException("The parameter is null");
	if (conn instanceof ConnectionField) {
	    ConnectionField c = (ConnectionField)conn;
	    connectionImpl = c;
	} else
	    throw new
		SdpException("Bad implementation class ConnectionField");
    }
 
    /**
     * Returns the Bandwidth of the specified type.
     * @param create type - type of the Bandwidth to return
     * @return the Bandwidth or null if undefined
     */
    public Vector getBandwidths(boolean create) {
	if (bandwidthList == null) {
	    if (create)
		bandwidthList = new Vector();
	}
	return bandwidthList;
    }
 
    /**
     * Sets the value of the Bandwidth with the specified type.
     * @param bandwidthList to set
     * @throws SdpException if the vector is null
     */
    public void setBandwidths(Vector bandwidthList)
	throws SdpException {
	if (bandwidthList == null)
	    throw new SdpException("The parameter is null");
	else
	    this.bandwidthList = bandwidthList;
    }
 
    /**
     * Returns the integer value of the specified bandwidth name.
     * @param name name - the name of the bandwidth type
     * @throws SdpParseException
     * @return the value of the named bandwidth
     */
    public int getBandwidth(String name)
	throws SdpParseException {
	if (name == null)
	    return -1;
	else if (bandwidthList == null)
	    return -1;
	for (int i = 0; i < bandwidthList.size(); i++) {
	    Object o = bandwidthList.elementAt(i);
	    if (o instanceof BandwidthField) {
		BandwidthField b = (BandwidthField)o;
		String type = b.getType();
		if (type != null) {
		    if (name.equals(type)) {
			return b.getValue();
		    }
		}
	    }
	}
	return -1;
    }
 
    /**
     * Sets the value of the specified bandwidth type.
     * @param name name - the name of the bandwidth type.
     * @param value value - the value of the named bandwidth type.
     * @throws SdpException if the name is null
     */
    public void setBandwidth(String name,
			     int value)
	throws SdpException {
	if (name == null)
	    throw new SdpException("The parameter is null");
	else
	    if (bandwidthList != null) {
		for (int i = 0; i < bandwidthList.size(); i++) {
		    Object o = bandwidthList.elementAt(i);
		    if (o instanceof BandwidthField) {
			BandwidthField b = (BandwidthField)o;
			String type = b.getType();
			if (type != null) {
			    if (name.equals(type)) {
				b.setValue(value);
			    }
			}
		    }
		}
	    }
    }
 
    /**
     * Removes the specified bandwidth type.
     * @param name name - the name of the bandwidth type
     */
    public void removeBandwidth(String name) {
	if (name != null)
	    if (bandwidthList != null) {
		for (int i = 0; i < bandwidthList.size(); i++) {
		    Object o = bandwidthList.elementAt(i);
		    if (o instanceof BandwidthField) {
			BandwidthField b = (BandwidthField)o;
			try {
			    String type = b.getType();
			    if (type != null) {
				if (name.equals(type)) {
				    bandwidthList.removeElement(b);
				}
			    }
			}
			catch (SdpParseException e) {}
		    }
		}
	    }
    }
 
    /**
     * Returns the key data.
     * @return key
     */
    public KeyField getKey() {
	return keyImpl;
    }
 
    /**
     * Sets encryption key information.
     * This consists of a method and an encryption key included inline.
     * @param key key - the encryption key data; depending on method may be null
     * @throws SdpException if the parameter is null
     */
    public void setKey(KeyField key)
	throws SdpException {
	if (key == null)
	    throw new SdpException("The parameter is null");
	if (key instanceof KeyField) {
	    KeyField k = (KeyField)key;
	    keyImpl = k;
	} else 
	    throw new
		SdpException("The parameter must be an instance of KeyField");
    }
 
    /**
     * Returns the value of the specified attribute.
     * @param name name - the name of the attribute
     * @throws SdpParseException
     * @return the value of the named attribute
     */
    public String getAttribute(String name)
	throws SdpParseException {
	if (name == null)
	    return null;
	else if (attributesList == null)
	    return null;
	for (int i = 0; i < attributesList.size(); i++) {
	    Object o = attributesList.elementAt(i);
	    if (o instanceof AttributeField) {
		AttributeField a = (AttributeField)o;
		String n = a.getName();
		if (n != null) {
		    if (name.equals(n)) {
			return a.getValue();
		    }
		}
	    }
	}
	return null;
    }
 
    /**
     * Returns the set of attributes for this Description as a Vector
     * of Attribute objects in the order they were parsed.
     * @param create create - specifies whether to return null or a new empty
     * Vector in case no
     * attributes exists for this Description
     * @return attributes for this Description
     */
    public Vector getAttributes(boolean create) {
	if (attributesList == null) {
	    if (create)
		attributesList = new Vector();
	}
	return attributesList;
    }
 
    /**
     * Removes the attribute specified by the value parameter.
     * @param name name - the name of the attribute
     */
    public void removeAttribute(String name) {
	if (name != null)
	    if (attributesList != null) {
		for (int i = 0; i < attributesList.size(); i++) {
		    Object o = attributesList.elementAt(i);
		    if (o instanceof AttributeField) {
			AttributeField a = (AttributeField)o;
			try {
			    String n = a.getName();
			    if (n != null) {
				if (name.equals(n)) {
				    attributesList.removeElement(a);
				}
			    }
			}
			catch (SdpParseException e) {}
 
		    }
		}
	    }
    }
 
    /**
     * Sets the value of the specified attribute.
     * @param name name - the name of the attribute.
     * @param value value - the value of the named attribute.
     * @throws SdpException if the name or the value is null
     */
    public void setAttribute(String name,
			     String value)
	throws SdpException {
	if (name == null || value == null)
	    throw new SdpException("The parameter is null");
	else
	    if (attributesList != null) {
		for (int i = 0; i < attributesList.size(); i++) {
		    Object o = attributesList.elementAt(i);
		    if (o instanceof AttributeField) {
			AttributeField a = (AttributeField)o;
			String n = a.getName();
			if (n != null) {
			    if (name.equals(n)) {
				a.setValue(value);
			    }
			}
		    }
		}
	    }
    }
 
    /**
     * Adds the specified Attribute to this Description object.
     * @param attributes the attributes to add
     * @throws SdpException if the vector is null
     */
    public void setAttributes(Vector attributes)
	throws SdpException {
	if (attributes == null)
	    throw new SdpException("The parameter is null");
	else attributesList = attributes;
    }
 
    /**
     * Adds a MediaDescription to the session description.
     * These correspond to the m=
     * fields of the SDP data.
     * @param create boolean to set
     * @throws SdpException
     * @return media - the field to add.
     */
    public Vector getMediaDescriptions(boolean create)
	throws SdpException {
	if (mediaDescriptions == null) {
	    if (create)
		mediaDescriptions = new Vector();
	}
	return mediaDescriptions;
    }
 
    /**
     * Removes all MediaDescriptions from the session description.
     * @param mediaDescriptions to set
     * @throws SdpException if the parameter is null
     */
    public void setMediaDescriptions(Vector mediaDescriptions)
	throws SdpException {
	if (mediaDescriptions == null)
	    throw new SdpException("The parameter is null");
	else this.mediaDescriptions = mediaDescriptions;
    }

    /** 
     * Returns an encoded string of vector contents.
     * @param vector the objects to process
     * @return encode string of vector contents
     */ 
    private String encodeVector(Vector vector) {
	StringBuffer encBuff = new StringBuffer();
 
	for (int i = 0; i < vector.size(); i++)
	    encBuff.append(vector.elementAt(i));
 
	return encBuff.toString();
    }
 

    /**
     * Utility method for cloning a Vector 
     * Acknowledgement - this code was contributed by Sverker Abrahamsson.
     * @param v the vector to be copied
     * @return the cloned vector
     */
    private Vector cloneVector(Vector v) {
	Vector clone = new Vector(v.capacity());

	int size = v.size();
	for (int i = 0; i < size; i++) {
	    clone.setElementAt(v.elementAt(i), i);
	}
	return clone;
    }
 
    /**
     * Returns the canonical string representation of the
     * current SessionDescrption. Acknowledgement - this code
     *
     * @return Returns the canonical string representation
     * of the current SessionDescrption.
     */
    public String toString() {
	StringBuffer encBuff = new StringBuffer();
 
	// Encode single attributes
	encBuff.append(getVersion() == null ? "" : getVersion().toString());
	encBuff.append(getOrigin() == null ? "" : getOrigin().toString());
	encBuff.append(getSessionName() == null ? "" : getSessionName().toString
		       ());
	encBuff.append(getInfo() == null ? "" : getInfo().toString());
 
	// Encode attribute vectors
	try {
	    encBuff.append(getURI() == null ? "" : getURI().toString());
	    encBuff.append(encodeVector(getEmails(true)));
	    encBuff.append(encodeVector(getPhones(true)));
	    encBuff.append(getConnection() == null ? "" :
			   getConnection().toString
			   ());
	    encBuff.append(encodeVector(getBandwidths(true)));
	    encBuff.append(encodeVector(getTimeDescriptions(true)));
	    encBuff.append(encodeVector(getZoneAdjustments(true)));
	    encBuff.append(getKey() == null ? "" : getKey().toString());
	    encBuff.append(encodeVector(getAttributes(true)));
	    encBuff.append(encodeVector(getMediaDescriptions(true)));
	    // adds the final crlf
	}
	catch (SdpException exc) {
	    // add exception handling if necessary
	}
	return encBuff.toString();
    }
 
}