001 /**
002 * Created on 24-feb-2005
003 * Created by jh
004 */
005 package org.springframework.richclient.widget.editor.provider;
006
007 import java.util.Observable;
008
009 /**
010 * Base implementation for DataProviders.
011 *
012 * @author Jan Hoskens
013 *
014 */
015 public abstract class AbstractDataProvider extends Observable implements DataProvider
016 {
017
018 private final String id;
019
020 public AbstractDataProvider()
021 {
022 this("abstractDataProvider");
023 }
024
025 public AbstractDataProvider(String id)
026 {
027 this.id = id;
028 }
029
030 public String getId()
031 {
032 return id;
033 }
034
035 /**
036 * A basic implementation that directs the necessary logic to {@link #isDetailObject(Object)} and
037 * {@link #loadDetailObject(Object)}.
038 */
039 public final Object getDetailObject(Object selectedObject, boolean forceLoad)
040 {
041 if (forceLoad || !isDetailObject(selectedObject))
042 return loadDetailObject(selectedObject);
043 return selectedObject;
044 }
045
046 /**
047 * Check if the given object is a detailed object or not. If it is already detailed, the object can be
048 * returned as-is instead of loading it from the back-end.
049 *
050 * @param objectToCheck
051 * object to check.
052 * @return <code>true</code> if the object is a detailed one.
053 */
054 protected boolean isDetailObject(Object objectToCheck)
055 {
056 return true;
057 }
058
059 /**
060 * Load the detailed object from the back-end. Note that although the baseObject can be detailed, you MUST
061 * fetch the object from the back-end in any case in this method.
062 *
063 * @param baseObject
064 * object containing enough information to fetch a detailed object from the back-end.
065 * @return the detailed object retrieved from the back-end.
066 */
067 protected Object loadDetailObject(Object baseObject)
068 {
069 throw new UnsupportedOperationException("getDetailObject(object) not implemented for " + baseObject);
070 }
071
072
073 public Object clone(Object sampleData)
074 {
075 throw new UnsupportedOperationException("clone(object) not implemented for " + sampleData);
076 }
077
078 public final Object update(Object updatedData)
079 {
080 setChanged();
081 Object newEntity = doUpdate(updatedData);
082 notifyObservers(DataProviderEvent.updateEntityEvent(updatedData, newEntity));
083 return newEntity;
084 }
085
086 public Object doUpdate(Object updatedData)
087 {
088 throw new UnsupportedOperationException("doUpdate(object) not implemented for " + updatedData);
089 };
090
091
092 public final void delete(Object dataToRemove)
093 {
094 setChanged();
095 doDelete(dataToRemove);
096 notifyObservers(DataProviderEvent.deleteEntityEvent(dataToRemove));
097 }
098
099 public void doDelete(Object dataToRemove)
100 {
101 throw new UnsupportedOperationException("doDelete(object) not implemented for " + dataToRemove);
102 }
103
104 public final Object create(Object newData)
105 {
106 setChanged();
107 Object newEntity = doCreate(newData);
108 notifyObservers(DataProviderEvent.newEntityEvent(newEntity));
109 return newEntity;
110 }
111
112 public Object doCreate(Object newData)
113 {
114 throw new UnsupportedOperationException("doCreate(object) not implemented for " + newData);
115 }
116
117 public Object newInstance(Object criteria)
118 {
119 return null;
120 }
121
122 /**
123 * {@inheritDoc}
124 */
125 public void addDataProviderListener(DataProviderListener dataProviderListener)
126 {
127 addObserver(dataProviderListener);
128 }
129
130 /**
131 * {@inheritDoc}
132 */
133 public void removeDataProviderListener(DataProviderListener dataProviderListener)
134 {
135 deleteObserver(dataProviderListener);
136 }
137
138 /**
139 * {@inheritDoc}
140 */
141 public boolean supportsBaseCriteria()
142 {
143 return false;
144 }
145
146 public void setBaseCriteria(Object criteria)
147 {
148 throw new UnsupportedOperationException("setBaseCriteria(object) not implemented for " + criteria);
149 }
150
151 public boolean exists(Object data)
152 {
153 return false;
154 }
155
156 public RefreshPolicy getRefreshPolicy()
157 {
158 return RefreshPolicy.ON_USER_SWITCH;
159 }
160
161 public Object getSimpleObject(Object baseObject)
162 {
163 return baseObject;
164 }
165 }