1 package org.apache.jcs.auxiliary.remote;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.Serializable;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.StringTokenizer;
26
27 import org.apache.commons.logging.Log;
28 import org.apache.commons.logging.LogFactory;
29 import org.apache.jcs.auxiliary.AuxiliaryCache;
30 import org.apache.jcs.auxiliary.AuxiliaryCacheAttributes;
31 import org.apache.jcs.auxiliary.AuxiliaryCacheFactory;
32 import org.apache.jcs.auxiliary.remote.server.behavior.RemoteType;
33 import org.apache.jcs.engine.behavior.ICache;
34 import org.apache.jcs.engine.behavior.ICompositeCacheManager;
35 import org.apache.jcs.engine.behavior.IElementSerializer;
36 import org.apache.jcs.engine.logging.behavior.ICacheEventLogger;
37
38
39
40
41
42
43
44 public class RemoteCacheFactory
45 implements AuxiliaryCacheFactory
46 {
47
48 private final static Log log = LogFactory.getLog( RemoteCacheFactory.class );
49
50
51 private String name;
52
53
54 private final static HashMap<String, RemoteCacheNoWaitFacade<? extends Serializable, ? extends Serializable>> facades =
55 new HashMap<String, RemoteCacheNoWaitFacade<? extends Serializable, ? extends Serializable>>();
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 public <K extends Serializable, V extends Serializable> AuxiliaryCache<K, V> createCache(
71 AuxiliaryCacheAttributes iaca, ICompositeCacheManager cacheMgr,
72 ICacheEventLogger cacheEventLogger, IElementSerializer elementSerializer )
73 {
74 RemoteCacheAttributes rca = (RemoteCacheAttributes) iaca;
75
76 ArrayList<ICache<K, V>> noWaits = new ArrayList<ICache<K, V>>();
77
78
79 if ( rca.getRemoteType() == RemoteType.LOCAL )
80 {
81
82 ArrayList<String> failovers = new ArrayList<String>();
83
84
85
86
87 boolean primayDefined = false;
88 if ( rca.getRemoteHost() != null )
89 {
90 primayDefined = true;
91
92 failovers.add( rca.getRemoteHost() + ":" + rca.getRemotePort() );
93
94 RemoteCacheManager rcm = RemoteCacheManager.getInstance( rca, cacheMgr, cacheEventLogger,
95 elementSerializer );
96 ICache<K, V> ic = rcm.getCache( rca );
97 if ( ic != null )
98 {
99 noWaits.add( ic );
100 }
101 else
102 {
103 log.info( "noWait is null" );
104 }
105 }
106
107
108 String failoverList = rca.getFailoverServers();
109 if ( failoverList != null )
110 {
111 StringTokenizer fit = new StringTokenizer( failoverList, "," );
112 int fCnt = 0;
113 while ( fit.hasMoreElements() )
114 {
115 fCnt++;
116
117 String server = (String) fit.nextElement();
118 failovers.add( server );
119
120 rca.setRemoteHost( server.substring( 0, server.indexOf( ":" ) ) );
121 rca.setRemotePort( Integer.parseInt( server.substring( server.indexOf( ":" ) + 1 ) ) );
122 RemoteCacheManager rcm = RemoteCacheManager.getInstance( rca, cacheMgr, cacheEventLogger,
123 elementSerializer );
124
125
126 if ( ( !primayDefined && fCnt == 1 ) || noWaits.size() <= 0 )
127 {
128 ICache<K, V> ic = rcm.getCache( rca );
129 if ( ic != null )
130 {
131 noWaits.add( ic );
132 }
133 else
134 {
135 log.info( "noWait is null" );
136 }
137 }
138 }
139
140 }
141
142
143 rca.setFailovers( failovers.toArray( new String[0] ) );
144
145
146 }
147 else if ( rca.getRemoteType() == RemoteType.CLUSTER )
148 {
149
150 StringTokenizer it = new StringTokenizer( rca.getClusterServers(), "," );
151 while ( it.hasMoreElements() )
152 {
153
154 String server = (String) it.nextElement();
155
156 rca.setRemoteHost( server.substring( 0, server.indexOf( ":" ) ) );
157 rca.setRemotePort( Integer.parseInt( server.substring( server.indexOf( ":" ) + 1 ) ) );
158 RemoteCacheManager rcm = RemoteCacheManager.getInstance( rca, cacheMgr, cacheEventLogger,
159 elementSerializer );
160 rca.setRemoteType( RemoteType.CLUSTER );
161 ICache<K, V> ic = rcm.getCache( rca );
162 if ( ic != null )
163 {
164 noWaits.add( ic );
165 }
166 else
167 {
168 log.info( "noWait is null" );
169 }
170 }
171
172 }
173
174
175 @SuppressWarnings("unchecked")
176 RemoteCacheNoWait<K, V>[] rcnwArray = noWaits.toArray( new RemoteCacheNoWait[0] );
177 RemoteCacheNoWaitFacade<K, V> rcnwf =
178 new RemoteCacheNoWaitFacade<K, V>(rcnwArray, rca, cacheMgr, cacheEventLogger, elementSerializer );
179
180 getFacades().put( rca.getCacheName(), rcnwf );
181
182 return rcnwf;
183 }
184
185
186
187
188
189
190
191 public String getName()
192 {
193 return this.name;
194 }
195
196
197
198
199
200 public void setName( String name )
201 {
202 this.name = name;
203 }
204
205
206
207
208
209 public static HashMap<String, RemoteCacheNoWaitFacade<? extends Serializable, ? extends Serializable>> getFacades()
210 {
211 return facades;
212 }
213 }