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.sql.rowset.providers;
043:
044: import java.io.*;
045: import java.util.Locale;
046: import java.util.ResourceBundle;
047: import javax.sql.*;
048:
049: import javax.sql.rowset.spi.*;
050:
051: import com.sun.sql.rowset.internal.*;
052:
053: /**
054: * An implemenation of based on Sun's reference implementation of RIOptimisticProvider.
055: *
056: * @see javax.sql.rowset.spi.SyncProvider
057: * @see javax.sql.rowset.spi.SyncProviderException
058: * @see javax.sql.rowset.spi.SyncFactory
059: * @see javax.sql.rowset.spi.SyncFactoryException
060: *
061: */
062: public final class RIOptimisticProvider extends SyncProvider implements
063: Serializable {
064:
065: private static ResourceBundle rb = ResourceBundle.getBundle(
066: "com.sun.sql.rowset.providers.Bundle", Locale.getDefault()); // NOI18N
067:
068: private CachedRowSetXReader reader;
069: private CachedRowSetXWriter writer;
070:
071: /**
072: * The unique provider indentifier.
073: */
074: private String providerID = "com.sun.rowset.providers.RIOptimisticProvider"; //NOI18N
075:
076: /**
077: * The vendor name of this SyncProvider implementation
078: */
079: private String vendorName = "Sun Microsystems Inc."; //NOI18N
080:
081: /**
082: * The version number of this SyncProvider implementation
083: */
084: private String versionNumber = "1.0"; //NOI18N
085:
086: /**
087: * Creates an <code>RIOptimisticProvider</code> object initialized with the
088: * fully qualified class name of this <code>SyncProvider</code> implementation
089: * and a default reader and writer.
090: * <P>
091: * This provider is available to all disconnected <code>RowSet</code> implementations
092: * as the default persistence provider.
093: */
094: public RIOptimisticProvider() {
095: providerID = this .getClass().getName();
096: reader = new CachedRowSetXReader();
097: writer = new CachedRowSetXWriter();
098: }
099:
100: /**
101: * Returns the <code>'javax.sql.rowset.providers.RIOptimisticProvider'</code>
102: * provider identification string.
103: *
104: * @return String Provider ID of this persistence provider
105: */
106: public String getProviderID() {
107: return providerID;
108: }
109:
110: /**
111: * Returns the <code>javax.sql.RowSetWriter</code> object for this
112: * <code>RIOptimisticProvider</code> object. This is the writer that will
113: * write changes made to the <code>Rowset</code> object back to the data source.
114: *
115: * @return the <code>javax.sql.RowSetWriter</code> object for this
116: * <code>RIOptimisticProvider</code> object
117: */
118: public RowSetWriter getRowSetWriter() {
119: try {
120: writer.setReader(reader);
121: } catch (java.sql.SQLException e) {
122: }
123: return writer;
124: }
125:
126: /**
127: * Returns the <code>javax.sql.RowSetReader</code> object for this
128: * <code>RIOptimisticProvider</code> object. This is the reader that will
129: * populate a <code>RowSet</code> object using this <code>RIOptimisticProvider</code>.
130: *
131: * @return the <code>javax.sql.RowSetReader</code> object for this
132: * <code>RIOptimisticProvider</code> object
133: */
134: public RowSetReader getRowSetReader() {
135: return reader;
136: }
137:
138: /**
139: * Returns the <code>SyncProvider</code> grade of synchronization that
140: * <code>RowSet</code> objects can expect when using this
141: * implementation. As an optimisic synchonization provider, the writer
142: * will only check rows that have been modified in the <code>RowSet</code>
143: * object.
144: */
145: public int getProviderGrade() {
146: return SyncProvider.GRADE_CHECK_MODIFIED_AT_COMMIT;
147: }
148:
149: /**
150: * Modifies the data source lock severity according to the standard
151: * <code>SyncProvider</code> classifications.
152: *
153: * @param datasource_lock An <code>int</code> indicating the level of locking to be
154: * set; must be one of the following constants:
155: * <PRE>
156: * SyncProvider.DATASOURCE_NO_LOCK,
157: * SyncProvider.DATASOURCE_ROW_LOCK,
158: * SyncProvider.DATASOURCE_TABLE_LOCK,
159: * SyncProvider.DATASOURCE_DB_LOCk
160: * </PRE>
161: * @throws SyncProviderException if the parameter specified is not
162: * <code>SyncProvider.DATASOURCE_NO_LOCK</code>
163: */
164: public void setDataSourceLock(int datasource_lock)
165: throws SyncProviderException {
166: if (datasource_lock != SyncProvider.DATASOURCE_NO_LOCK) {
167: throw new SyncProviderException(rb
168: .getString("LOCKING_CLASSIFICATION_NOT_SUPPORTED")); //NOI18N
169: }
170: }
171:
172: /**
173: * Returns the active data source lock severity in this
174: * reference implementation of the <code>SyncProvider</code>
175: * abstract class.
176: *
177: * @return <code>SyncProvider.DATASOURCE_NO_LOCK</code>.
178: * The reference implementation does not support data source locks.
179: */
180: public int getDataSourceLock() throws SyncProviderException {
181: return SyncProvider.DATASOURCE_NO_LOCK;
182: }
183:
184: /**
185: * Returns the supported updatable view abilities of the
186: * reference implementation of the <code>SyncProvider</code>
187: * abstract class.
188: *
189: * @return <code>SyncProvider.NONUPDATABLE_VIEW_SYNC</code>. The
190: * the reference implementation does not support updating tables
191: * that are the source of a view.
192: */
193: public int supportsUpdatableView() {
194: return SyncProvider.NONUPDATABLE_VIEW_SYNC;
195: }
196:
197: /**
198: * Returns the release version ID of the Reference Implementation Optimistic
199: * Synchronization Provider.
200: *
201: * @return the <code>String</code> detailing the version number of this SyncProvider
202: */
203: public String getVersion() {
204: return this .versionNumber;
205: }
206:
207: /**
208: * Returns the vendor name of the Reference Implemntation Optimistic
209: * Syncchronication Provider
210: *
211: * @return the <code>String</code> detailing the vendor name of this
212: * SyncProvider
213: */
214: public String getVendor() {
215: return this.vendorName;
216: }
217: }
|