KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > walend > somnifugi > SomniTopicSession


1 package net.walend.somnifugi;
2
3 import javax.naming.Context JavaDoc;
4 import javax.naming.NamingException JavaDoc;
5
6 import javax.jms.TopicSession JavaDoc;
7 import javax.jms.Topic JavaDoc;
8 import javax.jms.Message JavaDoc;
9 import javax.jms.JMSException JavaDoc;
10 import javax.jms.TopicSubscriber JavaDoc;
11 import javax.jms.TopicPublisher JavaDoc;
12 import javax.jms.TemporaryTopic JavaDoc;
13 import javax.jms.InvalidDestinationException JavaDoc;
14 import javax.jms.Destination JavaDoc;
15 import javax.jms.MessageProducer JavaDoc;
16 import javax.jms.MessageConsumer JavaDoc;
17 import javax.jms.Queue JavaDoc;
18 import javax.jms.QueueBrowser JavaDoc;
19 import javax.jms.TemporaryQueue JavaDoc;
20
21 import net.walend.somnifugi.channel.Takable;
22
23 /**
24 A Session for Topics. Use this to create TopicPublishers, TopicSubscribers, and Messages.
25
26 @author <a HREF="http://walend.net">David Walend</a> <a HREF="mailto:david@walend.net">david@walend.net</a>
27 @author @pwang@ added support for client acknowledgement.
28  */

29
30 public class SomniTopicSession
31     extends SomniSession
32     implements TopicSession JavaDoc
33 {
34     private int tempCount=0;
35
36     protected SomniTopicSession(String JavaDoc name,SomniExceptionListener exceptionLisetener,boolean started,Context JavaDoc context,int acknowledgeMode,String JavaDoc connectionClientID)
37     {
38         super(name,exceptionLisetener,started,context,acknowledgeMode,connectionClientID);
39     }
40
41     private TopicSubscriber JavaDoc createSubscriber(Topic JavaDoc topic,String JavaDoc subscriberName,boolean durable,SomniMessageSelector messageSelector,boolean noLocal)
42         throws JMSException JavaDoc
43     {
44         SomniTopic atopic = (SomniTopic)topic;
45
46         synchronized(guard)
47         {
48             checkClosed();
49
50             Takable<Message JavaDoc> takable = atopic.addSubscriber(subscriberName,durable,messageSelector,noLocal,getConnectionClientID());
51
52             SomniTopicSubscriber result = new SomniTopicSubscriber(atopic,takable,subscriberName,getExceptionListener(),this);
53             addConsumer(result);
54
55             return result;
56         }
57     }
58     
59     /**
60 A SomnifugiJMS-only method.
61 <P>
62 Creates a nondurable subscriber to the specified topic, using a
63 message selector or specifying whether messages published by its
64 own connection should be delivered to it.
65
66 <P>A client uses a <CODE>TopicSubscriber</CODE> object to receive
67 messages that have been published to a topic.
68  
69 <P>Regular <CODE>TopicSubscriber</CODE> objects are not durable.
70 They receive only messages that are published while they are active.
71
72 <P>Messages filtered out by a subscriber's message selector will
73 never be delivered to the subscriber. From the subscriber's
74 perspective, they do not exist.
75
76 <P>In some cases, a connection may both publish and subscribe to a
77 topic. The subscriber <CODE>NoLocal</CODE> attribute allows a subscriber
78 to inhibit the delivery of messages published by its own connection.
79 The default value for this attribute is false.
80
81 @param topic the <CODE>Topic</CODE> to subscribe to
82 @param messageSelector only Messages that this MessageSelector matches will be delivered.
83 A value of null or an empty string indicates that there is no message selector
84 for the message consumer.
85
86 @exception JMSException if the session fails to create a subscriber
87                         due to some internal error.
88 @exception InvalidDestinationException if an invalid topic is specified.
89 @exception InvalidSelectorException if the message selector is invalid.
90       */

91     public TopicSubscriber JavaDoc createSubscriber(Topic JavaDoc topic,SomniMessageSelector messageSelector)
92         throws JMSException JavaDoc
93     {
94         String JavaDoc subscriberName = createConsumerName(topic.getTopicName(),"Subscriber");
95
96         return createSubscriber(topic,subscriberName,false,messageSelector,false);
97     }
98
99     //TopicSession methods
100

101     /** Creates a topic identity given a <CODE>Topic</CODE> name.
102       *
103 <P>This facility is provided for the rare cases where clients need to
104 dynamically manipulate topic identity. This allows the creation of a
105 topic identity with a provider-specific name. Clients that depend
106 on this ability are not portable.
107       *
108 <P>Note that this method is not for creating the physical topic.
109 The physical creation of topics is an administrative task and is not
110 to be initiated by the JMS API. The one exception is the
111 creation of temporary topics, which is accomplished with the
112 <CODE>createTemporaryTopic</CODE> method.
113  
114 @param topicName the name of this <CODE>Topic</CODE>
115       *
116 @return a <CODE>Topic</CODE> with the given name
117       *
118 @exception JMSException if the session fails to create a topic
119                         due to some internal error.
120       */

121     public Topic JavaDoc createTopic(String JavaDoc topicName)
122         throws JMSException JavaDoc
123     {
124         return SomniTopicCache.IT.getTopic(topicName,getContext());
125     }
126
127     /** Creates a nondurable subscriber to the specified topic.
128  
129 <P>A client uses a <CODE>TopicSubscriber</CODE> object to receive
130 messages that have been published to a topic.
131       *
132 <P>Regular <CODE>TopicSubscriber</CODE> objects are not durable.
133 They receive only messages that are published while they are active.
134       *
135 <P>In some cases, a connection may both publish and subscribe to a
136 topic. The subscriber <CODE>NoLocal</CODE> attribute allows a subscriber
137 to inhibit the delivery of messages published by its own connection.
138 The default value for this attribute is false.
139       *
140 @param topic the <CODE>Topic</CODE> to subscribe to
141  
142 @exception JMSException if the session fails to create a subscriber
143                         due to some internal error.
144 @exception InvalidDestinationException if an invalid topic is specified.
145       */

146     public TopicSubscriber JavaDoc createSubscriber(Topic JavaDoc topic)
147         throws JMSException JavaDoc
148     {
149         String JavaDoc subscriberName = createConsumerName(topic.getTopicName(),"Subscriber");
150
151         return createSubscriber(topic,subscriberName,false,null,false);
152     }
153
154     /** Creates a nondurable subscriber to the specified topic, using a
155 message selector or specifying whether messages published by its
156 own connection should be delivered to it.
157       *
158 <P>A client uses a <CODE>TopicSubscriber</CODE> object to receive
159 messages that have been published to a topic.
160  
161 <P>Regular <CODE>TopicSubscriber</CODE> objects are not durable.
162 They receive only messages that are published while they are active.
163       *
164 <P>Messages filtered out by a subscriber's message selector will
165 never be delivered to the subscriber. From the subscriber's
166 perspective, they do not exist.
167       *
168 <P>In some cases, a connection may both publish and subscribe to a
169 topic. The subscriber <CODE>NoLocal</CODE> attribute allows a subscriber
170 to inhibit the delivery of messages published by its own connection.
171 The default value for this attribute is false.
172       *
173 @param topic the <CODE>Topic</CODE> to subscribe to
174 @param messageSelector only messages with properties matching the
175 message selector expression are delivered. A value of null or
176 an empty string indicates that there is no message selector
177 for the message consumer.
178 @param noLocal if set, inhibits the delivery of messages published
179 by its own connection
180
181 @exception JMSException if the session fails to create a subscriber
182                         due to some internal error.
183 @exception InvalidDestinationException if an invalid topic is specified.
184 @exception InvalidSelectorException if the message selector is invalid.
185 @exception UnsupportedOperationException if the messageSelector is something other than null or ""
186       */

187     public TopicSubscriber JavaDoc createSubscriber(Topic JavaDoc topic, String JavaDoc messageSelector,boolean noLocal)
188         throws JMSException JavaDoc
189     {
190         String JavaDoc subscriberName = createConsumerName(topic.getTopicName(),"Subscriber");
191         SomniMessageSelector ms = null;
192         if((messageSelector != null)&&(!("".equals(messageSelector))))
193         {
194             ms = new SQL92MessageSelector(messageSelector);
195         }
196
197         return createSubscriber(topic,subscriberName,false,ms,noLocal);
198     }
199
200     /** Creates a durable subscriber to the specified topic.
201  
202 <P>If a client needs to receive all the messages published on a
203 topic, including the ones published while the subscriber is inactive,
204 it uses a durable <CODE>TopicSubscriber</CODE>. The JMS provider
205 retains a record of this
206 durable subscription and insures that all messages from the topic's
207 publishers are retained until they are acknowledged by this
208 durable subscriber or they have expired.
209       *
210 <P>Sessions with durable subscribers must always provide the same
211 client identifier. In addition, each client must specify a name that
212 uniquely identifies (within client identifier) each durable
213 subscription it creates. Only one session at a time can have a
214 <CODE>TopicSubscriber</CODE> for a particular durable subscription.
215       *
216 <P>A client can change an existing durable subscription by creating
217 a durable <CODE>TopicSubscriber</CODE> with the same name and a new
218 topic and/or
219 message selector. Changing a durable subscriber is equivalent to
220 unsubscribing (deleting) the old one and creating a new one.
221       *
222 <P>In some cases, a connection may both publish and subscribe to a
223 topic. The subscriber <CODE>NoLocal</CODE> attribute allows a subscriber
224 to inhibit the delivery of messages published by its own connection.
225 The default value for this attribute is false.
226       *
227 @param topic the non-temporary <CODE>Topic</CODE> to subscribe to
228 @param name the name used to identify this subscription
229  
230 @exception JMSException if the session fails to create a subscriber
231                         due to some internal error.
232 @exception InvalidDestinationException if an invalid topic is specified.
233       */

234     public TopicSubscriber JavaDoc createDurableSubscriber(Topic JavaDoc topic,String JavaDoc name)
235         throws JMSException JavaDoc
236     {
237         return createSubscriber(topic,name,true,null,false);
238     }
239
240     /** Creates a durable subscriber to the specified topic, using a
241 message selector or specifying whether messages published by its
242 own connection should be delivered to it.
243  
244 <P>If a client needs to receive all the messages published on a
245 topic, including the ones published while the subscriber is inactive,
246 it uses a durable <CODE>TopicSubscriber</CODE>. The JMS provider
247 retains a record of this
248 durable subscription and insures that all messages from the topic's
249 publishers are retained until they are acknowledged by this
250 durable subscriber or they have expired.
251       *
252 <P>Sessions with durable subscribers must always provide the same
253 client identifier. In addition, each client must specify a name which
254 uniquely identifies (within client identifier) each durable
255 subscription it creates. Only one session at a time can have a
256 <CODE>TopicSubscriber</CODE> for a particular durable subscription.
257 An inactive durable subscriber is one that exists but
258 does not currently have a message consumer associated with it.
259       *
260 <P>A client can change an existing durable subscription by creating
261 a durable <CODE>TopicSubscriber</CODE> with the same name and a new
262 topic and/or
263 message selector. Changing a durable subscriber is equivalent to
264 unsubscribing (deleting) the old one and creating a new one.
265       *
266 @param topic the non-temporary <CODE>Topic</CODE> to subscribe to
267 @param name the name used to identify this subscription
268 @param messageSelector only messages with properties matching the
269 message selector expression are delivered. A value of null or
270 an empty string indicates that there is no message selector
271 for the message consumer.
272 @param noLocal if set, inhibits the delivery of messages published
273 by its own connection
274  
275 @exception JMSException if the session fails to create a subscriber
276                         due to some internal error.
277 @exception InvalidDestinationException if an invalid topic is specified.
278 @exception InvalidSelectorException if the message selector is invalid.
279 @exception UnsupportedOperationException if the messageSelector is something other than null or ""
280       */

281     public TopicSubscriber JavaDoc createDurableSubscriber(Topic JavaDoc topic,String JavaDoc name,String JavaDoc messageSelector,boolean noLocal)
282         throws JMSException JavaDoc
283     {
284         SomniMessageSelector ms = null;
285         if((messageSelector != null)&&(!("".equals(messageSelector))))
286         {
287             ms = new SQL92MessageSelector(messageSelector);
288         }
289         return createSubscriber(topic,name,true,ms,noLocal);
290     }
291
292     /** Creates a publisher for the specified topic.
293       *
294 <P>A client uses a <CODE>TopicPublisher</CODE> object to publish
295 messages on a topic.
296 Each time a client creates a <CODE>TopicPublisher</CODE> on a topic, it
297 defines a
298 new sequence of messages that have no ordering relationship with the
299 messages it has previously sent.
300       *
301 @param topic the <CODE>Topic</CODE> to publish to, or null if this is an
302 unidentified producer
303       *
304 @exception JMSException if the session fails to create a publisher
305                         due to some internal error.
306 @exception InvalidDestinationException if an invalid topic is specified.
307      */

308     public TopicPublisher JavaDoc createPublisher(Topic JavaDoc topic)
309         throws JMSException JavaDoc
310     {
311         synchronized(guard)
312             {
313                 checkClosed();
314                 SomniTopicPublisher result = new SomniTopicPublisher((SomniTopic)topic,createProducerName(topic.getTopicName(),"Publisher"),getConnectionClientID());
315                 addProducer(result);
316                 return result;
317             }
318     }
319
320     /** Creates a <CODE>TemporaryTopic</CODE> object. Its lifetime will be that
321 of the <CODE>TopicConnection</CODE> unless it is deleted earlier.
322       *
323 @return a temporary topic identity
324       *
325 @exception JMSException if the session fails to create a temporary
326                         topic due to some internal error.
327       */

328     public TemporaryTopic JavaDoc createTemporaryTopic()
329         throws JMSException JavaDoc
330     {
331         try
332             {
333                 String JavaDoc tempName;
334                 synchronized(guard)
335                     {
336                         tempName = getName()+":temp"+tempCount;
337                         tempCount++;
338                     }
339                 SomniTemporaryTopic topic = new SomniTemporaryTopic(tempName,ChannelFactoryCache.IT.getChannelFactory(tempName,getContext(),false),ChannelFactoryCache.IT.getFanOutFactory(tempName,getContext()),getContext());
340                 SomniTopicCache.IT.putTemporaryTopic(topic);
341
342                 return topic;
343             }
344         catch(NamingException JavaDoc ne)
345             {
346                 throw new SomniNamingException(ne);
347             }
348     }
349
350     /** Unsubscribes a durable subscription that has been created by a client.
351  
352 <P>This method deletes the state being maintained on behalf of the
353 subscriber by its provider.
354       *
355 <P>It is erroneous for a client to delete a durable subscription
356 while there is an active <CODE>TopicSubscriber</CODE> for the
357 subscription, or while a consumed message is part of a pending
358 transaction or has not been acknowledged in the session.
359       *
360 @param name the name used to identify this subscription
361  
362 @exception JMSException if the session fails to unsubscribe to the
363                         durable subscription due to some internal error.
364 @exception InvalidDestinationException if an invalid subscription name
365                                        is specified.
366       */

367     public void unsubscribe(String JavaDoc name)
368         throws JMSException JavaDoc
369     {
370         SomniTopicCache.IT.endDurableSubscription(name);
371         SomniLogger.IT.finer(getName()+" unsubscribed from "+name);
372     }
373
374     //new Session methods from jms 1.1
375

376     /** Creates a <CODE>MessageProducer</CODE> to send messages to the specified
377       * destination.
378       *
379       * <P>A client uses a <CODE>MessageProducer</CODE> object to send
380       * messages to a destination. Since <CODE>Queue</CODE> and <CODE>Topic</CODE>
381       * both inherit from <CODE>Destination</CODE>, they can be used in
382       * the destination parameter to create a <CODE>MessageProducer</CODE> object.
383       *
384       * @param destination the <CODE>Destination</CODE> to send to,
385       * or null if this is a producer which does not have a specified
386       * destination.
387       *
388       * @exception JMSException if the session fails to create a MessageProducer
389       * due to some internal error.
390       * @exception InvalidDestinationException if an invalid destination
391       * is specified.
392       *
393       * @since 1.1
394       *
395      */

396
397     public MessageProducer JavaDoc createProducer(Destination JavaDoc destination) throws JMSException JavaDoc
398     {
399         try
400             {
401                 return createPublisher((Topic JavaDoc)destination);
402             }
403         catch(ClassCastException JavaDoc cce)
404             {
405                 throw new InvalidDestinationException JavaDoc("destination must be a Topic, not a "+destination.getClass().getName(),cce.getMessage());
406             }
407     }
408     
409        /** Creates a <CODE>MessageConsumer</CODE> for the specified destination.
410       * Since <CODE>Queue</CODE> and <CODE>Topic</CODE>
411       * both inherit from <CODE>Destination</CODE>, they can be used in
412       * the destination parameter to create a <CODE>MessageConsumer</CODE>.
413       *
414       * @param destination the <CODE>Destination</CODE> to access.
415       *
416       * @exception JMSException if the session fails to create a consumer
417       * due to some internal error.
418       * @exception InvalidDestinationException if an invalid destination
419       * is specified.
420       *
421       * @since 1.1
422       */

423
424     public MessageConsumer JavaDoc createConsumer(Destination JavaDoc destination) throws JMSException JavaDoc
425     {
426         try
427             {
428                 return createSubscriber((Topic JavaDoc)destination);
429             }
430         catch(ClassCastException JavaDoc cce)
431             {
432                 throw new InvalidDestinationException JavaDoc("destination must be a Topic, not a "+destination.getClass().getName(),cce.getMessage());
433             }
434     }
435
436        /** Creates a <CODE>MessageConsumer</CODE> for the specified destination,
437       * using a message selector.
438       * Since <CODE>Queue</CODE> and <CODE>Topic</CODE>
439       * both inherit from <CODE>Destination</CODE>, they can be used in
440       * the destination parameter to create a <CODE>MessageConsumer</CODE>.
441       *
442       * <P>A client uses a <CODE>MessageConsumer</CODE> object to receive
443       * messages that have been sent to a destination.
444       *
445       *
446       * @param destination the <CODE>Destination</CODE> to access
447       * @param messageSelector only messages with properties matching the
448       * message selector expression are delivered. A value of null or
449       * an empty string indicates that there is no message selector
450       * for the message consumer.
451       *
452       *
453       * @exception JMSException if the session fails to create a MessageConsumer
454       * due to some internal error.
455       * @exception InvalidDestinationException if an invalid destination
456        * is specified.
457      
458       * @exception InvalidSelectorException if the message selector is invalid.
459       *
460       * @since 1.1
461       */

462     public MessageConsumer JavaDoc createConsumer(Destination JavaDoc destination, String JavaDoc messageSelector)
463         throws JMSException JavaDoc
464     {
465         try
466             {
467                 //todo creatSubscriber method with just a topic and messageSelector
468
return createSubscriber((Topic JavaDoc)destination,messageSelector,false);
469             }
470         catch(ClassCastException JavaDoc cce)
471             {
472                 throw new InvalidDestinationException JavaDoc("destination must be a Topic, not a "+destination.getClass().getName(),cce.getMessage());
473             }
474     }
475     
476     
477      /** Creates <CODE>MessageConsumer</CODE> for the specified destination, using a
478       * message selector. This method can specify whether messages published by
479       * its own connection should be delivered to it, if the destination is a
480       * topic.
481       *<P> Since <CODE>Queue</CODE> and <CODE>Topic</CODE>
482       * both inherit from <CODE>Destination</CODE>, they can be used in
483       * the destination parameter to create a <CODE>MessageConsumer</CODE>.
484       * <P>A client uses a <CODE>MessageConsumer</CODE> object to receive
485       * messages that have been published to a destination.
486       *
487       * <P>In some cases, a connection may both publish and subscribe to a
488       * topic. The consumer <CODE>NoLocal</CODE> attribute allows a consumer
489       * to inhibit the delivery of messages published by its own connection.
490       * The default value for this attribute is False. The <CODE>noLocal</CODE>
491       * value must be supported by destinations that are topics.
492       *
493       * @param destination the <CODE>Destination</CODE> to access
494       * @param messageSelector only messages with properties matching the
495       * message selector expression are delivered. A value of null or
496       * an empty string indicates that there is no message selector
497       * for the message consumer.
498       * @param NoLocal - if true, and the destination is a topic,
499       * inhibits the delivery of messages published
500       * by its own connection. The behavior for
501       * <CODE>NoLocal</CODE> is
502       * not specified if the destination is a queue.
503       *
504       * @exception JMSException if the session fails to create a MessageConsumer
505       * due to some internal error.
506       * @exception InvalidDestinationException if an invalid destination
507        * is specified.
508      
509       * @exception InvalidSelectorException if the message selector is invalid.
510       *
511       * @since 1.1
512       *
513       */

514     public MessageConsumer JavaDoc createConsumer(Destination JavaDoc destination,String JavaDoc messageSelector,boolean NoLocal)
515         throws JMSException JavaDoc
516     {
517         try
518             {
519                 return createSubscriber((Topic JavaDoc)destination,messageSelector,NoLocal);
520             }
521         catch(ClassCastException JavaDoc cce)
522             {
523                 throw new InvalidDestinationException JavaDoc("destination must be a Topic, not a "+destination.getClass().getName(),cce.getMessage());
524             }
525     }
526     
527        /** Creates a queue identity given a <CODE>Queue</CODE> name.
528       *
529       * <P>This facility is provided for the rare cases where clients need to
530       * dynamically manipulate queue identity. It allows the creation of a
531       * queue identity with a provider-specific name. Clients that depend
532       * on this ability are not portable.
533       *
534       * <P>Note that this method is not for creating the physical queue.
535       * The physical creation of queues is an administrative task and is not
536       * to be initiated by the JMS API. The one exception is the
537       * creation of temporary queues, which is accomplished with the
538       * <CODE>createTemporaryQueue</CODE> method.
539       *
540       * @param queueName the name of this <CODE>Queue</CODE>
541       *
542       * @return a <CODE>Queue</CODE> with the given name
543       *
544       * @exception JMSException if the session fails to create a queue
545       * due to some internal error.
546       * @since 1.1
547       */

548  
549     public Queue JavaDoc createQueue(String JavaDoc queueName) throws JMSException JavaDoc
550     {
551         throw new IllegalStateException JavaDoc("Don't use a TopicSession to create a Queue.");
552     }
553     
554   /** Creates a <CODE>QueueBrowser</CODE> object to peek at the messages on
555       * the specified queue.
556       *
557       * @param queue the <CODE>queue</CODE> to access
558       *
559       *
560       * @exception JMSException if the session fails to create a browser
561       * due to some internal error.
562       * @exception InvalidDestinationException if an invalid destination
563       * is specified
564       *
565       * @since 1.1
566       */

567     public QueueBrowser JavaDoc createBrowser(Queue JavaDoc queue) throws JMSException JavaDoc
568     {
569         throw new IllegalStateException JavaDoc("Don't use a TopicSession to work with Queues.");
570     }
571
572
573     /** Creates a <CODE>QueueBrowser</CODE> object to peek at the messages on
574       * the specified queue using a message selector.
575       *
576       * @param queue the <CODE>queue</CODE> to access
577       *
578       * @param messageSelector only messages with properties matching the
579       * message selector expression are delivered. A value of null or
580       * an empty string indicates that there is no message selector
581       * for the message consumer.
582       *
583       * @exception JMSException if the session fails to create a browser
584       * due to some internal error.
585       * @exception InvalidDestinationException if an invalid destination
586       * is specified
587       * @exception InvalidSelectorException if the message selector is invalid.
588       *
589       * @since 1.1
590       */

591
592     public QueueBrowser JavaDoc createBrowser(Queue JavaDoc queue,String JavaDoc messageSelector)
593         throws JMSException JavaDoc
594     {
595         throw new IllegalStateException JavaDoc("Don't use a TopicSession to work with Queues.");
596     }
597
598     
599      /** Creates a <CODE>TemporaryQueue</CODE> object. Its lifetime will be that
600       * of the <CODE>Connection</CODE> unless it is deleted earlier.
601       *
602       * @return a temporary queue identity
603       *
604       * @exception JMSException if the session fails to create a temporary queue
605       * due to some internal error.
606       *
607       *@since 1.1
608       */

609
610     public TemporaryQueue JavaDoc createTemporaryQueue() throws JMSException JavaDoc
611     {
612         throw new IllegalStateException JavaDoc("Don't use a TopicSession to work with Queues.");
613     }
614 }
615
616 /* Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 David Walend
617 All rights reserved.
618
619 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
620
621 Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
622
623 Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
624
625 Neither the name of the SomnifugiJMS Project, walend.net, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission from David Walend.
626
627 Credits in redistributions in source or binary forms must include a link to http://somnifugi.sourceforge.net .
628
629 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
630 The net.walend.somnifugi.sql92 package is modified code from the openmq project, https://mq.dev.java.net/ , Copyright (c) of Sun, and carries the CDDL license, repeated here: You can obtain a copy of the license at https://glassfish.dev.java.net/public/CDDLv1.0.html. See the License for the specific language governing permissions and limitations under the License.
631
632 =================================================================================
633
634 For more information and the latest version of this software, please see http://somnifugi.sourceforge.net and http://walend.net or email <a HREF="mailto:david@walend.net">david@walend.net</a>.
635  */

636
Popular Tags