View Javadoc

1   /*
2    * ModeShape (http://www.modeshape.org)
3    * See the COPYRIGHT.txt file distributed with this work for information
4    * regarding copyright ownership.  Some portions may be licensed
5    * to Red Hat, Inc. under one or more contributor license agreements.
6    * See the AUTHORS.txt file in the distribution for a full listing of 
7    * individual contributors.
8    *
9    * ModeShape is free software. Unless otherwise indicated, all code in ModeShape
10   * is licensed to you under the terms of the GNU Lesser General Public License as
11   * published by the Free Software Foundation; either version 2.1 of
12   * the License, or (at your option) any later version.
13   * 
14   * ModeShape is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17   * Lesser General Public License for more details.
18   *
19   * You should have received a copy of the GNU Lesser General Public
20   * License along with this software; if not, write to the Free
21   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
23   */
24  package org.modeshape.graph.connector.federation;
25  
26  import java.util.List;
27  import java.util.Map;
28  import org.modeshape.graph.ExecutionContext;
29  import org.modeshape.graph.Location;
30  import org.modeshape.graph.cache.CachePolicy;
31  import org.modeshape.graph.observe.Observer;
32  import org.modeshape.graph.property.DateTime;
33  import org.modeshape.graph.property.Name;
34  import org.modeshape.graph.property.Property;
35  import org.modeshape.graph.request.AccessQueryRequest;
36  import org.modeshape.graph.request.CacheableRequest;
37  import org.modeshape.graph.request.CloneBranchRequest;
38  import org.modeshape.graph.request.CloneWorkspaceRequest;
39  import org.modeshape.graph.request.CopyBranchRequest;
40  import org.modeshape.graph.request.CreateNodeRequest;
41  import org.modeshape.graph.request.CreateWorkspaceRequest;
42  import org.modeshape.graph.request.DeleteBranchRequest;
43  import org.modeshape.graph.request.DeleteChildrenRequest;
44  import org.modeshape.graph.request.DestroyWorkspaceRequest;
45  import org.modeshape.graph.request.FullTextSearchRequest;
46  import org.modeshape.graph.request.GetWorkspacesRequest;
47  import org.modeshape.graph.request.LockBranchRequest;
48  import org.modeshape.graph.request.MoveBranchRequest;
49  import org.modeshape.graph.request.ReadAllChildrenRequest;
50  import org.modeshape.graph.request.ReadAllPropertiesRequest;
51  import org.modeshape.graph.request.ReadBlockOfChildrenRequest;
52  import org.modeshape.graph.request.ReadBranchRequest;
53  import org.modeshape.graph.request.ReadNextBlockOfChildrenRequest;
54  import org.modeshape.graph.request.ReadNodeRequest;
55  import org.modeshape.graph.request.ReadPropertyRequest;
56  import org.modeshape.graph.request.RemovePropertyRequest;
57  import org.modeshape.graph.request.RenameNodeRequest;
58  import org.modeshape.graph.request.Request;
59  import org.modeshape.graph.request.RequestType;
60  import org.modeshape.graph.request.SetPropertyRequest;
61  import org.modeshape.graph.request.UnlockBranchRequest;
62  import org.modeshape.graph.request.UpdatePropertiesRequest;
63  import org.modeshape.graph.request.UpdateValuesRequest;
64  import org.modeshape.graph.request.VerifyNodeExistsRequest;
65  import org.modeshape.graph.request.VerifyWorkspaceRequest;
66  import org.modeshape.graph.request.processor.RequestProcessor;
67  
68  /**
69   * A RequestProcessor used by the {@link JoinRequestProcessor} in cases where there is a single source-request with the same
70   * location(s). This processor merely copies the results from each source request for the
71   * {@link #setFederatedRequest(FederatedRequest) current federated request} into the request passed as a parameter.
72   */
73  class JoinMirrorRequestProcessor extends RequestProcessor {
74  
75      private FederatedRequest federatedRequest;
76  
77      JoinMirrorRequestProcessor( String sourceName,
78                                  ExecutionContext context,
79                                  Observer observer,
80                                  DateTime now,
81                                  CachePolicy defaultCachePolicy ) {
82          super(sourceName, context, observer, now, defaultCachePolicy);
83  
84      }
85  
86      /**
87       * @param federatedRequest Sets federatedRequest to the specified value.
88       */
89      void setFederatedRequest( FederatedRequest federatedRequest ) {
90          this.federatedRequest = federatedRequest;
91      }
92  
93      protected boolean checkErrorOrCancel( Request request,
94                                            Request sourceRequest ) {
95          if (sourceRequest.hasError()) {
96              request.setError(sourceRequest.getError());
97              return true;
98          }
99          if (sourceRequest.isCancelled()) {
100             request.cancel();
101             return true;
102         }
103         return false;
104     }
105 
106     /**
107      * {@inheritDoc}
108      * 
109      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.ReadNodeRequest)
110      */
111     @Override
112     public void process( ReadNodeRequest request ) {
113         ReadNodeRequest source = (ReadNodeRequest)federatedRequest.getFirstProjectedRequest().getRequest();
114         if (checkErrorOrCancel(request, source)) return;
115         request.setActualLocationOfNode(source.getActualLocationOfNode());
116         for (Location childInSource : source.getChildren()) {
117             request.addChild(childInSource);
118         }
119         for (Property propertyInSource : source.getProperties()) {
120             request.addProperties(propertyInSource);
121         }
122         request.setCachePolicy(getDefaultCachePolicy());
123         setCacheableInfo(request, source.getCachePolicy());
124     }
125 
126     /**
127      * {@inheritDoc}
128      * 
129      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.ReadAllChildrenRequest)
130      */
131     @Override
132     public void process( ReadAllChildrenRequest request ) {
133         ReadAllChildrenRequest source = (ReadAllChildrenRequest)federatedRequest.getFirstProjectedRequest().getRequest();
134         if (checkErrorOrCancel(request, source)) return;
135         request.setActualLocationOfNode(source.getActualLocationOfNode());
136         for (Location childInSource : source.getChildren()) {
137             request.addChild(childInSource);
138         }
139         request.setCachePolicy(getDefaultCachePolicy());
140         setCacheableInfo(request, source.getCachePolicy());
141     }
142 
143     /**
144      * {@inheritDoc}
145      * 
146      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.ReadAllPropertiesRequest)
147      */
148     @Override
149     public void process( ReadAllPropertiesRequest request ) {
150         ReadAllPropertiesRequest source = (ReadAllPropertiesRequest)federatedRequest.getFirstProjectedRequest().getRequest();
151         if (checkErrorOrCancel(request, source)) return;
152         request.setActualLocationOfNode(source.getActualLocationOfNode());
153         for (Property propertyInSource : source.getProperties()) {
154             request.addProperties(propertyInSource);
155         }
156         request.setCachePolicy(getDefaultCachePolicy());
157         setCacheableInfo(request, source.getCachePolicy());
158     }
159 
160     /**
161      * {@inheritDoc}
162      * 
163      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.ReadBlockOfChildrenRequest)
164      */
165     @Override
166     public void process( ReadBlockOfChildrenRequest request ) {
167         ReadBlockOfChildrenRequest source = (ReadBlockOfChildrenRequest)federatedRequest.getFirstProjectedRequest().getRequest();
168         if (checkErrorOrCancel(request, source)) return;
169         request.setActualLocationOfNode(source.getActualLocationOfNode());
170         for (Location childInSource : source.getChildren()) {
171             request.addChild(childInSource);
172         }
173         request.setCachePolicy(getDefaultCachePolicy());
174         setCacheableInfo(request, source.getCachePolicy());
175     }
176 
177     /**
178      * {@inheritDoc}
179      * 
180      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.ReadNextBlockOfChildrenRequest)
181      */
182     @Override
183     public void process( ReadNextBlockOfChildrenRequest request ) {
184         ReadNextBlockOfChildrenRequest source = (ReadNextBlockOfChildrenRequest)federatedRequest.getFirstProjectedRequest()
185                                                                                                 .getRequest();
186         if (checkErrorOrCancel(request, source)) return;
187         request.setActualLocationOfStartingAfterNode(source.getActualLocationOfStartingAfterNode());
188         for (Location childInSource : source.getChildren()) {
189             request.addChild(childInSource);
190         }
191         request.setCachePolicy(getDefaultCachePolicy());
192         setCacheableInfo(request, source.getCachePolicy());
193     }
194 
195     /**
196      * {@inheritDoc}
197      * 
198      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.ReadPropertyRequest)
199      */
200     @Override
201     public void process( ReadPropertyRequest request ) {
202         ReadPropertyRequest source = (ReadPropertyRequest)federatedRequest.getFirstProjectedRequest().getRequest();
203         if (checkErrorOrCancel(request, source)) return;
204         request.setActualLocationOfNode(source.getActualLocationOfNode());
205         request.setProperty(source.getProperty());
206         request.setCachePolicy(getDefaultCachePolicy());
207         setCacheableInfo(request, source.getCachePolicy());
208     }
209 
210     /**
211      * {@inheritDoc}
212      * 
213      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.SetPropertyRequest)
214      */
215     @Override
216     public void process( SetPropertyRequest request ) {
217         SetPropertyRequest source = (SetPropertyRequest)federatedRequest.getFirstProjectedRequest().getRequest();
218         if (checkErrorOrCancel(request, source)) return;
219         // Set the actual location and created flags ...
220         request.setActualLocationOfNode(source.getActualLocationOfNode());
221         request.setNewProperty(source.isNewProperty());
222     }
223 
224     /**
225      * {@inheritDoc}
226      * 
227      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.VerifyNodeExistsRequest)
228      */
229     @Override
230     public void process( VerifyNodeExistsRequest request ) {
231         VerifyNodeExistsRequest source = (VerifyNodeExistsRequest)federatedRequest.getFirstProjectedRequest().getRequest();
232         if (checkErrorOrCancel(request, source)) return;
233         request.setActualLocationOfNode(source.getActualLocationOfNode());
234         request.setCachePolicy(getDefaultCachePolicy());
235         setCacheableInfo(request, source.getCachePolicy());
236     }
237 
238     /**
239      * {@inheritDoc}
240      * 
241      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.RemovePropertyRequest)
242      */
243     @Override
244     public void process( RemovePropertyRequest request ) {
245         RemovePropertyRequest source = (RemovePropertyRequest)federatedRequest.getFirstProjectedRequest().getRequest();
246         if (checkErrorOrCancel(request, source)) return;
247         request.setActualLocationOfNode(source.getActualLocationOfNode());
248     }
249 
250     /**
251      * {@inheritDoc}
252      * 
253      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.RenameNodeRequest)
254      */
255     @Override
256     public void process( RenameNodeRequest request ) {
257         RenameNodeRequest source = (RenameNodeRequest)federatedRequest.getFirstProjectedRequest().getRequest();
258         if (checkErrorOrCancel(request, source)) return;
259         request.setActualLocations(source.getActualLocationBefore(), source.getActualLocationAfter());
260     }
261 
262     /**
263      * {@inheritDoc}
264      * 
265      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.ReadBranchRequest)
266      */
267     @Override
268     public void process( ReadBranchRequest request ) {
269         CacheableRequest source = (CacheableRequest)federatedRequest.getFirstProjectedRequest().getRequest();
270         if (checkErrorOrCancel(request, source)) return;
271         if (RequestType.READ_BRANCH == source.getType()) {
272             ReadBranchRequest readSource = (ReadBranchRequest)source;
273             request.setActualLocationOfNode(readSource.getActualLocationOfNode());
274             for (Location node : readSource) {
275                 List<Location> children = readSource.getChildren(node);
276                 if (children != null) request.setChildren(node, children);
277                 Map<Name, Property> props = readSource.getPropertiesFor(node);
278                 if (props != null) request.setProperties(node, props.values());
279             }
280         } else if (RequestType.READ_NODE == source.getType()) {
281             ReadNodeRequest readSource = (ReadNodeRequest)source;
282             request.setActualLocationOfNode(readSource.getActualLocationOfNode());
283             Location parent = readSource.getActualLocationOfNode();
284             request.setChildren(parent, readSource.getChildren());
285             request.setProperties(parent, readSource.getPropertiesByName().values());
286         }
287         request.setCachePolicy(getDefaultCachePolicy());
288         setCacheableInfo(request, source.getCachePolicy());
289     }
290 
291     /**
292      * {@inheritDoc}
293      * 
294      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.CreateNodeRequest)
295      */
296     @Override
297     public void process( CreateNodeRequest request ) {
298         CreateNodeRequest source = (CreateNodeRequest)federatedRequest.getFirstProjectedRequest().getRequest();
299         if (checkErrorOrCancel(request, source)) return;
300         request.setActualLocationOfNode(source.getActualLocationOfNode());
301     }
302 
303     /**
304      * {@inheritDoc}
305      * 
306      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.UpdatePropertiesRequest)
307      */
308     @Override
309     public void process( UpdatePropertiesRequest request ) {
310         UpdatePropertiesRequest source = (UpdatePropertiesRequest)federatedRequest.getFirstProjectedRequest().getRequest();
311         if (checkErrorOrCancel(request, source)) return;
312         request.setActualLocationOfNode(source.getActualLocationOfNode());
313         request.setNewProperties(source.getNewPropertyNames());
314     }
315 
316     /**
317      * {@inheritDoc}
318      * 
319      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.UpdateValuesRequest)
320      */
321     @Override
322     public void process( UpdateValuesRequest request ) {
323         UpdateValuesRequest source = (UpdateValuesRequest)federatedRequest.getFirstProjectedRequest().getRequest();
324         if (checkErrorOrCancel(request, source)) return;
325         request.setActualLocation(source.getActualLocationOfNode(),
326                                   request.getActualAddedValues(),
327                                   request.getActualRemovedValues());
328     }
329 
330     /**
331      * {@inheritDoc}
332      * 
333      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.CopyBranchRequest)
334      */
335     @Override
336     public void process( CopyBranchRequest request ) {
337         CopyBranchRequest source = (CopyBranchRequest)federatedRequest.getFirstProjectedRequest().getRequest();
338         if (checkErrorOrCancel(request, source)) return;
339         request.setActualLocations(source.getActualLocationBefore(), source.getActualLocationAfter());
340     }
341 
342     /**
343      * {@inheritDoc}
344      * 
345      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.CloneBranchRequest)
346      */
347     @Override
348     public void process( CloneBranchRequest request ) {
349         CloneBranchRequest source = (CloneBranchRequest)federatedRequest.getFirstProjectedRequest().getRequest();
350         if (checkErrorOrCancel(request, source)) return;
351         request.setActualLocations(source.getActualLocationBefore(), source.getActualLocationAfter());
352         request.setRemovedNodes(source.getRemovedNodes());
353     }
354 
355     /**
356      * {@inheritDoc}
357      * 
358      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.DeleteBranchRequest)
359      */
360     @Override
361     public void process( DeleteBranchRequest request ) {
362         DeleteBranchRequest source = (DeleteBranchRequest)federatedRequest.getFirstProjectedRequest().getRequest();
363         if (checkErrorOrCancel(request, source)) return;
364         request.setActualLocationOfNode(source.getActualLocationOfNode());
365     }
366 
367     /**
368      * {@inheritDoc}
369      * 
370      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.DeleteChildrenRequest)
371      */
372     @Override
373     public void process( DeleteChildrenRequest request ) {
374         DeleteChildrenRequest source = (DeleteChildrenRequest)federatedRequest.getFirstProjectedRequest().getRequest();
375         if (checkErrorOrCancel(request, source)) return;
376         request.setActualLocationOfNode(source.getActualLocationOfNode());
377     }
378 
379     /**
380      * {@inheritDoc}
381      * 
382      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.MoveBranchRequest)
383      */
384     @Override
385     public void process( MoveBranchRequest request ) {
386         MoveBranchRequest source = (MoveBranchRequest)federatedRequest.getFirstProjectedRequest().getRequest();
387         if (checkErrorOrCancel(request, source)) return;
388         request.setActualLocations(source.getActualLocationBefore(), source.getActualLocationAfter());
389     }
390 
391     /**
392      * {@inheritDoc}
393      * 
394      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.LockBranchRequest)
395      */
396     @Override
397     public void process( LockBranchRequest request ) {
398         LockBranchRequest source = (LockBranchRequest)federatedRequest.getFirstProjectedRequest().getRequest();
399         if (checkErrorOrCancel(request, source)) return;
400         request.setActualLocation(source.getActualLocation());
401     }
402 
403     /**
404      * {@inheritDoc}
405      * 
406      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.UnlockBranchRequest)
407      */
408     @Override
409     public void process( UnlockBranchRequest request ) {
410         UnlockBranchRequest source = (UnlockBranchRequest)federatedRequest.getFirstProjectedRequest().getRequest();
411         if (checkErrorOrCancel(request, source)) return;
412         request.setActualLocation(source.getActualLocation());
413     }
414 
415     /**
416      * {@inheritDoc}
417      * 
418      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.VerifyWorkspaceRequest)
419      */
420     @Override
421     public void process( VerifyWorkspaceRequest request ) {
422         VerifyNodeExistsRequest source = (VerifyNodeExistsRequest)federatedRequest.getFirstProjectedRequest().getRequest();
423         if (checkErrorOrCancel(request, source)) return;
424         assert source.getActualLocationOfNode().getPath().isRoot();
425         request.setActualRootLocation(source.getActualLocationOfNode());
426     }
427 
428     /**
429      * {@inheritDoc}
430      * 
431      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.GetWorkspacesRequest)
432      */
433     @Override
434     public void process( GetWorkspacesRequest request ) {
435         throw new UnsupportedOperationException(); // should never be called
436     }
437 
438     /**
439      * {@inheritDoc}
440      * 
441      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.CreateWorkspaceRequest)
442      */
443     @Override
444     public void process( CreateWorkspaceRequest request ) {
445         throw new UnsupportedOperationException(); // should never be called
446     }
447 
448     /**
449      * {@inheritDoc}
450      * 
451      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.CloneWorkspaceRequest)
452      */
453     @Override
454     public void process( CloneWorkspaceRequest request ) {
455         throw new UnsupportedOperationException(); // should never be called
456     }
457 
458     /**
459      * {@inheritDoc}
460      * 
461      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.DestroyWorkspaceRequest)
462      */
463     @Override
464     public void process( DestroyWorkspaceRequest request ) {
465         throw new UnsupportedOperationException(); // should never be called
466     }
467 
468     /**
469      * {@inheritDoc}
470      * 
471      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.AccessQueryRequest)
472      */
473     @Override
474     public void process( AccessQueryRequest request ) {
475         throw new UnsupportedOperationException(); // should never be called
476     }
477 
478     /**
479      * {@inheritDoc}
480      * 
481      * @see org.modeshape.graph.request.processor.RequestProcessor#process(org.modeshape.graph.request.FullTextSearchRequest)
482      */
483     @Override
484     public void process( FullTextSearchRequest request ) {
485         throw new UnsupportedOperationException(); // should never be called
486     }
487 }