tag:blogger.com,1999:blog-10431854993745799952024-03-05T20:51:13.854-08:00Jeroens blogjerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.comBlogger23125tag:blogger.com,1999:blog-1043185499374579995.post-81192325574372542512015-11-07T12:44:00.000-08:002015-12-07T11:40:47.204-08:00Scripting vector graphics with iPath<p>Since a while I've been creating a language (or DSL) in Javascript for scripting designs, images, contours etc. I called it iPath and it's used in my website <a href="http://www.stretchsketch.com/">StretchSketch</a>.
</p>
<p>
Originally iPath is intended for creating cnc files. The idea was to create customisable templates, which can be cut by cnc devices like routers, lasercutter or watercutters. At first I thought that SVG was the lingua franca for vectorised graphics but this is only true in the world of internet (browsers). CNC shops still hold to their good old DXF. Converting SVG to DXF turned out to be less straightforward than anticipated. Inkscape did do a poor job (at that time), and other solutions where costly. So I decided to make iPath format agnostic. Currently it can generate SVG and DXF but theoretically other generators can be used as well.
</p>
<p>
In iPath one can formulate a 2D drawing by instantiating a new iPath and calling methods on it in a way known as a fluent interface. A square can be formed by the following snippet:
</p>
<pre class="brush:js;">
var square = new iPath().line(20,0).line(0,20).line(-20,0).line(0,-20);
</pre>
<p>
A line takes 2 arguments an x and y coordinate, so above will generate a square with a length of 20.
</p>
<pre class="brush:js;">
var l = 30;
var square = new iPath().line(l,0).line(0,l).line(-l,0).line(0,-l);
</pre>
<p>
This will create a square with a length of 30 but its easier to adapt its dimension. So far we've only been creating the model, we can't show the model yet. If we want to display the square as SVG (as the path's d-attribute) we need to call dPath(significance).
</p>
</p>
<pre class="brush:js;">
<path id="s3" d="M 0 0"/>
..
document.getElementById("s3").setAttribute('d', "M 10 10" + square.dPath(3));
</pre>
<p>
iPath's lines, moves etc are all relative: every movement is measured from the pen's current position. The only time absolute coordinates are needed, is for positioning your iPath model. In SVG path capitalised Characters means absolute parameters, and this is exactly what the "M 10 10" means: go to (10,10) in your current view).
</p>
<p>
So far we've only been looking at x,y coordinates (Cartesian), but we can also use polar coordinates. In this case we need to give an angle and distance as argument. Seasoned programmers may remember turtle graphics, part of the logo programming language, and iPath borrows this for indicating cartesian lines. The argument for turtleLine is an object with the angle (a) an distance (r) as properties. When repeated it is possible to create circular figures.
</p>
<pre class="brush:js;">
var gear = {};
gear.n = 20;
gear.r=100;
gear.h=0.7;
gear.ribbon = gear.r * Math.sin(Math.PI/gear.n) * 2 ;
gear.toothAngle = Math.atan(2* gear.h, gear.ribbon);
gear.toothSide = gear.ribbon / (2*Math.cos(gear.toothAngle));
gear.iPath = new iPath().turtleLine({a: (2*Math.PI / gear.n) - gear.toothAngle, r: gear.toothSide})
.turtleLine({a: 2*gear.toothAngle, r: gear.toothSide}).turtleLine({a:-gear.toothAngle})
.repeat(gear.n);
</pre>
<p>
This will create a gear:
</p>
<div style="margin: 10px 10px 10px 10px; float: left; cursor: pointer;" >
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="300" height="300">
<g stroke="red" stroke-width="0.8" fill="none" transform="scale(1)">
<path id="loop1" d="M150 25 l 21.646 -15.995 8.11 25.663 25.529 -8.523 -0.217 26.913 26.913 -0.217 -8.523 25.529 25.663 8.11 -15.995 21.646 21.901 15.643 -21.901 15.643 15.995 21.646 -25.663 8.11 8.523 25.529 -26.913 -0.217 0.217 26.913 -25.529 -8.523 -8.11 25.663 -21.646 -15.995 -15.643 21.901 -15.643 -21.901 -21.646 15.995 -8.11 -25.663 -25.529 8.523 0.217 -26.913 -26.913 0.217 8.523 -25.529 -25.663 -8.11 15.995 -21.646 -21.901 -15.643 21.901 -15.643 -15.995 -21.646 25.663 -8.11 -8.523 -25.529 26.913 0.217 -0.217 -26.913 25.529 8.523 8.11 -25.663 21.646 15.995 15.643 -21.901 15.643 21.901"/>
</g>
</svg>
</div>
<p>
Feel free to experiment with the <a href="http://www.stretchsketch.com/?sketch=iPath/gear.jsvg">customizable gear</a>.
</p>
<p>
As stated earlier iPath has been created for CNC applications, one of the features is to generate dxf alongside to SVG. This possiblity lets you adapt and view interactively SVG designs in the browser. Once a design is completely to your liking, it can be generated in DXF. Generating DXF is not as simple as it is for SVG, paths are not enough. DXF only comes in complete files and needs to be organized in layers. It is advised to use one layer per iPath model.
</p>
<pre class="brush:js;">
dxfBuilder = new DxfBuilder(new Blobber(), 3);
gear.iPath.dxf(dxfBuilder,{layer: {name: 'jeroen', layer_color: 6}});
saveAs(dxfBuilder.getBlob(), gear.filename);
</pre>
<p>
saveAs is from <a href="https://github.com/eligrey/FileSaver.js/">Eli Grey's FileSaver</a>. The DxfBuilder is from iPath's DXF library.
</p>
<p>
iPath's can be concatenated with concat:
</p>
<pre class="brush:js;">
new iPath().line(20,20).concat(new iPath().line(-20,40));
</pre>
<p>
jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com0tag:blogger.com,1999:blog-1043185499374579995.post-55739182725655323302011-02-20T05:30:00.000-08:002011-02-20T05:49:21.905-08:00chrome search enginesI've switched for quite some time now to chrome. However one oddity remained with chrome after I came back from holiday in Turkey: entering search terms in the address / search bar would lead me to the turkish google site, displaying turkish sites first, and all google information in Turkish.<br/><br />I do like Turkish pizza, and I wish good health and good fortune to the Turkish people and I even don't mind when the Turkish become member of the European Union but having my search results in Turkish is just over the edge. This is where my love for Turkey stops.<br/><br />Problem was to change this behavior I tried setting locale, but nothing was wrong with that (or maybe resetting did not solve it).<br />Until half an hour ago: I found the search engine option under the manage key at the basic preference panel. There I could not edit the default google search engine, so I tried to add an entry, but I found no way to add that entry to the default search engine part. I then removed google but alas I was not able to restore that leaving me only with bing or yahoo as a valid option.</br><br />I tried reinstalling chrome: to no avail as the user data settings are not updated. Removing the whole user data setting part (under ~/Library/Application Support/Google/Chrome/Default) Did solve my problem but that also removed all my local settings. Only removing the Web Data file was the accurate and spot on solution. This appears to be a sqlite datafile so I may be able to change it from there, but chrome is just capable of restoring this file to its original state and that solved my issue.jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com13tag:blogger.com,1999:blog-1043185499374579995.post-76402523338818688882011-01-19T09:44:00.000-08:002011-02-02T09:36:33.119-08:00file api with jqueryI have been working on a pure html website last year called iscriptdesign. It focuses on parameterized design with svg. Templates with svg and javascript code are processed, so that the user input gets evaluated by embedded javascript producing the svg. The svg can be exported, and you can use the output for a laser cutter or water cutter. <a href="http://www.iscriptdesign.com">Check it out !</a> One of the major shortcomings is the fact that it is not easy to display templates yourself. I was not able to load the template contents by a file uri, and so I had to rely on the templates on the same server as the html/javascript code for iscriptdesign resided. In the back of my mind I was looking for a more cms like approach to allow for personal uploads from third parties.<br><br />Until recently I started to realize the possibilities of the html5 file api. How sweet would it be if people could just drag n drop a template from their local filesystem on a drop spot of iscriptesign? Yesterday I started working on the project and now it's finished.<br><br />One of the real challenges was to incorporate it in jquery. Okay not really necessary of course but having the greater part of my website in jquery does make it somewhat desirable and you overtyping an example is not challenging is it?<br />help from stackoverflow and javaranch gave me head start (now that is challenging). <br /><h2>code</h2><br /><pre class="brush:js"><br />jQuery.fn.initDrop = function() {<br /> return this.each(function () {<br /> $(this).bind("dragover", function () {$(this).addClass('focus');$(".drop_container").addClass('focus'); return false;});<br /> $(this).bind("dragleave",function () { $(this).removeClass('focus');$(".drop_container").removeClass('focus'); return false;}); <br /> $(this).bind("drop",function(e) {<br /> $(".focus").removeClass("focus");<br /> $(".drop_container").addClass('focus');<br /> e.preventDefault(); <br /> var file = e.originalEvent.dataTransfer.files[0]; <br /> var reader = new FileReader(); <br /> reader.onload = function (evt) {<br /> digestRaw(evt.target.result, true);<br /> }; <br /> reader.readAsText(file); <br /> });<br /> $(this).prepend('<div class="image_container drop_container"></div>');<br /> });<br />};</pre><br /><br />The div label dropspot is a simple div tag.<br /><pre class="brush:xml"><br /> <div class="dropspot" id="dropspot">Drop Spot</div></pre><br />Which gets its drop behavior by:<br /><pre class="brush:js"><br /> $("#dropspot").initDrop();</pre><br /><br /><h2>Lessons</h2><br /><ul><li>Unfortunately I only found this working for Firefox (Mac and Windows) and Chrome (Mac, Windows not tested). Safari is not supporting this yet.</li><br /><li>dropevent needs to be unwrapped by retrieving e.orginalevent.</li><br /><li>dragend is not working should be dragleave.</li><br /><lI>In my case i need to remove linefeed/carriage return characters for windows(msdos) files I need to do a text.replace("result.replace(/\r\n?|\n/g, "");</li><br /></ul><br /><script type="text/javascript"><br /> SyntaxHighlighter.config.bloggerMode = true;<br /> SyntaxHighlighter.all();<br /></script>jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com3tag:blogger.com,1999:blog-1043185499374579995.post-68178056252201851222009-07-02T03:30:00.000-07:002009-07-02T03:53:22.783-07:00Eclipse galileoJust installed Eclipse Galileo the latest and gratest as I type.<br />with some quirks.<br />I need to set the proxy, by default it sets it to a native active provider, I had to change it to a manual "active provider".<br />Installation of subversive from polarion went fine allthough I forgot to add connectors<br />(available from http://community.polarion.com/projects/subversive/download/eclipse/2.0/galileo-site)<br />m2eclipse for maven support (http://m2eclipse.sonatype.org/update, exclude subclipse handler optional,and maven project configurators.<br />spring ide (http://springide.org/updatesite)<br /><br />Than I run into a<br /><pre>Get repository folder children operation failed.<br />svn: OPTIONS of '/svn/restofurl': 500 Server Error (http://serverrr.itc.intranet:8083)<br />svn: OPTIONS request failed on '/svn/restofurl'</pre><br />Error, which was solved by adding the serverrr.itc.intranet to the list of "bypass from proxy" in the proxy pane in the preferencesjerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com2tag:blogger.com,1999:blog-1043185499374579995.post-36820307326335618282009-02-04T08:39:00.000-08:002009-02-04T08:45:01.239-08:00mvn create artifactsJust played around with the wicket quickstart.<br />all well and fun however importing it in eclipse is not making it a web project. <br />for eclipse ganymede, <code>mvn eclipse:eclipse -Dwtpversion=2.0</code> worked almost.<br />It still gives an error in eclipse: <code>Java compiler level does not match the version of the installed Java project facet. Unknown Faceted Project Problem (Java Version Mismatch)</code> I fixed that by 1: in the compiler properties downgrading to java version 1.4, and than in projects facets setting the java version back to 5.0<br />et voila!jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com3tag:blogger.com,1999:blog-1043185499374579995.post-10548473982994510682008-12-07T11:33:00.000-08:002008-12-07T12:11:14.712-08:00mysql with launchdJust tried to install mysql on ox leopard. Instead of the documented 'MySQL Startup Item' I've chosen to go the mac road: launchd, as I understand mac's equivalent of windows services. It's something unique to mac and apparantly very flexible, check <a href="http://www.youtube.com/watch?v=cD_s6Fjdri8">it</a> out.<p><br />Mysql installs fine from the pkg distribution, however it gets installed under root:wheel. <br />bringing the file: com.mysql.mysqld.plist in /Library/LaunchDaemons/com.mysql.mysqld.plist will make it automatically pick it up during startup, you may manually control it by sudo launchctl (un)load com.mysql.mysqld.plist.<br /><div style="margin-left: 20px; margin-top:10px; margin-bottom:10px; padding: 5px; border:1px solid; width:420px; height:120px; overflow:scroll;white-space:nowrap"><a title="Drag-select from top-to-bottom, then copy, and paste into your text editor"><pre><code> <?xml version="1.0" encoding="UTF-8"?><br /><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><br /><plist version="1.0"><br /><dict><br /> <key>GroupName</key><br /> <string>admin</string><br /> <key>KeepAlive</key><br /> <true/><br /> <key>Label</key><br /> <string>com.mysql.mysqld</string><br /> <key>OnDemand</key><br /> <false/><br /> <key>Program</key><br /> <string>/usr/local/mysql/bin/mysqld</string><br /> <key>RunAtLoad</key><br /> <true/><br /> <key>UserName</key><br /> <string>jeroen</string><br /> <key>WorkingDirectory</key><br /> <string>/usr/local/mysql</string><br /></dict><br /></plist></code></pre></a></div><br /><br />starting mysql under the user mysql. However logging to mysql to change the password: mysqladmin -u root password 'secret' fails with the message:<br /><p>error: 'Access denied for user 'root'@'localhost' (using password: NO)'</p><br />I've not been able to solve the problem, the documentation failes on this point. I could not manually start mysqld because, it was installed under root:wheel. So the only way to get it right: reinstall it, chmod -R jeroen:admin /usr/local/mysql*.<br />Than do the mysqladmin -u root password 'secret'. After that update the com.mysql.mysqld.plist file to jeroen/admin for group/userid.<br />Hopefully this worksjerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com0tag:blogger.com,1999:blog-1043185499374579995.post-12666827908731717242008-11-22T08:58:00.000-08:002008-11-22T09:20:35.763-08:00motor in de garage.<table><tr><td valign="top">Ik heb een motor en die staat mooi en droog in de garage. Alleen als ik de motor eruit wil halen ben ik enorm aan sleuren en trekken. Niet heel erg handig. Vanochtend heb ik een plateau gemaakt van de aanrechtbladen die eerder vervangen zijn (niet alles meteen weggooien), en 3 kleine transport-tableautjes verkrijgbaar bij de praxis voor 10 euro per stuk. Ik was bang dat 60 cm niet genoeg zou zijn om de motor op zijn standaard te laten staan, en heb dus een plateautje wat laten uitsteken, was achteraf niet nodig. Goed om je te realiseren dat het tableau erg beweeglijk is op het moment dat je de motor erop rijdt, veranker het aan de voor- en achterkant. Als de motor er eenmaal opstaat en je versnelt zal het plateau veel sneller wegschieten dan de motor (wet van impuls denk ik). Zorg ook bij wegrijden dat het tableau aan de achterkant gezekerd is.</td><td><br /><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/NaEUR11_AHk&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/NaEUR11_AHk&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></td></tr></table>jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com0tag:blogger.com,1999:blog-1043185499374579995.post-79612407471517318552008-11-22T08:46:00.000-08:002008-11-22T08:58:22.473-08:00blazedsLast week I tried downloading blazeds to get it to work with flex, I compiled the source and followed the documentation to build it. However as usual the adobe documentation was not up to date: Here's what I had to do on mac (ox tiger).<br /><ul><br /><li>Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. Solution download <a href="http://sourceforge.net/project/showfiles.php?group_id=36177&package_id=28636">ant-contrib</a> from sourceforge, and select ant-contrib from the package. Store the obtained jar in /Developer/Java/apache-ant-1.7.0/bin/lib. And do sudo ln -ns /Developer/Java/apache-ant-1.7.0/bin/ant /usr/bin/ant to make a symbolic link.</li><br /><li>Permgen error. Gave export ANT_OPTS="-XX:MaxPermSize=512m", which does the trick</li><br /><li>some of the files ant generates can not be removed, making ant main to fail. I had to "sudo ant main" to make it all work..</li><br /></ul>jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com0tag:blogger.com,1999:blog-1043185499374579995.post-50454962664984415442008-10-19T02:30:00.000-07:002008-10-19T02:33:46.153-07:00netstat on macOn windows I was able to find ports in use by doing netstat, on the mac (ox Tiger) I can give lsof -i TCP:8080 see <a href="http://java-monitor.com/forum/showthread.php?t=22">here</a> for other os variants.jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com0tag:blogger.com,1999:blog-1043185499374579995.post-25230158455021676772008-03-07T06:19:00.000-08:002008-05-23T07:59:58.188-07:00Logging problemsDoing some unittests I could not get the logger to behave as expected. turned out that somewhere on the classpath commons-logging.properties was present.<br /><span style="color:#000000; font-size: 0.9em; font-family: courier;"> <br />System.out.println(this.getClass().getClassLoader().getResource("commons-logging.properties").toString());<br />System.out.println(this.getClass().getClassLoader().getResource("log4.jeroen").toString());<br />System.out.println(this.getClass().getClassLoader().getResource("log4j.properties").toString());<br />System.out.println(this.getClass().getClassLoader().getResource("org/apache/log4j/Logger.class").toString());<br />System.out.println(this.getClass().getClassLoader().getResource("org/apache/commons/logging/Log.class").toString());<br /></span><br />Adding this file to the root of src/test/java folder fixed this problem. <br />contents of file is:<br />org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl<br />org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger<br />I've not been able to locate this file, can be on Websphere, Spring or god knows.<br /><br />The combination of commons-logging, log4j is influencing a successful display of org.hibernate.type. The priority is set to trace, for this package name, but after log4j-1.2.12 is trace and debug separated, so debug is not working. This combination of log4j and commons-logging working for me is:<br /><span style="color:#000000; font-size: 0.9em; font-family: courier;"> <br />jar:file:/C:/projects/apache-log4j-1.2.15/log4j-1.2.15.jar!/org/apache/log4j/Logger.class<br />jar:file:/C:/projects/commons-logging-1.0.2/commons-logging-api.jar!/org/apache/commons/logging/Log.class<br />log4j.logger.org.hibernate.type=DEBUG, A1<br /></span><br />It's getting trickier and trickier, maybe the introduction of commons-logging was a bad idea, especially in combination with Websphere.<br />logging information can be forced with log4j.debug=truejerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com1tag:blogger.com,1999:blog-1043185499374579995.post-12593783024806606272008-03-05T08:02:00.000-08:002008-06-02T12:54:37.380-07:00firefox, hetnet, netmail en deleteOp het werk (en thuis ook, eigenlijk alleen mac os x) kan ik alleen firefox gebruiken omdat alle opties op IE ongedaan zijn gemaakt. Nu heeft de firefox variant van netmail geen multiple select om items weg te mikken, wat het voor netmail van hetnet allemaal wat tijdrovend en rsi gevoelig maakt.<br />Een korte zoektocht op internet leverde echter de volgende <a href="https://www.squarefree.com/bookmarklets/forms.html#toggle_checkboxes">url</a> op<br />Helaas nog niet helemaal geschikt om op hetnet te gebruiken maar wel bijna: Ten eerste sleep de button die daar staat naar de bookmark balk van firefox, of klik gewoon nieuw bookmark aan onder bookmarks.<br />zet nu in de url van deze bookmark (te bereiken via "properties")<br /><pre><br />javascript:(function(){ function toggle(box){ temp=box.onchange; box.onchange=null; box.checked=!box.checked; box.onchange=temp; } var x,k,f,j; elements=window.frames["viewer"].document.forms; for (k=0; k<elements.length; ++k) { f=elements[k]; for (j=0;j<f.length;++j) if (f[j].type.toLowerCase() == "checkbox") toggle(f[j]); } })();<br /></pre><br />Als je nu deze bookmark kiest worden alle checkboxes getoggled, de bookmark kan ook in de bookmarkbar worden geplaatst, en is dan meteen te gebruiken.<br />Ik vermoed dat het ook voor Safari werkt maar daar heb ik net te weinig ervaring mee, mijn eerste poging faalde, helaas.jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com1tag:blogger.com,1999:blog-1043185499374579995.post-87975728226596550682008-03-02T09:19:00.001-08:002008-03-02T09:20:10.892-08:00emacs trailing slashis op windows default / wat natuurlijk vervelend is:<br />(add-hook 'shell-mode-hook<br /><br /> '(lambda () (setq comint-completion-addsuffix '("\\" . "")))<br /><br /> t)<br />zet m naar backslash.jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com1tag:blogger.com,1999:blog-1043185499374579995.post-71454991506286052642008-03-02T09:10:00.000-08:002008-03-02T09:15:59.405-08:00windows processing messagesinds een tijd krijg ik een foutboodschap bij het aanmelden bij windows.<br />Windows - Geen schijf <br />exception Processing Message c00000a3 Parameters 75b6bf9c 75b6bf9c 75b6bf9c.<br />Weet niet waarom die boodschap er nu plotseling is, maar in mijn geval blijkt het te maken te hebben met de card readers die in mijn pc zitten.<br />Ik heb ze uitgezet met configuratie scherm -> systeem -> hardware -> apparaat beheer -> Medion Flash XL (CF USB, MS USB en SM USB)<br />Nu krijg ik de boodschap niet meer.jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com0tag:blogger.com,1999:blog-1043185499374579995.post-63568532478799555992007-12-31T03:10:00.001-08:002007-12-31T03:45:51.063-08:00Websphere SecurityCurrently I'm trying to port an application from WAS5.1 to WAS6.1. IBM's reputation of problem free migration and well supported and ducumented migration plans once again proves to be below the imaginary. The problem I run into lately was security: I ported over the settings for the ldap server. However that did not work out well, I even managed to cut of the branch I was sitting: I could not start the server anymore, and there for I could not modify the settings I just applied. The server quit with: <br /><div class="jcode"><br />[31-12-07 12:06:23:222 CET] 0000000a ServiceLogger I com.ibm.ws.ffdc.IncidentStreamImpl resetIncidentStream FFDC0010I: FFDC closed incident stream file c:\Program Files\IBM\WebSphere\AppServer\profiles\profile1\logs\ffdc\server1_0000000a_07.12.31_12.06.23_6.txt<br />[31-12-07 12:06:23:191 CET] 0000000a ContextManage E SECJ0270E: Failed to get actual credentials. The exception is javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]; remaining name ''<br /> at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3025)<br /> at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2946)<br /> at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2752)<br /> at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1823)<br /> at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1746)<br /> at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:383)<br /> at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:353)<br /></div><br />Turned out that the copy paste action of the groupMemberId (advanced properties under ldap settings) from nsRole:nsRole to groupOfUniqueNames:uniqueMember was one bridge to far.jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com0tag:blogger.com,1999:blog-1043185499374579995.post-9862474515020886392007-12-27T05:00:00.000-08:002007-12-27T05:09:41.535-08:00websphere act as part of local os.Currently fighting with WAS 6.1, security. The manual (http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/tsec_localos.html) states: Act as part of the operating system.<br />Which is quite easy according to MS: Computer Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment\.<br />Unfortunately this option is disabled under my account @ work. However secpol.msc does get me there.<br />To stop mcafee do: net stop mcshieldjerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com0tag:blogger.com,1999:blog-1043185499374579995.post-36944529578588575682007-10-07T02:51:00.000-07:002007-10-07T02:55:02.448-07:00Eclipse workspaces on the mac.to create a new eclipse app with a preconfigured workspace:<br />go to /Applications/eclipse<br />copy the Eclipse icon.<br />ctrl (right) click on the new one, and chose show package contents. Go to plist, and change the -data value.<br />(http://lists.apple.com/archives/Java-dev/2005/Jan/msg00475.html)jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com0tag:blogger.com,1999:blog-1043185499374579995.post-39616764290638557772007-10-02T11:41:00.001-07:002007-10-17T03:30:37.969-07:00jsf Solutions for many2many<p><b>Introduction many to many</b></p> A challenging and interesting usecase for me has been the implementation of a many-to-many relations in a user interface. I havent found too much documentation or examples on the internet, so I thought I just publish my own efforts here. Note that here is quite some documentation on the ejb (jpa) modelling, but the actual gui implementation is missing in most cases.<br />Please note that this example is part of my "project" accountancy for sportclubs, see earliest blog for more details.<br /><p><b>Technology</b></p><br />The versions used in this example: jboss 4.2 (ejb3), seam 1.2.1, mysql 5.0m icefaces 1.6.0 and jsf-ri (?.?)<br /><p><b>Use case description & data model</b></p><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyxnMQKOUs3qZIpRZ7ARPdRc8VtZ5hHVNFg4UX2Qjf-xYfOztQ2pnVQBhTuMliQA28WIQVyYg1uxgZu7Y4119lwYuAAsUeI5BgELNJIr7t4kr_ji6CheECIqfnWN0uJ92Qs5PRVUFzM3Y/s1600-h/rolesubject.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyxnMQKOUs3qZIpRZ7ARPdRc8VtZ5hHVNFg4UX2Qjf-xYfOztQ2pnVQBhTuMliQA28WIQVyYg1uxgZu7Y4119lwYuAAsUeI5BgELNJIr7t4kr_ji6CheECIqfnWN0uJ92Qs5PRVUFzM3Y/s320/rolesubject.jpg" alt="" id="BLOGGER_PHOTO_ID_5116316307390909330" border="0" /></a><br />I have a subject (which may be of interest to our club: a person, store selling us volleybals, the room landlord etc) Furter I have roles, some of the roles will be connected to posts on the balance sheets (like credit, trainer, rent or debitor: compition player, recreational player). A subject performing a role becomes an actor. Of course a role maybe played by many actors, and a subject may fulfill many roles.<br />The actor is a period based entity, during a season, the next season he may give up his role as trainer, or give up his role as competition member.<br /><br />In ejb3 the possibility exists to directly indicate a many-to-many relation ship using an annotation with the same name and indicating a join-table. However I'm not convinced this is the way to go to map many-to-many relations. You loose control over your join table (in my use case, an actor exists for a certain period, for a new period the actor must be cloned), see also <a href="http://technology.amis.nl/blog/?p=972"> this </a> blog, where the author introduces some life in the join table. However in the end it turns out to be dead meat (see question 6 and 7).<br /><br />So instead of modeling a many2many relationship I modeled 2 one-to-many relationships. I'm not completely sure this is the right approach but for me it worked well. The 2 one-2-many relationships are intuitively mapped in the entities Subject, Actor and Role. See code below.<br /><p><b>Gui</b></p><br />We're approaching our final goal: how to display this in a gui. I have chosen for a master detail view: A list of all subjects, clicking on one subject presents you the subject in focus and the possibility to edit the subject's attributes. I'll leave vanilla attributes out of scope, and only look on how to select the roles the user wishes the subject to fulfill (role creation is left out of this use case). For this list I have tried two different implementations a ice:selectManyListbox and an ice:dataTable toegether with ice:rowSelector. Both having pros and cons which will be explained in (earlier) posts below and summarized in the last section. For now have fun with the generated entity classes.<br /><p><b>Thanks to</b></p><br />This blog wouldn't definitely have made it without the jboss seam and iceface guys, Thanks! Also thanks to the contributors of both forums who have helped me out on numerous occasions. Thanks also to my colleagues Bertram and Faizal who have helped me out on the "elegant" query. And finally to Ellen who has withstood all my swearing and cursing on the css and the blogspot templates. And was patient enough to let me it all figure out...<br />Jeroen.<br /><div class="jcode"><br /><span style="color:#ff0000;font-weight:bold;">Subject.java</span><br /><br /><span style="color:#808080;">001</span> <span style="color:#7f0055;"><b>package </b></span><span style="color:#000000;">nl.jeroen.testdb.persist;</span><br /><span style="color:#808080;">002</span> <span style="color:#3f7f5f;">// Generated Dec 23, 2006 5:43:17 PM by Hibernate Tools 3.2.0.snapshotb9</span><br /><span style="color:#808080;">003</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">004</span> <span style="color:#7f0055;"><b>import </b></span><span style="color:#000000;">java.util.ArrayList;</span><br /><span style="color:#808080;">024</span> <span style="color:#7f0055;"><b>import </b></span><span style="color:#000000;">....;</span><br /><span style="color:#808080;">024</span> <span style="color:#7f0055;"><b>import </b></span><span style="color:#000000;">org.jboss.seam.log.Log;</span><br /><span style="color:#808080;">025</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">026</span> <span style="color:#3f5fbf;">/**</span><br /><span style="color:#808080;">027</span> <span style="color:#ffffff;"> </span><span style="color:#3f5fbf;">* Subject generated by hbm2java</span><br /><span style="color:#808080;">028</span> <span style="color:#ffffff;"> </span><span style="color:#3f5fbf;">*/</span><br /><span style="color:#808080;">029</span> <span style="color:#646464;">@Name</span><span style="color:#000000;">(</span><span style="color:#2a00ff;">"subject"</span><span style="color:#000000;">)</span><br /><span style="color:#808080;">030</span> <span style="color:#646464;">@Entity</span><br /><span style="color:#808080;">031</span> <span style="color:#646464;">@Scope</span><span style="color:#000000;">(</span><span style="color:#000000;">ScopeType.SESSION</span><span style="color:#000000;">)</span><br /><span style="color:#808080;">032</span> <span style="color:#646464;">@Table</span><span style="color:#000000;">(</span><span style="color:#000000;">name = </span><span style="color:#2a00ff;">"subject"</span><span style="color:#000000;">, catalog = </span><span style="color:#2a00ff;">"seam"</span><span style="color:#000000;">, uniqueConstraints = </span><span style="color:#000000;">{})</span><br /><span style="color:#808080;">033</span> <span style="color:#7f0055;"><b>public class </b></span><span style="color:#000000;">Subject </span><span style="color:#7f0055;"><b>implements </b></span><span style="color:#000000;">java.io.Serializable </span><span style="color:#000000;">{</span><br /><span style="color:#808080;">034</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">035</span> <span style="color:#ffffff;"> </span><span style="color:#3f7f5f;">// Fields </span><br /><span style="color:#808080;">036</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@org.jboss.seam.annotations.Logger</span><br /><span style="color:#808080;">037</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">Log logger;</span><br /><span style="color:#808080;">038</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#7f0055;"><b>int </b></span><span style="color:#000000;">subjectid;</span><br /><span style="color:#808080;">039</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">String info;</span><br /><span style="color:#808080;">040</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">String firstname;</span><br /><span style="color:#808080;">041</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">String lastname;</span><br /><span style="color:#808080;">042</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">String email;</span><br /><span style="color:#808080;">043</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">List<Actor> actors = </span><span style="color:#7f0055;"><b>new </b></span><span style="color:#000000;">ArrayList<Actor></span><span style="color:#000000;">(</span><span style="color:#990000;">0</span><span style="color:#000000;">)</span><span style="color:#000000;">;</span><br /><span style="color:#808080;">044</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">119</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@OneToMany</span><span style="color:#000000;">(</span><span style="color:#000000;">cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = </span><span style="color:#2a00ff;">"subject"</span><span style="color:#000000;">)</span><br /><span style="color:#808080;">120</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#000000;">List<Actor> getActors</span><span style="color:#000000;">() {</span><br /><span style="color:#808080;">121</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>return this</b></span><span style="color:#000000;">.actors;</span><br /><span style="color:#808080;">122</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">123</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">124</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#7f0055;"><b>void </b></span><span style="color:#000000;">setActors</span><span style="color:#000000;">(</span><span style="color:#000000;">List<Actor> actors</span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">125</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.actors = actors;</span><br /><span style="color:#808080;">126</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">127</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">128</span> <span style="color:#000000;">}</span><br /></div><br /><div class="jcode"><br /><span style="color:#ff0000;font-weight:bold;">Actor.java</span><br /><br /><span style="color:#808080;">001</span> <span style="color:#7f0055;"><b>package </b></span><span style="color:#000000;">nl.jeroen.testdb.persist;</span><br /><span style="color:#808080;">002</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">003</span> <span style="color:#7f0055;"><b>import </b></span><span style="color:#000000;">java.util.HashSet;</span><br /><span style="color:#808080;">015</span> <span style="color:#7f0055;"><b>import </b></span><span style="color:#000000;">..;</span><br /><span style="color:#808080;">016</span> <span style="color:#7f0055;"><b>import </b></span><span style="color:#000000;">org.hibernate.validator.NotNull;</span><br /><span style="color:#808080;">017</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">018</span> <span style="color:#3f5fbf;">/**</span><br /><span style="color:#808080;">019</span> <span style="color:#ffffff;"> </span><span style="color:#3f5fbf;">* Actor generated by hbm2java</span><br /><span style="color:#808080;">020</span> <span style="color:#ffffff;"> </span><span style="color:#3f5fbf;">*/</span><br /><span style="color:#808080;">021</span> <span style="color:#646464;">@Entity</span><br /><span style="color:#808080;">022</span> <span style="color:#646464;">@Table</span><span style="color:#000000;">(</span><span style="color:#000000;">name = </span><span style="color:#2a00ff;">"actor"</span><span style="color:#000000;">, catalog = </span><span style="color:#2a00ff;">"seam"</span><span style="color:#000000;">, uniqueConstraints = </span><span style="color:#000000;">{</span><span style="color:#646464;">@UniqueConstraint</span><span style="color:#000000;">(</span><span style="color:#000000;">columnNames = </span><span style="color:#000000;">{</span><br /><span style="color:#808080;">023</span> <span style="color:#ffffff;"> </span><span style="color:#2a00ff;">"roleid"</span><span style="color:#000000;">, </span><span style="color:#2a00ff;">"subjectid"</span><span style="color:#000000;">, </span><span style="color:#2a00ff;">"periodid"</span><span style="color:#000000;">})})</span><br /><span style="color:#808080;">024</span> <span style="color:#7f0055;"><b>public class </b></span><span style="color:#000000;">Actor </span><span style="color:#7f0055;"><b>implements </b></span><span style="color:#000000;">java.io.Serializable </span><span style="color:#000000;">{</span><br /><span style="color:#808080;">025</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">026</span> <span style="color:#ffffff;"> </span><span style="color:#3f7f5f;">// Fields </span><br /><span style="color:#808080;">027</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">028</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#7f0055;"><b>int </b></span><span style="color:#000000;">actorid;</span><br /><span style="color:#808080;">029</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">Period period;</span><br /><span style="color:#808080;">030</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">Role role;</span><br /><span style="color:#808080;">031</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">Subject subject;</span><br /><span style="color:#808080;">032</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">Set<Transaction> transactionsForDestinationid = </span><span style="color:#7f0055;"><b>new </b></span><span style="color:#000000;">HashSet<Transaction></span><span style="color:#000000;">(</span><br /><span style="color:#808080;">033</span> <span style="color:#ffffff;"> </span><span style="color:#990000;">0</span><span style="color:#000000;">)</span><span style="color:#000000;">;</span><br /><span style="color:#808080;">034</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">Set<Transaction> transactionsForSourceid = </span><span style="color:#7f0055;"><b>new </b></span><span style="color:#000000;">HashSet<Transaction></span><span style="color:#000000;">(</span><br /><span style="color:#808080;">035</span> <span style="color:#ffffff;"> </span><span style="color:#990000;">0</span><span style="color:#000000;">)</span><span style="color:#000000;">;</span><br /><span style="color:#808080;">036</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">037</span> <span style="color:#ffffff;"> </span><span style="color:#3f7f5f;">// Constructors</span><br /><span style="color:#808080;">038</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">039</span> <span style="color:#ffffff;"> </span><span style="color:#3f5fbf;">/** default constructor */</span><br /><span style="color:#808080;">040</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#000000;">Actor</span><span style="color:#000000;">() {</span><br /><span style="color:#808080;">041</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">042</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">043</span> <span style="color:#ffffff;"> </span><span style="color:#3f5fbf;">/** minimal constructor */</span><br /><span style="color:#808080;">044</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#000000;">Actor</span><span style="color:#000000;">(</span><span style="color:#7f0055;"><b>int </b></span><span style="color:#000000;">actorid, Period period, Role role, Subject subject</span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">045</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.actorid = actorid;</span><br /><span style="color:#808080;">046</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.period = period;</span><br /><span style="color:#808080;">047</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.role = role;</span><br /><span style="color:#808080;">048</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.subject = subject;</span><br /><span style="color:#808080;">049</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">050</span> <span style="color:#ffffff;"> </span><span style="color:#3f5fbf;">/** full constructor */</span><br /><span style="color:#808080;">051</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#000000;">Actor</span><span style="color:#000000;">(</span><span style="color:#7f0055;"><b>int </b></span><span style="color:#000000;">actorid, Period period, Role role, Subject subject,</span><br /><span style="color:#808080;">052</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">Set<Transaction> transactionsForDestinationid,</span><br /><span style="color:#808080;">053</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">Set<Transaction> transactionsForSourceid</span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">054</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.actorid = actorid;</span><br /><span style="color:#808080;">055</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.period = period;</span><br /><span style="color:#808080;">056</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.role = role;</span><br /><span style="color:#808080;">057</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.subject = subject;</span><br /><span style="color:#808080;">058</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.transactionsForDestinationid = transactionsForDestinationid;</span><br /><span style="color:#808080;">059</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.transactionsForSourceid = transactionsForSourceid;</span><br /><span style="color:#808080;">060</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">061</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">062</span> <span style="color:#ffffff;"> </span><span style="color:#3f7f5f;">// Property accessors</span><br /><span style="color:#808080;">063</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@Id @GeneratedValue</span><br /><span style="color:#808080;">064</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@Column</span><span style="color:#000000;">(</span><span style="color:#000000;">name = </span><span style="color:#2a00ff;">"actorid"</span><span style="color:#000000;">, unique = true, nullable = </span><span style="color:#7f0055;"><b>false</b></span><span style="color:#000000;">)</span><br /><span style="color:#808080;">065</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@NotNull</span><br /><span style="color:#808080;">066</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#7f0055;"><b>int </b></span><span style="color:#000000;">getActorid</span><span style="color:#000000;">() {</span><br /><span style="color:#808080;">067</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>return this</b></span><span style="color:#000000;">.actorid;</span><br /><span style="color:#808080;">068</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">069</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">070</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#7f0055;"><b>void </b></span><span style="color:#000000;">setActorid</span><span style="color:#000000;">(</span><span style="color:#7f0055;"><b>int </b></span><span style="color:#000000;">actorid</span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">071</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.actorid = actorid;</span><br /><span style="color:#808080;">072</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">073</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@ManyToOne</span><span style="color:#000000;">(</span><span style="color:#000000;">fetch = FetchType.LAZY</span><span style="color:#000000;">)</span><br /><span style="color:#808080;">074</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@JoinColumn</span><span style="color:#000000;">(</span><span style="color:#000000;">name = </span><span style="color:#2a00ff;">"periodid"</span><span style="color:#000000;">, nullable = </span><span style="color:#7f0055;"><b>false</b></span><span style="color:#000000;">)</span><br /><span style="color:#808080;">075</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@NotNull</span><br /><span style="color:#808080;">076</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#000000;">Period getPeriod</span><span style="color:#000000;">() {</span><br /><span style="color:#808080;">077</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>return this</b></span><span style="color:#000000;">.period;</span><br /><span style="color:#808080;">078</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">079</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">080</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#7f0055;"><b>void </b></span><span style="color:#000000;">setPeriod</span><span style="color:#000000;">(</span><span style="color:#000000;">Period period</span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">081</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.period = period;</span><br /><span style="color:#808080;">082</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">083</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@ManyToOne</span><span style="color:#000000;">(</span><span style="color:#000000;">fetch = FetchType.LAZY</span><span style="color:#000000;">)</span><br /><span style="color:#808080;">084</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@JoinColumn</span><span style="color:#000000;">(</span><span style="color:#000000;">name = </span><span style="color:#2a00ff;">"roleid"</span><span style="color:#000000;">, nullable = </span><span style="color:#7f0055;"><b>false</b></span><span style="color:#000000;">)</span><br /><span style="color:#808080;">085</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@NotNull</span><br /><span style="color:#808080;">086</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#000000;">Role getRole</span><span style="color:#000000;">() {</span><br /><span style="color:#808080;">087</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>return this</b></span><span style="color:#000000;">.role;</span><br /><span style="color:#808080;">088</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">089</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">090</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#7f0055;"><b>void </b></span><span style="color:#000000;">setRole</span><span style="color:#000000;">(</span><span style="color:#000000;">Role role</span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">091</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.role = role;</span><br /><span style="color:#808080;">092</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">093</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@ManyToOne</span><span style="color:#000000;">(</span><span style="color:#000000;">fetch = FetchType.LAZY</span><span style="color:#000000;">)</span><br /><span style="color:#808080;">094</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@JoinColumn</span><span style="color:#000000;">(</span><span style="color:#000000;">name = </span><span style="color:#2a00ff;">"subjectid"</span><span style="color:#000000;">, nullable = </span><span style="color:#7f0055;"><b>false</b></span><span style="color:#000000;">)</span><br /><span style="color:#808080;">095</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@NotNull</span><br /><span style="color:#808080;">096</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#000000;">Subject getSubject</span><span style="color:#000000;">() {</span><br /><span style="color:#808080;">097</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>return this</b></span><span style="color:#000000;">.subject;</span><br /><span style="color:#808080;">098</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">099</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">100</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#7f0055;"><b>void </b></span><span style="color:#000000;">setSubject</span><span style="color:#000000;">(</span><span style="color:#000000;">Subject subject</span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">101</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.subject = subject;</span><br /><span style="color:#808080;">102</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">103</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@OneToMany</span><span style="color:#000000;">(</span><span style="color:#000000;">cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = </span><span style="color:#2a00ff;">"actorByDestinationid"</span><span style="color:#000000;">)</span><br /><span style="color:#808080;">104</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#000000;">Set<Transaction> getTransactionsForDestinationid</span><span style="color:#000000;">() {</span><br /><span style="color:#808080;">105</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>return this</b></span><span style="color:#000000;">.transactionsForDestinationid;</span><br /><span style="color:#808080;">106</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">107</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">108</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#7f0055;"><b>void </b></span><span style="color:#000000;">setTransactionsForDestinationid</span><span style="color:#000000;">(</span><br /><span style="color:#808080;">109</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">Set<Transaction> transactionsForDestinationid</span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">110</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.transactionsForDestinationid = transactionsForDestinationid;</span><br /><span style="color:#808080;">111</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">112</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@OneToMany</span><span style="color:#000000;">(</span><span style="color:#000000;">cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = </span><span style="color:#2a00ff;">"actorBySourceid"</span><span style="color:#000000;">)</span><br /><span style="color:#808080;">113</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#000000;">Set<Transaction> getTransactionsForSourceid</span><span style="color:#000000;">() {</span><br /><span style="color:#808080;">114</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>return this</b></span><span style="color:#000000;">.transactionsForSourceid;</span><br /><span style="color:#808080;">115</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">116</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">117</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#7f0055;"><b>void </b></span><span style="color:#000000;">setTransactionsForSourceid</span><span style="color:#000000;">(</span><br /><span style="color:#808080;">118</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">Set<Transaction> transactionsForSourceid</span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">119</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.transactionsForSourceid = transactionsForSourceid;</span><br /><span style="color:#808080;">120</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">121</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">122</span> <span style="color:#000000;">}</span><br /></div><br /><div class="jcode"><br /><span style="color:#ff0000;font-weight:bold;">Role.java</span><br /><br /><span style="color:#808080;">001</span> <span style="color:#7f0055;"><b>package </b></span><span style="color:#000000;">nl.jeroen.testdb.persist;</span><br /><span style="color:#808080;">002</span> <span style="color:#3f7f5f;">// Generated Dec 23, 2006 5:43:17 PM by Hibernate Tools 3.2.0.snapshotb9</span><br /><span style="color:#808080;">003</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">004</span> <span style="color:#7f0055;"><b>import </b></span><span style="color:#000000;">java.util.HashSet;</span><br /><span style="color:#808080;">012</span> <span style="color:#7f0055;"><b>import </b></span><span style="color:#000000;">..;</span><br /><span style="color:#808080;">018</span> <span style="color:#7f0055;"><b>import </b></span><span style="color:#000000;">org.hibernate.validator.NotNull;</span><br /><span style="color:#808080;">019</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">020</span> <span style="color:#3f5fbf;">/**</span><br /><span style="color:#808080;">021</span> <span style="color:#ffffff;"> </span><span style="color:#3f5fbf;">* Role generated by hbm2java</span><br /><span style="color:#808080;">022</span> <span style="color:#ffffff;"> </span><span style="color:#3f5fbf;">*/</span><br /><span style="color:#808080;">023</span> <span style="color:#646464;">@Entity</span><br /><span style="color:#808080;">024</span> <span style="color:#646464;">@Table</span><span style="color:#000000;">(</span><span style="color:#000000;">name = </span><span style="color:#2a00ff;">"role"</span><span style="color:#000000;">, catalog = </span><span style="color:#2a00ff;">"seam"</span><span style="color:#000000;">, uniqueConstraints = </span><span style="color:#000000;">{})</span><br /><span style="color:#808080;">025</span> <span style="color:#7f0055;"><b>public class </b></span><span style="color:#000000;">Role </span><span style="color:#7f0055;"><b>implements </b></span><span style="color:#000000;">java.io.Serializable </span><span style="color:#000000;">{</span><br /><span style="color:#808080;">026</span> <span style="color:#ffffff;"> </span><span style="color:#3f5fbf;">/**</span><br /><span style="color:#808080;">027</span> <span style="color:#ffffff;"> </span><span style="color:#3f5fbf;">* </span><br /><span style="color:#808080;">028</span> <span style="color:#ffffff;"> </span><span style="color:#3f5fbf;">*/</span><br /><span style="color:#808080;">029</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private static final </b></span><span style="color:#7f0055;"><b>long </b></span><span style="color:#000000;">serialVersionUID = -</span><span style="color:#990000;">1996329923962792444L</span><span style="color:#000000;">;</span><br /><span style="color:#808080;">030</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">031</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private static final </b></span><span style="color:#000000;">org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory</span><br /><span style="color:#808080;">032</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">.getLog</span><span style="color:#000000;">(</span><span style="color:#000000;">Role.</span><span style="color:#7f0055;"><b>class</b></span><span style="color:#000000;">)</span><span style="color:#000000;">;</span><br /><span style="color:#808080;">033</span> <span style="color:#ffffff;"> </span><span style="color:#3f7f5f;">// Fields </span><br /><span style="color:#808080;">034</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">035</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#7f0055;"><b>int </b></span><span style="color:#000000;">roleid;</span><br /><span style="color:#808080;">036</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">String info;</span><br /><span style="color:#808080;">037</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">Integer parentid;</span><br /><span style="color:#808080;">038</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">String name;</span><br /><span style="color:#808080;">039</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">Set<Actor> actors = </span><span style="color:#7f0055;"><b>new </b></span><span style="color:#000000;">HashSet<Actor></span><span style="color:#000000;">(</span><span style="color:#990000;">0</span><span style="color:#000000;">)</span><span style="color:#000000;">;</span><br /><span style="color:#808080;">040</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">041</span> <span style="color:#ffffff;"> </span><span style="color:#3f7f5f;">// Constructors</span><br /><span style="color:#808080;">103</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@OneToMany</span><span style="color:#000000;">(</span><span style="color:#000000;">cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = </span><span style="color:#2a00ff;">"role"</span><span style="color:#000000;">)</span><br /><span style="color:#808080;">104</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#000000;">Set<Actor> getActors</span><span style="color:#000000;">() {</span><br /><span style="color:#808080;">105</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>return this</b></span><span style="color:#000000;">.actors;</span><br /><span style="color:#808080;">106</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">107</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">108</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#7f0055;"><b>void </b></span><span style="color:#000000;">setActors</span><span style="color:#000000;">(</span><span style="color:#000000;">Set<Actor> actors</span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">109</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>this</b></span><span style="color:#000000;">.actors = actors;</span><br /><span style="color:#808080;">110</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">111</span> <span style="color:#ffffff;"> </span><br /><span style="color:#808080;">112</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@Override</span><br /><span style="color:#808080;">113</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#7f0055;"><b>int </b></span><span style="color:#000000;">hashCode</span><span style="color:#000000;">() {</span><br /><span style="color:#808080;">114</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>return </b></span><span style="color:#000000;">roleid;</span><br /><span style="color:#808080;">115</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">116</span> <span style="color:#ffffff;"></span><br /><span style="color:#808080;">117</span> <span style="color:#ffffff;"> </span><span style="color:#646464;">@Override</span><br /><span style="color:#808080;">118</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>public </b></span><span style="color:#7f0055;"><b>boolean </b></span><span style="color:#000000;">equals</span><span style="color:#000000;">(</span><span style="color:#000000;">Object obj</span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">119</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>final </b></span><span style="color:#000000;">String methodName = </span><span style="color:#2a00ff;">"equals"</span><span style="color:#000000;">;</span><br /><span style="color:#808080;">120</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>if </b></span><span style="color:#000000;">(</span><span style="color:#000000;">logger.isTraceEnabled</span><span style="color:#000000;">()) {</span><br /><span style="color:#808080;">121</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">logger.trace</span><span style="color:#000000;">(</span><span style="color:#000000;">LogUtil.getLogMessage</span><span style="color:#000000;">(</span><span style="color:#000000;">LogUtil.VERSION, methodName</span><br /><span style="color:#808080;">122</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">,</span><span style="color:#2a00ff;">"start '" </span><span style="color:#000000;">+ </span><span style="color:#2a00ff;">"'"</span><span style="color:#000000;">))</span><span style="color:#000000;">;</span><br /><span style="color:#808080;">123</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">124</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>if </b></span><span style="color:#000000;">(</span><span style="color:#000000;">obj == </span><span style="color:#7f0055;"><b>null</b></span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">125</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>return false</b></span><span style="color:#000000;">;</span><br /><span style="color:#808080;">126</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">127</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>if </b></span><span style="color:#000000;">(</span><span style="color:#7f0055;"><b>this </b></span><span style="color:#000000;">== obj</span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">128</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>return true</b></span><span style="color:#000000;">;</span><br /><span style="color:#808080;">129</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">130</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>if </b></span><span style="color:#000000;">(</span><span style="color:#000000;">obj </span><span style="color:#7f0055;"><b>instanceof </b></span><span style="color:#000000;">Role</span><br /><span style="color:#808080;">131</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">&& </span><span style="color:#000000;">((</span><span style="color:#000000;">Role</span><span style="color:#000000;">)</span><span style="color:#000000;">obj</span><span style="color:#000000;">)</span><span style="color:#000000;">.getRoleid</span><span style="color:#000000;">() </span><span style="color:#000000;">== roleid</span><span style="color:#000000;">) {</span><br /><span style="color:#808080;">132</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>return true</b></span><span style="color:#000000;">;</span><br /><span style="color:#808080;">133</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">134</span> <span style="color:#ffffff;"> </span><span style="color:#7f0055;"><b>return false</b></span><span style="color:#000000;">;</span><br /><span style="color:#808080;">135</span> <span style="color:#ffffff;"> </span><span style="color:#000000;">}</span><br /><span style="color:#808080;">136</span> <span style="color:#000000;">}</span><br /></div><br /><div style="float: left;"><br /><small><br /><a href="http://www.java2html.de/" target="_blank">Java2html</a><br /></small><br /></div>jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com1tag:blogger.com,1999:blog-1043185499374579995.post-69127666101420146372007-10-02T10:58:00.000-07:002007-10-08T03:44:03.992-07:00jsf Solutions for many2many: the selectManyListBox<span style="font-weight: bold;">SelectManyListbox.</span></p><br /><br />The selectManyListBox is an ordinary dropdown listbox with a list of selected values opposed to the single value for its SelectOneListbox sibbling. Unfortunately at the moment of implementing the ice:selectManyListbox was still buggy: the menurenderer.convertSelectValue didnot call the associated converter for multiple values. Apparently things have been ironed out in icefaces 1.6.1 Check the <a href="http://www.icefaces.org/JForum/posts/list/3634.page">iceforum </a>for a more detailed explanation.<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOQCFhKNl2YNj8HiSUGgMXO7kmA7TfbcekB-dfVLa08kiMO9H4bME8rH1xWKA7_Fid_GHLBnj1WUtwlpNUup27zhBw9s-Ga1g05UUW7cZQSb2EeTN3YtGFRXjPxtCiRdluwhWyUJmEUHE/s1600-h/Picture+2.png"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOQCFhKNl2YNj8HiSUGgMXO7kmA7TfbcekB-dfVLa08kiMO9H4bME8rH1xWKA7_Fid_GHLBnj1WUtwlpNUup27zhBw9s-Ga1g05UUW7cZQSb2EeTN3YtGFRXjPxtCiRdluwhWyUJmEUHE/s320/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5116404611918515106" border="0" /></a><br /><div class="jcode"><br /><span style="color:#7f0055;"> <h2>Roles</h2></span><br /><span style="color:#7f0055;"> <ice:selectManyListbox id="selectedRoles" value="#{subjectMgr.<a href="#selectedRoles">selectedRoles</a>}" converter="#{subjectMgr.<a href="#roleConverter">roleConverter</a>}" size="5"></span><br /><span style="color:#7f0055;"> <f:selectItems value="#{subjectMgr.<a href="#allAvailableRoles">allAvailableRoles</a>}"/></span><br /><span style="color:#7f0055;"> </ice:selectManyListbox></span><br /></div><br />You need 2 lists for selectmany listbox: a list with all available roles, individually stored into a selectitem and (2) a list with the selected roles. A converter (I think there is a seam tag, to circumvent the converter but at the moment of experimenting that was still in beta) to convert the values inside the selectitem tag to some unique serializable key (string) for rendering in the select tag and vice versa (in my case ordinary findById methods).<br />A successful display of the selectmanylistbox is not that hard, the hardest part is storing the selected and deleting the unselected roles.<br /><br />Check the code below for SubjectMgrBean.setSelectedRoles. The implementation I came up with was a maintenance of three lists: the new list (originating from the selectManyListBox component), the list with actors to remove (A map with a Role - Actor mapping). And the list with actors to be created. The rolesToAdd and the rolesToRemove lists are <a href="#initialized">initialized</a> by the current roles on the subject in focus. For the removal we take the presentRoles (roles to Remove) <a href="#remove">exclude</a> all roles in the newly selected roles, and we're are on our own with the roles which are up for deletion. An iteration is needed because in jpa-ql it is not possible to do a <a href="http://www.jboss.com/index.html?module=bb&op=viewtopic&t=114151">cascaded delete</a> on a parent entity.<br />A similar operation is used for the roles to add. All roles appearing in the presentRoles, are <a href="#create">removed</a> from the selected roles leaving a collection with roles to add. Every Role is attached to the subject in focus, by creating a new Actor and adding it the set of existing actors. A final merge on the entity manager is sufficient to store all roles (actors) at once.<br />As you have noticed the code for the selectmanylistbox may not be the world's cleanest code. But I'm convinced that a lot of plumbing is needed to get this to work. The amount of code for such a simple use case is also contra intuitive Also major drawback is the big bug in icefaces forcing you to either hack their code or using the reference-jsf's selectmanylistbox implemention. Particular caveat is the implementation of the equals method of the entity beans. However the most annoying feature is the gui element automatically disselect all choices in the box when the user hits a wrong element without the cmd key pressed (on iMac), leaving nothing but the cancel button to the user. If i would have realized this feature earlier I probably would have never taken the selectmanylistbox for this use case.<br />PS the last part can be found in September.<br /><div class="jcode"><br /><span style="color:#ff0000;font-weight:bold;">SubjectMgrBean.java</span><br /><br /><font color="#808080">001</font> <font color="#7f0055"><b>package </b></font><font color="#000000">nl.jeroen.testdb.persist;</font><br /><font color="#808080">002</font> <font color="#ffffff"></font><br /><font color="#808080">003</font> <font color="#7f0055"><b>import </b></font><font color="#000000">java.io.Serializable;</font><br /><font color="#808080">038</font> <font color="#7f0055"><b>import </b></font><font color="#000000">org.jboss.seam.annotations.datamodel.DataModelSelection;</font><br /><font color="#808080">039</font> <font color="#7f0055"><b>import </b></font><font color="#000000">....;</font><br /><font color="#808080">041</font> <font color="#7f0055"><b>import </b></font><font color="#000000">com.icesoft.util.DebugException;</font><br /><font color="#808080">042</font> <font color="#ffffff"></font><br /><font color="#808080">043</font> <font color="#646464">@Scope</font><font color="#000000">(</font><font color="#000000">ScopeType.CONVERSATION</font><font color="#000000">)</font><br /><font color="#808080">044</font> <font color="#646464">@Stateful</font><br /><font color="#808080">045</font> <font color="#646464">@Name</font><font color="#000000">(</font><font color="#2a00ff">"subjectMgr"</font><font color="#000000">)</font><br /><font color="#808080">046</font> <font color="#7f0055"><b>public class </b></font><font color="#000000">SubjectMgrBean </font><font color="#7f0055"><b>implements </b></font><font color="#000000">SubjectMgr, Serializable </font><font color="#000000">{</font><br /><font color="#808080">047</font> <font color="#ffffff"> </font><font color="#646464">@Logger</font><br /><font color="#808080">048</font> <font color="#ffffff"> </font><font color="#000000">Log logger;</font><br /><font color="#808080">049</font> <font color="#ffffff"> </font><br /><font color="#808080">050</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public static final </b></font><font color="#000000">String EMPTY = </font><font color="#2a00ff">"__EMPTY__"</font><font color="#000000">;</font><br /><font color="#808080">051</font> <font color="#ffffff"> </font><font color="#7f0055"><b>private static final </b></font><font color="#7f0055"><b>long </b></font><font color="#000000">serialVersionUID = </font><font color="#990000">8523599219865145149L</font><font color="#000000">;</font><br /><font color="#808080">052</font> <font color="#ffffff"> </font><font color="#7f0055"><b>private </b></font><font color="#000000">Map<String, Role> roleValues;</font><br /><font color="#808080">053</font> <font color="#ffffff"> </font><font color="#7f0055"><b>private </b></font><font color="#000000">List<SelectItem> allAvailableRoles;</font><br /><font color="#808080">054</font> <font color="#ffffff"> </font><font color="#7f0055"><b>private </b></font><font color="#000000">List<Role> selectedRoles;</font><br /><font color="#808080">055</font> <font color="#ffffff"> </font><br /><font color="#808080">056</font> <font color="#ffffff"> </font><font color="#646464">@In</font><font color="#000000">(</font><font color="#000000">required=</font><font color="#7f0055"><b>true</b></font><font color="#000000">)</font><br /><font color="#808080">057</font> <font color="#ffffff"> </font><font color="#000000">IApplicationSession sessionstore;</font><br /><font color="#808080">058</font> <font color="#ffffff"> </font><br /><font color="#808080">059</font> <font color="#ffffff"> </font><font color="#646464">@PersistenceContext</font><font color="#000000">(</font><font color="#000000">type=PersistenceContextType.EXTENDED</font><font color="#000000">)</font><br /><font color="#808080">060</font> <font color="#ffffff"> </font><font color="#7f0055"><b>private </b></font><font color="#000000">EntityManager em;</font><br /><font color="#808080">061</font> <font color="#ffffff"> </font><br /><font color="#808080">062</font> <font color="#ffffff"> </font><font color="#646464">@In</font><font color="#000000">(</font><font color="#000000">required=</font><font color="#7f0055"><b>false</b></font><font color="#000000">)</font><br /><font color="#808080">063</font> <font color="#ffffff"> </font><font color="#646464">@Out</font><font color="#000000">(</font><font color="#000000">required=</font><font color="#7f0055"><b>false</b></font><font color="#000000">)</font><br /><font color="#808080">064</font> <font color="#ffffff"> </font><font color="#7f0055"><b>private </b></font><font color="#000000">Subject subject;</font><br /><font color="#808080">065</font> <font color="#ffffff"></font><br /><font color="#808080">066</font> <font color="#ffffff"> </font><font color="#646464">@DataModel</font><font color="#000000">(</font><font color="#000000">value=</font><font color="#2a00ff">"subjectList"</font><font color="#000000">)</font><br /><font color="#808080">067</font> <font color="#ffffff"> </font><font color="#000000">List<Subject> subjectList;</font><br /><font color="#808080">068</font> <font color="#ffffff"> </font><font color="#646464">@DataModelSelection</font><font color="#000000">(</font><font color="#000000">value=</font><font color="#2a00ff">"subjectList"</font><font color="#000000">)</font><br /><font color="#808080">069</font> <font color="#ffffff"> </font><font color="#646464">@Out</font><font color="#000000">(</font><font color="#000000">required=false, value=</font><font color="#2a00ff">"focusSubject"</font><font color="#000000">)</font><br /><font color="#808080">070</font> <font color="#ffffff"> </font><font color="#7f0055"><b>private </b></font><font color="#000000">Subject focusSubject;</font><br /><font color="#808080">071</font> <font color="#ffffff"></font><br /><font color="#808080">072</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">List<SelectItem> <a name="allAvailableRoles">getAllAvailableRoles</a></font><font color="#000000">() {</font><br /><font color="#808080">073</font> <font color="#ffffff"> </font><font color="#7f0055"><b>final </b></font><font color="#000000">String methodName = </font><font color="#2a00ff">"getAllAvailableRoles: "</font><font color="#000000">;</font><br /><font color="#808080">074</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">logger.isTraceEnabled</font><font color="#000000">()) {</font><br /><font color="#808080">075</font> <font color="#ffffff"> </font><font color="#000000">logger.trace</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">methodName, LogUtil.VERSION,</font><br /><font color="#808080">076</font> <font color="#ffffff"> </font><font color="#2a00ff">"starting '" </font><font color="#000000">+ </font><font color="#2a00ff">"'"</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">077</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">078</font> <font color="#ffffff"> </font><font color="#7f0055"><b>boolean </b></font><font color="#000000">populateRoleValues = </font><font color="#7f0055"><b>false</b></font><font color="#000000">;</font><br /><font color="#808080">079</font> <font color="#3f7f5f">// List<SelectItem> result = null;</font><br /><font color="#808080">080</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">allAvailableRoles == </font><font color="#7f0055"><b>null </b></font><font color="#000000">|| allAvailableRoles.size</font><font color="#000000">() </font><font color="#000000">== </font><font color="#990000">0</font><font color="#000000">) {</font><br /><font color="#808080">081</font> <font color="#ffffff"> </font><font color="#000000">List<Role> l = em.createQuery</font><font color="#000000">(</font><font color="#2a00ff">"from Role role"</font><font color="#000000">)</font><font color="#000000">.getResultList</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#808080">082</font> <font color="#ffffff"> </font><font color="#000000">allAvailableRoles = </font><font color="#7f0055"><b>new </b></font><font color="#000000">ArrayList<SelectItem></font><font color="#000000">(</font><font color="#000000">l.size</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#808080">083</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">roleValues == </font><font color="#7f0055"><b>null</b></font><font color="#000000">) {</font><br /><font color="#808080">084</font> <font color="#ffffff"> </font><font color="#000000">populateRoleValues = </font><font color="#7f0055"><b>true</b></font><font color="#000000">;</font><br /><font color="#808080">085</font> <font color="#ffffff"> </font><font color="#000000">roleValues = </font><font color="#7f0055"><b>new </b></font><font color="#000000">TreeMap<String, Role></font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#808080">086</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">087</font> <font color="#ffffff"> </font><font color="#7f0055"><b>for </b></font><font color="#000000">(</font><font color="#000000">Role r : l</font><font color="#000000">) {</font><br /><font color="#808080">088</font> <font color="#ffffff"> </font><font color="#000000">SelectItem item = </font><font color="#7f0055"><b>new </b></font><font color="#000000">SelectItem</font><font color="#000000">(</font><font color="#000000">r,r.getName</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#808080">089</font> <font color="#ffffff"> </font><font color="#000000">allAvailableRoles.add</font><font color="#000000">(</font><font color="#000000">item</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">090</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">populateRoleValues</font><font color="#000000">) {</font><br /><font color="#808080">091</font> <font color="#ffffff"> </font><font color="#000000">roleValues.put</font><font color="#000000">(</font><font color="#000000">r.getName</font><font color="#000000">()</font><font color="#000000">,r</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">092</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">093</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">094</font> <font color="#ffffff"> </font><br /><font color="#808080">095</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">096</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">logger.isDebugEnabled</font><font color="#000000">()) {</font><br /><font color="#808080">097</font> <font color="#ffffff"> </font><font color="#000000">logger.debug</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">methodName, LogUtil.VERSION,</font><br /><font color="#808080">098</font> <font color="#ffffff"> </font><font color="#2a00ff">"ending with '" </font><font color="#000000">+ allAvailableRoles.size</font><font color="#000000">() </font><font color="#000000">+ </font><font color="#2a00ff">"' in available roles"</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">099</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">100</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#000000">allAvailableRoles;</font><br /><font color="#808080">101</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">102</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">setAllAvailableRoles</font><font color="#000000">(</font><font color="#000000">List<SelectItem> allAvailableRoles</font><font color="#000000">) {</font><br /><font color="#808080">103</font> <font color="#ffffff"> </font><font color="#7f0055"><b>this</b></font><font color="#000000">.allAvailableRoles = allAvailableRoles;</font><br /><font color="#808080">104</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">105</font> <font color="#ffffff"> </font><br /><font color="#808080">106</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">List<Role> getSelectedRoles</font><font color="#000000">() {</font><br /><font color="#808080">107</font> <font color="#ffffff"> </font><font color="#7f0055"><b>final </b></font><font color="#000000">String methodName = </font><font color="#2a00ff">"getSelectedRoles: "</font><font color="#000000">;</font><br /><font color="#808080">108</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">logger.isTraceEnabled</font><font color="#000000">()) {</font><br /><font color="#808080">109</font> <font color="#ffffff"> </font><font color="#000000">logger.trace</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">methodName, LogUtil.VERSION,</font><br /><font color="#808080">110</font> <font color="#ffffff"> </font><font color="#2a00ff">"starting '" </font><font color="#000000">+ focusSubject.getSubjectid</font><font color="#000000">() </font><font color="#000000">+ </font><font color="#2a00ff">"'"</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">111</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">112</font> <font color="#ffffff"> </font><font color="#000000">selectedRoles = em.createQuery</font><font color="#000000">(</font><font color="#2a00ff">"Select r from Role r, in (r.actors) a where a.subject = :subject"</font><font color="#000000">)</font><br /><font color="#808080">113</font> <font color="#ffffff"> </font><font color="#000000">.setParameter</font><font color="#000000">(</font><font color="#2a00ff">"subject"</font><font color="#000000">, focusSubject</font><font color="#000000">)</font><font color="#000000">.getResultList</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#808080">114</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">logger.isDebugEnabled</font><font color="#000000">()) {</font><br /><font color="#808080">115</font> <font color="#ffffff"> </font><font color="#000000">logger.debug</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">methodName, LogUtil.VERSION, </font><font color="#2a00ff">"returning '" </font><font color="#000000">+ selectedRoles.size</font><font color="#000000">() </font><font color="#000000">+ </font><font color="#2a00ff">"'"</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">116</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">117</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#000000">selectedRoles;</font><br /><font color="#808080">118</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">119</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000"><a name="selectedRoles">setSelectedRoles</a></font><font color="#000000">(</font><font color="#000000">List<Role> sltdRoles</font><font color="#000000">) {</font><br /><font color="#808080">120</font> <font color="#ffffff"> </font><font color="#7f0055"><b>final </b></font><font color="#000000">String methodName = </font><font color="#2a00ff">"setSelectedRoles: "</font><font color="#000000">;</font><br /><font color="#808080">121</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">logger.isDebugEnabled</font><font color="#000000">()) {</font><br /><font color="#808080">122</font> <font color="#ffffff"> </font><font color="#000000">logger.debug</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">methodName,</font><br /><font color="#808080">123</font> <font color="#ffffff"> </font><font color="#000000">LogUtil.VERSION, </font><font color="#2a00ff">"starting '" </font><font color="#000000">+ sltdRoles.size</font><font color="#000000">() </font><font color="#000000">+ </font><font color="#2a00ff">"'"</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">124</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">125</font> <font color="#ffffff"> </font><font color="#7f0055"><b>try </b></font><font color="#000000">{</font><br /><font color="#808080">126</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">logger.isDebugEnabled</font><font color="#000000">()) {</font><br /><font color="#808080">127</font> <font color="#ffffff"> </font><font color="#7f0055"><b>for </b></font><font color="#000000">(</font><font color="#000000">Role r : sltdRoles</font><font color="#000000">) {</font><br /><font color="#808080">128</font> <font color="#ffffff"> </font><font color="#000000">logger.debug</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">methodName,</font><br /><font color="#808080">129</font> <font color="#ffffff"> </font><font color="#000000">LogUtil.VERSION, </font><font color="#2a00ff">"selected roles: '" </font><font color="#000000">+ r.getName</font><font color="#000000">() </font><font color="#000000">+ </font><font color="#2a00ff">"' (" </font><font color="#000000">+ r + </font><font color="#2a00ff">")"</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">130</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">131</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">132</font> <font color="#ffffff"> </font><font color="#000000">Period prd = sessionstore.getFocusPeriod</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#808080">133</font> <font color="#ffffff"> </font><font color="#000000">logger.info</font><font color="#000000">(</font><font color="#2a00ff">"focust period is #0 name is '#1'"</font><font color="#000000">, prd.getPeriodid</font><font color="#000000">()</font><font color="#000000">, prd.getInfo</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#808080">134</font> <font color="#ffffff"> </font><font color="#000000">Map<Role,Actor> presentRolesToRemove = </font><font color="#7f0055"><b>new </b></font><font color="#000000">HashMap<Role, Actor></font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#808080">135</font> <font color="#ffffff"> </font><font color="#000000">Set<Role> presentRolesToCreate = </font><font color="#7f0055"><b>new </b></font><font color="#000000">HashSet<Role></font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#808080">136</font> <font color="#ffffff"> </font><font color="#7f0055"><b>for </b></font><font color="#000000">(</font><font color="#000000">Actor act :focusSubject.getActors</font><font color="#000000">()) {</font><br /><font color="#808080">137</font> <font color="#ffffff"> </font><font color="#000000">presentRolesToRemove.put</font><font color="#000000">(</font><font color="#000000">act.getRole</font><font color="#000000">()</font><font color="#000000">, act</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">138</font> <font color="#ffffff"> </font><font color="#000000"><a name="initialized">presentRolesToCreate.add</a></font><font color="#000000">(</font><font color="#000000">act.getRole</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#808080">139</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">140</font> <font color="#ffffff"> </font><font color="#000000"><a name="remove">presentRolesToRemove</a>.keySet</font><font color="#000000">()</font><font color="#000000">.removeAll</font><font color="#000000">(</font><font color="#000000">sltdRoles</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">141</font> <font color="#ffffff"> </font><font color="#7f0055"><b>for </b></font><font color="#000000">(</font><font color="#000000">Role r : presentRolesToRemove.keySet</font><font color="#000000">()) {</font><br /><font color="#808080">142</font> <font color="#ffffff"> </font><font color="#000000">Actor act = presentRolesToRemove.get</font><font color="#000000">(</font><font color="#000000">r</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">143</font> <font color="#ffffff"> </font><font color="#000000">focusSubject.getActors</font><font color="#000000">()</font><font color="#000000">.remove</font><font color="#000000">(</font><font color="#000000">act</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">144</font> <font color="#ffffff"> </font><font color="#000000">em.remove</font><font color="#000000">(</font><font color="#000000">act</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">145</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">146</font> <font color="#ffffff"> </font><font color="#000000"><a name="create">sltdRoles</a>.removeAll</font><font color="#000000">(</font><font color="#000000">presentRolesToCreate</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">147</font> <font color="#ffffff"> </font><font color="#7f0055"><b>for </b></font><font color="#000000">(</font><font color="#000000">Role r : sltdRoles</font><font color="#000000">) {</font><br /><font color="#808080">148</font> <font color="#ffffff"> </font><font color="#000000">focusSubject.getActors</font><font color="#000000">()</font><font color="#000000">.add</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">Actor</font><font color="#000000">(</font><font color="#000000">-</font><font color="#990000">1</font><font color="#000000">,sessionstore.getFocusPeriod</font><font color="#000000">()</font><font color="#000000">, r, focusSubject</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">149</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">150</font> <font color="#ffffff"> </font><font color="#000000">em.merge</font><font color="#000000">(</font><font color="#000000">focusSubject</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">151</font> <font color="#ffffff"> </font><font color="#000000">} </font><font color="#7f0055"><b>catch </b></font><font color="#000000">(</font><font color="#000000">Throwable e</font><font color="#000000">) {</font><br /><font color="#808080">152</font> <font color="#ffffff"> </font><font color="#000000">logger.error</font><font color="#000000">(</font><font color="#2a00ff">"error ocurrued"</font><font color="#000000">, e</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">153</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">154</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">155</font> <font color="#ffffff"> </font><br /><font color="#808080">156</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">Converter <a name="roleConverter">getRoleConverter</a></font><font color="#000000">() {</font><br /><font color="#808080">157</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return new </b></font><font color="#000000">Converter </font><font color="#000000">(){</font><br /><font color="#808080">158</font> <font color="#ffffff"> </font><br /><font color="#808080">159</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">Object getAsObject</font><font color="#000000">(</font><font color="#000000">FacesContext arg0, UIComponent arg1, String arg2</font><font color="#000000">) </font><font color="#7f0055"><b>throws </b></font><font color="#000000">ConverterException </font><font color="#000000">{</font><br /><font color="#808080">160</font> <font color="#ffffff"> </font><font color="#7f0055"><b>final </b></font><font color="#000000">String methodName = </font><font color="#2a00ff">"getAsObject"</font><font color="#000000">;</font><br /><font color="#808080">161</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">logger.isTraceEnabled</font><font color="#000000">()) {</font><br /><font color="#808080">162</font> <font color="#ffffff"> </font><font color="#000000">logger.trace</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">LogUtil.VERSION, methodName</font><br /><font color="#808080">163</font> <font color="#ffffff"> </font><font color="#000000">, </font><font color="#2a00ff">"start with argument '" </font><font color="#000000">+ arg2 + </font><font color="#2a00ff">"'"</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">164</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">165</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">arg2 == </font><font color="#7f0055"><b>null </b></font><font color="#000000">|| arg2.equals</font><font color="#000000">(</font><font color="#2a00ff">""</font><font color="#000000">) </font><font color="#000000">|| arg2.equals</font><font color="#000000">(</font><font color="#000000">EMPTY</font><font color="#000000">)) {</font><br /><font color="#808080">166</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return null</b></font><font color="#000000">;</font><br /><font color="#808080">167</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">168</font> <font color="#ffffff"> </font><font color="#7f0055"><b>try </b></font><font color="#000000">{</font><br /><font color="#808080">169</font> <font color="#ffffff"> </font><font color="#7f0055"><b>int </b></font><font color="#000000">roleid = Integer.parseInt</font><font color="#000000">(</font><font color="#000000">arg2</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">170</font> <font color="#ffffff"> </font><font color="#000000">Iterator<SelectItem> iter = allAvailableRoles.iterator</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#808080">171</font> <font color="#ffffff"> </font><font color="#7f0055"><b>boolean </b></font><font color="#000000">found = </font><font color="#7f0055"><b>false</b></font><font color="#000000">;</font><br /><font color="#808080">172</font> <font color="#ffffff"> </font><font color="#000000">Role result = </font><font color="#7f0055"><b>null</b></font><font color="#000000">;</font><br /><font color="#808080">173</font> <font color="#ffffff"> </font><font color="#7f0055"><b>while </b></font><font color="#000000">(</font><font color="#000000">!found && iter.hasNext</font><font color="#000000">()) {</font><br /><font color="#808080">174</font> <font color="#ffffff"> </font><font color="#000000">result = </font><font color="#000000">(</font><font color="#000000">Role</font><font color="#000000">) </font><font color="#000000">iter.next</font><font color="#000000">()</font><font color="#000000">.getValue</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#808080">175</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">result.getRoleid</font><font color="#000000">() </font><font color="#000000">== roleid</font><font color="#000000">) </font><br /><font color="#808080">176</font> <font color="#ffffff"> </font><font color="#000000">found = </font><font color="#7f0055"><b>true</b></font><font color="#000000">;</font><br /><font color="#808080">177</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">178</font> <font color="#ffffff"> </font><font color="#7f0055"><b>try </b></font><font color="#000000">{</font><br /><font color="#808080">179</font> <font color="#ffffff"> </font><font color="#000000">EntityManager em1 = </font><font color="#000000">(</font><font color="#000000">EntityManager</font><font color="#000000">) </font><font color="#000000">Component.getInstance</font><font color="#000000">(</font><font color="#2a00ff">"entityManager"</font><font color="#000000">, </font><font color="#7f0055"><b>true</b></font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">180</font> <font color="#ffffff"> </font><font color="#000000">em1.find</font><font color="#000000">(</font><font color="#000000">Role.class, roleid</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">181</font> <font color="#ffffff"> </font><font color="#000000">} </font><font color="#7f0055"><b>catch </b></font><font color="#000000">(</font><font color="#000000">Exception e</font><font color="#000000">) {</font><br /><font color="#808080">182</font> <font color="#ffffff"> </font><font color="#000000">logger.error</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">methodName,</font><br /><font color="#808080">183</font> <font color="#ffffff"> </font><font color="#000000">LogUtil.VERSION, </font><font color="#2a00ff">"Error occured retrieving them from inner class."</font><font color="#000000">)</font><font color="#000000">, e</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">184</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">185</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">logger.isDebugEnabled</font><font color="#000000">()) {</font><br /><font color="#808080">186</font> <font color="#ffffff"> </font><font color="#000000">logger.debug</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">methodName,</font><br /><font color="#808080">187</font> <font color="#ffffff"> </font><font color="#000000">LogUtil.VERSION, </font><font color="#2a00ff">"'" </font><font color="#000000">+ roleid + </font><font color="#2a00ff">"'"</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">188</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">189</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#000000">result;</font><br /><font color="#808080">190</font> <font color="#ffffff"> </font><font color="#000000">} </font><font color="#7f0055"><b>catch </b></font><font color="#000000">(</font><font color="#000000">NumberFormatException nfe</font><font color="#000000">) {</font><br /><font color="#808080">191</font> <font color="#ffffff"> </font><font color="#000000">logger.error</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">LogUtil.VERSION, methodName </font><br /><font color="#808080">192</font> <font color="#ffffff"> </font><font color="#000000">, </font><font color="#2a00ff">"passed argument '" </font><font color="#000000">+ arg2 + </font><font color="#2a00ff">"' cannot converted to int"</font><font color="#000000">)</font><font color="#000000">, nfe</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">193</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">194</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return null</b></font><font color="#000000">;</font><br /><font color="#808080">195</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">196</font> <font color="#ffffff"> </font><br /><font color="#808080">197</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">String getAsString</font><font color="#000000">(</font><font color="#000000">FacesContext arg0, UIComponent arg1, Object arg2</font><font color="#000000">) </font><font color="#7f0055"><b>throws </b></font><font color="#000000">ConverterException </font><font color="#000000">{</font><br /><font color="#808080">198</font> <font color="#ffffff"> </font><font color="#7f0055"><b>final </b></font><font color="#000000">String methodName = </font><font color="#2a00ff">"getAsString"</font><font color="#000000">;</font><br /><font color="#808080">199</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">logger.isTraceEnabled</font><font color="#000000">()) {</font><br /><font color="#808080">200</font> <font color="#ffffff"> </font><font color="#000000">logger.trace</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">LogUtil.VERSION, methodName</font><br /><font color="#808080">201</font> <font color="#ffffff"> </font><font color="#000000">, </font><font color="#2a00ff">"start '" </font><font color="#000000">+ arg2 + </font><font color="#2a00ff">"' of type '" </font><font color="#000000">+ </font><font color="#000000">(</font><font color="#000000">arg2 != </font><font color="#7f0055"><b>null </b></font><font color="#000000">? arg2.getClass</font><font color="#000000">() </font><font color="#000000">: </font><font color="#2a00ff">""</font><font color="#000000">) </font><font color="#000000">+ </font><font color="#2a00ff">"'"</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">202</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">203</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">arg2 == </font><font color="#7f0055"><b>null</b></font><font color="#000000">) </font><font color="#7f0055"><b>return </b></font><font color="#000000">EMPTY;</font><br /><font color="#808080">204</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#2a00ff">"-1"</font><font color="#000000">.equals</font><font color="#000000">(</font><font color="#000000">arg2</font><font color="#000000">)) </font><font color="#7f0055"><b>return </b></font><font color="#000000">EMPTY;</font><br /><font color="#808080">205</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">arg2 </font><font color="#7f0055"><b>instanceof </b></font><font color="#000000">Role</font><font color="#000000">) {</font><br /><font color="#808080">206</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#2a00ff">"" </font><font color="#000000">+ </font><font color="#000000">((</font><font color="#000000">Role</font><font color="#000000">)</font><font color="#000000">arg2</font><font color="#000000">)</font><font color="#000000">.getRoleid</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#808080">207</font> <font color="#ffffff"> </font><font color="#000000">} </font><font color="#7f0055"><b>else </b></font><font color="#000000">{</font><br /><font color="#808080">208</font> <font color="#ffffff"> </font><font color="#000000">logger.error</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">LogUtil.VERSION, methodName </font><br /><font color="#808080">209</font> <font color="#ffffff"> </font><font color="#000000">, </font><font color="#2a00ff">"argument is not expected type Role returning _EMPTY"</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">210</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">211</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#000000">EMPTY;</font><br /><font color="#808080">212</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">213</font> <font color="#ffffff"> </font><font color="#000000">}</font><font color="#000000">;</font><br /><font color="#808080">214</font> <font color="#ffffff"> </font><br /><font color="#808080">215</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">216</font> <font color="#ffffff"></font><br /><font color="#808080">217</font> <font color="#ffffff"></font><br /><font color="#808080">218</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">Role findRoleById</font><font color="#000000">(</font><font color="#000000">Integer id</font><font color="#000000">) {</font><br /><font color="#808080">219</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#000000">(</font><font color="#000000">Role</font><font color="#000000">) </font><font color="#000000">em.createQuery</font><font color="#000000">(</font><font color="#2a00ff">"r from Role r where r.roleid = :id"</font><font color="#000000">)</font><font color="#000000">.setParameter</font><font color="#000000">(</font><font color="#2a00ff">"id"</font><font color="#000000">, id</font><font color="#000000">)</font><font color="#000000">.getSingleResult</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#808080">220</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">221</font> <font color="#ffffff"></font><br /></div><br /><div style="float: right;"><br /><small><br /><a href="http://www.java2html.de" target="_blank">Java2html</a><br /></small><br /></div>jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com0tag:blogger.com,1999:blog-1043185499374579995.post-7329423652288605312007-09-26T01:11:00.000-07:002008-05-03T07:40:09.028-07:00ldap on mac os xto start openldap:<br />jdijkmeijer [/usr/libexec]$sudo ./slapd<br /><br />apache directory studio:<br />localhost:389 anonymous binding.<br />to be continued.<br /><br />Ok the continue: For some reason I could not get the openldap to work correctly slapadd etc all seemed to work but login in with the rootdn and password supplied, gave an error 49 invalid credentials. I do suspect the berkeley db is screwed but i'm not sure.<br />Anyhow I'm about to reinstall openldap hopefull that will work without installing the prefigured ldap /usr/libexec/slapd Im also woondering what will happen to the slap* cmds. Anyhow just installed the berkeleydb 4.6. It would have been nice if the installation script at http://www.oracle.com/technology/documentation/berkeley-db/db/ref/build_unix/intro.html<br />would have made a indication that <br />sudo ln -s /usr/local/BerkeleyDB.4.6/include/db.h /usr/include/db.h would have been useful for tools like openldap. Again to be continued..<br />configuration of the sources failed with:<br />checking for db.h... yes<br />checking for Berkeley DB major version... 1<br />checking for Berkeley DB minor version... 0<br />checking for Berkeley DB link (-ldb1)... no<br />checking for Berkeley DB link (-ldb-1)... no<br />checking for Berkeley DB link (default)... yes<br />checking for Berkeley DB version match... yes<br />checking for Berkeley DB thread support... no<br /><br />the installed version of berkeleydb must be explicitly indicated by the cppflags:<br />env CPPFLAGS="-I/usr/local/BerkeleyDB.4.6/include" LDFLAGS="-L/usr/local/BerkeleyDB.4.6/lib" ./configure<br />openldap is reinstalled and is located in /usr/local/libexec<br />time to get jboss listen to ldap...jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com60tag:blogger.com,1999:blog-1043185499374579995.post-64549451910163416922007-09-19T03:18:00.000-07:002007-10-03T03:13:09.900-07:00jsf Solutions for many2many: the dataTable<b>The datatable with rowselector.</b></p><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbWOklPHRASB2FFd5PzFIeYa5Y-XIgezCeYG0uPCv74mnuAQ8AEzo3CyKFa8-abZrjW_44TrO7U-W8IqHDVMAia76Of2vHffnWlqBcnil_RyBMvsDU2q3K94wU8JmNm6fe3xvlDTbM0kE/s1600-h/Picture+3.png"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbWOklPHRASB2FFd5PzFIeYa5Y-XIgezCeYG0uPCv74mnuAQ8AEzo3CyKFa8-abZrjW_44TrO7U-W8IqHDVMAia76Of2vHffnWlqBcnil_RyBMvsDU2q3K94wU8JmNm6fe3xvlDTbM0kE/s320/Picture+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5116488557054315442" /></a><br />Icefaces has extended the datatable with the possibility of a rowselector allowing remote method call of a listener method (Ajax). This feature wonderfully and intuitivily integrates with seam's datamodel and, even more important, seam's datamodelselection. The datamodel for a datamodelselection is a list with objects, which must have a isSelected method. No interface or super class is needed as this method is textual mentioned in the rowselector's value property. Check the roleItem code for a complete implementation.<br />Having learned a few things from jpa-ql and hibernate ql, and with the help of 2 colleagues I have been able to define an <a href="#query">elegant</a> query to populate a list with all the roles, and if present the actor for the subject having focus. In the same query I also construct the roleItem (See the RoleSubjectMgrBean.roleitms() code below), no list manipulation needed afterwards. I'm currently unaware whether the used syntax is allowed jpa-ql? Persisting the selection is a piece of cake (See the RoleSubjectMgrBean.rowSelection..) I only had to change the sessionbeans from session to conversation scope.<br /><div class="jcode"><br /><ice:dataTable value="#{<a href="#list">subjectRoleList</a>}"<br /> var="roleItem" rendered="${focusSubject.subjectid gt 0}"><br /> <ice:column><br /> <ice:rowSelector selectionListener="#{roleSubjectMgr.<a href="#selection">rowSelection</a>}" value="#{roleItem.<a href="#selected">selected</a>}" multiple="true" selectedClass="selected"/><br /> <f:facet name="header"><h:outputLabel value="#{msgs['spuyt.subject.edit.role.list']}"/></f:facet><br /> <h:outputText value="#{roleItem.role.name}"/><br /> </ice:column><br /></ice:dataTable><br /></div><br /><br /><p><br />Alas some drawbacks of this approach:<br /></p><ol><br /><li>The cursor doesn't change when hovering over the items.</li><br /><li>The subject in focus must be created before the datamodelselection can save its attached roles. This forces a conditional render of the datamodel</li><br /><li>By selecting a row the update is immediately executed on the database. Of course the cancel button gets a complete new meaning(less).</li><br /><li>Used query may not be jpa compliant</li><br /></ol><br /><div class="jcode"><br /><span style="color:#ff0000;font-weight:bold;">RoleSubjectMgrBean.java</span><br /><font color="#808080">001</font> <font color="#7f0055"><b>package </b></font><font color="#000000">nl.jeroen.testdb.persist;</font><br /><font color="#808080">002</font> <font color="#ffffff"></font><br /><font color="#808080">003</font> <font color="#7f0055"><b>import </b></font><font color="#000000">java.io.Serializable;</font><br /><font color="#808080">004</font> <font color="#7f0055"><b>import </b></font><font color="#000000">..;</font><br /><font color="#808080">028</font> <font color="#7f0055"><b>import </b></font><font color="#000000">org.jboss.seam.log.Log;</font><br /><font color="#808080">029</font> <font color="#ffffff"></font><br /><font color="#808080">030</font> <font color="#7f0055"><b>import </b></font><font color="#000000">com.icesoft.faces.component.ext.RowSelectorEvent;</font><br /><font color="#808080">031</font> <font color="#ffffff"></font><br /><font color="#808080">032</font> <font color="#646464">@Scope</font><font color="#000000">(</font><font color="#000000">ScopeType.CONVERSATION</font><font color="#000000">)</font><br /><font color="#808080">033</font> <font color="#646464">@Stateful</font><br /><font color="#808080">034</font> <font color="#646464">@Name</font><font color="#000000">(</font><font color="#2a00ff">"roleSubjectMgr"</font><font color="#000000">)</font><br /><font color="#808080">035</font> <font color="#7f0055"><b>public class </b></font><font color="#000000">RoleSubjectMgrBean </font><font color="#7f0055"><b>implements </b></font><font color="#000000">Serializable, RoleSubjectMgr </font><font color="#000000">{</font><br /><font color="#808080">036</font> <font color="#ffffff"> </font><font color="#7f0055"><b>private static final </b></font><font color="#7f0055"><b>long </b></font><font color="#000000">serialVersionUID = -</font><font color="#990000">9145745003284315431L</font><font color="#000000">;</font><br /><font color="#808080">037</font> <font color="#ffffff"></font><br /><font color="#808080">038</font> <font color="#ffffff"> </font><font color="#646464">@Logger</font><br /><font color="#808080">039</font> <font color="#ffffff"> </font><font color="#000000">Log logger;</font><br /><font color="#808080">040</font> <font color="#ffffff"> </font><br /><font color="#808080">041</font> <font color="#ffffff"> </font><font color="#646464">@In</font><font color="#000000">(</font><font color="#000000">required=</font><font color="#7f0055"><b>false</b></font><font color="#000000">)</font><br /><font color="#808080">042</font> <font color="#ffffff"> </font><font color="#7f0055"><b>private </b></font><font color="#000000">Subject focusSubject;</font><br /><font color="#808080">043</font> <font color="#ffffff"> </font><br /><font color="#808080">044</font> <font color="#ffffff"> </font><font color="#646464">@In</font><font color="#000000">(</font><font color="#000000">required=</font><font color="#7f0055"><b>true</b></font><font color="#000000">)</font><br /><font color="#808080">045</font> <font color="#ffffff"> </font><font color="#000000">IApplicationSession sessionstore;</font><br /><font color="#808080">046</font> <font color="#ffffff"> </font><br /><font color="#808080">047</font> <font color="#ffffff"> </font><font color="#646464">@DataModel</font><font color="#000000">(</font><font color="#000000">value=</font><font color="#2a00ff">"<a name="list">subjectRoleList</a>"</font><font color="#000000">)</font><br /><font color="#808080">048</font> <font color="#ffffff"> </font><font color="#7f0055"><b>private </b></font><font color="#000000">List<RoleItem> subjectRoleList;</font><br /><font color="#808080">049</font> <font color="#ffffff"> </font><br /><font color="#808080">050</font> <font color="#ffffff"> </font><font color="#646464">@DataModelSelection</font><font color="#000000">(</font><font color="#000000">value=</font><font color="#2a00ff">"subjectRoleList"</font><font color="#000000">)</font><br /><font color="#808080">051</font> <font color="#ffffff"> </font><font color="#646464">@Out</font><font color="#000000">(</font><font color="#000000">required=false, value=</font><font color="#2a00ff">"focusSubjectRoleList"</font><font color="#000000">)</font><br /><font color="#808080">052</font> <font color="#ffffff"> </font><font color="#7f0055"><b>private </b></font><font color="#000000">RoleItem focusSubjectRoleList;</font><br /><font color="#808080">053</font> <font color="#ffffff"> </font><br /><font color="#808080">054</font> <font color="#ffffff"> </font><font color="#646464">@PersistenceContext</font><font color="#000000">(</font><font color="#000000">type=PersistenceContextType.EXTENDED</font><font color="#000000">)</font><br /><font color="#808080">055</font> <font color="#ffffff"> </font><font color="#7f0055"><b>private </b></font><font color="#000000">EntityManager em;</font><br /><font color="#808080">056</font> <font color="#ffffff"> </font><br /><font color="#808080">057</font> <font color="#ffffff"> </font><font color="#646464">@Factory</font><font color="#000000">(</font><font color="#2a00ff">"subjectRoleList"</font><font color="#000000">)</font><br /><font color="#808080">058</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000"><a name="query">roleItems</a></font><font color="#000000">() {</font><br /><font color="#808080">059</font> <font color="#ffffff"> </font><font color="#3f7f5f">//http://opensource.atlassian.com/projects/hibernate/browse/HHH-2772</font><br /><font color="#808080">060</font> <font color="#ffffff"> </font><font color="#000000">subjectRoleList = em.createQuery</font><font color="#000000">(</font><font color="#2a00ff">"select new nl.jeroen.spuyt.util.RoleItem (r, a) </font><br /><font color="#2a00ff"> from Role r left join r.actors as a with a.subject.subjectid = :subject"</font><font color="#000000">)</font><br /><font color="#808080">061</font> <font color="#ffffff"> </font><font color="#000000">.setParameter</font><font color="#000000">(</font><font color="#2a00ff">"subject"</font><font color="#000000">, focusSubject.getSubjectid</font><font color="#000000">())</font><font color="#000000">.getResultList</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#808080">062</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">063</font> <font color="#ffffff"></font><br /><font color="#808080">064</font> <font color="#ffffff"> </font><font color="#646464">@Destroy @Remove</font><br /><font color="#808080">065</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">destroy</font><font color="#000000">() {</font><br /><font color="#808080">066</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">067</font> <font color="#ffffff"> </font><br /><font color="#808080">068</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000"><a name="selection">rowSelection</a></font><font color="#000000">(</font><font color="#000000">RowSelectorEvent e</font><font color="#000000">) {</font><br /><font color="#808080">069</font> <font color="#ffffff"> </font><font color="#7f0055"><b>final </b></font><font color="#000000">String methodName = </font><font color="#2a00ff">"rowSelection: "</font><font color="#000000">;</font><br /><font color="#808080">070</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">logger.isDebugEnabled</font><font color="#000000">()) {</font><br /><font color="#808080">071</font> <font color="#ffffff"> </font><font color="#000000">logger.debug</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">methodName, LogUtil.VERSION, </font><font color="#2a00ff">"'"</font><br /><font color="#808080">072</font> <font color="#ffffff"> </font><font color="#000000">+ focusSubjectRoleList + </font><font color="#2a00ff">"'"</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">073</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">074</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">focusSubjectRoleList.isSelected</font><font color="#000000">() ) {</font><br /><font color="#808080">075</font> <font color="#ffffff"> </font><font color="#3f7f5f">// it was selected and now we're going to remove it.</font><br /><font color="#808080">076</font> <font color="#ffffff"> </font><font color="#000000">focusSubject.getActors</font><font color="#000000">()</font><font color="#000000">.remove</font><font color="#000000">(</font><font color="#000000">focusSubjectRoleList.getActor</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#808080">077</font> <font color="#ffffff"> </font><font color="#000000">em.remove</font><font color="#000000">(</font><font color="#000000">focusSubjectRoleList.getActor</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#808080">078</font> <font color="#ffffff"> </font><font color="#000000">focusSubjectRoleList.setActor</font><font color="#000000">(</font><font color="#7f0055"><b>null</b></font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">079</font> <font color="#ffffff"> </font><font color="#000000">} </font><font color="#7f0055"><b>else </b></font><font color="#000000">{</font><br /><font color="#808080">080</font> <font color="#ffffff"> </font><font color="#3f7f5f">// creating a new actor</font><br /><font color="#808080">081</font> <font color="#ffffff"> </font><font color="#000000">Actor act = </font><font color="#7f0055"><b>new </b></font><font color="#000000">Actor</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#808080">082</font> <font color="#ffffff"> </font><font color="#000000">em.merge</font><font color="#000000">(</font><font color="#000000">focusSubject</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">083</font> <font color="#ffffff"> </font><font color="#000000">act.setPeriod</font><font color="#000000">(</font><font color="#000000">sessionstore.getFocusPeriod</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#808080">084</font> <font color="#ffffff"> </font><font color="#000000">act.setRole</font><font color="#000000">(</font><font color="#000000">focusSubjectRoleList.getRole</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#808080">085</font> <font color="#ffffff"> </font><font color="#000000">act.setSubject</font><font color="#000000">(</font><font color="#000000">focusSubject</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">086</font> <font color="#ffffff"> </font><font color="#000000">em.persist</font><font color="#000000">(</font><font color="#000000">act</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">087</font> <font color="#ffffff"> </font><font color="#000000">focusSubjectRoleList.setActor</font><font color="#000000">(</font><font color="#000000">act</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">088</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">089</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">090</font> <font color="#ffffff"> </font><br /><font color="#808080">091</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">String persist</font><font color="#000000">() {</font><br /><font color="#808080">092</font> <font color="#ffffff"> </font><font color="#7f0055"><b>final </b></font><font color="#000000">String methodName = </font><font color="#2a00ff">"persist: "</font><font color="#000000">;</font><br /><font color="#808080">093</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">logger.isTraceEnabled</font><font color="#000000">()) {</font><br /><font color="#808080">094</font> <font color="#ffffff"> </font><font color="#000000">logger.trace</font><font color="#000000">(</font><font color="#000000">LogUtil.getLogMessage</font><font color="#000000">(</font><font color="#000000">methodName, LogUtil.VERSION,</font><br /><font color="#808080">095</font> <font color="#ffffff"> </font><font color="#2a00ff">"starting '" </font><font color="#000000">+ </font><font color="#2a00ff">"'"</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">096</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">097</font> <font color="#ffffff"> </font><font color="#7f0055"><b>try </b></font><font color="#000000">{</font><br /><font color="#808080">098</font> <font color="#ffffff"> </font><font color="#7f0055"><b>if </b></font><font color="#000000">(</font><font color="#000000">focusSubject.getSubjectid</font><font color="#000000">() </font><font color="#000000">== </font><font color="#990000">0</font><font color="#000000">) {</font><br /><font color="#808080">099</font> <font color="#ffffff"> </font><font color="#000000">em.persist</font><font color="#000000">(</font><font color="#000000">focusSubject</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">100</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#2a00ff">"selectSubject"</font><font color="#000000">;</font><br /><font color="#808080">101</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">102</font> <font color="#ffffff"> </font><font color="#000000">em.merge</font><font color="#000000">(</font><font color="#000000">focusSubject</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">103</font> <font color="#ffffff"> </font><font color="#000000">} </font><font color="#7f0055"><b>catch </b></font><font color="#000000">(</font><font color="#000000">Exception e</font><font color="#000000">) {</font><br /><font color="#808080">104</font> <font color="#ffffff"> </font><font color="#000000">logger.error</font><font color="#000000">(</font><font color="#2a00ff">"error occured:"</font><font color="#000000">, e</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">105</font> <font color="#ffffff"> </font><font color="#000000">FacesContext.getCurrentInstance</font><font color="#000000">()</font><font color="#000000">.addMessage</font><font color="#000000">(</font><font color="#2a00ff">"error on saving"</font><font color="#000000">, </font><font color="#7f0055"><b>new </b></font><font color="#000000">FacesMessage</font><font color="#000000">(</font><font color="#2a00ff">"error on saving"</font><font color="#000000">))</font><font color="#000000">;</font><br /><font color="#808080">106</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">107</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#2a00ff">"listSubject"</font><font color="#000000">;</font><br /><font color="#808080">108</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">109</font> <font color="#000000">}</font><br /></div><br /><div class="jcode"><br /><span style="color:#ff0000;font-weight:bold;">RoleItem.java</span><br /><font color="#808080">01</font> <font color="#7f0055"><b>package </b></font><font color="#000000">nl.jeroen.spuyt.util;</font><br /><font color="#808080">02</font> <font color="#ffffff"></font><br /><font color="#808080">03</font> <font color="#7f0055"><b>import </b></font><font color="#000000">nl.jeroen.testdb.persist.Actor;</font><br /><font color="#808080">04</font> <font color="#7f0055"><b>import </b></font><font color="#000000">nl.jeroen.testdb.persist.Role;</font><br /><font color="#808080">05</font> <font color="#ffffff"></font><br /><font color="#808080">06</font> <font color="#7f0055"><b>public class </b></font><font color="#000000">RoleItem </font><font color="#000000">{</font><br /><font color="#808080">07</font> <font color="#ffffff"> </font><font color="#000000">Role role;</font><br /><font color="#808080">08</font> <font color="#ffffff"> </font><font color="#000000">Actor actor;</font><br /><font color="#808080">09</font> <font color="#ffffff"> </font><br /><font color="#808080">10</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">RoleItem</font><font color="#000000">(</font><font color="#000000">Role r, Actor a</font><font color="#000000">) {</font><br /><font color="#808080">11</font> <font color="#ffffff"> </font><font color="#000000">role = r;</font><br /><font color="#808080">12</font> <font color="#ffffff"> </font><font color="#000000">actor = a;</font><br /><font color="#808080">13</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">14</font> <font color="#ffffff"></font><br /><font color="#808080">15</font> <font color="#ffffff"> </font><font color="#646464">@Override</font><br /><font color="#808080">16</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">String toString</font><font color="#000000">() {</font><br /><font color="#808080">17</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#2a00ff">"name: '" </font><font color="#000000">+ role.getName</font><font color="#000000">() </font><font color="#000000">+ </font><font color="#2a00ff">"' roleid " </font><font color="#000000">+ role.getRoleid</font><font color="#000000">() </font><font color="#000000">+ </font><font color="#2a00ff">" actor " </font><font color="#000000">+ actor;</font><br /><font color="#808080">18</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">19</font> <font color="#ffffff"> </font><br /><font color="#808080">20</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>boolean </b></font><font color="#000000"><a name="selected">isSelected</a></font><font color="#000000">() {</font><br /><font color="#808080">21</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#000000">(</font><font color="#000000">actor != </font><font color="#7f0055"><b>null</b></font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#808080">22</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">23</font> <font color="#ffffff"> </font><br /><font color="#808080">24</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">setSelected</font><font color="#000000">(</font><font color="#7f0055"><b>boolean </b></font><font color="#000000">selected</font><font color="#000000">) {</font><br /><font color="#808080">25</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">26</font> <font color="#ffffff"></font><br /><font color="#808080">27</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">Role getRole</font><font color="#000000">() {</font><br /><font color="#808080">28</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#000000">role;</font><br /><font color="#808080">29</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">30</font> <font color="#ffffff"></font><br /><font color="#808080">31</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">setRole</font><font color="#000000">(</font><font color="#000000">Role role</font><font color="#000000">) {</font><br /><font color="#808080">32</font> <font color="#ffffff"> </font><font color="#7f0055"><b>this</b></font><font color="#000000">.role = role;</font><br /><font color="#808080">33</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">34</font> <font color="#ffffff"></font><br /><font color="#808080">35</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">Actor getActor</font><font color="#000000">() {</font><br /><font color="#808080">36</font> <font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#000000">actor;</font><br /><font color="#808080">37</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">38</font> <font color="#ffffff"></font><br /><font color="#808080">39</font> <font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">setActor</font><font color="#000000">(</font><font color="#000000">Actor actor</font><font color="#000000">) {</font><br /><font color="#808080">40</font> <font color="#ffffff"> </font><font color="#7f0055"><b>this</b></font><font color="#000000">.actor = actor;</font><br /><font color="#808080">41</font> <font color="#ffffff"> </font><font color="#000000">}</font><br /><font color="#808080">42</font> <font color="#ffffff"> </font><br /><font color="#808080">43</font> <font color="#000000">}</font></code><br /></div><br /><br /><div style="float: right;"><br /><small><br /><a href="http://www.java2html.de" target="_blank">Java2html</a><br /></small><br /></div>jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com52tag:blogger.com,1999:blog-1043185499374579995.post-22349898700012896242007-04-22T09:12:00.000-07:002007-04-22T09:17:19.032-07:00icefaces 163Just downloaded the 163 release from icesoft appeared they have fixed the bug I blogged about before. I tried to use it in my project but it doesnot start yet.<br />First I had to copy over 2 jars: Class not found: FileUploadBase$FileSizeLimitExceededException (commons fileupload), and facelets-icefaces not that exciting, jboss starts and ear deploys but I dont see my datatable now. Query gets excecuted. But no field generation, nada nothing.<br />First I'm going to see whether its possible to switch to jsf1.2 (Apparant changing the myfaces impl jars to the jsf ref ones).jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com1tag:blogger.com,1999:blog-1043185499374579995.post-75171080763800190442007-04-17T13:31:00.000-07:002007-10-01T06:54:49.853-07:00implementing many2manyI'm currently trying to implement a many2many relationship. Using jsf's selectMany thingy. Apparantly jboss seam does have something similar integrated in seam, now I've to use selectitems, converters and what's more. I tried the seam implementation a while ago, but I couldnt get it to work it also had a beta in the name, which is discouraging.<br /><br />As the myfaces/icefaces combination also has shown some weird behavior I decided to download both and add them as projects in eclipse, so I can do some debugging, and add logging. A feature with both products seriously lack.<br />Myfaces is build with maven :<br /><pre>D:\projects\seamice\myfaces\core> d:\programs\maven-2.0.4\bin\mvn </pre> produces the api and impl files, which can be copied:<br /><pre> copy /Y impl\target\myfaces-impl-1.1.6-SNAPSHOT.jar d:\programs\jboss-4.0.5.GA\server\default\deploy\jbossweb-tomcat55.sar\jsf-libs\myfaces-impl.jar </pre><br />(and repeat cmd above for the api jars, donot copy the source jars).<br /><br />The first obstacle I encountered was the output.<br />I did do something like:<br />SelectItem item = new SelectItem();<br />item.setLabel(role.getName());<br />item.setValue(role.getValue());<br />But the output in the html both value and label as the label.<br /><br /><span style="color: rgb(255, 0, 0);font-family:courier new;" >IceFaces:</span><br /><span style="color: rgb(255, 0, 0);font-family:courier new;" >codesnippet MenuRenderer:</span><br /><pre><br />if (logger.isTraceEnabled()) {<br />logger.trace(LogUtil.getLogMsg(methodName, LogUtil.VERSION<br />,"start to render option for '" + uiComponent.getId() + "' and item label '" + selectItem.getLabel() + "' and itemvalue '" + selectItem.getValue() + "'"));<br />}<br /> DOMContext domContext =<br /> DOMContext.attachDOMContext(facesContext, uiComponent);<br /><br /> Element select = (Element) domContext.getRootNode();<br /> Element option = domContext.createElement("option");<br /><br /> if (optionGroup == null) {<br /> select.appendChild(option);<br /> } else {<br /> optionGroup.appendChild(option);<br /> }<br /><br /> String valueString = formatComponentValue(facesContext, uiComponent,<br /> selectItem.getValue());<br /> if (logger.isDebugEnabled()) {<br />logger.debug(LogUtil.getLogMsg(methodName, LogUtil.VERSION<br />, "created option gets value assigned of '" + valueString + "'"));<br />}<br /></pre><br /><span style="color: rgb(255, 0, 0);">And the logging output:</span><br /><pre><br />15:16:05,593 TRACE [com.icesoft.faces.renderkit.dom_html_basic.MenuRenderer] renderOption[0.1]:start to render option for '_id61' and item label 'Spuyt' and itemvalue '1'<br />15:16:05,656 TRACE [javax.faces.component.UISelectMany] getValueBinding[0.1]:start with 'converter'<br />15:16:05,671 INFO [nl.jeroen.testdb.persist.SubjectMgrBean] getting as string for '1' class java.lang.Integer'<br />15:16:05,671 INFO [nl.jeroen.testdb.persist.SubjectMgrBean] getting as string for '1' class java.lang.Integer'<br />15:16:05,671 DEBUG [nl.jeroen.testdb.persist.SubjectMgrBean] [getRoleValues: ]0.1: starting ''<br />15:16:05,687 DEBUG [com.icesoft.faces.renderkit.dom_html_basic.MenuRenderer] renderOption[0.1]:created option gets value assigned of 'Spuyt'<br /></pre>In between something is going wrong and apparantly its the converter.getAsString method is being called, and this nicely retrieves the role with the passed argument as id, and returns the name.<br />But this is exactly why I switched back to Integers instead of the Roles because the conversion back (getAsObject) is not working as expected.<br />Because after submitting the form, I'd expect the getAsObject method to be called before the HTMLSelectManyListbox(UISelectMany).validateValue() (part of myfaces) but that's not happening.<br />validateValue's signature is:<br /><pre><br />validateValue(FacesContext context, Object convertedValues)<br /></pre><br />but my own logging states:<br /><pre><br />validateValue[0.1]:validate Value '[2, 6]'<br /></pre><br />convertedValues would expect that the values have been converter.getAsObject(..) but alas..<br />iceface's blocking servlet is doing in rendercycle, lifecycle.execute();<br /><p><br />UISelectMany does contain a getConvertedValue method which delegates the conversion of the submitted values to a renderer (MenuRender in our case). This menurenderer is not calling the converter.getAsObject so there's the error!<br /><br />Why is eclipse code formatter putting all the operands on the end of the line? I would prefer it to put at the start of the line, in case of long lines you don't have to scroll right. (I use the term operands here for characters like + . , etc)jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com0tag:blogger.com,1999:blog-1043185499374579995.post-86420824828451757432007-04-17T13:16:00.000-07:002007-04-17T13:31:33.455-07:00Icefaces seam and allHopefully an effort which will last to monitor my progress on my journey into jboss seam, icefaces and other relevant technologies. In the far past I used to be the treasurer of my volleybalclub, and I made a nice webapplication for maintaining all my expenses, credits debets etc. This application was made in Silverstream my employer at that time, but Silverstream went out of business or novell took over or god knows what and I havent been able to maintain the application or even migrate the application.<br />Of course my suceessor used Excel again and nothing wrong with Excel but I still have the feeling that there might be some business in a small treasure like application for small / medium sized clubs or institutes. I'm not really hindred by a bookkeeping or economic background, so that is not an obstacle.<br />Since 4 or 5 years I've been carrying the idea of reimplementing the application using the various opensource java techniques available at time. EJB 1.1, 2, struts, jsp, jsf, tapestry jsf etc. All without much result, I just haven't been able to master the technologies without proper guidance or education in my own spare time. Looking at the ejb3 comments its probably not really a shame, but It felt like it and finally I dare to speak out openly.<br />Lately I discovered seam and jboss and I have the feeling that this combination with jsf (icefaces) may work out. Hopefully I'm capable of keeping this blog up to date so people may benifit from it and otherwise it might be a worthwile resource for me to look back.jerryhttp://www.blogger.com/profile/13740690640459984584noreply@blogger.com0