The cdl.package option specifies a package name for the component.
The cdl.package option takes one of the following values as a parameter.
The default configuration is false
.
No parameter implies that the parameter is true
.
The cdl.package option generates no additional classes. The cdl.package option just modified the behavior of the Relaxer Table Objects.
The cdl.package option adds no additional methods to Relaxer objects.
List 6.6.3.1[cdlPackage.rcdl] is a sample RCDL definition, and List 6.6.3.2[cdlPackage.rng] is a sample RELAX NG schema used by the RCDL definition.
<component xmlns="http://www.relaxer.org/xmlns/cdl" namespace="http://example.com/account" name="backOffice"> <interface namespace="http://example.com/account" name="accountManager"> <grammar namespace="http://example.com/account" location="cdlPackage.rng"/> <operation name="findAccount"> <in name="accountNo" type="token"/> <out label="account"/> </operation> </interface> </component>
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> <start> <ref name="account"/> </start> <define name="account"> <element name="account"> <attribute name="accountNo"> <data type="token"/> </attribute> <element name="balance"> <data type="int"/> </element> <element name="owner"> <data type="token"/> </element> <ref name="address"/> <zeroOrMore> <ref name="phone"/> </zeroOrMore> </element> </define> <define name="address"> <element name="address"> <attribute name="zip"> <data type="token"/> </attribute> <text/> </element> </define> <define name="phone"> <element name="phone"> <attribute name="area"> <data type="token"/> </attribute> <data type="token"/> </element> </define> </grammar>
Execution of the Relaxer with the cdl.package option is as follows. The cdl option must be used together.
$ relaxer -cdl cdl.rcdl
As a result, Relaxer generates 17 files as follows:
List 6.6.3.3[IAccountManager.java] shows IAccountManager
which is a java interface to be used as an API.
Can not access : src/cdl.package/IAccountManager.java
List 6.6.3.4[IAccountManagerService.java] is
the IAccountManagerService
which is a Java interface
to be used as an SPI.
Can not access : src/cdl.package/IAccountManagerService.java
To complete the component,
you must develop a service provider.
For this purpose, Relaxer generates a prototype of the service provider.
In the example,
the AccountManagerService
shown in
List 6.6.3.5[AccountManagerService.java.AccountManager] is the
prototype of the service provider.
AccountManagerService
extends
AbstractAccountManagerService
which is the abstract base class for the service provider.
Therefore, the AccountManagerService
implicitly implements
the SPI IAccountManagerService
.
Can not access : src/cdl.package/AccountManagerService.java.AccountManager
Copy the file "AccountManagerService.java" and write
a findAccount
method.
The service provider AccountManagerService
is shown in List 6.6.3.6[AccountManagerService.java].
import java.rmi.RemoteException; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; public class AccountManagerService extends AbstractAccountManagerService { /** * Implementation of a operation findAccount. * * @param accountNo * @exception RemoteException * @return Account */ public Account findAccount(String accountNo) throws RemoteException { try { Account account = new Account(); account.setAccountNo(accountNo); account.setBalance(10000); account.setOwner("XML Taro"); account.setAddress( new Address("<address zip='123'>Yokohama</address>") ); Phone phone1 = new Phone(); phone1.setArea("123"); phone1.setContent("456-7890"); account.addPhone(phone1); Phone phone2 = new Phone("<phone area='090'>123-4567</phone>"); account.addPhone(phone2); return (account); } catch (IOException e) { throw (new RemoteException(e.getMessage(), e)); } catch (SAXException e) { throw (new RemoteException(e.getMessage(), e)); } catch (ParserConfigurationException e) { throw (new RemoteException(e.getMessage(), e)); } } }
Compilation of AccountManagerCommand
is as follows.
No special compile options are needed.
$ javac AccountManagerCommand.java
Execution of AccountManagerCommand
is shown here:
$ java AccountManagerCommand -findAccount a12345 <account accountNo="a12345"><balance>10000</balance><owner>XML \ Taro</owner><address zip="123">Yokohama</address><phone \ area="123">456-7890</phone><phone \ area="090">123-4567</phone></account>
The -findAccount
followed by a12345
means invoking a findAccount
method
with a parameter a12345
.
As a result, the command outputs an XML document produced by the service provider.