blob: 1934f8ca092ebb95a7167f6d18df8fa5cee2bf59 [file] [log] [blame]
//////////////////////
* Copyright (c) 2007-2013, Niclas Hedhman. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
//////////////////////
[[howto-leverage-properties,Leverage Properties]]
= Leverage Properties =
Zestâ„¢ does not follow the JavaBeans standard for property support. Instead, a much more explicit concept is in place. The
advantages are enormous, and the only real downside is that people are already destroyed, thinking in so called POJO
terms.
If you want to reproduce what's explained in this tutorial, remember to depend on the Core API artifact:
include::../../../../core/api/build/docs/buildinfo/artifact.txt[]
At runtime you will need the Core Runtime artifact too. See the <<howto-depend-on-zest>> tutorial for details.
So in Zest, instead of writing;
[snippet,java]
-----------
source=manual/src/main/java/org/qi4j/manual/recipes/properties/pojo/Book.java
tag=book
-----------
[snippet,java]
-----------
source=manual/src/main/java/org/qi4j/manual/recipes/properties/pojo/MutableBook.java
tag=mutableBook
-----------
where we need the MutableBook to be able to initialize it (known as Type 2 Dependency Injection) on creation. From our
point of view, this has many flaws. If we refactor the "Title" property, our IDE need to understand the getters and
setters concept. The good news now is that they all do, but how about meta information about the property itself. For
instance, how to define a system where a UI can get an Icon for "Author" in a generic way? All kinds of system has been
added, such as one can create a BookBean for some metadata, and then MBeans for management. Where will it end?
We think we have a much better solution, and are bold enough to abandon the getters/setters and POJOs. The above looks
like this;
[snippet,java]
-----------
source=manual/src/main/java/org/qi4j/manual/recipes/properties/Book.java
tag=book
-----------
There is more to this than meets the eye.
- @Immutable annotation signals that this can't change.
- Property still have a set() method, which can be used during the initialization only.
- Metadata about each Property can be declared as <<def-metainfo>>.
[snippet,java]
-----------
source=manual/src/main/java/org/qi4j/manual/recipes/properties/BookFactory.java
tag=create
-----------
== Persistence ==
The Property concept also allows a much better defined persistence model. In Zest, only Property and Association
instances are persisted, and that makes the semantics around the persistence system very clear.
Properties reference values only, and these values must be Serializable, which means that Properties can not contain
Entities, since Entities are not Serializable. Associations are the opposite, as they must only reference Entities and
nothing else.
== MetaInfo ==
Properties can also have typed, custom meta information associated with them. Meta information is declared once per
Property per Module. A Property is identified by its method name and the interface it is declared in.
Let's say we want to create a generic Swing client that can show and navigate the domain model, without knowing the
actual domain model. Such Swing client will utilize a SwingInfo property info if it is available.
[snippet,java]
-----------
source=manual/src/main/java/org/qi4j/manual/recipes/properties/SwingInfo.java
tag=info
-----------
Our generic Swing UI will be mainly reflective in nature, but when it gets hold of a Property, it can simply do;
[snippet,java]
-----------
source=manual/src/main/java/org/qi4j/manual/recipes/properties/SwingPanel.java
tag=info-use
-----------