001 package com.croftsoft.core.net.http.msg;
002
003 import java.io.*;
004 import java.net.*;
005
006 import com.croftsoft.core.io.Encoder;
007 import com.croftsoft.core.io.Parser;
008 import com.croftsoft.core.lang.NullArgumentException;
009 import com.croftsoft.core.lang.lifecycle.Lifecycle;
010 import com.croftsoft.core.net.http.HttpLib;
011 import com.croftsoft.core.util.loop.FixedDelayLoopGovernor;
012 import com.croftsoft.core.util.loop.Loopable;
013 import com.croftsoft.core.util.loop.Looper;
014 import com.croftsoft.core.util.queue.Queue;
015
016 /*********************************************************************
017 * Pushes outgoing messages to the server using HTTP.
018 *
019 * @author
020 * <a href="http://www.CroftSoft.com/">David Wallace Croft</a>
021 * @version
022 * 2003-05-26
023 * @since
024 * 2000-04-23
025 *********************************************************************/
026
027 public final class HttpMessagePusher
028 implements Lifecycle
029 //////////////////////////////////////////////////////////////////////
030 //////////////////////////////////////////////////////////////////////
031 {
032
033 public static final long MINIMUM_DELAY = 100;
034
035 public static final String THREAD_NAME = "HttpMessagePusher";
036
037 public static final int THREAD_PRIORITY = Thread.MIN_PRIORITY;
038
039 public static final boolean USE_DAEMON_THREAD = true;
040
041 //
042
043 private final Queue outgoingQueue;
044
045 private final Queue incomingQueue;
046
047 private final Encoder encoder;
048
049 private final Looper looper;
050
051 private final URL url;
052
053 private final String userAgent;
054
055 private final String contentType;
056
057 private final Parser parser;
058
059 //////////////////////////////////////////////////////////////////////
060 //////////////////////////////////////////////////////////////////////
061
062 public HttpMessagePusher (
063 Queue outgoingQueue,
064 Queue incomingQueue,
065 URL url,
066 String userAgent,
067 String contentType,
068 Encoder encoder,
069 Parser parser )
070 //////////////////////////////////////////////////////////////////////
071 {
072 NullArgumentException.check ( this.outgoingQueue = outgoingQueue );
073
074 NullArgumentException.check ( this.incomingQueue = incomingQueue );
075
076 NullArgumentException.check ( this.userAgent = userAgent );
077
078 NullArgumentException.check ( this.contentType = contentType );
079
080 NullArgumentException.check ( this.encoder = encoder );
081
082 NullArgumentException.check ( this.parser = parser );
083
084 NullArgumentException.check ( this.url = url );
085
086 looper = new Looper (
087 new Loopable ( )
088 {
089 public boolean loop ( )
090 {
091 return HttpMessagePusher.this.loop ( );
092 }
093 },
094 new FixedDelayLoopGovernor ( MINIMUM_DELAY, 0 ),
095 null,
096 THREAD_NAME,
097 THREAD_PRIORITY,
098 USE_DAEMON_THREAD );
099 }
100
101 //////////////////////////////////////////////////////////////////////
102 //////////////////////////////////////////////////////////////////////
103
104 public void init ( )
105 //////////////////////////////////////////////////////////////////////
106 {
107 looper.init ( );
108 }
109
110 public void start ( )
111 //////////////////////////////////////////////////////////////////////
112 {
113 looper.start ( );
114 }
115
116 public void stop ( )
117 //////////////////////////////////////////////////////////////////////
118 {
119 looper.stop ( );
120 }
121
122 public void destroy ( )
123 //////////////////////////////////////////////////////////////////////
124 {
125 looper.destroy ( );
126 }
127
128 //////////////////////////////////////////////////////////////////////
129 // private methods
130 //////////////////////////////////////////////////////////////////////
131
132 private boolean loop ( )
133 //////////////////////////////////////////////////////////////////////
134 {
135 try
136 {
137 Object request = outgoingQueue.pull ( );
138
139 Object response = HttpLib.post (
140 url,
141 encoder.encode ( request ),
142 userAgent,
143 contentType,
144 parser );
145
146 if ( response != null )
147 {
148 incomingQueue.append ( response );
149 }
150 }
151 catch ( InterruptedException ex )
152 {
153 }
154 catch ( Exception ex )
155 {
156 ex.printStackTrace ( );
157
158 return false;
159 }
160
161 return true;
162 }
163
164 //////////////////////////////////////////////////////////////////////
165 //////////////////////////////////////////////////////////////////////
166 }