42faf0ba4ff8335d71fd36779a0399f9ba03a920
[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.Map;
36 import java.util.Set;
37
38 import mir.entity.Entity;
39 import mir.util.CachingRewindableIterator;
40
41 public class EntityAdapter implements Map {
42   private Entity entity;
43   private EntityAdapterDefinition definition;
44   private Map calculatedFieldsCache;
45   private EntityAdapterModel model;
46
47   public EntityAdapter(Entity anEntity, EntityAdapterDefinition aDefinition, EntityAdapterModel aModel) {
48     entity = anEntity;
49     definition = aDefinition;
50     calculatedFieldsCache = new HashMap();
51     model = aModel;
52   }
53
54   public boolean containsKey(Object aKey) {
55     try {
56       if (aKey instanceof String)
57         return     entity.hasValueForField((String) aKey)
58                 || definition.hasCalculatedField((String) aKey)
59                 || entity.getFields().contains(aKey);
60     }
61     catch (Throwable t) {
62     }
63
64     return false;
65   }
66
67   public boolean equals(Object anObject) {
68     return        anObject instanceof EntityAdapter
69            && ((EntityAdapter) anObject).entity.equals(entity);
70   }
71
72   public int hashCode() {
73     return entity.hashCode();
74   }
75
76   public Entity getEntity() {
77     return entity;
78   }
79
80   public EntityAdapterModel getModel() {
81     return model;
82   }
83
84   public Object get(Object aKey) {
85     Object result;
86
87     if (calculatedFieldsCache.containsKey(aKey)) {
88       return calculatedFieldsCache.get(aKey);
89     }
90     else if (aKey instanceof String && definition.hasCalculatedField((String) aKey)) {
91       result = definition.getCalculatedField((String) aKey).getValue(this);
92       calculatedFieldsCache.put(aKey, result);
93
94       return result;
95     }
96     else if (aKey instanceof String) {
97       return entity.getValue((String) aKey);
98     }
99     else {
100       return null;
101     }
102   }
103
104   public boolean isEmpty() {
105     return false;
106   }
107
108   public Set keySet() {
109     throw new UnsupportedOperationException("EntityAdapter.keySet()");
110   }
111
112   public Object put(Object aKey, Object value) {
113     throw new UnsupportedOperationException("EntityAdapter.put()");
114   }
115
116   public void putAll(Map t) {
117     throw new UnsupportedOperationException("EntityAdapter.putAll()");
118   }
119
120   public Object remove(Object aKey) {
121     throw new UnsupportedOperationException("EntityAdapter.remove()");
122   }
123
124   public int size() {
125     throw new UnsupportedOperationException("EntityAdapter.size()");
126   }
127
128   public Collection values() {
129     throw new UnsupportedOperationException("EntityAdapter.values()");
130   }
131
132   public void clear() {
133     throw new UnsupportedOperationException("EntityAdapter.clear()");
134   }
135
136   public boolean containsValue(Object value) {
137     throw new UnsupportedOperationException("EntityAdapter.containsValue()");
138   }
139
140   public Set entrySet() {
141     throw new UnsupportedOperationException("EntityAdapter.entrySet()");
142   }
143
144   public Object getRelation(String aWhereClause, String anOrderByClause, String aDefinition) {
145     try {
146       return
147           new CachingRewindableIterator(
148             new EntityIteratorAdapter(
149                 aWhereClause, anOrderByClause, -1, getModel(), aDefinition));
150     }
151     catch (Throwable t) {
152       throw new RuntimeException(t.getMessage());
153     }
154   }
155
156   public EntityAdapter getToOneRelation(String aWhereClause, String anOrderByClause, String aDefinition) {
157     try {
158       Iterator i = new EntityIteratorAdapter(aWhereClause, anOrderByClause, -1, getModel(), aDefinition);
159
160       if (i.hasNext())
161         return (EntityAdapter) i.next();
162       else
163         return null;
164     }
165     catch (Throwable t) {
166       throw new RuntimeException(t.getMessage());
167     }
168   }
169 }