Oracle provides some basic tools for managing the repository, such as import/export and a JDeveloper browser plugin. Unfortunately, there is no tool currently for managing the files within the repository, so there really is no possibility to change the files at run-time without exporting and then reimporting the repository.
I will explain in this blog post how you can connect to a MDS repository and how you can work with the files stored there.
The MDS is basically an XML store with transaction capabilities, versioning, merging and a persistence framework optimized to work with XML nodes and attributes. It is somehow similar to an ORM, but for XML entities. The persistence framework has two adapters that can persist the store to a database or to a folder on disk. The database store has more advanced features is the recommended way of working with MDS. The file store is useful for at development time, because one can change the files manually.
The same as an ORM needs a configuration file to know the environment (e.g. hibernate.cfg.xml), the MDS uses its own config file named adf-config.xml. You can find this file automatically generated by JDeveloper in any ADF FMW project, with a default configuration.
The file has several configuration sections, but one is of particular interest, and it's called
<namespace metadata-store-usage="MetadataStore" path="/custom/" />
<metadata-store-usage default-cust-store="true" deploy-target="true" id="MetadataStore">
<property name="jdbc-userid" value="DEV_MDS"/>
<property name="jdbc-password" value="dev"/>
<property name="jdbc-url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="partition-name" value="p1"/>
<property name="repository-name" value="mds-SpacesDS"/>
In the above configuration, the most interesting elements are: type-definitions, namespace and metadata-store:
- type-definitions: here you can define custom XSD nodes that describe custom entities. The easiest way to generate XSD definitions is with the help of JAXB: you can define you data model as serializable POJOs (same as JPA entities) and then use Oracle's MDSBeanGenTool (located in the mdstools.jar file) java utility to generate the schema definition.
- namespace: here you must define the virtual paths within the MDS repository, so the persistence framework will know where to store and find the files
- metadata-store: this node configures the persistence adaper. It can be either DBMetadataStore, ClassPathMetadataStore, FileMetadataStore or ServletContextMetadataStore.
MDSConfig config = new MDSConfig(new File(path to adf-config.xml));The mdsSession variable holds the session instance for the MDS repository. A MDSSession is similar to the Hibernate Session object. It will handle all persistence operations and holds a transactional context.
MDSInstance mdsInstance = MDSInstance.getOrCreateInstance("test-instance", config);
MDSSession mdsSession = mdsInstance.createSession(new SessionOptions(null, null, new CustConfig(new CustClassListMapping)), null);
You can now query the repository to find the desired items. For example, to find all files in repository you would write:
NameQueryImpl query = new NameQueryImpl(mdsSession, ConditionFactory.createNameCondition("/", "%", true));Using the above query, you would only retrieve the names of the items inside the repository. To get the actual instance of an MDS object ( MetadataObject ), you have to write:
Iterator<QueryResult> result = query.execute();
QueryResult qr = result.next();
// ...do your magic here...
MOReference ref = mdsSession.getMOReference(path inside the repository);Once you have the MetadataObject instance, you can retrieve the XML document behind with mo.getDocument(); Having the DOM XML Document instance, you can alter the XML file and save it hack to the repository by issuing mdsSession.flushChanges();
MetadataObject mo = mdsSession.getMetadataObject(ref);
Using the information briefly described here and with a little bit of SWING knowledge, you can easily write an MDS browser and XML editor to change what you want inside the repository.