<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>agimatec &#187; Open Source</title>
	<atom:link href="http://www.agimatec.de/blog/tag/open-source/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.agimatec.de/blog</link>
	<description>Clash of realities</description>
	<lastBuildDate>Tue, 22 Dec 2009 16:50:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Dependency Management in Maven done right</title>
		<link>http://www.agimatec.de/blog/2009/02/dependency-management-in-maven-done-right/</link>
		<comments>http://www.agimatec.de/blog/2009/02/dependency-management-in-maven-done-right/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 12:23:15 +0000</pubDate>
		<dc:creator>Simon Tiffert</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=552</guid>
		<description><![CDATA[Despair, anger, perplexity, pain &#8211; I think we all know this moments when dealing with large Maven projects. I have seen a lot of posts in the lasts months who use some of this words. After years with Maven we learned how to deal with it. Not the pain, I mean to deal with Maven. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.agimatec.de/blog/2009/02/dependency-management-in-maven-done-right/what/" rel="attachment wp-att-553"><img src="http://www.agimatec.de/blog/wp-content/uploads/2009/02/what.jpg" alt="what" title="what" width="424" height="283" class="alignleft size-full wp-image-553" /></a>Despair, anger, perplexity, pain &#8211; I think we all know this moments when dealing with large Maven projects. I have seen a lot of posts in the lasts months who use some of this words. After years with Maven we learned how to deal with it. Not the pain, I mean to deal with Maven. I want to share a way to avoid some pitfalls or give you some advices if you are in trouble.</p>
<p>Maven is a good tool to handle your dependencies. You shouldn&#8217;t copy the necessary artifacts by hand in your lib folder. It is the beginning of the end for your project. Transitive dependencies could ease the management of your dependencies and Maven is the right tool for this. But sometimes it is to much magic behind the scenes. There could be a lot of transitive dependencies and there could be conflicts. Even more if your projects gets larger and uses more and more open source frameworks. We had problems with two actions:</p>
<ul>
<li>Change the version of a dependency</li>
<li>Update the version of Maven</li>
</ul>
<p><span id="more-552"></span></p>
<p><strong>Change the version of a dependency</strong></p>
<p>If you update the version of a dependency this could cause completely different transitive dependencies to be fetched. Normally no big deal, but you need to clean your artifacts. Often you just use <em>mvn install</em> to install your artifact. But without the <em>clean</em> target, the old dependencies are still in your target folder. Remember to use <em>mvn clean install</em> when changing the version of a dependency. But there is also another place, where old dependencies can survive. If you hot deploy your artifacts to your server, you should also delete the old artifacts and extracted folders. After that you are in a really clean condition.</p>
<p><strong>Update the version of Maven</strong></p>
<p>We had problems with transitive dependencies when changing the version of Maven. Make sure that every team member and build server uses the same version. Then you can still have problems, but there are no different transitive resolutions on different computers. Can be very confusing if one person in the team has version A and another one has version B. I think the Maven team tries to reduce this, but if there are changes in the dependency resolution, it could happen that conflicts are solved in a different way.</p>
<h2>What about real trouble?</h2>
<p>If you have a lot open source dependencies, there are much more transitive dependencies. Maven tries to resolve conflicts, but you will often find a situation, where dependencies A and B needs the same transitive dependency but in a different version. This can produce situations, described in the post: <a href="http://agilesoftwaredevelopment.com/blog/pbielicki/maven-supports-jar-hell">Maven supports JAR hell</a>. Something is wrong and you have a lot of unwanted dependencies in your library folder. The next step is to find out, where they come from. This can be complicated, because transitive dependencies also have own transitive dependencies.</p>
<h2>Find out where the dependencies come from</h2>
<p>There are different solutions for this and Maven has improved the detection of dependencies for users. Most of the time I use the Maven site. It is always a good idea to use this feature, because it can give you a nice overview of your project. Take the time and configure your site, it is very helpful for the team.</p>
<p>To generate the Maven site just use: <em>mvn site</em></p>
<p>This will generate a linked web site, where you can use a lot plugins. There is also the section dependencies, where you can have a look what dependencies exist and watch the transitive dependencies tree.</p>
<p>But there are also command line options. First of all the <a href="http://maven.apache.org/plugins/maven-dependency-plugin/">Maven Dependency Plugin</a>. To get the transitive dependencies tree just type: <em>mvn dependency:tree</em></p>
<p>It will display where the dependencies come from. It is also possible to <a href="http://maven.apache.org/plugins/maven-dependency-plugin/examples/filtering-the-dependency-tree.html">filter the output</a> or <a href="http://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-the-dependency-tree.html">find conflicts</a>.</p>
<p>We also use the concept of parent POMs with a deeper hierarchy. Sometimes you need to know, how your effective POM in the sub-project looks like. To get this information use: <em>mvn help:effective-pom</em></p>
<p>You should have a look at the <a href="http://maven.apache.org/plugins/maven-help-plugin/index.html">Maven Help Plugin</a>, because there are some interesting other options.</p>
<h2>Start your own dependency management</h2>
<p>That doesn&#8217;t mean that you don&#8217;t use Maven. But most of the time you know your artifacts and their actual version. And you want a specific version to be included. You also want to have a consistent version of an artifact used through all sub-projects, then you can use declarative dependency management in Maven. That can avoid classpath issues. It is also very easy to upgrade a version, because the child-POMs don&#8217;t have a version included. They use the version defined in the parent POM.</p>
<p>We manage our dependencies in our master parent POM. There is a section in the XML called dependencyManagement. There you can list your dependencies and add the group, the artifactId and very important: the version. Now every time Maven tries to resolve a dependency it is using this specified version. Easy, isn&#8217;t it? Yes, the dependency management list is getting larger, but in a large project you are very pleased to find always the correct version of your dependencies.</p>
<p>Read more about this in the <a href="http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management">Maven documentation</a>.</p>
<p>For us it was a great time saver, because we had less problems with Maven. You don&#8217;t need your own dependency management, but if you run in trouble think about using it.</p>
<p>If you want the know about the best Maven plugins, check out the <a href="http://www.agimatec.de/blog/2008/08/top-10-maven-plugins/">Top 10 Maven plugins on our blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2009/02/dependency-management-in-maven-done-right/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bean Validation (JSR-303) &#8211; 3/3 Ausblicke</title>
		<link>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-33-ausblicke/</link>
		<comments>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-33-ausblicke/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 10:01:24 +0000</pubDate>
		<dc:creator>roman.stumm</dc:creator>
				<category><![CDATA[Deutsch]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Validierung]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=435</guid>
		<description><![CDATA[Im letzten Teil der Blog-Einträge zur JSR-303 möchte ich einige Ideen für Integrationsmöglichkeiten vorstellen, die sich durch die Verwendung von Metadaten ergeben sowie einen Ausblick auf die kommende erste offizielle Referenzimplementierung geben. Beispiel 1: Verwendung im AJAX-Layer Um auf die Metadaten außerhalb von Java im JavaScript einer AJAX-GUI zugreifen zu können, wird aus den MetaBeans [...]]]></description>
			<content:encoded><![CDATA[<p>Im letzten Teil der Blog-Einträge zur JSR-303 möchte ich einige Ideen für Integrationsmöglichkeiten vorstellen, die sich durch die Verwendung von Metadaten ergeben sowie einen Ausblick auf die kommende erste offizielle Referenzimplementierung geben.<span id="more-435"></span></p>
<p><strong>Beispiel 1: Verwendung im AJAX-Layer</strong></p>
<p>Um auf die Metadaten außerhalb von Java im JavaScript einer AJAX-GUI zugreifen zu können, wird aus den MetaBeans ein JSON-String erzeugt, den ein Servlet zurückgeben kann:</p>
<p><code>public void service(  HttpServletRequest req,  HttpServletResponse res)<br />
throws ServletException, IOException {<br />
res.setContentType("text/javascript");<br />
JSONGenerator jsonGenerator =    new JSONGenerator();<br />
PrintWriter writer = res.getWriter();<br />
try {<br />
String output = jsonGenerator.toJSON(manager.findAll().values());<br />
writer.write(output);<br />
} catch (Exception e) {<br />
throw new ServletException("error creating JSON for metaBeans", e);<br />
}<br />
}<br />
</code></p>
<p>Dabei werden auch die Typinformationen von Java nach JSON übertragen, da diese ansonsten verloren gingen. Die Beans selbst überträgt das AJAX-Framework <a href="http://getahead.org/dwr/ ">DWR</a>, was nicht Gegenstand dieses Eintrages ist.</p>
<p><strong>Beispiel 2: Verwendung im Webservice-Layer</strong></p>
<p>Eine weitere Einsatzmöglichkeit stellt sich bei  Validierung eingehender Objekte eines Webservice. Am Beispiel der Webservice Frameworks <a href="http://xfire.codehaus.org/ ">XFire oder CXF</a> kann eine eigene Invoker-Implementierung konfiguriert werden, welche die eingehenden Beans validiert. Die zu validierenden Methoden und Parameter werden durch die Annotation @Validate gekennzeichnet.</p>
<p>Auszug aus einem Webservice-Interface:<br />
<code>@Validate<br />
void save(@Validate  Address address)  throws ValidationException;<br />
</code><br />
Entdeckte ConstraintViolations können der Exception mitgegeben werden.</p>
<p>Im Invoker wird das Validierungsframework aufgerufen (Beispiel für XFire):</p>
<p><code>public Object invoke(Method m, Object[] params, MessageContext context) throws XFireFault {<br />
BeanValidator validator =     new BeanValidator();<br />
ValidationResults results =    validator.validateCall( m, params);<br />
if (results != null &amp;&amp;   !results.isEmpty()) {<br />
throw new XFireFault(new  ValidationException(results),   XFireFault.RECEIVER);<br />
}<br />
return super.invoke(  m, params, context);<br />
}<br />
</code></p>
<p>Die zugehörige Konfiguration für XFire sieht dabei so aus:<br />
<code>&lt;beans&gt;<br />
&lt;bean id="TxInvoker" class="com.example.xfire.TransactionalInvoker"<br />
scope="prototype"/&gt;<br />
</code><br />
<code><br />
&lt;service xmlns="http://xfire.codehaus.org/config/1.0"&gt;<br />
&lt;name&gt;ExampleService&lt;/name&gt;<br />
&lt;serviceClass&gt;com.example.service.ExampleService&lt;/serviceClass&gt;<br />
&lt;implementationClass&gt;com.example.service.ExampleServiceImpl&lt;/implementationClass&gt;<br />
&lt;serviceFactory&gt;jsr181&lt;/serviceFactory&gt;<br />
&lt;invoker&gt;#TxInvoker&lt;/invoker&gt;<br />
&lt;/service&gt;<br />
&lt;/beans&gt;</code></p>
<p>Weitere Anwendungsmöglichkeiten sind die Visualisierung der Pflichtfelder und Validierungsfehler in Swing-GUIs oder einem Webformular.</p>
<p><strong>Ausblick</strong></p>
<p>Seit Oktober 2008 entsteht eine <a href="http://anonsvn.jboss.org/repos/hibernate/validator/trunk/">Referenzimplementierung</a>, die sich an Hibernate-Validator orientiert. Von der  veröffentlichten <a href="http://jcp.org/aboutJava/communityprocess/edr/jsr303/">Draft-Spec des JSR-303</a><br />
wurde dabei in den letzten Monaten mehrfach massiv abgewichen, um neue Features und Anregungen, die von der Java-Community eingegangen sind, einzubeziehen. Das agimatec-validation framework implementiert den jeweils aktuellen Stand der APIs möglichst zeitnah und vollständig. Wir gehen davon aus, dass sich bis zum offiziellen 1.0 Release des Standards noch mehrfach einiges ändern wird, da die Referenzimplementierung noch unvollständig ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-33-ausblicke/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bean Validation (JSR-303) &#8211; 2/3 Implementierung</title>
		<link>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-23-implementierung-agimatec-validation/</link>
		<comments>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-23-implementierung-agimatec-validation/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 09:46:39 +0000</pubDate>
		<dc:creator>roman.stumm</dc:creator>
				<category><![CDATA[Deutsch]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Validierung]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=424</guid>
		<description><![CDATA[agimatec-validation framework Constraints in Annotations oder mit XML-Deskriptoren sind Metadaten, die den Domainklassen zusätzliche Semantik verleihen, die für diverse Verwendungszwecke mit der Constraint-Metadata-API ausgewertet werden kann. Diese Anforderung bestand auch schon vor Zeiten der JSR-303 und hat die agimatec GmbH dazu veranlasst, das Framework „agimatec-validation“ im Frühjahr 2007 zu entwickeln. Das Framework ist seither als [...]]]></description>
			<content:encoded><![CDATA[<p><strong>agimatec-validation framework<br />
</strong></p>
<p>Constraints in Annotations oder mit XML-Deskriptoren sind Metadaten, die den Domainklassen zusätzliche Semantik verleihen, die für diverse Verwendungszwecke mit der Constraint-Metadata-API ausgewertet werden kann.</p>
<p>Diese Anforderung bestand auch schon vor Zeiten der JSR-303 und hat die agimatec GmbH dazu veranlasst, das Framework „agimatec-validation“ im Frühjahr 2007 zu entwickeln. Das Framework ist seither als Basis zur Erzeugung dynamischer AJAX Oberflächen für Portlets und zur Validierung in Webservices produktiv im Einsatz.</p>
<p>Durch die konzeptionelle Nähe war es bei Erscheinen der JSR-303 möglich, das <a href="http://code.google.com/p/agimatec-validation/">agimatec-validation Framework</a> so zu erweitern, dass damit rasch die erste und bislang  vollständigste Implementierung des Specification-Draft als OpenSource veröffentlicht wurde.<span id="more-424"></span></p>
<p>Zusätzliche Anforderungen waren dabei, dass</p>
<ul>
<li>eine möglichst automatische Generierung der Metadaten als XML-Dateien erfolgt,</li>
<li>eine Klasse zur Laufzeit unterschiedliche Metadaten und Validierungsregeln besitzen kann (z.B. für rechteabhängige Validierung),</li>
<li>die „höheren“ Schichten (hier: die GUI-Schicht) die Metadaten erweitern oder selektiv überschreiben können und</li>
<li> die Metadaten den AJAX GUIs in Form von <a href="http://www.json.org/ ">JSON (JavaScript Object Notation)</a> zur Verfügung stehen sollen.</li>
</ul>
<p><strong>Generierung aus Datenbankinformationen</strong></p>
<p>Die häufigsten Metainformationen betreffen  Pflichtfelder und Feldlängen. Diese sind im Datenbankschema definiert oder durch  Annotationen der Package javax.persistence<br />
<code>@Column(nullable, length, unique) oder<br />
@JoinColumn(...)</code><br />
an den Entity-Klassen definiert. Um aus dem Datenbankschema oder den Annotationen entsprechendes XML zu generieren bieten sich die als OpenSource verfügbaren <a href="http://code.google.com/p/agimatec-tools/">agimatec-tools</a> an (oder eine MDA-Lösung).</p>
<p>Das hier gezeigte XML folgt dem agimatec-validation Framework, da die JSR-303 bislang noch keine Aussage über XML-Tags getroffen hat:</p>
<p><code>&lt;beanInfos&gt;<br />
&lt;bean id=“Address“<br />
impl=“test.jsr303.Address“&gt;<br />
&lt;property name=“line1“<br />
mandatory=“true“<br />
maxLength=“30“/&gt;<br />
&lt;property name=“line2“<br />
maxLength=“30“/&gt;<br />
&lt;property name=“zipCode“<br />
mandatory=“true“<br />
maxLength=“5“/&gt;<br />
...<br />
&lt;/bean&gt;<br />
...<br />
&lt;/beanInfos&gt;<br />
</code></p>
<p><strong>Features und Validators per XML</strong></p>
<p>Häufige Eigenschaften sind direkt als Attribut deklarierbar, sonstige Informationen werden mit &lt;feature&gt;-Tags abgelegt:</p>
<p><code><br />
&lt;feature key="readonly"&gt;<br />
&lt;value class="boolean"&gt;true&lt;/value&gt;<br />
&lt;/feature&gt;<br />
</code></p>
<p>Eigene Validator-Implementierungen werden über das &lt;validator&gt;-Tag konfiguriert:</p>
<p><code><br />
&lt;beanInfos&gt;<br />
&lt;validator id="email"<br />
java="my.own.EMailValidation"/&gt;<br />
&lt;bean id=“Customer“&gt;<br />
&lt;property name=“emailAddress“&gt;<br />
&lt;validator refId="email"/&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;/beanInfos&gt;<br />
</code></p>
<p>Nicht alle Metadaten sind zur Validierung relevant, sondern können für andere Zwecke z.B. zur Erzeugung einer Oberfläche genutzt werden. So können z.B. Feldreihenfolgen im Eingabeformular, Felder zur Darstellung in einer Tabelle oder die Properties zur Anzeige einer Beschreibung eines Objekts aus den Metadaten hervorgehen. Hier sind der Phantasie der GUI-Entwickler kaum Grenzen gesetzt.</p>
<p>Da die Metadaten aus diversen Quellen (Annotations, unterschiedlichen XML-Dateien und/oder den JDK-BeanInfos) zusammengestellt werden, können Zusatzinformationen beispielsweise in gesonderten XML-Dateien gehalten werden, während andere Informationen per Generierung zustande kommen.</p>
<p>Jede XML-Datei mit Metadaten muss  registriert werden:</p>
<p><code>MetaBeanManager manager =  new MetaBeanManager();<br />
manager.addResourceLoader("beanInfos.xml");</code></p>
<p>Auf die Metadaten einer Domainklasse kann alternativ zur Metadata-API des JSR-303 direkt über den MetaBeanManager zugegriffen werden:</p>
<p><code>MetaBean metabean =  manager.findForClass(Address.class);<br />
// oder<br />
metaBean =  manager.findForId(„Address“);<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-23-implementierung-agimatec-validation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bean Validation (JSR-303) &#8211; 1/3 Standard</title>
		<link>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-13-standard/</link>
		<comments>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-13-standard/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 09:33:21 +0000</pubDate>
		<dc:creator>roman.stumm</dc:creator>
				<category><![CDATA[Deutsch]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Validierung]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=409</guid>
		<description><![CDATA[Die Modellschicht ist das Kernstück der meisten Anwendungen und beeinflusst Schnittstellen, Datenbankdesign und Oberflächen. Validierungsregeln und Metadaten, die über die Typinformationen von Java hinausgehen, können mit Hilfe von Annotations oder XML, deklariert werden. Daraus ergeben sich Chancen zur Verbesserung der Konsistenzprüfungen und Verarbeitung der Modellschicht in unterschiedlichen Anwendungslayern. Neben den seit Jahren bekannten proprietären Validierungsframeworks [...]]]></description>
			<content:encoded><![CDATA[<p>Die Modellschicht ist das Kernstück der meisten Anwendungen und beeinflusst Schnittstellen, Datenbankdesign und Oberflächen. Validierungsregeln und Metadaten, die über die Typinformationen von Java hinausgehen, können mit Hilfe von Annotations oder XML, deklariert werden. Daraus ergeben sich Chancen zur Verbesserung der  Konsistenzprüfungen und Verarbeitung der Modellschicht in unterschiedlichen Anwendungslayern.</p>
<p>Neben den seit Jahren bekannten proprietären Validierungsframeworks liegt seit März 2008 mit der JSR-303 ein Spezifikationsvorschlag für eine Java API für JavaBeans vor, der zukünftige Tools und Standards beeinflussen wird.</p>
<p>In den folgenden drei Einträgen stelle ich</p>
<p>a) Grundkonzepte der JSR-303<br />
b) eine erste Implementierung des Standards<br />
und<br />
c) Beispiele für Integrationsmöglichkeiten und die Referenzimplementierung<br />
vor.<br />
<span id="more-409"></span><br />
Datenvalidierung ist eine allgemeine Aufgabe, die leider über die meisten Schichten einer Anwendung verteilt ist und dabei oftmals die Implementierung gleicher oder ähnlicher Regeln in jeder Schicht zur Folge hat. Dies führt zu doppeltem Code und Fehleranfälligkeit.</p>
<p>Für die Konsistenzprüfung umfangreicher Modelle von Businessentitäten müssen Validierungsregeln deklariert oder programmiert werden. Zu diesem Zweck gibt es seit Jahren bereits eine Vielzahl an proprietären Frameworks, einige Beispiele:</p>
<ul>
<li>
<p style="margin-bottom: 0cm; font-style: normal;" align="left"><a href="http://commons.apache.org/validator/ "><span style="font-family: Times New Roman,serif;"><span style="font-size: small;">Apache 	Common-Validator </span></span></a></p>
</li>
<li>
<p style="margin-bottom: 0cm; font-style: normal;" align="left"><a href="http://struts.apache.org/1.2.4/userGuide/dev_validator.html "><span style="font-family: Times New Roman,serif;"><span style="font-size: small;">Struts-Validation 	für Webclients und JavaScript</span></span></a></p>
</li>
<li>
<p style="margin-bottom: 0cm; font-style: normal;" align="left"><a href="http://validator.hibernate.org "><span style="font-family: Times New Roman,serif;"><span style="font-size: small;">Hibernate-Validator 	(mit JBoss Seam Integration) </span></span></a></p>
</li>
<li>
<p style="margin-bottom: 0cm; font-style: normal;" align="left"><a href="http://www.opensymphony.com/xwork/wikidocs/Validation%20Framework.html "><span style="font-family: Times New Roman,serif;"><span style="font-size: small;">WebWork mit XWork 	Validation Framework</span></span></a></p>
</li>
</ul>
<p>Diese sind jedoch meist darauf ausgelegt, die Validierung in einer bestimmten Schicht der Anwendung abzusichern und sind sich allenfalls konzeptionell ähnlich. Einen Java-Standard für Deklaration und Prüfung von Validierungs-Constraints gab es bislang nicht.<br />
Seit März 2008 liegt mit der „JSR-303: Bean Validation“ ein erster Vorschlag für einen allgemeinen Validierungsstandard im Javaumfeld vor, der zukünftig Einfluß auf Tools, Produkte und darauf aufbauende Standards haben soll. Ziel der Spezifikation ist es, als Erweiterung des Java-Beans Objektmodells in Java EE und SE eine einheitliche API für alle Schichten, sei es die Persistence Schicht, die Web Schicht und andere GUI-Schichten (z.B. Swing), zu bieten.</p>
<p style="margin-bottom: 0cm; font-style: normal;" align="left"><span style="font-family: Times New Roman,serif;"><span style="font-size: small;"><strong>Grundkonzepte der Spezifikation</strong></span></span></p>
<p>Als Metamodell zur Deklaration von Constraints schlägt der <a href="http://jcp.org/aboutJava/communityprocess/edr/jsr303/">Draft der JSR-303</a> Annotationen für JavaBeans vor. Ferner wird in Aussicht gestellt, dass auch XML-Deployment-Descriptoren unterstützt werden sollen, was zum Zeitpunkt der Erstellung dieses Artikels aber noch nicht spezifiziert wurde. Alle Klassen der Spezifikation selbst werden sich im Package „javax.validation“ befinden.</p>
<p style="margin-bottom: 0cm;" align="left"><span style="font-family: Times New Roman,serif;"><span style="font-size: small;"><em><strong>Annotation der Domainklassen</strong></em></span></span></p>
<p>Um für die Domainklasse „Address“ festzulegen, dass die Felder „line1“ und „zipCode“ Pflichtfelder sind und die Werte eine  maximale Anzahl Zeichen nicht überschreiten dürfen, schreibt man:<br />
<code>public class Address {<br />
@NotEmpty @Length(max = 30)<br />
private String line1;<br />
@Length(max = 30)<br />
private String line2;<br />
@NotEmpty @Length(max = 5)<br />
private String zipCode;<br />
...<br />
}</code></p>
<p>Folgende Sprachkonstrukte dürfen hierzu mit Annotationen versehen werden:</p>
<ul>
<li> Instanzvariablen (field validation)</li>
<li> Getter-Methoden (method validation)</li>
<li> die Klasse selbst (bean-level constraints)</li>
<li> Superklassen und</li>
<li> Interfaces.</li>
</ul>
<p>Es ist daher auch möglich, die Klasse „Customer“ durch Annotation ihres Interfaces „Person“ mit Constraints zu versehen:</p>
<p><code>public interface Person {<br />
@NotEmpty<br />
String getFirstName();<br />
String getMiddleName();<br />
@NotEmpty<br />
String getLastName();<br />
}</code></p>
<p><code><br />
public class Customer implements Person {<br />
private String firstName;<br />
private String middleName;<br />
private String lastName;<br />
@Password(robustness = 5)<br />
private String password;<br />
...<br />
}<br />
</code></p>
<p>Alle Constraints aus Oberklassen und Interfaces werden stets vererbt. Neben den Annotationen, welche die Implementierung der Spezifikation mitbringen wird, können beliebige eigene genutzt werden.</p>
<p><strong>Eigene Constraints definieren</strong><br />
Zur Implementierung neuer Constraints müssen die entsprechende Annotation und ein  ConstraintValidator erstellt werden.<br />
Die Annotation wird im Domainmodell wie bereits dargestellt verwendet. Aufgerufen wird die Implementierung von einem Validator,  welcher darüber entscheidet ob der Constraint erfüllt ist oder nicht.</p>
<p>Dazu folgt ein Beispiel für die Annotation „Pattern“:</p>
<p><code>@Documented<br />
@Target({METHOD, FIELD})<br />
@Retention(RUNTIME)<br />
@ConstraintValidator(<br />
PatternValidator.class)</code><br />
<code><br />
public @interface Pattern {<br />
String regex();<br />
String message()<br />
default "{beancheck.pattern}";<br />
String[] groups() default {};<br />
}</code></p>
<p>Die Implementierung „PatternValidator“ soll den Wert der annotierten Property gegen den angegebenen regulären Ausdruck aus „regex“ prüfen. Der ConstraintValidator PatternValidator muss das Interface „javax.validation.Constraint“ implementieren, das die Methode<br />
<code>boolean isValid(Object value, ConstraintContext constraintContext);</code><br />
beinhaltet.</p>
<p><strong>Mehrfache Zuweisung von Constraints gleichen Typs</strong></p>
<p>Um mehrere gleiche Constraints mit unterschiedlichen Parametern für das gleiche Feld verwenden zu können, unterstützt die Spezifikation sogenannte „multi-valued constraints“.  Eine Annotation darf hierbei die eigentlichen Constraint-Annotations als Array im Feld „value“ beinhalten:</p>
<p><code>@Documented<br />
@Target({ElementType.METHOD, FIELD})<br />
@Retention(RUNTIME)<br />
public @interface Patterns {<br />
Pattern[] value();<br />
}<br />
</code></p>
<p>In der Verwendung liest sich dies dadurch folgendermaßen:<br />
<code><br />
public class Engine {<br />
@Patterns({<br />
@Pattern(regex = "^[A-Z0-9-]+$"),<br />
@Pattern(regex = "^....-....$")<br />
})<br />
protected String serialNumber;<br />
...<br />
}<br />
</code></p>
<p>Das Beispiel zeigt die Constraint-Definitionen zweier @Pattern für das Feld „serialNumber“ in einer Domainklasse namens „Engine“.</p>
<p>Für die eigentliche Validierung sieht die Spezifikation das Interface „Validator“ vor. Es definiert diverse validate*() Methoden für Objekte oder einzelne Properties, welche bei Verstoß gegen die festgelegten Validierungsregeln die Menge der entsprechenden ConstraintViolation Objekte zurückgeben:<br />
<code><br />
Validator validator = ... ;<br />
Set&lt;ConstraintViolation&lt;Address&gt;&gt;<br />
errors = validator.validate(address);</code></p>
<p><code><br />
for(ConstraintViolation each :  errors) {<br />
printInvalidContraint(<br />
each.getPropertyPath(),<br />
each.getInterpolatedMessage());<br />
}</code></p>
<p>An welcher Stelle die Validierung in eine Anwendung integriert werden kann oder sollte ist nicht Bestandteil der Spezifikation.</p>
<p>Dieser Eintrag ist sowieso schon zu lang, aber alle Features im Detail zu zeigen, würde den Rahmen endgültig springen, daher hier einige weitere Features der JSR-303 stichpunktartig:</p>
<p><strong>Validierung von Objektgraphen</strong><br />
Durch die Annotation „@Valid“ können auch referenzierte Objekte in die Validierung ihres Parent-Objects einbezogen werden. Auf diese Weise ist es möglich,  mit einem Aufruf der Validierungs-API ganze Objektgraphen zu validieren.</p>
<p><strong>Mehrsprachige Meldungen</strong><br />
Ein Constraint kann eine eigene Fehlermeldung im Annotation-Element „message“ festlegen. Die Spezifikation beschreibt die Möglichkeit, die Meldungen mehrsprachig in ein  ResourceBundle auszulagern und in den Annotationen nur die sprachunabhängigen Schlüssel zu referenzieren.</p>
<p>Mit <strong>Class-Level Constraints</strong> können ganze Objekte anstatt einzelner Properties validiert werden. Als Anwendungsbeispiel kann man sich einen Validator vorstellen, der überprüft, ob die angegebene Stadt in einer Adresse zu Land und Postleitzahl passt.</p>
<p><strong>Validierungsgruppen</strong> ermöglichen eine teilweise Validierung und werden von der Community noch diskutiert, wobei die Expert Group nach Möglichkeiten sucht, dies verständlich und gleichzeitig flexibel zu gestalten.<br />
Eine Reihenfolge der Validierungen festzulegen ermöglicht die Annotation @GroupSequence.<br />
Mit Hilfe der Gruppen und Reihenfolge ist es möglich, dass in einer Anwendungsschicht nur bestimmte Validierungen durchgeführt werden („Wizzard-Style“) um auch bereits unvollständig initialisierte Objekte prüfen zu können oder die Validierung so gestaltet wird, dass zeitaufwändige Verarbeitungen nachgelagert werden („Short-Circuit“).</p>
<p>Mit der <strong>Constraint-Metadata API </strong>wird eine Schnittstelle definiert, die Auskunft über die Constraints einer Klasse oder einzelner Properties gibt. Auch diese API steht noch nicht abschließend fest, dürfte aber für Toolhersteller von besonderem Interesse sein.</p>
<p>Wer mehr über die Spezifikation erfahren möchte, sei auf den <a href="http://blog.emmanuelbernard.com/2008/05/jsr-303-interviews.html ">Blog des Lead-Autors</a> der JSR-303 verwiesen, der für alle Features auch Beispiele vorstellt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/12/bean-validation-jsr-303-13-standard/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Nabaztag plugin for TeamCity</title>
		<link>http://www.agimatec.de/blog/2008/07/nabaztag-plugin-for-teamcity/</link>
		<comments>http://www.agimatec.de/blog/2008/07/nabaztag-plugin-for-teamcity/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 14:50:39 +0000</pubDate>
		<dc:creator>Simon Tiffert</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Nabaztag]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=189</guid>
		<description><![CDATA[BuildBunny is our Nabaztag plugin for TeamCity. After our switch to the continuous build server TeamCity, our bunny just reads the time every hour. To change the situation I have created BuildBunny as new notifier in TeamCity. You can download it here. Nabaztag A Nabaztag is a WiFi enabled electronic device with a text to [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.agimatec.de/blog/wp-content/uploads/2008/07/nabaztag-speech.jpg"><img class="alignleft alignnone size-medium wp-image-190" style="float: left;" title="nabaztag-speech" src="http://www.agimatec.de/blog/wp-content/uploads/2008/07/nabaztag-speech.jpg" alt="" width="300" height="229" /></a><strong>BuildBunny</strong> is our Nabaztag plugin for TeamCity. After our switch to the continuous build server TeamCity, our bunny just reads the time every hour. To change the situation I have created BuildBunny as new notifier in TeamCity.</p>
<p>You can download it <a href="http://code.google.com/p/buildbunny/">here</a>.</p>
<p><strong>Nabaztag</strong></p>
<p>A Nabaztag is a WiFi enabled electronic device with a text to speech engine, rotating ears and colorful leds. When connected to your WiFi it can read mails, RSS feeds, weather forecast or can be accessed with a <a href="http://doc.nabaztag.com/api/">API</a>. You are not directly connected to the bunny, all messages are sended and managed by the Nabaztag server.</p>
<p><strong>TeamCity</strong></p>
<p>We manage our continuous integration with TeamCity. It is a product of JetBrains, the guys with the great IntelliJ Idea IDE. Before we started using TeamCity we had CruiseControl running. The configuration was very complicated and the interface wasn&#8217;t an eye catcher. With TeamCity we can configure all our Maven2 builds in a nice web interface with a lot of usefull settings. There is also an IDE plugin with the possibility to have personal remote builds. The only problem was the silence of our build bunny, which was running with CruiseControl before. With the Nabaztag plugin we want to close this gap for the TeamCity and Nabaztag community.</p>
<p><strong>Screenshots</strong></p>
<p><a href="http://www.agimatec.de/blog/wp-content/uploads/2008/07/teamcity.png"><img class="alignnone size-thumbnail wp-image-191" title="teamcity" src="http://www.agimatec.de/blog/wp-content/uploads/2008/07/teamcity.png" alt="" width="150" height="118" /></a> <a href="http://www.agimatec.de/blog/wp-content/uploads/2008/07/teamcity2.png"><img class="alignnone size-thumbnail wp-image-192" title="teamcity2" src="http://www.agimatec.de/blog/wp-content/uploads/2008/07/teamcity2.png" alt="" width="150" height="125" /></a></p>
<p><strong>Links</strong></p>
<p>BuildBunny at Google Code: <a href="http://code.google.com/p/buildbunny/" target="_blank">http://code.google.com/p/buildbunny/</a></p>
<p>Nabaztag: <a href="http://www.nabaztag.com">http://www.nabaztag.com</a></p>
<p>TeamCity: <a href="http://www.jetbrains/teamcity">http://www.jetbrains/teamcity</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/07/nabaztag-plugin-for-teamcity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>agimatec-tools als OpenSource auf google.code released!</title>
		<link>http://www.agimatec.de/blog/2008/06/agimatec-tools-als-opensource-auf-googlecode-released/</link>
		<comments>http://www.agimatec.de/blog/2008/06/agimatec-tools-als-opensource-auf-googlecode-released/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 11:25:31 +0000</pubDate>
		<dc:creator>roman.stumm</dc:creator>
				<category><![CDATA[Deutsch]]></category>
		<category><![CDATA[Codegenerierung]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=167</guid>
		<description><![CDATA[Unsere agimatec-tools sind nun als OpenSource Projekt auf google.code veröffentlicht. Wir setzen diese Tools und Frameworks bereits seit über einem Jahr produktiv in unseren Produkten ein. Drei Tools verbergen sich bisher hinter &#8220;agimatec-tools&#8221;: 1. Ein Database-Migration Tool zum setup/alter/check von Datenbanken. Projekte, die eine oder mehrere Datenbanken (oder Datenbanken unterschiedlicher Hersteller) pflegen und weiterentwicklen, können [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.agimatec.de/blog/wp-content/uploads/2008/06/schema.png"><img class="alignnone size-medium wp-image-166" title="agimatec-tools" src="http://www.agimatec.de/blog/wp-content/uploads/2008/06/schema.png" alt="agimatec-tools" width="300" height="254" /></a></p>
<p>Unsere <a href="http://code.google.com/p/agimatec-tools/">agimatec-tools sind nun als OpenSource Projekt auf google.code</a> veröffentlicht.  Wir setzen diese Tools und Frameworks bereits seit über einem Jahr produktiv in unseren Produkten ein.</p>
<p>Drei Tools verbergen sich bisher hinter &#8220;agimatec-tools&#8221;:<span id="more-167"></span></p>
<p>1. Ein Database-Migration Tool zum setup/alter/check von Datenbanken. Projekte, die eine oder mehrere Datenbanken (oder Datenbanken unterschiedlicher Hersteller) pflegen und weiterentwicklen, können mit diesem Werkzeug das Deployment/Upgrade ihrer Datenbanken durchführen und prüfen, ob das Schema vollständig und korrekt ist. (Beispielprojekt anbei)</p>
<p>Das Tool erlaubt auch die Verarbeitung (Parsen, Transformation, Code-Generierung) von SQL-Scripten.</p>
<p>2. Ein Framework zum Datenimport, das es vor allem mit einem Groovy-Script einfach macht, CSV-Dateien, XML-Dateien und andere Textformate zu importieren. (Wir setzen es z.B. gemeinsam mit dem Datenbank-Migration-Tool ein um einen initialen Datenimport aus vom Kunden gelieferten Dateien durchzuführen.)</p>
<p>3. Das Tool &#8220;annomark&#8221; (annnogen+freemarker) zur Generierung von Code durch Annotationen, wie bereits in einem früheren Beitrag angekündigt: &#8220;<a href="http://www.agimatec.de/blog/2008/05/transferobjects-generieren/">TransferObjects generieren</a>&#8220;. Mit Annomark lassen sich flexible Verarbeitungen, nicht nur die Generierung von TransferObjekten, realisieren. (Ein Beispielprojekt demonstriert weitere Möglichkeiten.)</p>
<p>Die Veröffentlichung beinhaltet nicht nur Source und Binaries, sondern bietet auch Beispielprojekte und -templates, die für eigene Maven-Projekte verwendet werden können und umfassend die Verwendung der APIs demonstrieren.  Auf google.code sind die Frameworks jeweils ausführlich im Wiki auf Englisch dokumentiert.</p>
<p>Jetzt sind wir gespannt auf Rückmeldungen und Anregungen und freuen uns, wenn diese Tools dem einen oder anderen weiterhelfen können!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/06/agimatec-tools-als-opensource-auf-googlecode-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Plugins für Maven2 auf google.code</title>
		<link>http://www.agimatec.de/blog/2008/05/plugins-fur-maven2-auf-googlecode/</link>
		<comments>http://www.agimatec.de/blog/2008/05/plugins-fur-maven2-auf-googlecode/#comments</comments>
		<pubDate>Tue, 20 May 2008 11:23:48 +0000</pubDate>
		<dc:creator>roman.stumm</dc:creator>
				<category><![CDATA[Deutsch]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Test]]></category>

		<guid isPermaLink="false">http://www.agimatec.de/blog/?p=122</guid>
		<description><![CDATA[Wir stellen vor: Zwei kleine Plugins für maven2, heute als Open-Source Projecte herausgegeben. Plugin 1: verifysize Das Problem: Manchmal bemerkt man recht spät, dass die Größe von .ear oder .war Archiven mal wieder unerwartet angewachsen ist, z.B. weil sich indirekte Abhängigkeiten im Projekt geändert haben. Das &#8220;verifysize&#8221; Plugin prüft die Größe des Artefakts. Überschreitet (oder [...]]]></description>
			<content:encoded><![CDATA[<p>Wir stellen vor: Zwei kleine Plugins für maven2, heute als Open-Source Projecte herausgegeben.</p>
<p><strong>Plugin 1: verifysize</strong><br />
Das Problem: Manchmal bemerkt man recht spät, dass die Größe von .ear oder .war Archiven mal wieder unerwartet angewachsen ist, z.B. weil sich indirekte Abhängigkeiten im Projekt geändert haben. Das &#8220;verifysize&#8221; Plugin prüft die Größe des Artefakts. Überschreitet (oder unterschreitet) sie einen angegeben Wert, so schlägt der Build (wahlweise) fehl.<br />
Durch diesen zeitnahen Hinweis läßt sich die Ursache meist schnell finden.</p>
<p><strong>Plugin 2: wait</strong><br />
Das Problem: Eines unserer Maven-Projekte soll Integration-Tests gegen eine Serverinstallation ausführen. Der Server wird deployed und nach einiger Zeit von einem cron-Job automatisch gestartet. Das Maven-Projekt muß aber so lange warten, bis der Serverstart abgeschlossen ist, bevor mit der Ausführung der Integration-Tests begonnen wird.<br />
Mit dem &#8220;wait&#8221; Plugin kann der Buildprozess auf die Verfügbarkeit einer (oder mehrerer) URLs warten, z.B. darauf, dass die zu testende Webanwendung oder der benötigte Webservice verfügbar ist.<br />
(Die Verwendung des cargo-Plugins war mir für dieses Problem zu komplex.)</p>
<p><strong>Download und Dokumentation: </strong><br />
<a href="http://code.google.com/p/agimatec-maven-plugins/" target="_blank"> http://code.google.com/p/agimatec-maven-plugins/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.agimatec.de/blog/2008/05/plugins-fur-maven2-auf-googlecode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
