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 }