001 package com.croftsoft.core.util.queue;
002
003 import java.util.*;
004
005 import com.croftsoft.core.lang.NullArgumentException;
006
007 /*********************************************************************
008 * An implementation of Queue that relies upon a Vector backbone.
009 *
010 * @author
011 * <a href="https://www.croftsoft.com/">David Wallace Croft</a>
012 * @version
013 * 2003-05-22
014 * @since
015 * 1999-02-07
016 *********************************************************************/
017
018 public final class VectorQueue
019 implements Queue
020 //////////////////////////////////////////////////////////////////////
021 //////////////////////////////////////////////////////////////////////
022 {
023
024 private final Vector vector;
025
026 //////////////////////////////////////////////////////////////////////
027 //////////////////////////////////////////////////////////////////////
028
029 public VectorQueue ( Vector vector )
030 //////////////////////////////////////////////////////////////////////
031 {
032 NullArgumentException.check ( this.vector = vector );
033 }
034
035 public VectorQueue ( )
036 //////////////////////////////////////////////////////////////////////
037 {
038 this ( new Vector ( ) );
039 }
040
041 //////////////////////////////////////////////////////////////////////
042 //////////////////////////////////////////////////////////////////////
043
044 public boolean append ( Object o )
045 //////////////////////////////////////////////////////////////////////
046 {
047 NullArgumentException.check ( o );
048
049 synchronized ( vector )
050 {
051 vector.addElement ( o );
052
053 vector.notifyAll ( );
054 }
055
056 return true;
057 }
058
059 public Object poll ( )
060 //////////////////////////////////////////////////////////////////////
061 {
062 synchronized ( vector )
063 {
064 if ( vector.size ( ) > 0 )
065 {
066 Object o = vector.elementAt ( 0 );
067
068 vector.removeElementAt ( 0 );
069
070 return o;
071 }
072 }
073
074 return null;
075 }
076
077 public Object pull ( )
078 throws InterruptedException
079 //////////////////////////////////////////////////////////////////////
080 {
081 return pull ( 0 );
082 }
083
084 public Object pull ( long timeout )
085 throws InterruptedException
086 //////////////////////////////////////////////////////////////////////
087 {
088 if ( timeout < 0 )
089 {
090 throw new IllegalArgumentException ( "timeout < 0" );
091 }
092
093 long stopTime = System.currentTimeMillis ( ) + timeout;
094
095 Object o = null;
096
097 while ( ( o = poll ( ) ) == null )
098 {
099 if ( timeout == 0 )
100 {
101 synchronized ( vector )
102 {
103 vector.wait ( );
104 }
105 }
106 else
107 {
108 long now = System.currentTimeMillis ( );
109
110 if ( stopTime > now )
111 {
112 synchronized ( vector )
113 {
114 vector.wait ( stopTime - now );
115 }
116 }
117 else
118 {
119 break;
120 }
121 }
122 }
123
124 return o;
125 }
126
127 public Object replace ( Object o )
128 //////////////////////////////////////////////////////////////////////
129 {
130 synchronized ( vector )
131 {
132 int index = vector.indexOf ( o );
133
134 if ( index < 0 )
135 {
136 append ( o );
137
138 return null;
139 }
140 else
141 {
142 Object oldObject = vector.elementAt ( index );
143
144 vector.setElementAt ( o, index );
145
146 return oldObject;
147 }
148 }
149 }
150
151 //////////////////////////////////////////////////////////////////////
152 //////////////////////////////////////////////////////////////////////
153 }