import org.teiid.metadata.MetadataRepository;
...
package com.something;
public class CustomMetadataRepository implements MetadataRepository {
@Override
public void loadMetadata(MetadataFactory factory, ExecutionFactory executionFactory, Object connectionFactory)
throws TranslatorException {
/* Provide implementation and fill the details in factory */
...
}
}
Custom Metadata Repository
If the provided metadata facilities are not sufficient then a developer can extend the MetadataRepository class provided in the org.teiid.api jar to plug-in their own metadata facilities into the Teiid engine. For example, a user can write a metadata facility that is based on reading data from a database or a JCR repository.
See the arche-type for creating a custom metadata repository.
Or see setting up the build environment to start development. For Example:
Then build a JAR archive with above implementation class and create file a named org.teiid.metadata.MetadataRepository in the META-INF/services directory with contents:
com.something.CustomMetadataRepository
Once the JAR file has been built, it needs to be deployed in the WildFly as a module under <jboss-as>/modules directory. Follow the below steps to create a module.
-
Create a directory <jboss-as>/modules/com/something/main
-
Under this directory create a "module.xml" file that looks like
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.something">
<resources>
<resource-root path="something.jar" />
</resources>
<dependencies>
<module name="javax.api"/>
<module name="org.teiid.common-core"/>
<module name="org.teiid.teiid-api" />
</dependencies>
</module>
-
Copy the jar file under this same directory. Make sure you add any additional dependencies if required by your implementation class under dependencies.
-
Restart the server
The below XML fragment shows how to configure the VDB with the custom metadata repository created
<vdb name="{vdb-name}" version="1">
<model name="{model-name}" type="PHYSICAL">
<source name="AccountsDB" translator-name="oracle" connection-jndi-name="java:/oracleDS"/>
<metadata type="{metadata-repo-module}"></metadata>
</model>
</vdb>
Now when this VDB gets deployed, it will call the CustomMetadataRepository instance for metadata of the model. Using this you can define metadata for single model or for the whole VDB pragmatically. Be careful about holding state and synchronization in your repository instance.
Development Considerations
-
MetadataRepository
instances are created on a per vdb basis and may be called concurrently for the load of multiple models. -
See the
MetadataFactory
and theorg.teiid.metadata
package javadocs for metadata construction methods and objects. For example if you use your own DDL, then call theMetadataFactory.parse(Reader)
method. If you need access to files in a VDB zip deployment, then use theMetadataFactory.getVDBResources
method. -
Use the
MetadataFactory.addPermission
and addMetadataFactory.addColumnPermission
method to grant permissions on the given metadata objects to the named roles. The roles should be declared in your vdb.xml, which is also where they are typically tied to container roles.