Jump to: navigation, search

Difference between revisions of "EclipseLink/Development/339373"

(Override Rules)
(Configuration)
Line 36: Line 36:
  
  
Example:
+
Example: Using a single list of bindings:
  
 
<div style="width:700px">
 
<div style="width:700px">
Line 56: Line 56:
  
 
....
 
....
 +
</source>
 +
</div>
 +
 +
Example: Using a Map for multiple packages:
 +
 +
<div style="width:700px">
 +
<source lang="java">
 +
 +
...
 +
 +
FileReader fooPackageBindings1 = new FileReader("foo/base-bindings.xml");
 +
FileReader fooPackageBindings2 = new FileReader("foo/override-bindings.xml");
 +
 +
List<Object> fooPackageBindingsList = new ArrayList<Object>();
 +
fooPackageBindingsList.add(bindings1);
 +
fooPackageBindingsList.add(bindings2);
 +
 +
FileReader barPackageBindings1 = new FileReader("bar/base-bindings.xml");
 +
FileReader barPackageBindings2 = new FileReader("bar/override-bindings.xml");
 +
 +
List<Object> barPackageBindingsList = new ArrayList<Object>();
 +
barPackageBindingsList.add(bindings1);
 +
barPackageBindingsList.add(bindings2);
 +
 +
Map<String, List> bindingsMap = new HashMap<String, List>
 +
bindingsMap.put("foo", fooPackageBindingsList);
 +
bindingsMap.put("bar", barPackageBindingsList);
 +
 +
properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, bindingsMap);
 +
 +
JAXBContext ctx = JAXBContext.newInstance(new Class[]{Employee.class}, properties);
 +
 
</source>
 
</source>
 
</div>
 
</div>

Revision as of 11:02, 4 April 2011

Design Specification: Multiple Bindings File Support

ER 339373

Currently MOXy provides the ability to augment the annotation metadata with an XML bindings file. This enhancement request is for the ability to apply multiple binding files to a model.

Sample use case: 1. Initial metadata is specified with annotations. 2. Second version modifies the metadata with an XML bindings file. 3. Subsequent versions continue to modify the metadata with new bindings files.

With the metadata layered in this way a JAXBContext could be created to represent any version of the XML document.

Requirements

  1. Must provide an API to allow multiple bindings files to be passed into the context creation
  2. Be able to merge multiple bindings files into a single unified XmlBindings
  3. Must coincide with JPA rules for overrides with multiple orm .xml files.

Configuration

Currently MOXy allows external bindings files to be passed in through a map of properties. MOXy allows one bindings file per package. The files can be passed into through the properties in 3 formats

  1. A Map of Input Sources keyed on package name.
  2. A list of Input Sources, one per package.
  3. A single Input Source.

To support multiple bindings files for a single package, this will be changed to allow the following additional options:

  1. A Map of Lists of Input Sources, keyed on package name. (Map<String, List<Object>>)
  2. Allow the list of Input Sources from #2 above to contain more than entry per package.


Example: Using a single list of bindings:

....
 
FileReader bindings1 = new FileReader("base-bindings.xml");
FileReader bindings2 = new FileReader("override-bindings.xml");
 
List<Object> bindingsList = new ArrayList<Object>();
bindingsList.add(bindings1);
bindingsList.add(bindings2);
 
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, bindingsList);
 
JAXBContext ctx = JAXBContext.newInstance(new Class[]{Employee.class}, properties);
 
....

Example: Using a Map for multiple packages:

...
 
FileReader fooPackageBindings1 = new FileReader("foo/base-bindings.xml");
FileReader fooPackageBindings2 = new FileReader("foo/override-bindings.xml");
 
List<Object> fooPackageBindingsList = new ArrayList<Object>();
fooPackageBindingsList.add(bindings1);
fooPackageBindingsList.add(bindings2);
 
FileReader barPackageBindings1 = new FileReader("bar/base-bindings.xml");
FileReader barPackageBindings2 = new FileReader("bar/override-bindings.xml");
 
List<Object> barPackageBindingsList = new ArrayList<Object>();
barPackageBindingsList.add(bindings1);
barPackageBindingsList.add(bindings2);
 
Map<String, List> bindingsMap = new HashMap<String, List>
bindingsMap.put("foo", fooPackageBindingsList);
bindingsMap.put("bar", barPackageBindingsList);
 
properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, bindingsMap);
 
JAXBContext ctx = JAXBContext.newInstance(new Class[]{Employee.class}, properties);

Override Rules

When multiple bindings files are encountered for the same package, a unified Bindings will be created by merging the content of all the files. The following rules will be used for merging:

  • XmlSchema


  • JavaTypes
    • The merged bindings will contain all unique java-type entries from all bindings files
    • If the same java-type occurs in multiple files, any values that are set in the later file, will override values from the previous file
  • JavaEnums
    • The merged bindings will contain all unique java-enum entries from all bindings files