The input from this article comes from:
Service builder principles
Service builder relies on forward engineering and a descriptive format of the model that complies with a dtd. So the user needs to create a valid xml file called service.xml.
Service xml main nodes are 'entity' node.
Entity node describe a persistence entity (i.e. table) for a RDBMS.
The entity description covers columns and relationships (parents and children via collection) as well as primary key strategy.
This file serves as input to an ant task that carries on the generation process. Some 20 different artifacts are generated. All of those artifacts are service-builder 'entity' node centric.
Service builder from a generation perspective
Forward-engineering
Is a approach domain centric as some advantages:
- density of the information (a simple file to describe)
Service builder from minuteproject perspective
Minuteproject is evolving from smart reverse-engineering to a development methodology platform focusing on 4 Weapons of Mass Productivity:
- smart reverse-engineering
- virtualization
- statement driven development (SDD)
- transient definition
Service builder / Minuteproject matching
Although the philosophies (forward-engineering vs. reverse-engineering) are different there is a mapping between the both approach.
The question is are all the information in service builder available by minuteproject reverse-engineering?
YES!
Let's have a element review of service builder nodes
Service builder
< ATTLIST service-builder package-path CDATA #REQUIRED auto-namespace-tables CDATA #IMPLIED > <!ELEMENT author (#PCDATA)> <!ELEMENT namespace (#PCDATA) >
package-path, author, namespace can be deduced by minuteproject model node
Entity
< ATTLIST entity name CDATA #REQUIRED human-name CDATA #IMPLIED table CDATA #IMPLIED uuid CDATA #IMPLIED uuid-accessor CDATA #IMPLIED local-service CDATA #IMPLIED remote-service CDATA #IMPLIED persistence-class CDATA #IMPLIED data-source CDATA #IMPLIED session-factory CDATA #IMPLIED tx-manager CDATA #IMPLIED cache-enabled CDATA #IMPLIED json-enabled CDATA #IMPLIED >
Entity name can be deduced from table name (or view name)
Human name can be deduce by table alias name
All the other boolean field can be deduce by so convention or some parameters to set on the mp4liferay track
Datasource can be deduced by convention (related to the namespace) (and also generated by MP)
Column
<!ATTLIST column name CDATA #REQUIRED db-name CDATA #IMPLIED type CDATA #REQUIRED primary CDATA #IMPLIED accessor CDATA #IMPLIED filter-primary CDATA #IMPLIED entity CDATA #IMPLIED mapping-key CDATA #IMPLIED mapping-table CDATA #IMPLIED id-type CDATA #IMPLIED id-param CDATA #IMPLIED convert-null CDATA #IMPLIED lazy CDATA #IMPLIED localized CDATA #IMPLIED json-enabled CDATA #IMPLIED >Column info can be found by reverse-engineering name (via alias), db-name, type, primary, entity, mapping-key, mapping-table.
Id-type and id-param can be deduced from the PK strategy associated to the database type.
MP covers those described in service.xml (uuid, sequence, autoincrement, identity)
Finder and finder-column
can be deduce from defaulting (pk, fk) or with the semantic reference of the table.
References correspond to DB relationships.
Review conclusion
This means that the main information can be deduced from the smart reverse-engineering.What is missing can be added by convention a liferay configuration for defaulting (such as companyId, groupId, finder extra info) and parametrization of the liferay track.
In all the case the configuration of service.xml (generated by MP) can be manually changed and at the next generation from the DB your alterations are kept!! Thank to updatable code feature of MP.
Can minuteproject even extend service-builder facility?
YES AGAIN!
Virtualization
This is the strong point of reverse-engineering: you can work with Views. In forward-engineering it is impossible since you cannot guess the implementation whereas in reverse-engineering, you take it as is!
So your view can be set as entity in service.xml (with readonly access)
But what is the identity field of this view. Minuteproject enrichment or convention enable to grant one to a field acting as a unique key.
Even better, minuteproject provides you the ability to grant relationships between view like parent-child foreign key and this can also be used in service.xml
Enrichment
Example: detect relationship between entity when no foreign key present.
Can minuteproject do more for service builder?
YES!
Validation - mandatory and type are not enough
You should have stereotype such as email, url, password. A stereotype is an abstraction between presentation and validation aspects.
Constraints
Limit the column value to a enumeration.
Updatable code
The code you generate can be updated via some extension points. The next time you generate your modification are kept!
Datasource
Minuteproject can generate the datasource code
Semantic reference
Sometimes you do not want to display the entire entity fields but just the more important. This is the semantic reference.
Work with Statement only
Sometimes you can go back to the fundamentals of your UCs (I/O + function).
Ex a jdbc call to a stored procedure.
DTO oriented service
The input is not mapped to a persistence entity.
Conclusion
After this feasability review, minuteproject can have the capabilities to generate service.xml of liferay from the DB. But also to extend it.
A sample generation is foreseen for MP release 0.8.5.
The first approach is to generate the SB input configuration. But nearly all generated artifacts SB generate can also be generated by MP.
A sample generation is foreseen for MP release 0.8.5.
The first approach is to generate the SB input configuration. But nearly all generated artifacts SB generate can also be generated by MP.
No comments:
Post a Comment