[kepler-dev] object manager status
Chad Berkley
berkley at nceas.ucsb.edu
Fri Aug 19 14:33:52 PDT 2005
Hi,
I've finally got the object manager (OM) working and importing ksw files
into the system. Note that if you want to try this functionality out,
you just have to change the basicKeplerLibrary.xml file (in
configs/ptolemy/configs/kepler/) so that the <property
name="_alternateLibraryBuilder"...> lines are uncommented and the
<group>....</group> lines are commented out. There are instructions
within that file on what to do.
What happens when you enable the _alternativeLibraryBuilder property is
that it tells the system to use the specified class to build the actor
library instead of the static moml files (and momlparser) that reside
within the configuration. The class that I currently have setup,
org.kepler.moml.KSWLibraryBuilder, takes another property, _libraryDir,
which tells it what directory to look in for ksw files. You can specify
multiple directories to search by adding another property called
"_libraryDirX" where 'X' can be anything. the name of the property just
has to start with "_libraryDir."
Once the KSWLibraryBuilder locates all of the ksw files in the given
directories, it unpacks them and looks at the manifest for the lsid of
each object in the ksw file. It then tries to register the object with
the given lsid into the lsid sub-system. If there is a conflict, the
ksw file is skipped and an error message is printed. the OM supports
normal LSIDs as well as 'localhost' LSIDs. the localhost lsids are not
resolved by the normal LSID resolver, instead they are handled by the OM
and resolved to a local file. The class KeplerLSID handles this
transition.
On startup, a checksum of each ksw file is generated and checked against
the cached version. This should force the cached ksw to be updated if
the ksw file is updated.
Within a KSW file, there are 7 different types of objects. Each object
is described by two attributes in the manifest: a type and an lsid. the
type must be one of the following:
* data - some sort of data object like an excel file or a text table
* actorMetadata - a moml file describing one actor
* xmlMetadata - xml formatted metadata (other than MoML) like EML or
Darwin Core
* jar - a jar file containing java executables
* class - a java class file
* nativeLibrary - a binary precompiled native library (like a dll)
* workflow - a MoML workflow
The manifest gives the type and lsid of each file in the ksw, but the
actor metadata shows how all the objects are interconnected. Here's an
example of 'actorMetadata' for the Constant actor (with C style comments
inserted):
<?xml version="1.0"?>
<entity name="Constant">
//the entityId field gives the lsid for this actorMetadata file
<property name="entityId" value="urn:lsid:localhost:actor:101:1"
class="org.kepler.moml.NamedObjId"/>
//the documentation property is reserved for human and/or
//machine readable documentation about this actor
<property name="documentation"
class="org.kepler.moml.DocumentationAttribute">
A constant actor
</property>
//the class property tells what class implements this actor
<property name="class" value="ptolemy.actor.lib.Const"
class="ptolemy.kernel.util.StringAttribute">
// the id property within class tells the id of the class
// that implements the actor. note this can be a java class
// or it can be a MoML class
<property name="id" value="urn:lsid:localhost:class:101:1"
class="ptolemy.kernel.util.StringAttribute"/>
</property>
//all ports are explicitly declared
<port name="output">
<property name="direction" value="output"/>
<property name="dataType" value="unknown"/>
<property name="isMultiport" value="false"/>
</port>
<port name="trigger">
<property name="direction" value="input"/>
<property name="dataType" value="unknown"/>
<property name="isMultiport" value="true"/>
</port>
//the semantic type is the link into one or more ontologies for
//subsequent classification within the system
<property name="semanticType0"
value="urn:lsid:lsid.ecoinformatics.org:onto:1:1#ConstantActor"
class="org.kepler.sms.SemanticType"/>
//there is another property called 'dependency' which would allows
//you to build a dependency tree for the actor. objects like
//native libraries can be assigned to the actor here.
//the syntax would look like:
//<property name="dependency0"
//value="urn:lsid:lsid.ecoinformatics.org:dep:101:1"
//class="org.kepler.moml.DependencyAttribute"/>
</entity>
There can be one or more actor metadata files within a ksw file. Each
one represents one 'actor' within the system. Note that two actors
might be implemented by the same class.
Once the ksw file is read in by the KSWLibraryBuilder and all of the
lsids are checked and verified for uniqueness, each object in the ksw is
cached. The ObjectManager (which implements the actual cache) allows
easy access to each of the objects via the object's lsid. You can get
the object back from the cache as a file, stream or reader. The OM
handles getting and caching any remote objects (via the LSIDResolver)
and you can 'put' local files with localhost lsids with the putLocalFile
method.
The OM also allows you to get the file handle of a temp file for use in
processing. The calling agent never needs to know where or how the file
is stored (though it can find out), it just calls getTempFile() and is
returned a file handle. The temp file also has an lsid and is cached
for later retrieval. Temp files are deleted on kepler startup so they
do not persist through kepler sessions.
You can also iterate through the entire contents of the cache.
ObjectManager.getCacheItemIterator() returns an Enumeration of all
objects in the cache.
The LSIDGenerator utility class can be used to create new, unique
(local) lsids. It will give you the next object number (for a
namespace) or the next revision (for an object). Newly created lsids
are registered so they won't be used again. Caution should be used with
this because the lsids generated are unique locally, but may not be
remotely. Additional checks are needed to verify global uniqeness.
My next step is to convert the system to using the OM full time instead
of having to uncomment the property from the config file. I need to get
all of the current actors into ksw form before we can do that. I'm
going to work on automating that process next week. In the meantime, if
you want to try this with your own ksw file, you can use the
org.kepler.ksw.KSWCreator command line app to create one. You can
either give it all the info it needs on the command line, or run it with
one command line argument (the working dir) and it'll ask you for the
info interactively. Once it creates the ksw file for you, you can just
stick it into the kepler/ksw directory and have it load. This should
work with MoML or Java classes. The file kepler/ksw/Sinewave.ksw is an
example of a ksw file that uses a MoML class instead of a Java class.
I'm also working on making this all thread safe. I'm in the process of
synchronizing the essential methods (and code blocks) but I've only just
started. This is tricky, so when i think i'm done, i'll probably ask
one or more of you to take a look at it to make sure i haven't missed
anything.
Just wanted to let everyone know what the status of the OM is. Let me
know if you have any comments or suggestions.
chad
More information about the Kepler-dev
mailing list