001: /*
002: * Portions Copyright 2000-2007 Sun Microsystems, Inc. All Rights
003: * Reserved. Use is subject to license terms.
004: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
005: *
006: * This program is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU General Public License version
008: * 2 only, as published by the Free Software Foundation.
009: *
010: * This program is distributed in the hope that it will be useful, but
011: * WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * General Public License version 2 for more details (a copy is
014: * included at /legal/license.txt).
015: *
016: * You should have received a copy of the GNU General Public License
017: * version 2 along with this work; if not, write to the Free Software
018: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
019: * 02110-1301 USA
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
022: * Clara, CA 95054 or visit www.sun.com if you need additional
023: * information or have any questions.
024: */
025: package gov.nist.siplite.stack;
026:
027: import java.io.IOException;
028: import gov.nist.core.*;
029: import gov.nist.siplite.header.*;
030: import gov.nist.siplite.*;
031:
032: /**
033: * This is the Stack abstraction for the active object that waits
034: * for messages to appear on the wire and processes these messages
035: * by calling the MessageFactory interface to create a ServerRequest
036: * or ServerResponse object. The main job of the message processor is
037: * to instantiate message channels for the given transport.
038: *
039: * @version JAIN-SIP-1.1
040: * <a href="{@docRoot}/uncopyright.html">This code is in the public domain.</a>
041: *
042: */
043:
044: public abstract class MessageProcessor {
045: /** Currrent listening point. */
046: private ListeningPoint listeningPoint;
047: /** Flag indicating exit in progress. */
048: boolean exitFlag;
049: /** Number of message processor users. */
050: private int useCount;
051:
052: /**
053: * Gets the transport string.
054: * @return A string that indicates the transport.
055: * (i.e. "tcp" or "udp")
056: */
057: public abstract String getTransport();
058:
059: /**
060: * Gets the port identifier.
061: * @return the port for this message processor. This is where you
062: * receive messages.
063: */
064: public abstract int getPort();
065:
066: /**
067: * Gets the SIP Stack.
068: * @return the sip stack.
069: */
070: public abstract SIPMessageStack getSIPStack();
071:
072: /**
073: * Creates a message channel for the specified host/port.
074: * @param targetHostPort destination for logged message
075: * @return New MessageChannel for this processor.
076: */
077: public abstract MessageChannel createMessageChannel(
078: HostPort targetHostPort) throws IOException;
079:
080: /**
081: * Starts our thread.
082: */
083: public abstract void start() throws IOException;
084:
085: /**
086: * Stops the processor thread.
087: */
088: public abstract void stop();
089:
090: /**
091: * Flags whether this processor is secure or not.
092: * @return true if this processor is secure
093: */
094: public abstract boolean isSecure();
095:
096: /**
097: * Return true if there are pending messages to be processed
098: * (which prevents the message channel from being closed).
099: * @return true if message channel is in use
100: */
101: synchronized public boolean inUse() {
102: return (useCount != 0);
103: }
104:
105: /**
106: * Get the Via header to assign for this message processor.
107: * @return the via header
108: */
109: public ViaHeader getViaHeader() {
110:
111: ViaHeader via = new ViaHeader();
112: Host host = new Host();
113: host.setHostname(this .getSIPStack().getHostAddress());
114: via.setHost(host);
115: via.setPort(this .getPort());
116: via.setTransport(this .getTransport());
117: return via;
118: }
119:
120: /**
121: * Returns the exitin progres flag.
122: * @return true if exit is in progress
123: */
124: public boolean toExit() {
125: return exitFlag;
126: }
127:
128: /**
129: * Sets the listening point for message processor.
130: * @param lp the new listening point
131: */
132: public void setListeningPoint(ListeningPoint lp) {
133: listeningPoint = lp;
134: }
135:
136: /**
137: * Gets the current listening point.
138: * @return the current listening point
139: */
140: public ListeningPoint getListeningPoint() {
141: return listeningPoint;
142: }
143:
144: /**
145: * Increments the count of channels.
146: */
147: synchronized void incrementUseCount() {
148: useCount++;
149: }
150:
151: /**
152: * Clears the count of channels.
153: */
154: synchronized void clearUseCount() {
155: useCount = 0;
156: }
157:
158: /**
159: * Decrements the count of channels.
160: */
161: synchronized void decrementUseCount() {
162: if (0 != useCount) {
163: useCount--;
164: }
165: }
166: }
|