1b21f3e9ec0cf8d560f4ec071aebb2d2f513abc1
[mir.git] / source / mir / entity / adapter / EntityAdapter.java
1 /*
2  * Copyright (C) 2001, 2002 The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with  any library licensed under the Apache Software License,
22  * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library
23  * (or with modified versions of the above that use the same license as the above),
24  * and distribute linked combinations including the two.  You must obey the
25  * GNU General Public License in all respects for all of the code used other than
26  * the above mentioned libraries.  If you modify this file, you may extend this
27  * exception to your version of the file, but you are not obligated to do so.
28  * If you do not wish to do so, delete this exception statement from your version.
29  */
30 package mir.entity.adapter;
31
32 import java.util.Collection;
33 import java.util.HashMap;
34 import java.util.Iterator;
35 import java.util.List;
36 import java.util.Map;
37 import java.util.Set;
38
39 import mir.entity.Entity;
40 import mir.util.CachingRewindableIterator;
41
42 public class EntityAdapter implements Map {
43   private Entity entity;
44   private EntityAdapterDefinition definition;
45   private Map calculatedFieldsCache;
46   private EntityAdapterModel model;
47
48   public EntityAdapter(Entity anEntity, EntityAdapterDefinition aDefinition, EntityAdapterModel aModel) {
49     entity = anEntity;
50     definition = aDefinition;
51     calculatedFieldsCache = new HashMap();
52     model = aModel;
53   }
54
55   public boolean containsKey(Object aKey) {
56     try {
57       if (aKey instanceof String)
58         return     entity.hasValueForField((String) aKey)
59                 || definition.hasCalculatedField((String) aKey)
60                 || entity.getFields().contains(aKey);
61     }
62     catch (Throwable t) {
63     }
64
65     return false;
66   }
67
68   public boolean equals(Object anObject) {
69     return        anObject instanceof EntityAdapter
70            && ((EntityAdapter) anObject).entity.equals(entity);
71   }
72
73   public int hashCode() {
74     return entity.hashCode();
75   }
76
77   public Entity getEntity() {
78     return entity;
79   }
80
81   public EntityAdapterModel getModel() {
82     return model;
83   }
84
85   public Object get(Object aKey) {
86     Object result;
87
88     if (calculatedFieldsCache.containsKey(aKey)) {
89       return calculatedFieldsCache.get(aKey);
90     }
91     else if (aKey instanceof String && definition.hasCalculatedField((String) aKey)) {
92       result = definition.getCalculatedField((String) aKey).getValue(this);
93       calculatedFieldsCache.put(aKey, result);
94
95       return result;
96     }
97     else if (aKey instanceof String) {
98       return entity.getValue((String) aKey);
99     }
100     else {
101       return null;
102     }
103   }
104
105   public boolean isEmpty() {
106     return false;
107   }
108
109   public Set keySet() {
110     throw new UnsupportedOperationException("EntityAdapter.keySet()");
111   }
112
113   public Object put(Object aKey, Object value) {
114     throw new UnsupportedOperationException("EntityAdapter.put()");
115   }
116
117   public void putAll(Map t) {
118     throw new UnsupportedOperationException("EntityAdapter.putAll()");
119   }
120
121   public Object remove(Object aKey) {
122     throw new UnsupportedOperationException("EntityAdapter.remove()");
123   }
124
125   public int size() {
126     throw new UnsupportedOperationException("EntityAdapter.size()");
127   }
128
129   public Collection values() {
130     throw new UnsupportedOperationException("EntityAdapter.values()");
131   }
132
133   public void clear() {
134     throw new UnsupportedOperationException("EntityAdapter.clear()");
135   }
136
137   public boolean containsValue(Object value) {
138     throw new UnsupportedOperationException("EntityAdapter.containsValue()");
139   }
140
141   public Set entrySet() {
142     throw new UnsupportedOperationException("EntityAdapter.entrySet()");
143   }
144
145   public Object getComplexRelation(String aMainTablePrefix, List someExtraTables,
146     String aWhereClause, String anOrderByClause, String aDefinition) {
147     try {
148       return
149           new CachingRewindableIterator(          
150             new EntityIteratorAdapter(aMainTablePrefix, someExtraTables, 
151                 aWhereClause, anOrderByClause,
152                 -1, getModel(), aDefinition, -1, 0)    
153             );
154     }
155     catch (Throwable t) {
156       throw new RuntimeException(t.getMessage());
157     }
158   }
159
160
161   public Object getRelation(String aWhereClause, String anOrderByClause, String aDefinition) {
162     try {
163       return
164           new CachingRewindableIterator(
165             new EntityIteratorAdapter(
166                 aWhereClause, anOrderByClause, -1, getModel(), aDefinition));
167     }
168     catch (Throwable t) {
169       throw new RuntimeException(t.getMessage());
170     }
171   }
172
173   public EntityAdapter getToOneRelation(String aWhereClause, String anOrderByClause, String aDefinition) {
174     try {
175       Iterator i = new EntityIteratorAdapter(aWhereClause, anOrderByClause, -1, getModel(), aDefinition);
176
177       if (i.hasNext())
178         return (EntityAdapter) i.next();
179       else
180         return null;
181     }
182     catch (Throwable t) {
183       throw new RuntimeException(t.getMessage());
184     }
185   }
186 }