001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package com.sun.data.provider.impl;
043:
044: import java.util.ArrayList;
045: import java.util.HashMap;
046: import java.util.Iterator;
047: import com.sun.data.provider.DataListener;
048: import com.sun.data.provider.DataProvider;
049: import com.sun.data.provider.DataProviderException;
050: import com.sun.data.provider.FieldKey;
051: import com.sun.data.provider.TransactionalDataListener;
052: import com.sun.data.provider.TransactionalDataProvider;
053: import java.util.ResourceBundle;
054:
055: /**
056: *
057: * @author Joe Nuxoll
058: * Winston Prakash (Buf Fixes and clean up)
059: */
060: public class BasicTransactionalDataProvider extends
061: AbstractDataProvider implements TransactionalDataProvider {
062:
063: private transient ResourceBundle bundle = null;
064: /**
065: *
066: */
067: protected DataProvider provider;
068:
069: /**
070: *
071: * @param provider DataProvider
072: */
073: public void setDataProvider(DataProvider provider) {
074: if (this .provider != null) {
075: this .provider.removeDataListener(ears);
076: }
077: this .provider = provider;
078: this .provider.addDataListener(ears);
079: changeMap.clear();
080: fireProviderChanged();
081: }
082:
083: /**
084: * <p>Return the resource bundle containing our localized messages.</p>
085: */
086: private ResourceBundle getBundle() {
087:
088: if (bundle == null) {
089: bundle = ResourceBundle
090: .getBundle("com/sun/data/provider/impl/Bundle");
091: }
092: return bundle;
093:
094: }
095:
096: /**
097: *
098: * @return DataProvider
099: */
100: public DataProvider getDataProvider() {
101: return provider;
102: }
103:
104: /** {@inheritDoc} */
105: public FieldKey[] getFieldKeys() throws DataProviderException {
106: if (provider == null) {
107: return FieldKey.EMPTY_ARRAY;
108: }
109: return provider.getFieldKeys();
110: }
111:
112: /** {@inheritDoc} */
113: public FieldKey getFieldKey(String fieldId)
114: throws DataProviderException {
115: if (provider == null) {
116: throw new DataProviderException(getBundle().getString(
117: "NO_DATAPROVIDER_SET"));
118: }
119: return provider.getFieldKey(fieldId);
120: }
121:
122: /**
123: *
124: * @param fieldKey FieldKey
125: * @return Class
126: */
127: public Class getType(FieldKey fieldKey)
128: throws DataProviderException {
129: if (provider == null) {
130: throw new DataProviderException(getBundle().getString(
131: "arbitraryCharData"));
132: }
133: return provider.getType(fieldKey);
134: }
135:
136: /** {@inheritDoc} */
137: public Object getValue(FieldKey fieldKey)
138: throws DataProviderException {
139: if (provider == null) {
140: throw new DataProviderException(getBundle().getString(
141: "NO_DATAPROVIDER_SET"));
142: }
143: if (changeMap.containsKey(fieldKey)) {
144: return changeMap.get(fieldKey);
145: }
146: return provider.getValue(fieldKey);
147: }
148:
149: /** {@inheritDoc} */
150: public boolean isReadOnly(FieldKey fieldKey)
151: throws DataProviderException {
152: if (provider == null) {
153: throw new DataProviderException(getBundle().getString(
154: "NO_DATAPROVIDER_SET"));
155: }
156: return provider.isReadOnly(fieldKey);
157: }
158:
159: /** {@inheritDoc} */
160: public void setValue(FieldKey fieldKey, Object value)
161: throws DataProviderException {
162: if (provider == null) {
163: throw new DataProviderException(getBundle().getString(
164: "NO_DATAPROVIDER_SET"));
165: }
166: if (provider.isReadOnly(fieldKey)) {
167: throw new DataProviderException(getBundle().getString(
168: "FK_READ_ONLY"));
169: }
170: Object oldValue = getValue(fieldKey);
171: changeMap.put(fieldKey, value);
172: fireValueChanged(fieldKey, oldValue, value);
173: }
174:
175: /**
176: *
177: */
178: protected HashMap changeMap = new HashMap();
179:
180: /**
181: *
182: */
183: public void commitChanges() throws DataProviderException {
184: Iterator i = changeMap.keySet().iterator();
185: while (i.hasNext()) {
186: FieldKey key = (FieldKey) i.next();
187: provider.setValue(key, changeMap.get(key));
188: }
189: changeMap.clear();
190: fireChangesCommitted();
191: }
192:
193: /**
194: *
195: */
196: public void revertChanges() throws DataProviderException {
197: changeMap.clear();
198: fireChangesReverted();
199: fireProviderChanged();
200: }
201:
202: // ----------------------------------------------------------- Event Methods
203:
204: /** {@inheritDoc} */
205: public void addTransactionalDataListener(TransactionalDataListener l) {
206: super .addDataListener(l);
207: }
208:
209: /** {@inheritDoc} */
210: public void removeTransactionalDataListener(
211: TransactionalDataListener l) {
212: super .removeDataListener(l);
213: }
214:
215: /** {@inheritDoc} */
216: public TransactionalDataListener[] getTransactionalDataListeners() {
217: if (dpListeners == null) {
218: return new TransactionalDataListener[0];
219: } else {
220: ArrayList cdpList = new ArrayList();
221: for (int i = 0; i < dpListeners.length; i++) {
222: if (dpListeners[i] instanceof TransactionalDataListener) {
223: cdpList.add(dpListeners[i]);
224: }
225: }
226: return (TransactionalDataListener[]) cdpList
227: .toArray(new TransactionalDataListener[cdpList
228: .size()]);
229: }
230: }
231:
232: /**
233: * Fires a changesCommtted event to each registered {@link
234: * TransactionalDataListener}
235: *
236: * @see TransactionalDataListener#changesCommitted(TransactionalDataProvider)
237: */
238: protected void fireChangesCommitted() {
239: TransactionalDataListener[] cdls = getTransactionalDataListeners();
240: for (int i = 0; i < cdls.length; i++) {
241: cdls[i].changesCommitted(this );
242: }
243: }
244:
245: /**
246: * Fires a changesReverted event to each registered {@link
247: * TransactionalDataListener}
248: *
249: * @see TransactionalDataListener#changesReverted(TransactionalDataProvider)
250: */
251: protected void fireChangesReverted() {
252: TransactionalDataListener[] cdls = getTransactionalDataListeners();
253: for (int i = 0; i < cdls.length; i++) {
254: cdls[i].changesReverted(this );
255: }
256: }
257:
258: /**
259: *
260: */
261: protected DataListener ears = new DataListener() {
262: public void valueChanged(DataProvider provider,
263: FieldKey fieldKey, Object oldValue, Object newValue) {
264: fireValueChanged(fieldKey, oldValue, newValue);
265: }
266:
267: public void providerChanged(DataProvider provider) {
268: fireProviderChanged();
269: }
270: };
271: }
|