fixed logic wrt localID and docid. Implemented new method in IdentifierManager to getAllGUIDs from identifier table for implementation of loadAllKeys in ObjectPathMapLoader.
further development of ObjectPathMapLoader.
new class for refreshing the hazelcast map with metacat. Initial commit.
check session != null before checking authorization
Add stub methods in CNodeService that implement the Hazelcast EntryListener interface: entryAdded(), entryRemoved(), entryUpdated(), and entryEvicted(). Add a listener to the hzSystemMetadata map so the CNodeService can respond to those events and create appropriate CNReplicationTask objects for distributed execution across the CN cluster. Again, stubs only so far.
Minor cleanup - tabs to spaces.
Enable CNodeService to access 1) the hzNodes map defined in the DataONE process cluster by becoming a Hazelcast client (hzClient) to that cluster and 2) the hzSystemMetadata map defined in the DataONE storage cluster by becoming a member to that cluster (using direct Hazelcast calls). Added fields for maintaining the DataONE cluster properties.
Add in the Hazelcast Id generation namespace and an IdGenerator instance for task ids. Hazelcast will produce cluster-wide unique ids for the "task-ids" namespace, to be used when creating CNreplicationTask objects.
Add a CNReplicationTask class that will be submitted to the CN storage cluster when there are changes to the object store involving system metadata, science metadata, and resource maps. When a new entry is added to the hzSystemMetadata map, a new data, science metadata, or resource map was added to the VO, and all CN cluster members need to be updated with the object and it's system metadata. This task is executed on each CN to replicate the information. If the event is an update to an existing system metadata entry, it may only involve a change to system metadata, or may involve a change to science metadata as well. The task will return with the PID of the object replicated, be it a sysmeta, scimeta, or resource object. Locking of the PID will be handled by the task.
Catch D1nodeService up to the DataONE 0.6.4 schema where there is no ObjectFormat.isScienceMetadata() method, but rather ObjectFormat.getFormatType() where type is currently one of 'DATA, 'METADATA', or 'RESOURCE'.
Modify HazelcastService to read configuration information from an on-disk file (not from a jar file). Added init() to start up the service (was calling doRefresh() before. We still need to decide if this is a refreshable service.
move HazelcastService to D1 package
changes for schema update (d1_common)
added HazelCast MapStore and MapLoader implementation for SystemMetadata
use InvalidRequest when the PID is not found. https://redmine.dataone.org/issues/1768
use Permission.REPLICATE not EXECUTE
check with the CN if replication is allowed for the object in question for getReplica()
add getReplica() implementation. same as get() but with different logging. seems silly, but maybe I missed something important that distinguishes this method.
Update classes to use the DataONE 0.6.4 schema and types. Major changes involve using BigInteger vs long in SystemMetadata.size, and using ObjectFormatIdentifier rather than Object format.
Insert system metadata after the data object is inserted.
latest D1 jars - changes include:updateSystemMetadata() impl for CNnew identifier methods (generate is its own method)removal of the resourceMap pointer from system metadata
Update the d1 common java jar to include the changes to BaseException, and update MNodeService.synchronizationFailed() to use the BaseException.getNodeId() method to report which node the exception came from.
use correct enum method
refactor Constants
remove ServiceTypeUtil - replace with TypeMarshaller
use new "v1" types from DataONE
remove CrudService -- replaced by MNodeService and CNodeService
use the ObjectFormat Id (not toString()) to check against the configured science metadata formats
Return the new pid (not the obsoleted pid) on update(), and set the correct system metadata.
In D1NodeService.getLogRecords(), don't pass in null start and count params - set them to the defaults (0 and 1000).
In MNodeService.getCapabilities(), update the properties to match those in metacat.properties. Flesh out the NodeHealth object, adding NodeState, Ping, and Status information. Flesh out the Synchronization object information, but for now, use mock values. TODO: This should be determined from configuration and on-the-fly information.
In MNodeService.getCapabilities(), set the synchronization and replication properties of the node.
In MNodeService.getCapabilities(), set the serviceAvailable for each service supported.
In MNodeService.getCapabilities(), set the serviceVersion for each service supported.
check reservation before create/update
Use D1 properties to set node values, and add the 'WAR VERSION' back into the node name for deployments.
add hasReservation() method (NotImplemented, however)
use objectFormatIdentifier for listObjects()remove provisional system metadata indicator - Metacat will not implement reserveIdentifier()
consistently construct username/groups for MetacatHandler calls - also consistently call isAuthorized
provisional replicate() implementation -- does not check if the session's subject is "allowed" to do this.the test also requires 2 servers -- right now it attempts to replicate with itself which will fail because of duplicate IDs
provisional version of getOperationStatistics() -- not clear if we are meant to aggregate by hour or by day
provisional getCapabilities() implementation. Much of the synchronization information and node health is omitted.
simplify the get() method -- no need to use temp files for this operation
implement d1 paging for the log record results
save systemmetadata when create() is called
allow very minimal system metadata for provisional entries (CN.reserveIdentifier)
Fix a NullPointerException issue when the SubjectList in a Session is null.
Add the missing URL delimiter when building the D1 base service URL.
allow the test to read the OFL docid
use docImpl getBytes() to preserve encodingno need to catch an exception only to throw it (those I was playing around with looking up the fmt from the d1_common lib if it was not found on the server...but this is redundant with other client code)
remove resolve() test -- not implemented in Metacat
handle data objects (not sci meta) and also set the resulting pid so that create() can succeed
catch exceptions from system meta data query and throw service failure rather than swallowing them with an error msg
Update getOperationStatistics() to reflect the change in the signature, using ObjectFormatIdentifier instead of ObjectFormat.
use super class' create() methoduse string comparison for assertRelation method
beef up isAuthorized method to check for "public" access rules and also for the rights holder
Use 'synchronization_failed' for the event string in synchronizationFailed(), and add a TODO to use the event enum when the 0.6.3 types are updated.
return all public objects for the search() method [for now]
add space to error message
add the old ecogrid query code (still commented out) from the old Rest handler
implement reserveIdentifier() and check whether the id is reserved when creating records (only allow the create when the Subject creating matches the Subject who reserved it -- currently stored in rightsHolder)
remove extraneous update() call when create() does the call for us
Add placeholder NotImplemented exceptions for getOperationsStatistics() and getCapabilities() in MNodeService.
Implement MNCore.ping() by testing for a successful database connection.
Minor housekeeping - tabs to spaces.
Implement update() in MNodeService. Handle both XML science metadata updates and data object updates. Keep system metadata up to date, and log the update event.
Make isScienceMetadata() protected for access from subclasses.
Add insertSystemMetadata() to D1NodeService, wrap the exception handling from calls to IdentifierManager.
Add updateSystemMetadata() to D1NodeService as a helper method to wrap the exception handling from calls to IdentifierManager.
At Ben's suggestion, add metacatUrl to D1NodeService and make it available to subclasses. Set the metacatUrl in the constructor using SystemUtil rather than all roll your own PropertyService calls. More concise. Also, log the delete event in MNodeService.delete().
throw NotAllowed in MNodeService.delete() when isAuthorized() returns false.
Implement the MNStorage.delete() MNodeService. There is debate about what permissions are needed to 'delete' an object (archive it in metacat terms): D1 'WRITE' (metacat 'write') or D1 CHANGE_PERMISSION (metacat 'all'). For now we are using CHANGE_PERMISSION until it is ironed out.
isAuthorized: check for nulls in Session subjects, catch any unexpected errors and deny access when in doubt
Remove setParamsFromRequest() from D1NodeService. This was called (previously as CrudService) from ResourceHandler, but will be deprecated in favor of manually creating a param map for each method that needs to pass params on to MetacatHandler.
Implement [MN|CN]Storage.create() in D1NodeService. Since MetacatHandler requires an IP for event logging, we pass in the metacat URL (hold over from CrudService). To do this in the abstract D1NodeService, change the constructors to take metacatUrl as a parameter and get the URL from the metacat properties file in getInstance() of the subclasses. Needs testing.
include URL in resolve() method as well as placeholder for preference
Metacat does not implement CNRegister
Implement CNRead.synchronizationFailed() in MNodeService. Note: The CN URL is not yet available in the SynchronizationFailed exception, but will be once the d1_common_java exception is updated. See https://redmine.dataone.org/issues/1656. Once updated, change this method to explicitly state the CN URL making the call.
Change Metacathandler.read() to be public since it's internal to Metacat, and use read() in D1NodeService after isAuthorized() for the calling Subject from the Session object.
Implement MNRead.listObjects() in MNodeService.
Implement MNRead.describe() in MNodeService.
Implement MNRead.getChecksum() in MNodeService.
Minor formatting changes - tabs to spaces, indents, etc.
Implement [MN|CN]Read.get() in D1NodeService. Added setParamsFromRequest() to pass through parameters from the request object. Since the D1 Authorization API doesn't specify which authentication system a subject belongs to, we don't know if the subject listed is a KNB LDAP DN. isAuthorized() may return true for a mapped identity, but we don't know the DN of the KNB identity per se. This needs to be tested.
-use every Subject in the session (alt Ids and Group membership)-consolidate to single isAuthorized method
throw exception for unimplemented methods
implement resolve() method
implement assertRelation
implement CNReplication.setReplicationStatus() but with a note about selecting which replica's status should be set (right now it is all)
implement CNReplication.setReplicationPolicy
correction: implementation is CN-specific
implement getChecksum() in the superclass
implement getChecksum (retrieves from system metadata)
use shared get() method from superclass
use shared getLogRecords method
Remove isAuthorized(), setAccessPolicy(), and getLogRecords() methods since they're implemented in the superclass.
use Permission, not Event for isAuthorized() methods
CNCoreImpl is replaced by CNodeService
implement CNAuthorization
Metacat does not implement CNIdentity - it is a stand-alone service