ModeShape Distribution 3.3.0.Final

org.modeshape.jcr.federation.spi
Class Connector

java.lang.Object
  extended by org.modeshape.jcr.federation.spi.Connector
Direct Known Subclasses:
ReadOnlyConnector, WritableConnector

public abstract class Connector
extends Object

SPI of a generic external connector, representing the interface to an external system integrated with ModeShape. Since it is expected that the documents are well formed (structure-wise), the FederatedDocumentWriter class should be used. This is the base class for WritableConnector and ReadOnlyConnector which is what connector implementations are expected to implement.


Nested Class Summary
 class Connector.ExtraProperties
           
 
Constructor Summary
Connector()
          Ever connector is expected to have a no-argument constructor, although the class should never initialize any of the data at this time.
 
Method Summary
protected  void checkFieldNotNull(Object fieldValue, String fieldName)
          Utility method that checks whether the field with the supplied name is set.
protected  Connector.ExtraProperties extraPropertiesFor(String id, boolean update)
           
protected  ExtraPropertiesStore extraPropertiesStore()
          Get the "extra" properties store.
protected  ValueFactories factories()
          Get the set of value factory objects that the connector can use to create property value objects.
 ExternalBinaryValue getBinaryValue(String id)
          Returns a binary value which is connector specific and which is never stored by ModeShape.
 Integer getCacheTtlSeconds()
          Returns the default value, for this connector, of the maximum number of seconds an external document should be stored in the workspace cache.
 Document getChildReference(String parentKey, String childKey)
          Returns a document representing a single child reference from the supplied parent to the supplied child.
 ExecutionContext getContext()
          Get the execution context for this connector instance.
abstract  Document getDocumentById(String id)
          Returns a Document instance representing the document with a given id.
abstract  String getDocumentId(String path)
          Returns the id of an external node located at the given path.
abstract  Collection<String> getDocumentPathsById(String id)
          Return the path(s) of the external node with the given identifier.
 Logger getLogger()
          Get the logger for this connector instance.
 MimeTypeDetector getMimeTypeDetector()
          Get the MIME type detector for this connector instance.
 String getRepositoryName()
          Get the name of the repository.
 String getSourceName()
          Returns the name of the source which this connector interfaces with.
protected  TransactionManager getTransactionManager()
          Returns the transaction manager instance that was set on the connector during initialization.
abstract  boolean hasDocument(String id)
          Checks if a document with the given id exists in the end-source.
 void initialize(NamespaceRegistry registry, NodeTypeManager nodeTypeManager)
          Initialize the connector.
 Boolean isQueryable()
          Indicates if content exposed by this connector should be indexed by the repository or not.
abstract  boolean isReadonly()
          Indicates if the connector instance has been configured in read-only mode.
protected  Name nameFrom(String nameString)
          Helper method that creates a Name object from a string, using no decoding.
protected  Name nameFrom(String namespaceUri, String localName)
          Create a name from the given namespace URI and local name.
protected  Name nameFrom(String namespaceUri, String localName, TextDecoder decoder)
          Create a name from the given namespace URI and local name.
protected  Document newChildReference(String childId, String childName)
          Obtain a new child reference document that is useful in the getChildReference(String, String) method.
protected  ConnectorChangeSet newConnectorChangedSet()
           
protected  DocumentWriter newDocument(String id)
          Obtain a new DocumentWriter that can be used to construct a document, typically within the getDocumentById(String) method.
abstract  String newDocumentId(String parentId, Name newDocumentName, Name newDocumentPrimaryType)
          Generates an identifier which will be assigned when a new document (aka. child) is created under an existing document (aka.parent).
protected  PageWriter newPageDocument(PageKey pageKey)
          Obtain a new PageWriter that can be used to construct a page of children, typically within the Pageable.getChildren(PageKey) method.
protected  PathFactory pathFactory()
           
protected  Path pathFrom(Path parentPath, String childPath)
          Helper method that creates a Path object from a parent path and a child path string.
protected  Path pathFrom(String path)
          Helper method that creates a Path object from a string.
protected  PropertyFactory propertyFactory()
           
protected  DocumentReader readDocument(Document document)
          Obtain a new DocumentReader that can be used to read an existing document, typically used within the storeDocument(Document) and updateDocument(DocumentChanges) methods.
abstract  boolean removeDocument(String id)
          Removes the document with the given id.
protected  void setExtraPropertiesStore(ExtraPropertiesStore customExtraPropertiesStore)
          Method that can be called by a connector during initialization if it wants to provide its own implementation of an "extra" properties store.
 void shutdown()
          Shutdown the connector by releasing all resources.
abstract  void storeDocument(Document document)
          Stores the given document.
protected  DocumentTranslator translator()
           
abstract  void updateDocument(DocumentChanges documentChanges)
          Updates a document using the provided changes.
protected  DocumentWriter writeDocument(Document document)
          Obtain a new DocumentWriter that can be used to update a document.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

Connector

public Connector()
Ever connector is expected to have a no-argument constructor, although the class should never initialize any of the data at this time. Instead, all initialization should be performed in the initialize(javax.jcr.NamespaceRegistry, org.modeshape.jcr.api.nodetype.NodeTypeManager) method.

Method Detail

getSourceName

public String getSourceName()
Returns the name of the source which this connector interfaces with.

Returns:
a non-null string.

getRepositoryName

public final String getRepositoryName()
Get the name of the repository.

Returns:
the repository name; never null

getLogger

public final Logger getLogger()
Get the logger for this connector instance. This is available for use in or after the initialize(NamespaceRegistry, NodeTypeManager) method.

Returns:
the logger; never null

getContext

public ExecutionContext getContext()
Get the execution context for this connector instance. This is available for use in or after the initialize(NamespaceRegistry, NodeTypeManager) method.

Returns:
the context; never null

getMimeTypeDetector

public MimeTypeDetector getMimeTypeDetector()
Get the MIME type detector for this connector instance. This is available for use in or after the initialize(NamespaceRegistry, NodeTypeManager) method.

Returns:
the MIME type detector; never null

getCacheTtlSeconds

public Integer getCacheTtlSeconds()
Returns the default value, for this connector, of the maximum number of seconds an external document should be stored in the workspace cache.

Returns:
an Integer value. If null, it means that no special value is configured and the default workspace cache configuration will be used. If negative, it means an entry will be cached forever.

isQueryable

public Boolean isQueryable()
Indicates if content exposed by this connector should be indexed by the repository or not.

Returns:
true if the content should be indexed, false otherwise.

extraPropertiesFor

protected Connector.ExtraProperties extraPropertiesFor(String id,
                                                       boolean update)

extraPropertiesStore

protected ExtraPropertiesStore extraPropertiesStore()
Get the "extra" properties store. Connectors can directly use this, although it's probably easier to create an Connector.ExtraProperties object for each node and use it to add, remove and then store or update the extra properties in the extra properties store.

Returns:
the storage for extra properties; never null

setExtraPropertiesStore

protected void setExtraPropertiesStore(ExtraPropertiesStore customExtraPropertiesStore)
Method that can be called by a connector during initialization if it wants to provide its own implementation of an "extra" properties store.

Parameters:
customExtraPropertiesStore - the custom implementation of the ExtraPropertiesStore; may not be null

getTransactionManager

protected TransactionManager getTransactionManager()
Returns the transaction manager instance that was set on the connector during initialization.

Returns:
a non-null TransactionManager instance

initialize

public void initialize(NamespaceRegistry registry,
                       NodeTypeManager nodeTypeManager)
                throws RepositoryException,
                       IOException
Initialize the connector. This is called automatically by ModeShape once for each Connector instance, and should not be called by the connector. By the time this method is called, ModeShape will hav already set the context, logger, name, and repositoryName plus any fields that match configuration properties for the connector.

By default this method does nothing, so it should be overridden by implementations to do a one-time initialization of any internal components. For example, connectors can use the supplied registry and nodeTypeManager objects to register custom namesapces and node types required by the external content.

This is an excellent place for connector to validate the connector-specific fields set by ModeShape via reflection during instantiation.

Parameters:
registry - the namespace registry that can be used to register custom namespaces; never null
nodeTypeManager - the node type manager that can be used to register custom node types; never null
Throws:
RepositoryException - if operations on the NamespaceRegistry or NodeTypeManager fail
IOException - if any stream based operations fail (like importing cnd files)

shutdown

public void shutdown()
Shutdown the connector by releasing all resources. This is called automatically by ModeShape when this Connector instance is no longer needed, and should never be called by the connector.


getDocumentById

public abstract Document getDocumentById(String id)
Returns a Document instance representing the document with a given id. The document should have a "proper" structure for it to be usable by ModeShape.

Parameters:
id - a non-null string
Returns:
either an Document instance or null

getDocumentId

public abstract String getDocumentId(String path)
Returns the id of an external node located at the given path.

Parameters:
path - a non-null string representing an exeternal path.
Returns:
either the id of the document or null

getDocumentPathsById

public abstract Collection<String> getDocumentPathsById(String id)
Return the path(s) of the external node with the given identifier. The resulting paths are from the point of view of the connector. For example, the "root" node exposed by the connector wil have a path of "/".

Parameters:
id - a non-null string
Returns:
the connector-specific path(s) of the node, or an empty document if there is no such document; never null

isReadonly

public abstract boolean isReadonly()
Indicates if the connector instance has been configured in read-only mode.

Returns:
true if the connector has been configured in read-only mode, false otherwise.

getChildReference

public Document getChildReference(String parentKey,
                                  String childKey)
Returns a document representing a single child reference from the supplied parent to the supplied child. This method is called when there are an unknown number of children on a node.

This method should be implemented and will be called if and only if a connector uses paging and specifies an unknown number of children in the PageWriter.addPage(String, int, long, long) or PageWriter.addPage(String, String, long, long) methods.

Parameters:
parentKey - the key for the parent
childKey - the key for the child
Returns:
the document representation of a child reference, of null if the parent does not contain a child with the given key

getBinaryValue

public ExternalBinaryValue getBinaryValue(String id)
Returns a binary value which is connector specific and which is never stored by ModeShape. Connectors who need this feature must return an object that is an instance of a subclasses of ExternalBinaryValue, either UrlBinaryValue or a custom subclass with connector-specific information.

Normally, the getDocumentById(String) method implementation will set binary values on properties of nodes, which should create the same ExternalBinaryValue subclass that is returned by this method. The ExternalBinaryValue.getId() value from that instance will be passed into this method.

Parameters:
id - a String representing the identifier of the external binary which should have connector-specific meaning. This identifier need not be the SHA-1 hash of the content.
Returns:
either a binary value implementation or null if there is no such value with the given id.

removeDocument

public abstract boolean removeDocument(String id)
Removes the document with the given id.

Parameters:
id - a non-null string.
Returns:
true if the document was removed, or false if there was no document with the given id

hasDocument

public abstract boolean hasDocument(String id)
Checks if a document with the given id exists in the end-source.

Parameters:
id - a non-null string.
Returns:
true if such a document exists, false otherwise.

storeDocument

public abstract void storeDocument(Document document)
Stores the given document.

Parameters:
document - a non-null Document instance.
Throws:
DocumentAlreadyExistsException - if there is already a new document with the same identifier
DocumentNotFoundException - if one of the modified documents was removed by another session

updateDocument

public abstract void updateDocument(DocumentChanges documentChanges)
Updates a document using the provided changes.

Parameters:
documentChanges - a non-null DocumentChanges object which contains granular information about all the changes.

newDocumentId

public abstract String newDocumentId(String parentId,
                                     Name newDocumentName,
                                     Name newDocumentPrimaryType)
Generates an identifier which will be assigned when a new document (aka. child) is created under an existing document (aka.parent). This method should be implemented only by connectors which support writing.

Parameters:
parentId - a non-null String which represents the identifier of the parent under which the new document will be created.
newDocumentName - a non-null Name which represents the name that will be given to the child document
newDocumentPrimaryType - a non-null Name which represents the child document's primary type.
Returns:
either a non-null String which will be assigned as the new identifier, or null which means that no "special" id format is required. In this last case, the repository will auto-generate a random id.
Throws:
DocumentStoreException - if the connector is readonly.

checkFieldNotNull

protected void checkFieldNotNull(Object fieldValue,
                                 String fieldName)
                          throws RepositoryException
Utility method that checks whether the field with the supplied name is set.

Parameters:
fieldValue - the value of the field
fieldName - the name of the field
Throws:
RepositoryException - if the field value is null

translator

protected DocumentTranslator translator()

readDocument

protected DocumentReader readDocument(Document document)
Obtain a new DocumentReader that can be used to read an existing document, typically used within the storeDocument(Document) and updateDocument(DocumentChanges) methods.

Parameters:
document - the document that should be read; may not be null
Returns:
the document reader; never null

newDocument

protected DocumentWriter newDocument(String id)
Obtain a new DocumentWriter that can be used to construct a document, typically within the getDocumentById(String) method.

Parameters:
id - the identifier of the document; may not be null
Returns:
the document writer; never null

writeDocument

protected DocumentWriter writeDocument(Document document)
Obtain a new DocumentWriter that can be used to update a document.

Parameters:
document - the document that should be updated; may not be null
Returns:
the document writer; never null

newPageDocument

protected PageWriter newPageDocument(PageKey pageKey)
Obtain a new PageWriter that can be used to construct a page of children, typically within the Pageable.getChildren(PageKey) method.

Parameters:
pageKey - the key for the page; may not be null
Returns:
the page writer; never null

newChildReference

protected Document newChildReference(String childId,
                                     String childName)
Obtain a new child reference document that is useful in the getChildReference(String, String) method.

Parameters:
childId - the ID of the child node; may not be null
childName - the name of the child node; may not be null
Returns:
the child reference document; never null

factories

protected final ValueFactories factories()
Get the set of value factory objects that the connector can use to create property value objects.

Returns:
the collection of factories; never null

propertyFactory

protected final PropertyFactory propertyFactory()

pathFactory

protected final PathFactory pathFactory()

pathFrom

protected final Path pathFrom(String path)
Helper method that creates a Path object from a string. This is equivalent to calling " pathFactory().create(path)", and is simply provided for convenience.

Parameters:
path - the string from which the path is to be created
Returns:
the value, or null if the supplied string is null
Throws:
ValueFormatException - if the conversion from a string could not be performed
See Also:
ValueFactory.create(String), pathFrom(Path, String)

pathFrom

protected final Path pathFrom(Path parentPath,
                              String childPath)
Helper method that creates a Path object from a parent path and a child path string. This is equivalent to calling " pathFactory().create(parentPath,childPath)", and is simply provided for convenience.

Parameters:
parentPath - the parent path
childPath - the child path as a string
Returns:
the value, or null if the supplied string is null
Throws:
ValueFormatException - if the conversion from a string could not be performed
See Also:
ValueFactory.create(String), pathFrom(String)

nameFrom

protected final Name nameFrom(String nameString)
Helper method that creates a Name object from a string, using no decoding. This is equivalent to calling " factories().getNameFactory().create(nameString)", and is simply provided for convenience.

Parameters:
nameString - the string from which the name is to be created
Returns:
the value, or null if the supplied string is null
Throws:
ValueFormatException - if the conversion from a string could not be performed
See Also:
ValueFactory.create(String, TextDecoder), NameFactory.create(String, String, TextDecoder), NameFactory.create(String, String), nameFrom(String, String), nameFrom(String, String, TextDecoder)

nameFrom

protected final Name nameFrom(String namespaceUri,
                              String localName)
Create a name from the given namespace URI and local name. This is equivalent to calling " factories().getNameFactory().create(namespaceUri,localName)", and is simply provided for convenience.

Parameters:
namespaceUri - the namespace URI
localName - the local name
Returns:
the new name
Throws:
IllegalArgumentException - if the local name is null or empty
See Also:
ValueFactory.create(String, TextDecoder), NameFactory.create(String, String, TextDecoder), NameFactory.create(String, String), nameFrom(String), nameFrom(String, String, TextDecoder)

nameFrom

protected final Name nameFrom(String namespaceUri,
                              String localName,
                              TextDecoder decoder)
Create a name from the given namespace URI and local name. This is equivalent to calling " factories().getNameFactory().create(namespaceUri,localName,decoder)", and is simply provided for convenience.

Parameters:
namespaceUri - the namespace URI
localName - the local name
decoder - the decoder that should be used to decode the qualified name
Returns:
the new name
Throws:
IllegalArgumentException - if the local name is null or empty
See Also:
NameFactory.create(String, String, TextDecoder), ValueFactory.create(String, TextDecoder), NameFactory.create(String, String, TextDecoder), NameFactory.create(String, String), nameFrom(String), nameFrom(String, String)

newConnectorChangedSet

protected ConnectorChangeSet newConnectorChangedSet()
Returns:
a fresh ConnectorChangeSet for use in recording changes

ModeShape Distribution 3.3.0.Final

Copyright © 2008-2013 JBoss, a division of Red Hat. All Rights Reserved.