Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: com/virtuosotechnologies/asaph/model/opsemantics/PredicateFilterSemantics.java


1   /*
2   ================================================================================
3   
4     FILE:  PredicateFilterSemantics.java
5     
6     PROJECT:
7     
8       Asaph
9     
10    CONTENTS:
11    
12      An opsemantics that runs a PredicateSemantics and filters on Boolean.TRUE
13    
14    PROGRAMMERS:
15    
16      Daniel Azuma (DA)  <dazuma@kagi.com>
17    
18    COPYRIGHT:
19    
20      Copyright (C) 2003  Daniel Azuma  (dazuma@kagi.com)
21      
22      This program is free software; you can redistribute it and/or
23      modify it under the terms of the GNU General Public License as
24      published by the Free Software Foundation; either version 2
25      of the License, or (at your option) any later version.
26      
27      This program is distributed in the hope that it will be useful,
28      but WITHOUT ANY WARRANTY; without even the implied warranty of
29      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30      GNU General Public License for more details.
31      
32      You should have received a copy of the GNU General Public
33      License along with this program; if not, write to
34        Free Software Foundation, Inc.
35        59 Temple Place, Suite 330
36        Boston, MA 02111-1307 USA
37  
38  ================================================================================
39  */
40  
41  
42  package com.virtuosotechnologies.asaph.model.opsemantics;
43  
44  
45  import java.util.Iterator;
46  
47  import com.virtuosotechnologies.asaph.model.SongDatabase;
48  import com.virtuosotechnologies.asaph.model.SongOperation;
49  import com.virtuosotechnologies.asaph.model.SongIDResultSet;
50  import com.virtuosotechnologies.asaph.model.SongDatabaseFailedException;
51  
52  
53  /**
54   * An opsemantics that runs a PredicateSemantics and filters on Boolean.TRUE.
55   * Note that this does not extend ValueFilterSemantics because it does not follow the
56   * contract of ValueFilterSemantics, which states that the values are already present
57   * in the original result set.
58   * Instead, this copies the result set, runs the given PredicateSemantics, and then
59   * filters the original result set according to the result values in the copy. Note
60   * that as a result, any values in the original resultset remain untouched.
61   */
62  public interface PredicateFilterSemantics
63  extends SongOperation
64  {
65    /**
66     * Get the predicate.
67     *
68     * @return predicate
69     */
70    public PredicateSemantics getPredicate();
71    
72    
73    /**
74     * The default implementation of PredicateFilterSemantics
75     */
76    public static class DefaultImplementation
77    implements PredicateFilterSemantics
78    {
79      private PredicateSemantics predicate_;
80      
81      
82      /**
83       * Constructor
84       *
85       * @param predicate predicate
86       */
87      public DefaultImplementation(
88        PredicateSemantics predicate)
89      {
90        if (predicate == null)
91        {
92          throw new NullPointerException();
93        }
94        predicate_ = predicate;
95      }
96      
97      
98      /**
99       * Get the predicate.
100      *
101      * @return predicate
102      */
103     public PredicateSemantics getPredicate()
104     {
105       return predicate_;
106     }
107     
108     
109     /**
110      * Performs the operation on the given result set.
111      *
112      * @param resultSet the SongIDResultSet
113      * @exception SongDatabaseFailedException Catch-all exception for database-related
114      *     problems. This will often have a cause exception, which may be exceptions
115      *     like IOException or SQLException.
116      */
117     public void perform(
118       SongIDResultSet resultSet)
119     throws
120       SongDatabaseFailedException
121     {
122       SongDatabase database = resultSet.getDatabase();
123       SongIDResultSet copySet = resultSet.createLinkedCopy();
124       database.performOperation(predicate_, copySet);
125       for (Iterator iter = copySet.getEntryCollection().iterator(); iter.hasNext(); )
126       {
127         SongIDResultSet.Entry entry = (SongIDResultSet.Entry)iter.next();
128         if (!Boolean.TRUE.equals(entry.getData()))
129         {
130           resultSet.remove(entry.getSongID());
131         }
132       }
133     }
134     
135     
136     /**
137      * The equals method should return true if the given object is a SongOperation
138      * with the same semantics as this one. (i.e. it would perform the same operation.)
139      * This may be used to optimize performance. It is always safe to return false from
140      * this method, if the semantics of the given object cannot be determined.
141      * (This is similar to the equals method in java.util.Comparator.)
142      * As a corollary, it is safe just to fall back on the default implementation
143      * inherited from java.lang.Object.
144      *
145      * @param obj object to test
146      * @return true if the object is equal
147      */
148     public boolean equals(
149       Object obj)
150     {
151       if (obj instanceof PredicateFilterSemantics)
152       {
153         return ((PredicateFilterSemantics)obj).getPredicate().equals(predicate_);
154       }
155       return false;
156     }
157   }
158 }