XDoclet: Attribute-Oriented Programming - packagetagshandler.packagesubstitution
Author: XDoclet Team

##### XDoclet

- Overview
- News and Status
- Download/Installation
- Using XDoclet
- Best Practices
- FAQ
- License

##### Ant Task Reference

- <doclet .. />
- <ejbdoclet .. />
- <hibernatedoclet .. />
- <jdodoclet .. />
- <jmxdoclet .. />
- <mockdoclet .. />
- <portletdoclet .. />
- <springdoclet .. />
- <tapestrydoclet .. />
- <webdoclet .. />
- <wseedoclet .. />

##### Tag Reference

- apache (@soap @struts @axis @tapestry)
- bea (@weblogic)
- borland (@bes)
- caucho (@resin)
- ejb (@ejb @dao)
- exolab (@castor)
- hp (@hpas)
- hibernate (@hibernate)
- ibm (@websphere)
- java (@javabean)
- jboss (@jboss)
- jdo (@jdo)
- jmx (@jmx)
- jsf (@jsf)
- macromedia (@jrun)
- mockobjects (@mock)
- mvcsoft (@mvcsoft)
- mx4j (@mx4j)
- objectweb (@jonas)
- oracle (@oc4j)
- orion (@orion)
- portlet (@portlet)
- pramati (@pramati)
- spring (@spring)
- sun (@sunone)
- sybase (@easerver)
- tjdo (@tjdo)
- web (@web @jsp)
- webwork (@webwork)
- wsee (@wsee)
- xdoclet (@xdoclet @doc @msg)

##### Feature Documentation

- Using Value Objects
- EJB Environment Handling

##### Advanced

- Maven Plug-in
- Merge Points
- IDE Integration
- Migration from EJBDoclet
- Ant 1.5 Troubleshooting

##### Community

- Feedback
- Resources
- Tools

##### Development

- Developer Guide
- Javadoc (API)
- Template Language (*.xdt)
- XJavaDoc Site

##### Search XDoclet

##### Project Documentation

- About XDoclet
- Project Info
- Project Reports
- Development Process

## packagetagshandler.packagesubstitution

It's good practice to put interfaces (such as remote/local interfaces, data objects and home interfaces) in a separate "interfaces" package rather than in the EJB bean implementation package. Previous versions of XDoclet dictated this behavior, so if package name of a bean ended with `.beans` or `.ejb` interfaces were put into .interfaces package. It's no more the case. You have full control over it. If you don't use a `packageSubstitution` element, then all interfaces are generated to the same package as the bean implementation class. But if you want to follow the pattern and put interfaces into a separate package you can, by providing the list of package name tails that interfaces of beans inside that packages should be placed into the package you define. For example interfaces of `test.ejb.CustomerBean` will be placed in `test.interfaces` by the following `packageSubstitution`:

     <packageSubstitution packages="ejb,beans" substituteWith="interfaces" />

By using the `useFirst` attribute, you can tell XDoclet to substitute the first occurrence and not the last.
Now if you have a structure like

com.acme.foo.bar.ejb
com.acme.baz.lala.ejb

you want to gather all interfaces under one root/subtree like e.g.

com.acme.interfaces.bar.*
com.acme.interfaces.lala.*

now you can say:
<packagesubstitution packages="foo,baz" substituteWith="interfaces" useFirst="true"/>

### Implementing Class

xdoclet.tagshandler.PackageTagsHandler.PackageSubstitution

### Attributes

Attribute | Description | Required
--- | --- | ---
packages | Set the comma-separated list of packages to be substituted. | No.
substituteWith | Set the substitute package name. | No.
useFirst | Specify whether the first occurrence of a package from the list should be substituted, or the last. | No.