APIdia Launch Partner
Top Description Inners Fields Constructors Methods
javax.sql.rowset.spi

public Class SyncFactory

Additional top-level class in compilation unit: ProviderImpl.

extends Object
Class Inheritance
Imports
java.util.logging.*, java.util.*, java.sql.*, javax.sql.*, java.io.FileInputStream, .InputStream, .IOException, .FileNotFoundException, javax.naming.*

The Service Provider Interface (SPI) mechanism that generates SyncProvider instances to be used by disconnected RowSet objects. The SyncProvider instances in turn provide the javax.sql.RowSetReader object the RowSet object needs to populate itself with data and the javax.sql.RowSetWriter object it needs to propagate changes to its data back to the underlying data source.

Because the methods in the SyncFactory class are all static, there is only one SyncFactory object per Java VM at any one time. This ensures that there is a single source from which a RowSet implementation can obtain its SyncProvider implementation.

1.0 Overview

The SyncFactory class provides an internal registry of available synchronization provider implementations (SyncProvider objects). This registry may be queried to determine which synchronization providers are available. The following line of code gets an enumeration of the providers currently registered.
    java.util.Enumeration e = SyncFactory.getRegisteredProviders();
All standard RowSet implementations must provide at least two providers: Note that the JDBC RowSet Implementations include the SyncProvider implementations RIOptimisticProvider and RIXmlProvider, which satisfy this requirement.

The SyncFactory class provides accessor methods to assist applications in determining which synchronization providers are currently registered with the SyncFactory.

Other methods let RowSet persistence providers be registered or de-registered with the factory mechanism. This allows additional synchronization provider implementations to be made available to RowSet objects at run time.

Applications can apply a degree of filtering to determine the level of synchronization that a SyncProvider implementation offers. The following criteria determine whether a provider is made available to a RowSet object:

  1. If a particular provider is specified by a RowSet object, and the SyncFactory does not contain a reference to this provider, a SyncFactoryException is thrown stating that the synchronization provider could not be found.
  2. If a RowSet implementation is instantiated with a specified provider and the specified provider has been properly registered, the requested provider is supplied. Otherwise a SyncFactoryException is thrown.
  3. If a RowSet object does not specify a SyncProvider implementation and no additional SyncProvider implementations are available, the reference implementation providers are supplied.

2.0 Registering SyncProvider Implementations

Both vendors and developers can register SyncProvider implementations using one of the following mechanisms.

Next, an application will register the JNDI context with the SyncFactory instance. This allows the SyncFactory to browse within the JNDI context looking for SyncProvider implementations.
   Hashtable appEnv = new Hashtable();
   appEnv.put(Context.INITIAL_CONTEXT_FACTORY, "CosNaming");
   appEnv.put(Context.PROVIDER_URL, "iiop://hostname/providers");
   Context ctx = new InitialContext(appEnv);

   SyncFactory.registerJNDIContext(ctx);
If a RowSet object attempts to obtain a MyProvider object, the SyncFactory will try to locate it. First it searches for it in the system properties, then it looks in the resource files, and finally it checks the JNDI context that has been set. The SyncFactory instance verifies that the requested provider is a valid extension of the SyncProvider abstract class and then gives it to the RowSet object. In the following code fragment, a new CachedRowSet object is created and initialized with env, which contains the binding to MyProvider.
   Hashtable env = new Hashtable();
   env.put(SyncFactory.ROWSET_SYNC_PROVIDER, "com.fred.providers.MyProvider");
   CachedRowSet crs = new com.sun.rowset.CachedRowSetImpl(env);
Further details on these mechanisms are available in the javax.sql.rowset.spi package specification.
Author
Jonathan Bruce
Since
1.5
See Also
javax.sql.rowset.spi.SyncProvider, javax.sql.rowset.spi.SyncFactoryException

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static class
SyncFactory.SyncFactoryHolder

Lazy initialization Holder class used by getSyncFactory

Field Summary

Modifier and TypeField and Description
private static String
private static boolean
debug

The internal debug switch.

private static Context
ic

The initial JNDI context where SyncProvider implementations can be stored and from which they can be invoked.

private static Hashtable<String, SyncProvider>
implementations

The registry of available SyncProvider implementations.

private static boolean
lazyJNDICtxRefresh

Internal switch indicating whether the JNDI namespace should be re-read.

private static int
providerImplIndex

Internal registry count for the number of providers contained in the registry.

private static String
ROWSET_PROPERTIES

The standard resource file name.

public static final String
ROWSET_SYNC_PROVIDER

The standard property-id for a synchronization provider implementation name.

public static final String
ROWSET_SYNC_PROVIDER_VERSION

The standard property-id for a synchronization provider implementation version tag.

public static final String
ROWSET_SYNC_VENDOR

The standard property-id for a synchronization provider implementation vendor name.

private static volatile Logger
rsLogger

The Logger object to be used by the SyncFactory.

private static String

Constructor Summary

AccessConstructor and Description
private
SyncFactory()

Creates a new SyncFactory object, which is the singleton instance.

Method Summary

Modifier and TypeMethod and Description
private static void
enumerateBindings(NamingEnumeration<?> bindings, Properties properties)

Scans each binding on JNDI context and determines if any binding is an instance of SyncProvider, if so, add this to the registry and continue to scan the current context using a re-entrant call to this method until all bindings have been enumerated.

public static SyncProvider

Returns:

a SyncProvider implementation
getInstance
(String
the unique identifier of the provider
providerID
)

Returns the SyncProvider instance identified by providerID.

public static Logger

Returns:

The Logger that has been specified for use by SyncProvider implementations
getLogger
()

Returns the logging object for applications to retrieve synchronization events posted by SyncProvider implementations.

private static String[]
getPropertyNames(boolean append)

Used by the parseProperties methods to disassemble each property tuple.

private static String[]
getPropertyNames(boolean append, String propertyIndex)

Disassembles each property and its associated value.

public static Enumeration<SyncProvider>

Returns:

Enumeration A enumeration of available synchronization providers that are registered with this Factory
getRegisteredProviders
()

Returns an Enumeration of currently registered synchronization providers.

public static SyncFactory

Returns:

the SyncFactory instance
getSyncFactory
()

Returns the SyncFactory singleton.

private static synchronized void
initJNDIContext()

Controls JNDI context initialization.

private static synchronized void
private static Properties
parseJNDIContext()

Parses the set JNDI Context and passes bindings to the enumerateBindings method when complete.

private static void
parseProperties(Properties p)

Internal handler for all standard property parsing.

public static synchronized void
registerProvider(String
A String object with the unique ID of the synchronization provider being registered
providerID
)

Adds the given synchronization provider to the factory register.

public static synchronized void
setJNDIContext(Context
a valid JNDI context
ctx
)

Sets the initial JNDI context from which SyncProvider implementations can be retrieved from a JNDI namespace

public static void
setLogger(Logger
A Logger object instance
logger
)

Sets the logging object to be used by the SyncProvider implementation provided by the SyncFactory.

public static void
setLogger(Logger
a Logger object instance
logger
,
Level
a Level object instance indicating the degree of logging required
level
)

Sets the logging object that is used by SyncProvider implementations provided by the SyncFactory SPI.

private static void
showImpl(ProviderImpl impl)

Internal debug method that outputs the registry contents.

public static synchronized void
unregisterProvider(String
The unique-id of the synchronization provider
providerID
)

Removes the designated currently registered synchronization provider from the Factory SPI register.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

colonback to summary
private static String colon
debugback to summary
private static boolean debug

The internal debug switch.

icback to summary
private static Context ic

The initial JNDI context where SyncProvider implementations can be stored and from which they can be invoked.

implementationsback to summary
private static Hashtable<String, SyncProvider> implementations

The registry of available SyncProvider implementations. See section 2.0 of the class comment for SyncFactory for an explanation of how a provider can be added to this registry.

lazyJNDICtxRefreshback to summary
private static boolean lazyJNDICtxRefresh

Internal switch indicating whether the JNDI namespace should be re-read.

providerImplIndexback to summary
private static int providerImplIndex

Internal registry count for the number of providers contained in the registry.

ROWSET_PROPERTIESback to summary
private static String ROWSET_PROPERTIES

The standard resource file name.

ROWSET_SYNC_PROVIDERback to summary
public static final String ROWSET_SYNC_PROVIDER

The standard property-id for a synchronization provider implementation name.

ROWSET_SYNC_PROVIDER_VERSIONback to summary
public static final String ROWSET_SYNC_PROVIDER_VERSION

The standard property-id for a synchronization provider implementation version tag.

ROWSET_SYNC_VENDORback to summary
public static final String ROWSET_SYNC_VENDOR

The standard property-id for a synchronization provider implementation vendor name.

rsLoggerback to summary
private static volatile Logger rsLogger

The Logger object to be used by the SyncFactory.

strFileSepback to summary
private static String strFileSep

Constructor Detail

SyncFactoryback to summary
private SyncFactory()

Creates a new SyncFactory object, which is the singleton instance. Having a private constructor guarantees that no more than one SyncProvider object can exist at a time.

Method Detail

enumerateBindingsback to summary
private static void enumerateBindings(NamingEnumeration<?> bindings, Properties properties) throws NamingException

Scans each binding on JNDI context and determines if any binding is an instance of SyncProvider, if so, add this to the registry and continue to scan the current context using a re-entrant call to this method until all bindings have been enumerated.

getInstanceback to summary
public static SyncProvider getInstance(String providerID) throws SyncFactoryException

Returns the SyncProvider instance identified by providerID.

Parameters
providerID:String

the unique identifier of the provider

Returns:SyncProvider

a SyncProvider implementation

Exceptions
SyncFactoryException:
If the SyncProvider cannot be found, the providerID is null, or some error was encountered when trying to invoke this provider.
getLoggerback to summary
public static Logger getLogger() throws SyncFactoryException

Returns the logging object for applications to retrieve synchronization events posted by SyncProvider implementations.

Returns:Logger

The Logger that has been specified for use by SyncProvider implementations

Exceptions
SyncFactoryException:
if no logging object has been set.
getPropertyNamesback to summary
private static String[] getPropertyNames(boolean append)

Used by the parseProperties methods to disassemble each property tuple.

getPropertyNamesback to summary
private static String[] getPropertyNames(boolean append, String propertyIndex)

Disassembles each property and its associated value. Also handles overloaded property names that contain indexes.

getRegisteredProvidersback to summary
public static Enumeration<SyncProvider> getRegisteredProviders() throws SyncFactoryException

Returns an Enumeration of currently registered synchronization providers. A RowSet implementation may use any provider in the enumeration as its SyncProvider object.

At a minimum, the reference synchronization provider allowing RowSet content data to be stored using a JDBC driver should be possible.

Returns:Enumeration<SyncProvider>

Enumeration A enumeration of available synchronization providers that are registered with this Factory

Exceptions
SyncFactoryException:
If an error occurs obtaining the registered providers
getSyncFactoryback to summary
public static SyncFactory getSyncFactory()

Returns the SyncFactory singleton.

Returns:SyncFactory

the SyncFactory instance

initJNDIContextback to summary
private static synchronized void initJNDIContext() throws SyncFactoryException

Controls JNDI context initialization.

Exceptions
SyncFactoryException:
if an error occurs parsing the JNDI context
initMapIfNecessaryback to summary
private static synchronized void initMapIfNecessary() throws SyncFactoryException
parseJNDIContextback to summary
private static Properties parseJNDIContext() throws NamingException

Parses the set JNDI Context and passes bindings to the enumerateBindings method when complete.

parsePropertiesback to summary
private static void parseProperties(Properties p)

Internal handler for all standard property parsing. Parses standard ROWSET properties and stores lazy references into the internal registry.

registerProviderback to summary
public static synchronized void registerProvider(String providerID) throws SyncFactoryException

Adds the given synchronization provider to the factory register. Guidelines are provided in the SyncProvider specification for the required naming conventions for SyncProvider implementations.

Synchronization providers bound to a JNDI context can be registered by binding a SyncProvider instance to a JNDI namespace.

SyncProvider p = new MySyncProvider();
InitialContext ic = new InitialContext();
ic.bind ("jdbc/rowset/MySyncProvider", p);
 
Furthermore, an initial JNDI context should be set with the SyncFactory using the setJNDIContext method. The SyncFactory leverages this context to search for available SyncProvider objects bound to the JNDI context and its child nodes.
Parameters
providerID:String

A String object with the unique ID of the synchronization provider being registered

Exceptions
SyncFactoryException:
if an attempt is made to supply an empty or null provider name
See Also
setJNDIContext
setJNDIContextback to summary
public static synchronized void setJNDIContext(Context ctx) throws SyncFactoryException

Sets the initial JNDI context from which SyncProvider implementations can be retrieved from a JNDI namespace

Parameters
ctx:Context

a valid JNDI context

Exceptions
SyncFactoryException:
if the supplied JNDI context is null
setLoggerback to summary
public static void setLogger(Logger logger)

Sets the logging object to be used by the SyncProvider implementation provided by the SyncFactory. All SyncProvider implementations can log their events to this object and the application can retrieve a handle to this object using the getLogger method.

Parameters
logger:Logger

A Logger object instance

Exceptions
NullPointerException:
if the logger is null
setLoggerback to summary
public static void setLogger(Logger logger, Level level)

Sets the logging object that is used by SyncProvider implementations provided by the SyncFactory SPI. All SyncProvider implementations can log their events to this object and the application can retrieve a handle to this object using the getLogger method.

Parameters
logger:Logger

a Logger object instance

level:Level

a Level object instance indicating the degree of logging required

Exceptions
NullPointerException:
if the logger is null
showImplback to summary
private static void showImpl(ProviderImpl impl)

Internal debug method that outputs the registry contents.

unregisterProviderback to summary
public static synchronized void unregisterProvider(String providerID) throws SyncFactoryException

Removes the designated currently registered synchronization provider from the Factory SPI register.

Parameters
providerID:String

The unique-id of the synchronization provider

Exceptions
SyncFactoryException:
If an attempt is made to unregister a SyncProvider implementation that was not registered.
javax.sql.rowset.spi back to summary

private Class SyncFactory.SyncFactoryHolder

extends Object
Class Inheritance

Lazy initialization Holder class used by getSyncFactory

Field Summary

Modifier and TypeField and Description
pack-priv static final SyncFactory

Constructor Summary

AccessConstructor and Description
private

Method Summary

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

factoryback to summary
pack-priv static final SyncFactory factory

Constructor Detail

SyncFactoryHolderback to summary
private SyncFactoryHolder()