You are right Adrian... actually this would be the last thing to touch but we 
could use a different convention like:

data/<some name>_seed.xml
data/<some name>_demo.xml

or more simply:

data/seed.xml
data/demo.xml

(where the filename is the reader name) and then consider to merge all seed 
records in <some name>_seed.xml and all records for demo in <some name>_demo.xml

Jacopo

On Mar 2, 2012, at 9:06 AM, Adrian Crum wrote:

> I don't think we can eliminate the seed/demo data readers. In most cases, 
> data loading must be done in a certain order.
> 
> -Adrian
> 
> On 3/1/2012 2:53 PM, Jacopo Cappellato wrote:
>> A decent description of the "Configuration By Exception" concept is the 
>> following [*]:
>> 
>> "Java EE 5 introduced the idea of configuration by exception (sometimes 
>> referred to as programming by exception or convention over configuration). 
>> This means, unless specified differently, the container or provider should 
>> apply the default rules. In other  words, having to supply a configuration 
>> is the exception to the rule. This allows you to write the minimum amount of 
>> code to get your application running, relying on the container and provider 
>> defaults."
>> 
>> To some extent the OFBiz framework already applied this pattern is some 
>> areas (you may remember when we made the entity group-name "org.ofbiz" the 
>> default value and then were able to remove a bunch of configuration files); 
>> however I see a lot of room for further apply it, starting from the 
>> ofbiz-component.xml files.
>> 
>> For example, considering the ofbiz-component.xml file in framework/example:
>> 
>> <ofbiz-component name="example"
>>         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>         
>> xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-component.xsd";>
>>     <!-- define resource loaders; most common is to use the component 
>> resource loader -->
>>     <resource-loader name="main" type="component"/>
>> 
>>     <!-- place the config directory on the classpath to access configuration 
>> files -->
>>     <classpath type="dir" location="config"/>
>>     <classpath type="dir" location="dtd"/>
>> 
>>     <!-- load single or multiple external libraries -->
>>     <classpath type="jar" location="build/lib/*"/>
>> 
>>     <!-- entity resources: model(s), eca(s), group, and data definitions -->
>>     <entity-resource type="model" reader-name="main" loader="main" 
>> location="entitydef/entitymodel.xml"/>
>>     <entity-resource type="model" reader-name="main" loader="main" 
>> location="entitydef/entitymodel_view.xml"/>
>>     <!--<entity-resource type="eca" reader-name="main" loader="main" 
>> location="entitydef/eecas.xml"/>  -->
>>     <entity-resource type="data" reader-name="seed" loader="main" 
>> location="data/ExampleTypeData.xml"/>
>>     <entity-resource type="data" reader-name="seed" loader="main" 
>> location="data/ExampleSecurityData.xml"/>
>>     <entity-resource type="data" reader-name="seed" loader="main" 
>> location="data/ExamplePortletData.xml"/>
>>     <entity-resource type="data" reader-name="seed" loader="main" 
>> location="data/ExamplePortalSeedData.xml"/>
>>     <entity-resource type="data" reader-name="seed" loader="main" 
>> location="data/ExampleHelpData.xml"/>
>>     <entity-resource type="data" reader-name="demo" loader="main" 
>> location="data/ExampleDemoData.xml"/>
>> 
>>     <!-- service resources: model(s), eca(s) and group definitions -->
>>     <service-resource type="model" loader="main" 
>> location="servicedef/services.xml"/>
>>     <service-resource type="eca" loader="main" 
>> location="servicedef/secas.xml"/>
>>     <!--
>>     <service-resource type="group" loader="main" 
>> location="servicedef/groups.xml"/>
>>     -->
>> 
>>     <test-suite loader="main" location="testdef/tests.xml"/>
>> 
>>     <!-- web applications; will be mounted when using the embedded container 
>> -->
>>     <webapp name="example"
>>         title="Example"
>>         menu-name="secondary"
>>         server="default-server"
>>         location="webapp/example"
>>         base-permission="OFBTOOLS,EXAMPLE"
>>         mount-point="/example"/>
>>     <webapp name="birt"
>>         title="BIRT"
>>         server="default-server"
>>         location="webapp/birt"
>>         base-permission="OFBTOOLS,WEBTOOLS"
>>         mount-point="/birt"
>>         app-bar-display="false"/>
>> 
>> </ofbiz-component>
>> 
>> 
>> If we assume that the "default" layout of an OFBiz component is the one used 
>> by the "example" component (and actually by all our components) we could 
>> simply have:
>> 
>> <ofbiz-component name="example"
>>         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>         
>> xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-component.xsd";>
>>     <!-- define resource loaders; most common is to use the component 
>> resource loader so we use it; if you want a different one then use the 
>> resource-loader element-->
>>     <!-- the following folders, if present, will be added to the classpath: 
>> config, dtd; use the "classpath" element with attribute type="dir" to add 
>> more -->
>>     <!-- all the jar files in the following folders, if present, will be 
>> added to the classpath: build/lib, lib; use the "classpath" element with 
>> attribute type="jar" to add more -->
>>     <!-- all the entity definitions files and eca definition files and group 
>> definition files in the folder "entitydef" will be loaded using the 
>> reader-name="main" and loader="main"; use the element "entity-resource" to 
>> specify different resources -->
>>     <!-- the data files in the "data" subfolders will be loaded considering 
>> the subfolder name as the "reader-name": for example data/seed/ will be 
>> loaded when seed data are loaded, data/demo will be loaded when demo data is 
>> loaded; you can create a new reader-name simply adding a new subfolder -->
>>     <!-- service definition files, eca(s) and group definitions will be 
>> loaded from the servicedef folder; use the service-resource element ...-->
>>     <!-- all the test suites in the testdef folder will be executed using 
>> the loader="main"; use "test-suite" to specify a different resource -->
>>     <test-suite loader="main" location="testdef/tests.xml"/>
>> 
>>     <!-- web applications; will be mounted when using the embedded container 
>> -->
>>     <!-- I am pretty sure we could simplify these ones as well, but at this 
>> point you get the idea... -->
>>     <webapp name="example"
>>         title="Example"
>>         menu-name="secondary"
>>         server="default-server"
>>         location="webapp/example"
>>         base-permission="OFBTOOLS,EXAMPLE"
>>         mount-point="/example"/>
>>     <webapp name="birt"
>>         title="BIRT"
>>         server="default-server"
>>         location="webapp/birt"
>>         base-permission="OFBTOOLS,WEBTOOLS"
>>         mount-point="/birt"
>>         app-bar-display="false"/>
>> </ofbiz-component>
>> 
>> It should be possible to create a component that uses default resource names 
>> and locations without the need to define the ofbiz-component.xml file; for 
>> special components that require non-standard configurations then the 
>> ofbiz-component.xml file will be used as we are doing now.
>> 
>> What do you think? If we start to think in this direction I am pretty sure 
>> we could be able to simplify a lot of the OFBiz configuration files (service 
>> definitions, entity definitions etc...).
>> 
>> Kind regards,
>> 
>> Jacopo
>> 
>> 
>> [*]: http://moon26.blogspot.com/2011/04/configuration-by-exception_13.html
>> 

Reply via email to