| Readme.txt chemistry-opencmis-queryparser-example |
| ================================================= |
| |
| This project is an example how to build a query parser using the OpenCMIS query framework. |
| |
| The example is standalone program that makes use of the AntLR based query parser. It |
| parses a CMIS query string and creates after traversing the syntax tree a new statement in |
| CMIS query language. While this sounds pretty useless this sample still has value: |
| - it is not dependent on any query language of a backend (like a database) or a |
| specific database scheme. |
| - it can be easily adapted to generate output in different format (SQL, XML, JSON) |
| - it separates classes that can be reused from those that are specific to the output |
| language |
| - it provides unit tests that can be adapted to other target languages. |
| |
| The sample provides code for the full cycle to parse and process a query. The entry point |
| is a static main() method so that it runs standalone without any server. Usually this code |
| will be called from the CMIS Discovery service in a real CMIS server. |
| |
| The code consists of the following classes: |
| |
| ExampleQueryProcessor.java: |
| This is the main class. It takes a query and parses it. It traverses the generated tree |
| and finally builds the output. |
| |
| ExampleQueryWalker.java: |
| A walker that traverses the syntax tree and generates the CMISQL output. For each node in |
| the tree callback functions are provided processing a specific token. |
| |
| ExampleTypeManager.java: |
| An OpenCMIS parser processes the query and does certain checks for validity. To do this |
| it needs information about the available types and properties in the backend. This |
| information is provided by the interface TypeManager. This class implements a minimal |
| type system to get a running sample. It has only one type implemented: cmis:document |
| (note that this is not allowed for a real server according to the CMIS spec). |
| |
| ExtendedAbstractPredicateWalker.java |
| This class extends the predefined walker from the server support package. It provides |
| more fine grained control and more hooks to plugin while traversing the tree. This part |
| is independent of the generated output and therefore separated in its own class. It may |
| be reused for other projects. |
| |
| ExampleQueryProcessorTest.java |
| A Junit test that feeds the parser with CMISQL queries and compares the generated output |
| against an expected result. While the tests are specific to the output language the basic |
| principles and design of the unit test can be done in the same way for other parsers. |
| |
| |
| |