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    }