<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7808117296491924045</id><updated>2012-01-31T02:16:03.504+01:00</updated><title type='text'>Magnus K Karlsson</title><subtitle type='html'>I'm dedicated agile system architect/developer with specialty of open source framework.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>81</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-3186127103372118821</id><published>2012-01-31T02:16:00.000+01:00</published><updated>2012-01-31T02:16:03.510+01:00</updated><title type='text'>How to install Oracle JDK on Ubuntu 11 from repository.</title><content type='html'>With Oracle the acquisition of Sun the Oracle have retired the "Operating System Distributor License for Java" (JDL) and the only available JDK release will be the OpenJDK. I had previously some bad experience with the OpenJDK and I prefer to use the official Oracle version of JDK, but I don't want to install the JDK binaries manually – we are using Ubuntu! But the &lt;a href="http://webupd8.org/" target="_blank"&gt;webupd8.org&lt;/a&gt; team have been nice to published the binaries in a Personal Package Archives (PPA) and so far I have no problem using it, so I can warmly recommend using it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To install:&lt;/b&gt;&lt;br /&gt;sudo add-apt-repository ppa:webupd8team/java&lt;br /&gt;sudo apt-get update&lt;br /&gt;sudo mkdir -p /usr/lib/mozilla/plugins #just in case, this will be added to the package in the next version&lt;br /&gt;sudo apt-get install oracle-jdk7-installer&lt;br /&gt;&lt;br /&gt;&lt;b&gt;And to uninstall:&lt;/b&gt;&lt;br /&gt;sudo apt-get remove oracle-jdk7-installer&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;And to verify your installation:&lt;/b&gt;&lt;br /&gt;java -version&lt;br /&gt;java version "1.7.0_02"&lt;br /&gt;Java(TM) SE Runtime Environment (build 1.7.0_02-b13)&lt;br /&gt;Java HotSpot(TM) 64-Bit Server VM (build 22.0-b10, mixed mode)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;And to verify the web browser installation:&lt;/b&gt;&lt;br /&gt;&lt;a href="http://java.com/en/download/installed.jsp" target="_blank"&gt;http://java.com/en/download/installed.jsp&lt;/a&gt;&lt;br /&gt;Verified Java Version&lt;br /&gt;Congratulations!&lt;br /&gt;You have the recommended Java installed (1.7.0_02).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;And with maven 2:&lt;/b&gt;&lt;br /&gt;mvn -version&lt;br /&gt;Java version: 1.7.0_02&lt;br /&gt;Java home: /usr/lib/jvm/java-7-oracle/jre&lt;br /&gt;Default locale: en_US, platform encoding: UTF-8&lt;br /&gt;OS name: "linux" version: "3.0.0-15-generic" arch: "amd64" Family: "unix"&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Java Web Start&lt;/b&gt;&lt;br /&gt;The only thing that did not work out of the box was the Java Web Start. To fix that open JNLP file link and when asked for application, brows to: &lt;br /&gt;/usr/lib/jvm/java-7-oracle/bin/javaws&lt;br /&gt;&lt;br /&gt;&lt;b&gt;For complete reference see:&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-ubuntu-via.html" target="_blank"&gt;http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-ubuntu-via.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-3186127103372118821?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/3186127103372118821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=3186127103372118821&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3186127103372118821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3186127103372118821'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2012/01/how-to-install-oracle-jdk-on-ubuntu-11.html' title='How to install Oracle JDK on Ubuntu 11 from repository.'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-966870937672210711</id><published>2012-01-31T01:42:00.000+01:00</published><updated>2012-01-31T01:42:34.879+01:00</updated><title type='text'>How to Make a Launcher (Shortcut) in the New Ubuntu 11.10 (Oneiric Ocelot) Dock.</title><content type='html'>In my previous blog I wrote about how to create a custom launcher to the Unity dock, but when you upgrade to 11.10 (Oneiric Ocelot) that no longer holds. When you right click on the desktop the menu item Create Launcher... is no longer there. &lt;br /&gt;&lt;br /&gt;The simplest way I have yet found is to manually create a desktop file anywhere one the file system, but I would recommend to put it in the same folder as the program you are creating to shortcut to.&lt;br /&gt;&lt;br /&gt;Example of my eclipse.desktop:&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[[Desktop Entry]Exec=/home/magnus/bin/eclipse-jee-3.7.1/eclipseIcon=/home/magnus/bin/eclipse-jee-3.7.1/icon.xpmName=Eclipse JEE 3.7.1StartupNotify=trueTerminal=falseType=ApplicationX-KDE-SubstituteUID=false]]&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-966870937672210711?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/966870937672210711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=966870937672210711&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/966870937672210711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/966870937672210711'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2012/01/how-to-make-launcher-shortcut-in-new_31.html' title='How to Make a Launcher (Shortcut) in the New Ubuntu 11.10 (Oneiric Ocelot) Dock.'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8577356988152513493</id><published>2012-01-31T01:28:00.000+01:00</published><updated>2012-01-31T01:28:33.995+01:00</updated><title type='text'>How to implement MVC (Model View Controller) Pattern with Swing – Part 3</title><content type='html'>In my third blog about implementing MVC pattern in Swing I will look at how to implement global actions, context sensitive global actions, updating status bar and popup dialogs. But before delving into these issues and I would like again to repeat each class responsibility in the MVC pattern:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Model: &lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Simple POJO model.&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;View:&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Layout out the Swing components. &lt;/li&gt;&lt;li&gt;Responds to user action by sending request to Control. &lt;/li&gt;&lt;li&gt;Responds to Controller responds.&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;Controller: &lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Receives request from the View.&lt;/li&gt;&lt;li&gt;Do logic. &lt;/li&gt;&lt;li&gt;Sends Responds to View(s).&lt;/li&gt;&lt;/ol&gt;And a last reminder the Request and Responds to and from &lt;b&gt;the Controller should be TOTALLY view technique neutral as the Model&lt;/b&gt;. The view specific code, in our case Swing code, ends in the view. Handling all Swing code is the responsibility of each view.&lt;br /&gt;&lt;br /&gt;In my previous blog we have seen that each View is only responsible of its Swing component and what happens in other view is it totally unaware of. Try to think of separation of concern. It is the responsibility of the Controller to call the Response methods in each Views that should be updated. &lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[    private class CreateDocumentAction extends AbstractAction {        private static final long serialVersionUID = 1L;        public CreateDocumentAction() {            putValue(Action.NAME, "Create");            putValue(Action.SHORT_DESCRIPTION, "Create Document");            putValue(Action.SMALL_ICON, imageIcon("/org/tango-project/tango-icon-theme/16x16/actions/document-new.png"));        }        @Override        public void actionPerformed(ActionEvent e) {            getDossierController().preCreateDocument(getModel());        }    }]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And the corresponding Controller code:&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[    public void preCreateDocument(Dossier dossier) {        // 1. do server logic        Document document = new Document();        document.setDossierId(dossier.getDossierId());        // 2. do swing response        getMainFrame().getView(DocumentModelView.class).setModel(document);        getMainFrame().getView(DossierTreeModelView.class).addDocumentNode(document);    }]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Toolbar is yet Another View&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So now lets start with looking how to add a JToolBar to our Swing client. If you think of it for a while you will realize that the toolbar is yet another view. So lets write a new class that extends from our AbstractView. &lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.mvcframework.demo.view;import static se.msc.mvcframework.ComponentFactory.button;import static se.msc.mvcframework.ComponentFactory.imageIcon;import java.awt.event.ActionEvent;import javax.swing.AbstractAction;import javax.swing.Action;import javax.swing.JButton;import javax.swing.JToolBar;import se.msc.mvcframework.AbstractFrame;import se.msc.mvcframework.AbstractView;import se.msc.mvcframework.demo.controller.DossierController;public class ToolBarView extends AbstractView&lt;jtoolbar&gt; {    private JButton saveButton;    private Action saveAction;    public ToolBarView(AbstractFrame mainFrame) {        super(mainFrame);    }    @Override    protected JToolBar layout() {        JToolBar toolBar = new JToolBar();        toolBar.add(button(new OpenDossier()));        toolBar.add(saveButton = button(saveAction = new SaveAction()));        return toolBar;    }    // ---------- Request Code Goes Here    public class OpenDossier extends AbstractAction {        private static final long serialVersionUID = 1L;        public OpenDossier() {            putValue(Action.NAME, "Open");            putValue(Action.SHORT_DESCRIPTION, "Open Dossier");            putValue(Action.SMALL_ICON, imageIcon("/org/tango-project/tango-icon-theme/16x16/actions/document-open.png"));        }        @Override        public void actionPerformed(ActionEvent e) {            getMainFrame().getController(DossierController.class).retrieveDossierView();        }    }    public class SaveAction extends AbstractAction {        private static final long serialVersionUID = 1L;        public SaveAction() {            putValue(Action.DEFAULT, AbstractFrame.GLOBAL_SAVE_ACTION);            putValue(Action.NAME, "Save");            putValue(Action.SHORT_DESCRIPTION, "Save");            putValue(Action.SMALL_ICON, imageIcon("/org/tango-project/tango-icon-theme/16x16/actions/document-save.png"));        }        @Override        public void actionPerformed(ActionEvent e) {        }    }    // ---------- Response Code Goes Here    public void setGlobalActions(Action[] actions) {        resetGlobalActions();        for (Action action : actions) {            if (AbstractFrame.GLOBAL_SAVE_ACTION.equals(action.getValue(Action.DEFAULT)))                saveButton.setAction(action);        }    }    public void resetGlobalActions() {        saveButton.setAction(saveAction);    }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;I have here used javax.swing.Action for base class, since they contain all graphical properties such icon, label and tooltip. But also javax.swing.Action can be used for JButton and in JPopupMenu and JMenuItem. &lt;br /&gt;&lt;br /&gt;And I have also deliberately not created a abstract class for our action, which could have loaded our images, since I do not believe that such extra abstraction class will not bring any extra to our code nor reduce the number of lines. It will only make our client code more less understandable. But what would justify an extra abstraction layer is if abstract action class called the Controller in thread safe ways and change cursor to busy and in case of failure show a generic exception dialog. That would really bring something to our code, but not loading icons, using Action is quite straightforward and I like to see directly what my code does.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Handling Context Sensitive Global Actions&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So after realized that the toolbar is just another view, lets move onto how to make the toolbar context sensitive, i.e. when switching active panel/window the save actions is replaced with the active panel/window save action. But before we must first decide where the concrete Swing save action should be located. It clearly belong to the concrete view. Think again of separation of concern. But what we must do is to expose the global actions so we can send them to the toolbar view. And lastly where do we wire the views together? In the Controller of course.&lt;br /&gt;&lt;br /&gt;Let first add an extra method in our abstract view:&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[    public Action[] getGlobalActions() { return new Action[0]; }]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Then in our controller we wire the global actions from the view to the toolbar view. &lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[    public Action[] getGlobalActions() { return new Action[0]; }]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And in our toolbar view:&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[    public void preCreateDocument(Dossier dossier) {        // 1. do server logic        Document document = new Document();        document.setDossierId(dossier.getDossierId());        // 2. do swing response  getMainFrame().getView(ToolBarView.class).setGlobalActions(getMainFrame().getView(DocumentModelView.class).getGlobalActions());        getMainFrame().getView(DocumentModelView.class).setModel(document);        getMainFrame().getView(DossierTreeModelView.class).addDocumentNode(document);    }]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The last thing we need is to do is to switch back to the default when changing to other views. Here it can be justified to introduce some kind of View lifecycle mechanism, so the programmer does not have to concern about setting the correct toolbar action each time a new View is retrieved. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Managing a Statusbar&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After thinking the GUI as a composition of different views, it should not be surprising to think of the statusbar as yet another view as well. And where is the respond sent to update this view. In the Controller of course. Here is a simple example how to implement a statusbar with swinglabs JXStatusBar.&lt;br /&gt;&lt;br /&gt;se.msc.mvcframework.demo.view.StatusBarView&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.mvcframework.demo.view;import javax.swing.JLabel;import org.jdesktop.swingx.JXStatusBar;import se.msc.mvcframework.AbstractFrame;import se.msc.mvcframework.AbstractView;public class StatusBarView extends AbstractView&lt;jxstatusbar&gt; {    private JLabel statusLabel1;    private JLabel statusLabel2;    public StatusBarView(AbstractFrame mainFrame) {        super(mainFrame);    }    @Override    protected JXStatusBar layout() {        statusLabel1 = new JLabel("Ready1");        statusLabel2 = new JLabel("Ready2");        JXStatusBar statusBar = new JXStatusBar();        statusBar.add(new JLabel(), new JXStatusBar.Constraint(JXStatusBar.Constraint.ResizeBehavior.FILL));        statusBar.add(statusLabel1, new JXStatusBar.Constraint(100));        statusBar.add(statusLabel2, new JXStatusBar.Constraint(100));        return statusBar;    }    // ---------- Request Code Goes Here    // ---------- Response Code Goes Here    public void setStatusText1(String statusText1) {        statusLabel1.setText(statusText1);    }    public void setStatusText2(String statusText2) {        statusLabel2.setText(statusText2);    }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Managing Modular Popup Windows&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The modular popup windows is also yet another view. The only difference it needs a parent JFrame to show from. And the solution to that is simple. Each View has a reference to the AbstractFrame that holds the JFrame via getFrame().&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8577356988152513493?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8577356988152513493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8577356988152513493&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8577356988152513493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8577356988152513493'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2012/01/how-to-implement-mvc-model-view_31.html' title='How to implement MVC (Model View Controller) Pattern with Swing – Part 3'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-4068085930567176927</id><published>2012-01-23T10:37:00.001+01:00</published><updated>2012-01-23T10:38:46.795+01:00</updated><title type='text'>How to Merge PDF Files in Ubuntu</title><content type='html'>There are so many good web article that you would like to read and sometimes they even stretch over several web pages, but what if you are not online or like to concatenate several different article of your choosing? &lt;br /&gt;&lt;br /&gt;One way to do it, it to use the build in print to PDF file in Ubuntu. But what if there are several article? Then you probably want to merge these PDF files. In Ubuntu that is an easy task.&lt;br /&gt;&lt;br /&gt;First install pdftk:&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[sudo apt-get install pdftk]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Then type the following in the the directory where all the pdf files are:&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[pdftk 1.pdf 2.pdf 3.pdf cat output merged.pdf]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;For a complete reference see &lt;a href="http://ubuntuhowtos.com/howtos/merge_pdf_files" target="_blank"&gt;http://ubuntuhowtos.com/howtos/merge_pdf_files&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-4068085930567176927?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/4068085930567176927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=4068085930567176927&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4068085930567176927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4068085930567176927'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2012/01/how-to-merge-pdf-files-in-ubuntu.html' title='How to Merge PDF Files in Ubuntu'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-3270931025931931433</id><published>2012-01-23T09:14:00.001+01:00</published><updated>2012-01-23T09:15:09.040+01:00</updated><title type='text'>Putting Logic in finally is not Thread-safe</title><content type='html'>This is not a very good documented feature in Java. And if you search the web for when to use finally you will find numerous example of using finally for closing resources. And these are good example of when to use finally, but what they will not tell you is that the finally code will run in a separate thread with low priority. This means that if you put logic in your finally block this code will not be thread safe. No matter what you do to make it thread-safe. &lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[public synchronized void notThreadSafeMethod() {  try {    // some code go here  } catch (Exception e)    // DO NOT PUT LOGIC HERE, IT WILL NOT BE THREAD-SAFE  }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The same thing goes if you are depending on the state of the resource. For example if you are building a state machine that should change state whenever a resource is open or closed. And you are relying and whichever the resource is open or closed by calling the resource itself. This will not be thread-safe if you close the resource in a finally block.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-3270931025931931433?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/3270931025931931433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=3270931025931931433&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3270931025931931433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3270931025931931433'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2012/01/putting-logic-in-finally-is-not-thread.html' title='Putting Logic in finally is not Thread-safe'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-5457170187007467348</id><published>2012-01-21T14:36:00.004+01:00</published><updated>2012-01-31T01:41:23.288+01:00</updated><title type='text'>How to Make a Launcher (Shortcut) in the New Ubuntu 11.04 (Natty Narwhal) Dock.</title><content type='html'>I have been using Ubuntu for some time for writing Java code and for that I use Eclipse. You can install Eclipse via Ubuntu repository, but you probably don't wont to do that because the version in the Ubuntu repository is so old. And installation of Eclipse is so easy, simply download the tar archieve and decompress it to any folder of your liking and then duoble click the eclipse executable. &lt;br /&gt;&lt;br /&gt;But after that you probably want a Launcher in the Ubuntu dock? But how do you do that? There is a build in plus icon application for that, but in that program you you can only use installed program, not random program simply unzipped on your disk. &lt;br /&gt;&lt;br /&gt;So to make a arbitrary launcher:&lt;br /&gt;&lt;br /&gt;1. Right click on you desktop and select 'Create Launcher...'.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-NE44q4WyZs0/Txq-mHtzLMI/AAAAAAAAAHM/4Q5LziryGbI/s1600/Screenshot-Create+Launcher.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="168" src="http://2.bp.blogspot.com/-NE44q4WyZs0/Txq-mHtzLMI/AAAAAAAAAHM/4Q5LziryGbI/s320/Screenshot-Create+Launcher.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Type in Name, Command path and optional Comment.&lt;br /&gt;3. And finally click on the default icon and brows to your eclipse home folder and select &lt;span style="background-color: #cccccc; color: black;"&gt;icon.xpm&lt;/span&gt;.&lt;br /&gt;4. Then move the Launcher file to &lt;span style="background-color: #cccccc;"&gt;~/.local/share/applications&lt;/span&gt;.&lt;br /&gt;5. And finally drag the Layncher file from ~/.local/share/applications and drop it on the Ubuntu dock.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-5457170187007467348?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/5457170187007467348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=5457170187007467348&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/5457170187007467348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/5457170187007467348'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2012/01/how-to-make-launcher-shortcut-in-new.html' title='How to Make a Launcher (Shortcut) in the New Ubuntu 11.04 (Natty Narwhal) Dock.'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-NE44q4WyZs0/Txq-mHtzLMI/AAAAAAAAAHM/4Q5LziryGbI/s72-c/Screenshot-Create+Launcher.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-7348212311829781648</id><published>2012-01-20T21:09:00.000+01:00</published><updated>2012-01-20T21:09:13.773+01:00</updated><title type='text'>How to implement MVC (Model View Controller) Pattern with Swing – Part 2</title><content type='html'>In my previous blog I lay the ground of the definition of the MVC pattern and showed you have to implement it with Swing technology. I also defined a minimum set of classes that will help you to separate the client code into the MVC components – View, Controller and Model. &lt;br /&gt;In this blog I will implement a more complex Swing client to show you that the minimum set of framework classes still holds for upholding the separation of concern between the View, Controller and Model. And the MVC pattern really deliver a component based architecture. That is even if you decide to rearrange the views, that will not impose the previous written code of the views, you merely need to rewire the code in the controller. And maybe foremost the code will be clean and what I hope most, will be easy read and follow.&lt;br /&gt;&lt;br /&gt;But first lets repeat the responsibilities of each class in the MVC pattern&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td&gt;View&lt;/td&gt;    &lt;td&gt;&lt;br /&gt;Layout the Swing components.&lt;br /&gt;Sends user action request to the Controller.&lt;br /&gt;Updates the View from Controller responses.&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;Controller&lt;/td&gt;   &lt;td&gt;&lt;br /&gt;Do business logic.&lt;br /&gt;Sends responses to views.&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;    &lt;td&gt;Model&lt;/td&gt;    &lt;td&gt;A POJO.&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;And a few warnings:&lt;br /&gt;&lt;br /&gt;Don't do any logic in the Swing Action, e.g. open other dialogs or frames, call for update in other views. All these code will only destroy the maintainability of you application, because what it is breaking the law of seperation of concern. A specific View should not be aware and shoould not care what other Views are doing. What the View should do is merely pass the user action to the Controller and it is the job of the Controller to decide what to do with the request. &lt;br /&gt;&lt;br /&gt;For example. The Controller X recieves a request, does some logic, such as calling the Server Facade and recieves the responds. Call for update on View Y, Z and E and open a new dialog.&lt;br /&gt;&lt;br /&gt;By keeping the swing logic in the Controller and also keeping the Controller free from Swing code,   it will be easy to go back later to understand the logic and flow in the client, but also for other to read and finally to maintain. It will only be in one place you need to change your code if the working flow or logic changes.&lt;br /&gt;&lt;br /&gt;So now lets discuss the example. It is a internal frame solution, that only got one internal frame a dossier window. The dossier window contains document and present these structure in a tree. The detail of each tree node is shown in the same internal frame but in a detail panel. Here is a snapshot of the example.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-zo00VO2hutg/TxnInE1LeBI/AAAAAAAAAHE/tHYjsZohld4/s1600/Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="243" src="http://3.bp.blogspot.com/-zo00VO2hutg/TxnInE1LeBI/AAAAAAAAAHE/tHYjsZohld4/s320/Screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Lets start with Main class. &lt;br /&gt;1. It creates and saves all Views and Controllers in HashMap that the base class holds, so that all Views and Controller will be accessible through the entire client.&lt;br /&gt;2. Lay out the JFrame with a default view.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.mvcframework.demo.main;import static se.msc.mvcframework.ComponentFactory.frame;import javax.swing.JDesktopPane;import javax.swing.JFrame;import se.msc.mvcframework.AbstractFrame;import se.msc.mvcframework.InternalFrameView;import se.msc.mvcframework.demo.controller.DossierController;import se.msc.mvcframework.demo.view.DocumentFormView;import se.msc.mvcframework.demo.view.DossierFormView;import se.msc.mvcframework.demo.view.DossierTreeView;import se.msc.mvcframework.demo.view.DossierView;public class MainInternalFrame extends AbstractFrame {    private JDesktopPane desktopPane;    @Override    protected void registerAllViews() {        desktopPane = new JDesktopPane();        views.put(DossierFormView.class, new DossierFormView(this));        views.put(DocumentFormView.class, new DocumentFormView(this));        views.put(DossierTreeView.class, new DossierTreeView(this));        views.put(DossierView.class, new InternalFrameView&lt;dossierview&gt;(this, desktopPane, new DossierView(this)));    }    @Override    protected void registerAllControllers() {        controllers.put(DossierController.class, new DossierController(this));    }    @Override    protected JFrame layout() {        return frame("Demo MVC Framework", desktopPane, new ToolBarView(this).getContentPane());    }    public static void main(String[] args) {        javax.swing.SwingUtilities.invokeLater(new Runnable() {            public void run() {                new MainInternalFrame().show();            }        });    }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;We have two form views that have simply to to important methods that populates the view – getValues and setValues. &lt;br /&gt;&lt;br /&gt;Now for the Tree View. This View is more complex but only because Swing is so verbose. I will leave the detail of how to implement a modifiable tree you can download the source at the end of the blog or google. I will in upcoming blog present a better ways to decorate the existing swing components, to take a POJO Model and populate from that. And to hold that POJO Model, so you can later ask the swing component for a POJO Model instead of making tiring calling of get and set from the model to the swing component and vice versa. But showing you simplifying handling of swing components is out of the scoop of this blog. The import thing is to show you how to seperate the concern of the Views and Controllers and the interaction between them.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[    // ------------ Request Code Goes Here        @SuppressWarnings("unchecked")    private &lt;B&gt; BeanTreeNode&lt;B&gt; getSelectedNode(Class&lt;B&gt; nodeClass) {        return (tree.getSelectionPath() != null) ? (BeanTreeNode&lt;B&gt;) tree.getSelectionPath().getLastPathComponent() : null;    }        public class TreeMouseListener extends MouseAdapter {                @Override        public void mousePressed(MouseEvent e) {            BeanTreeNode&lt;Object&gt; node = getSelectedNode(Object.class);            if (node == null) return;                        if (e.isPopupTrigger()) documentPopupMenu.show((JComponent) e.getSource(), e.getX(), e.getY());        }                @Override        public void mouseReleased(MouseEvent e) {            BeanTreeNode&lt;Object&gt; node = getSelectedNode(Object.class);            if (node == null) return;                        if (e.isPopupTrigger()) documentPopupMenu.show((JComponent) e.getSource(), e.getX(), e.getY());        }                @Override        public void mouseClicked(MouseEvent e) {            BeanTreeNode&lt;Object&gt; node = getSelectedNode(Object.class);            if (node == null) return;            if (node.getBean() instanceof Dossier) getDossierController().retrieveDossier((Dossier) node.getBean());            if (node.getBean() instanceof Document) getDossierController().retrieveDocument((Document) node.getBean());        }    }    public class CreateDocument extends AbstractAction {        private static final long serialVersionUID = 1L;        public CreateDocument(String name) {            super(name);        }        @Override        public void actionPerformed(ActionEvent e) {            getDossierController().PreCreateDocument();        }    }    public class DeleteDocument extends AbstractAction {        private static final long serialVersionUID = 1L;        public DeleteDocument(String name) {            super(name);        }        @Override        public void actionPerformed(ActionEvent e) {            BeanTreeNode&lt;Object&gt; node = getSelectedNode(Object.class);            if (node.getBean() instanceof Document) getDossierController().DeleteDocument((Document) node.getBean());        }    }    // ------------ Response Code Goes Here        public void setDossier(Dossier dossier) {        dossierNode.setBean(dossier);    }    public void addDocumentNode(Document document) {        dossierNode.getBean().addDocument(document); // update views internal cache            BeanTreeNode&lt;Document&gt; documentNode = new BeanTreeNode&lt;Document&gt;(document, "Name", null);        dossierNode.add(documentNode);        treeModel.nodeStructureChanged(dossierNode);        tree.setSelectionPath(new TreePath(documentNode.getPath()));    }    public void updateDocumentNode(Document document) {        BeanTreeNode&lt;Document&gt; documentNode = getSelectedNode(Document.class);        documentNode.setBean(document);        treeModel.nodeStructureChanged(documentNode);        tree.setSelectionPath(new TreePath(documentNode.getPath()));    }    public void deleteDocumentNode(Document document) {        dossierNode.getBean().removeDocument(document); // update views internal cache        dossierNode.remove(getSelectedNode(Document.class));        treeModel.nodeStructureChanged(dossierNode);        tree.setSelectionPath(new TreePath(dossierNode.getPath()));    }]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;As you can see in the code above the the tree View does not do anything in theirs action, just merely call the correct Controller method.&lt;br /&gt;&lt;br /&gt;And now the Controller where we wire everything together.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.mvcframework.demo.controller;import java.util.Random;import java.util.UUID;import se.msc.mvcframework.AbstractController;import se.msc.mvcframework.AbstractFrame;import se.msc.mvcframework.demo.model.Document;import se.msc.mvcframework.demo.model.Dossier;import se.msc.mvcframework.demo.view.DocumentFormView;import se.msc.mvcframework.demo.view.DossierFormView;import se.msc.mvcframework.demo.view.DossierTreeView;import se.msc.mvcframework.demo.view.DossierView;public class DossierController extends AbstractController {    public DossierController(AbstractFrame mainFrame) {        super(mainFrame);    }    public void showDossierView() {        // 1. do server logic        Dossier dossier = new Dossier();        dossier.setDossierId(new Random().nextLong());        dossier.setDossierNumber(UUID.randomUUID().toString());        dossier.setTitle("My Dossier");        // 2. do swing response          getMainFrame().getInternalFrameView(DossierView.class).setTitle(dossier.getTitle());        getMainFrame().getView(DossierTreeView.class).setDossier(dossier);        getMainFrame().getInternalFrameView(DossierView.class).show();    }    public void retrieveDossier(Dossier dossier) {        // 1. do server logic        // 2. do swing response        getMainFrame().getView(DossierFormView.class).setValues(dossier);        getMainFrame().getInternalFrameView(DossierView.class).getView().showDossierFormView();    }        public void retrieveDocument(Document document) {        // 1. do server logic        // 2. do swing response        getMainFrame().getView(DocumentFormView.class).setValues(document);        getMainFrame().getInternalFrameView(DossierView.class).getView().showDocumentFormView();    }        public void PreCreateDocument() {        // 1. do server logic        Document document = new Document();        // 2. do swing response        getMainFrame().getView(DossierTreeView.class).addDocumentNode(document);        getMainFrame().getView(DocumentFormView.class).setValues(document);        getMainFrame().getInternalFrameView(DossierView.class).getView().showDocumentFormView();    }    public void cancelCreateDocument(Document document) {        // 1. do server logic        // 2. do swing response        getMainFrame().getView(DossierTreeView.class).deleteDocumentNode(document);        getMainFrame().getInternalFrameView(DossierView.class).getView().showDossierFormView();    }        public void CreateUpdateDocument(Document document) {        // 1. do server logic        if (document.getDocumentId() == null) {            document.setDocumentId(new Random().nextLong());            document.setDocumentNumber(UUID.randomUUID().toString());        }        // 2. do swing response                getMainFrame().getView(DocumentFormView.class).setValues(document);        getMainFrame().getView(DossierTreeView.class).updateDocumentNode(document);    }        public void DeleteDocument(Document document) {        // 1. do server logic        // 2. do swing response        getMainFrame().getView(DossierTreeView.class).deleteDocumentNode(document);        getMainFrame().getInternalFrameView(DossierView.class).getView().showDossierFormView();    }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;I hope by just reading the code in the Controller you will get the feeling what will happen. But the best part. Everything is type safe! You can click on the method and directly go the code!&lt;br /&gt;&lt;br /&gt;&lt;a href="https://docs.google.com/open?id=0BxdWn5V3EudmZjRkMWU4ZGYtZTNkNy00NjRmLTlkODgtMmQ2NmZlMmE2MjVm" target="_blank"&gt;Download the source.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-7348212311829781648?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/7348212311829781648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=7348212311829781648&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7348212311829781648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7348212311829781648'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2012/01/how-to-implement-mvc-model-view_20.html' title='How to implement MVC (Model View Controller) Pattern with Swing – Part 2'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-zo00VO2hutg/TxnInE1LeBI/AAAAAAAAAHE/tHYjsZohld4/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-4036374385615446594</id><published>2012-01-17T00:51:00.004+01:00</published><updated>2012-01-17T21:07:28.499+01:00</updated><title type='text'>How to implement MVC (Model View Controller) Pattern in Swing</title><content type='html'>The MVC pattern is the most common pattern when it comes to web framework, but when building a rich client with swing or by using a rich client framework such as, &lt;a href="http://wiki.eclipse.org/index.php/Rich_Client_Platform" target="_blank"&gt;Eclipse Rich Client Platform, Eclipse RCP&lt;/a&gt; , or &lt;a href="http://www.springsource.org/spring-rcp" target="_blank"&gt;Spring Rich Client Project, Spring RCP&lt;/a&gt; or trying to develop a similar platform yourself, thing tends to fast get very complicated. Why is that? Well, first Swing is very low tech. To do even the most simple thing requires quite a lot of lines of code. Another reason is that a lot of people have not taken their time to fully understand the MVC pattern. And maybe last there are a lot of misunderstanding what a view is in the MVC pattern and the Swing model. The Swing model is entire a presentation necessity and therefore only belong to the view.&lt;br /&gt;&lt;br /&gt;So hopefully what I will achieve in this blog is to explain the MVC pattern and how to implement it with Swing. What I will not do in this blog is to explain how to use certain Swing components, their are quite a few tutorials out there, e.g. Oracle own Swing Tutorial, &lt;a href="http://docs.oracle.com/javase/tutorial/uiswing/" target="_blank"&gt;http://docs.oracle.com/javase/tutorial/uiswing/&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Last start with explaining the MVC pattern fundamental. Maybe the easiest way to explain MVC is to look at how things work in the web world.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-LMsl67o_ROE/TxSzUNxqcCI/AAAAAAAAAG4/Jn4eoaFqHBI/s1600/MVC.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="218" src="http://3.bp.blogspot.com/-LMsl67o_ROE/TxSzUNxqcCI/AAAAAAAAAG4/Jn4eoaFqHBI/s320/MVC.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;What happens:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The &lt;b&gt;View&lt;/b&gt; builds the graphical interface and reacts to user interaction, by redirecting the request to the Controller.&lt;/li&gt;&lt;li&gt;The &lt;b&gt;Controller&lt;/b&gt; respond to the request, do logic and sends response to a view.&lt;/li&gt;&lt;li&gt;The &lt;b&gt;View&lt;/b&gt; takes these parameters and presents them in a view to the user.&lt;/li&gt;&lt;/ol&gt;And as you already might have guessed the above request and response parameters is the &lt;b&gt;Model&lt;/b&gt; in the MVC pattern.&lt;br /&gt;&lt;br /&gt;Before continue I would like to stress a few things extra hard:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;All graphical components are created and layed out in the view. Nowhere else!&lt;/li&gt;&lt;li&gt;The Controller is neutral to whatever graphical user interface technique used! A simple control question is. Think that you must change graphical technique, from example Swing to SVT. Will you controller classes be affected? This question might feel quite theoretical but is a good eye opener if you have successfully separated the view concern from the controller concern.&lt;/li&gt;&lt;li&gt;The Model should also be plain old Java object, POJO, and not infected with presentation specific codes. And again check that by asking yourself if you were forced to change presentation technique. How would that affect your model classes?&lt;/li&gt;&lt;/ul&gt;And a final reminder about the model in the MVC pattern and the model in Swing. The Swing model should not be confused with the model in the MVC pattern. The Swing model is entirely part of the choosen presentation technique, i.e. Swing and belongs only in the view and should not be mixed with the model in the MVC pattern. &lt;br /&gt;&lt;br /&gt;The last thing before diving into concrete code is the concern of &lt;b&gt;Object Instances Lifecycle&lt;/b&gt;. Now you might start to wonder what that has to do with MVC. And the question is none, but the problem is still real and I think one must adress this with some thinking and strategy, because it is so vital to the application and programmers daily life. And not to mention testability. Which is something I will not go into any deeper in this blog, but I can recommned the FEST test framework. Anyhow which Swing test framework you choose you must before have a clear lifecycle handle of object in your rich client. Otherwise you will end up with untestable code.&lt;br /&gt;&lt;br /&gt;So lest start with the &lt;b&gt;View&lt;/b&gt;. What does a view do?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Layout the graphical components.&lt;/li&gt;&lt;li&gt;Responds to user interaction (and sends the request to the Controller).&lt;/li&gt;&lt;li&gt;Updates the view (requested from the Controller).&lt;/li&gt;&lt;/ol&gt;Lets starts with the layout. &lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.examples.mvcframework;import javax.swing.JComponent;public abstract class AbstractView&lt;c extends JComponent&gt; {    private final AbstractFrame mainFrame;    private final C contentPane;    public AbstractView(AbstractFrame mainFrame) {        this.mainFrame = mainFrame;        this.contentPane = layout();    }    protected abstract C layout();    protected AbstractFrame getMainFrame() {        return mainFrame;    }    public C getContentPane() {        return contentPane;    }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.examples.demo.view;import static se.msc.examples.mvcframework.ComponentFactory.button;import static se.msc.examples.mvcframework.ComponentFactory.buttons;import static se.msc.examples.mvcframework.ComponentFactory.panel;import static se.msc.examples.mvcframework.ComponentFactory.table;import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import se.msc.examples.demo.controller.PersonController;import se.msc.examples.demo.model.Person;import se.msc.examples.mvcframework.AbstractFrame;import se.msc.examples.mvcframework.AbstractView;import se.msc.examples.mvcframework.BeanTableModel;public class PersonListView extends AbstractView&lt;jpanel&gt; {    private BeanTableModel&lt;person&gt; tableModel;    private JTable table;    public PersonListView(AbstractFrame mainFrame) {        super(mainFrame);    }    @Override    protected JPanel layout() {        tableModel = new BeanTableModel&lt;person&gt;(Person.class, new String[] { "Id", "Created", "Name" });        table = table(tableModel);        JPanel panel = panel(new BorderLayout(), null);        panel.add(new JScrollPane(table), BorderLayout.CENTER);        panel.add(buttons(button("Create", new CreatePerson()), button("Retrieve", new RetrievePerson()), button("Delete", new DeletePerson())), BorderLayout.SOUTH);        return panel;    }    // ------------ Request Code Goes Here    // ------------ Response Code Goes Here        // ------------ Test Code Goes Here            public static void main(String[] args) {        javax.swing.SwingUtilities.invokeLater(new Runnable() {            @Override            public void run() {                showFrame(frame("PersonListView", new PersonListView(null).getContentPane(), null));            }        });    }   }]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Try not to bother about the static component methods, such as frame, etc. they are all methods in a ComponentFactory that do all the Swing plumbing construction. I will later show them in the Appendix.&lt;br /&gt;&lt;br /&gt;But our application will certaintly contains several views, so lets we refactor out the main method in a class thats holds the JFrame instance. What we also will do in our frame class is to solve the problem of object lifecycle and dependencies to those. We will create a map that hold all the views and another that holds the controllers. And finally we will inject the instance of the main frame to all views and controllers. In this way, we will have only one instance of all the views and controllers, but also they will be accessable everywhere. &lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.examples.mvcframework;import static se.msc.examples.mvcframework.ComponentFactory.showFrame;import java.util.HashMap;import java.util.Map;import javax.swing.JComponent;import javax.swing.JFrame;import javax.swing.JPanel;public abstract class AbstractFrame {    protected final JFrame frame;    protected final Map&lt;Class&lt;? extends AbstractView&lt;? extends JComponent&gt;&gt;, AbstractView&lt;? extends JComponent&gt;&gt; views = new HashMap&lt;Class&lt;? extends AbstractView&lt;? extends JComponent&gt;&gt;, AbstractView&lt;? extends JComponent&gt;&gt;();    protected final Map&lt;Class&lt;? extends AbstractController&gt;, AbstractController&gt; controllers = new HashMap&lt;Class&lt;? extends AbstractController&gt;, AbstractController&gt;();    public AbstractFrame() {        registerAllViews();        registerAllControllers();        this.frame = layout();    }    protected abstract void registerAllViews();    protected abstract void registerAllControllers();    protected abstract JFrame layout();    protected void show() {        showFrame(frame);    }    @SuppressWarnings("unchecked")    public &lt;v extends AbstractView&lt;? extends JComponent&gt;&gt; V getView(Class&lt;v&gt; viewClass) {        return (V) views.get(viewClass);    }    @SuppressWarnings("unchecked")    public &lt;v extends AbstractView&lt;JPanel&gt;&gt; InternalFrameView&lt;v&gt; getInternalFrameView(Class&lt;v&gt; viewClass) {        return (InternalFrameView&lt;v&gt;) views.get(viewClass);    }    @SuppressWarnings("unchecked")    public &lt;c extends AbstractController&gt; C getController(Class&lt;c&gt; controllerClass) {        return (C) controllers.get(controllerClass);    }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.examples.demo.main;import static se.msc.examples.mvcframework.ComponentFactory.frame;import javax.swing.JFrame;import se.msc.examples.demo.controller.PersonController;import se.msc.examples.demo.view.PersonFormView;import se.msc.examples.demo.view.PersonListView;import se.msc.examples.mvcframework.AbstractFrame;public class MainFrame extends AbstractFrame {    @Override    protected void registerAllViews() {        views.put(PersonListView.class, new PersonListView(this));    }    @Override    protected void registerAllControllers() {        controllers.put(PersonController.class, new PersonController(this));    }    @Override    protected JFrame layout() {        return frame("Demo MVC Framework", getView(PersonFormView.class).getContentPane(), null);    }    public static void main(String[] args) {        javax.swing.SwingUtilities.invokeLater(new Runnable() {            @Override            public void run() {                new MainFrame().show();            }        });    }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now lets get back to the View and add code for the user interaction request.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.examples.demo.view;import static se.msc.examples.mvcframework.ComponentFactory.button;import static se.msc.examples.mvcframework.ComponentFactory.buttons;import static se.msc.examples.mvcframework.ComponentFactory.frame;import static se.msc.examples.mvcframework.ComponentFactory.panel;import static se.msc.examples.mvcframework.ComponentFactory.showFrame;import static se.msc.examples.mvcframework.ComponentFactory.table;import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import se.msc.examples.demo.controller.PersonController;import se.msc.examples.demo.model.Person;import se.msc.examples.mvcframework.AbstractFrame;import se.msc.examples.mvcframework.AbstractView;import se.msc.examples.mvcframework.BeanTableModel;public class PersonListView extends AbstractView&lt;jpanel&gt; {    private BeanTableModel&lt;person&gt; tableModel;    private JTable table;    public PersonListView(AbstractFrame mainFrame) {        super(mainFrame);    }    @Override    protected JPanel layout() {        tableModel = new BeanTableModel&lt;person&gt;(Person.class, new String[] { "Id", "Created", "Name" });        table = table(tableModel);        JPanel panel = panel(new BorderLayout(), null);        panel.add(new JScrollPane(table), BorderLayout.CENTER);        panel.add(buttons(button("Create", new CreatePerson()), button("Retrieve", new RetrievePerson()), button("Delete", new DeletePerson())), BorderLayout.SOUTH);        return panel;    }    // ------------ Request Code Goes Here    private class CreatePerson implements ActionListener {        @Override        public void actionPerformed(ActionEvent e) {            getMainFrame().getController(PersonController.class).preCreatePerson();        }    }    private class RetrievePerson implements ActionListener {        @Override        public void actionPerformed(ActionEvent e) {            Person person = tableModel.getBean(table.getSelectedRow());            getMainFrame().getController(PersonController.class).retrievePerson(person);        }    }    private class DeletePerson implements ActionListener {        @Override        public void actionPerformed(ActionEvent e) {            Person person = tableModel.getBean(table.getSelectedRow());            getMainFrame().getController(PersonController.class).deletePerson(person);        }    }    // ------------ Response Code Goes Here    public void addPerson(Person person) {        tableModel.insert(person);    }    public void updatePerson(Person person) {        tableModel.setBean(table.getSelectedRow(), person);    }    public void deletePerson() {        tableModel.remove(table.getSelectedRow());    }        // ------------ Test Code Goes Here            public static void main(String[] args) {        javax.swing.SwingUtilities.invokeLater(new Runnable() {            @Override            public void run() {                showFrame(frame("PersonListView", new PersonListView(null).getContentPane(), null));            }        });    }    }]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;As you can see, it is easy to get instance references to the controller class, but the controller is also used in a type safe way. This approach have several advances compared with external configuration files where you wire views and controllers together through weak string references. What will happen if decide to refactor and change a controller method name? &lt;br /&gt;&lt;br /&gt;The view can in the same manner be accessed in the same type safe way. To need for external configuration files, such as XML files.&lt;br /&gt;&lt;br /&gt;So this is the basic of MVC. Now look if this holds for more complex GUI. Lets say we want to make a desktop application. Well the layout stays the same, but we need to put theirs panel in internal frame. We could do that in the view, but what happens if requirement changes and these views wants to put in a tabbed panel instead. No lets leave the views intact and instead lets created a decorating view that takes a view of panel as argument. &lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.examples.mvcframework;import static se.msc.examples.mvcframework.ComponentFactory.internalFrame;import javax.swing.JDesktopPane;import javax.swing.JInternalFrame;import javax.swing.JPanel;public class InternalFrameView&lt;v extends AbstractView&lt;JPanel&gt;&gt; extends AbstractView&lt;jinternalframe&gt; {    private final JDesktopPane desktopPane;    private final V view;    private final JInternalFrame internalFrame;    public InternalFrameView(AbstractFrame mainFrame, JDesktopPane desktopPane, V view) {        super(mainFrame);        this.desktopPane = desktopPane;        this.view = view;        this.internalFrame = internalFrame(view.getContentPane(), view.getClass().getSimpleName());    }    @Override    protected JInternalFrame layout() {        return internalFrame;    }    // ------------ Request Code Goes Here    // ------------ Response Code Goes Here    public V getView() {        return view;    }    public void show() {        desktopPane.add(internalFrame);        internalFrame.pack();        internalFrame.setVisible(true);        try {            internalFrame.setSelected(true);        } catch (java.beans.PropertyVetoException e) {        }    }    public void close() {        internalFrame.dispose();        desktopPane.remove(internalFrame);    }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Then we need to modify our main frame class.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.examples.demo.main;import static se.msc.examples.mvcframework.ComponentFactory.frame;import javax.swing.JDesktopPane;import javax.swing.JFrame;import se.msc.examples.demo.controller.PersonController;import se.msc.examples.demo.view.PersonFormView;import se.msc.examples.demo.view.PersonListView;import se.msc.examples.demo.view.PersonTreeView;import se.msc.examples.mvcframework.AbstractFrame;import se.msc.examples.mvcframework.InternalFrameView;public class MainInternalFrame extends AbstractFrame {    private JDesktopPane desktopPane;    @Override    protected void registerAllViews() {        desktopPane = new JDesktopPane();        views.put(PersonListView.class, new InternalFrameView&lt;personlistview&gt;(this, desktopPane, new PersonListView(this)));        views.put(PersonFormView.class, new InternalFrameView&lt;personformview&gt;(this, desktopPane, new PersonFormView(this)));    }    @Override    protected void registerAllControllers() {        controllers.put(PersonController.class, new PersonController(this));    }    @Override    protected JFrame layout() {        return frame("Demo MVC Framework", desktopPane, new ToolBarView(this).getContentPane());    }    public static void main(String[] args) {        javax.swing.SwingUtilities.invokeLater(new Runnable() {            public void run() {                new MainInternalFrame().show();            }        });    }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.examples.demo.view;import static se.msc.examples.mvcframework.ComponentFactory.button;import static se.msc.examples.mvcframework.ComponentFactory.buttons;import static se.msc.examples.mvcframework.ComponentFactory.frame;import static se.msc.examples.mvcframework.ComponentFactory.panel;import static se.msc.examples.mvcframework.ComponentFactory.showFrame;import static se.msc.examples.mvcframework.ComponentFactory.table;import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import se.msc.examples.demo.controller.PersonController;import se.msc.examples.demo.model.Person;import se.msc.examples.mvcframework.AbstractFrame;import se.msc.examples.mvcframework.AbstractView;import se.msc.examples.mvcframework.BeanTableModel;public class PersonListView extends AbstractView&lt;jpanel&gt; {    private BeanTableModel&lt;person&gt; tableModel;    private JTable table;    public PersonListView(AbstractFrame mainFrame) {        super(mainFrame);    }    @Override    protected JPanel layout() {        tableModel = new BeanTableModel&lt;person&gt;(Person.class, new String[] { "Id", "Created", "Name" });        table = table(tableModel);        JPanel panel = panel(new BorderLayout(), null);        panel.add(new JScrollPane(table), BorderLayout.CENTER);        panel.add(buttons(button("Create", new CreatePerson()), button("Retrieve", new RetrievePerson()), button("Delete", new DeletePerson())), BorderLayout.SOUTH);        return panel;    }    // ------------ Request Code Goes Here    private class CreatePerson implements ActionListener {        @Override        public void actionPerformed(ActionEvent e) {            getMainFrame().getController(PersonController.class).preCreatePerson();        }    }    private class RetrievePerson implements ActionListener {        @Override        public void actionPerformed(ActionEvent e) {            Person person = tableModel.getBean(table.getSelectedRow());            getMainFrame().getController(PersonController.class).retrievePerson(person);        }    }    private class DeletePerson implements ActionListener {        @Override        public void actionPerformed(ActionEvent e) {            Person person = tableModel.getBean(table.getSelectedRow());            getMainFrame().getController(PersonController.class).deletePerson(person);        }    }    // ------------ Response Code Goes Here    public void addPerson(Person person) {        tableModel.insert(person);    }    public void updatePerson(Person person) {        tableModel.setBean(table.getSelectedRow(), person);    }    public void deletePerson() {        tableModel.remove(table.getSelectedRow());    }        // ------------ Test Code Goes Here            public static void main(String[] args) {        javax.swing.SwingUtilities.invokeLater(new Runnable() {            @Override            public void run() {                showFrame(frame("PersonListView", new PersonListView(null).getContentPane(), null));            }        });    }    }]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.examples.demo.view;import static se.msc.examples.mvcframework.ComponentFactory.button;import static se.msc.examples.mvcframework.ComponentFactory.frame;import static se.msc.examples.mvcframework.ComponentFactory.label;import static se.msc.examples.mvcframework.ComponentFactory.showFrame;import static se.msc.examples.mvcframework.ComponentFactory.textField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.text.SimpleDateFormat;import javax.swing.JPanel;import javax.swing.JTextField;import se.msc.examples.demo.controller.PersonController;import se.msc.examples.demo.model.Person;import se.msc.examples.mvcframework.AbstractFrame;import se.msc.examples.mvcframework.AbstractView;import com.jgoodies.forms.builder.PanelBuilder;import com.jgoodies.forms.factories.ButtonBarFactory;import com.jgoodies.forms.layout.CellConstraints;import com.jgoodies.forms.layout.FormLayout;public class PersonFormView extends AbstractView&lt;jpanel&gt; {    private JTextField id;    private JTextField created;    private JTextField name;    private Person person;    public PersonFormView(AbstractFrame mainFrame) {        super(mainFrame);    }    // ------------ Request Code Goes Here    @Override    protected JPanel layout() {        FormLayout formLayout = new FormLayout("right:pref, 2dlu, pref:grow", // columns                "pref, 3dlu, pref, 3dlu, pref, 3dlu, pref"); // rows        PanelBuilder builder = new PanelBuilder(formLayout);        builder.setDefaultDialogBorder();        CellConstraints cc = new CellConstraints();        builder.add(label("Id:", null), cc.xy(1, 1));        builder.add(id = textField(10, false), cc.xy(3, 1));        builder.add(label("Created:", null), cc.xy(1, 3));        builder.add(created = textField(10, false), cc.xy(3, 3));        builder.add(label("Name:", null), cc.xy(1, 5));        builder.add(name = textField(10, true), cc.xy(3, 5));        JPanel pnlSaveCancelButtons = ButtonBarFactory.buildOKCancelBar(button("Save", new Save()), button("Cancel", new Cancel()));        builder.add(pnlSaveCancelButtons, cc.xy(3, 7, "left, center"));        return builder.getPanel();    }    private class Cancel implements ActionListener {        @Override        public void actionPerformed(ActionEvent e) {            getMainFrame().getController(PersonController.class).cancelCreatePerson();        }    }    private class Save implements ActionListener {        @Override        public void actionPerformed(ActionEvent e) {            getMainFrame().getController(PersonController.class).savePerson(getValues());        }    }    // ------------ Response Code Goes Here    public Person getValues() {        person.setName(name.getText());        return person;    }    public void setValues(Person person) {        this.person = person;        if (person.getId() != null) id.setText(new String(person.getId()));        else id.setText("");        if (person.getCreated() != null) created.setText(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(person.getCreated()));        else created.setText("");        if (person.getName() != null) name.setText(new String(person.getName()));        else name.setText("");    }    // ------------ Test Code Goes Here    public static void main(String[] args) {        javax.swing.SwingUtilities.invokeLater(new Runnable() {            @Override            public void run() {                showFrame(frame("PersonFormView", new PersonFormView(null).getContentPane(), null));            }        });    }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.examples.demo.controller;import java.util.Date;import java.util.UUID;import se.msc.examples.demo.model.Person;import se.msc.examples.demo.view.PersonFormView;import se.msc.examples.demo.view.PersonListView;import se.msc.examples.mvcframework.AbstractController;import se.msc.examples.mvcframework.AbstractFrame;public class PersonController extends AbstractController {    public PersonController(AbstractFrame mainFrame) {        super(mainFrame);    }    public void savePerson(Person person) {        if (person.getId() == null) postCreatePerson(person);        else updatePerson(person);    }    // ------------ CRUD Code Goes Here    public void preCreatePerson() {        // 1. do server logic        Person person = new Person();        // 2. do swing response        getMainFrame().getInternalFrameView(PersonFormView.class).getView().setValues(person);        getMainFrame().getInternalFrameView(PersonFormView.class).show();    }    private void postCreatePerson(Person person) {        // 1. do server logic        person.setId(UUID.randomUUID().toString());        person.setCreated(new Date());        // 2. do swing response        getMainFrame().getInternalFrameView(PersonFormView.class).close();        getMainFrame().getInternalFrameView(PersonListView.class).getView().addPerson(person);    }    public void cancelCreatePerson() {        getMainFrame().getInternalFrameView(PersonFormView.class).close();    }    public void retrievePerson(Person person) {        // 1. do server logic        // 2. do swing response        getMainFrame().getInternalFrameView(PersonFormView.class).getView().setValues(person);        getMainFrame().getInternalFrameView(PersonFormView.class).show();    }    private void updatePerson(Person person) {        // 1. do server logic        // 2. do swing response        getMainFrame().getInternalFrameView(PersonFormView.class).close();        getMainFrame().getInternalFrameView(PersonListView.class).getView().updatePerson(person);    }    public void deletePerson(Person person) {        // 1. do server logic        // 2. do swing response        getMainFrame().getInternalFrameView(PersonListView.class).getView().deletePerson();    }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Conclusion&lt;br /&gt;MVC greatly reducing the coupling between seperated classes, but doing right is not always easy.&lt;br /&gt;&lt;br /&gt;The complete source code can be &lt;a href="https://docs.google.com/open?id=0BxdWn5V3EudmMzc4ZWE5OTItYTJiNy00MzM4LWFlNjItYzkwMDA3OTExZTA2" target="_blank"&gt;downloaded here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-4036374385615446594?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/4036374385615446594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=4036374385615446594&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4036374385615446594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4036374385615446594'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2012/01/how-to-implement-mvc-model-view.html' title='How to implement MVC (Model View Controller) Pattern in Swing'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-LMsl67o_ROE/TxSzUNxqcCI/AAAAAAAAAG4/Jn4eoaFqHBI/s72-c/MVC.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8214624321342197795</id><published>2011-11-22T22:28:00.003+01:00</published><updated>2011-11-22T22:30:59.490+01:00</updated><title type='text'>How to Install Swedish BankID on Ubuntu 11.10 64-bits</title><content type='html'>First download the Swedish BankID program from &lt;a href="https://install.bankid.com/" target="_blank"&gt;https://install.bankid.com/&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Unzip the file.&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[tar -xvf BISP-&lt;version&gt;.tar.gz&lt;/version&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;Install BankID&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[cd BISP-&lt;version&gt;&lt;/version&gt;sudo ./install.&lt;version&gt;.sh -i&lt;/version&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;The last part is only for 64-bit OS and that is to simulate your 32-bit Firefox pluging to run on your 64-bit OS. To do that you need the ia32-libs and nspluginwrapper packages. On a clean installed computer they are not installed.&lt;br /&gt;&lt;br /&gt;To install them &lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[sudo apt-get install ia32-libs nspluginwrapper]]&gt;&lt;/script&gt;&lt;br /&gt;Then install the BankID plugin in Firefox.&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[sudo nspluginwrapper -i /usr/local/lib/personal/libplugins.so]]&gt;&lt;/script&gt;&lt;br /&gt;Now restart Firefox and test your plugin via &lt;a href="https://install.bankid.com/" target="_blank"&gt;https://install.bankid.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To read more in depth of the installation, see &lt;a href="http://ubuntu-se.org/wiki/NexusPersonal" target="_blank"&gt;http://ubuntu-se.org/wiki/NexusPersonal&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8214624321342197795?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8214624321342197795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8214624321342197795&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8214624321342197795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8214624321342197795'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2011/11/how-to-install-swedish-bankid-on-ubuntu.html' title='How to Install Swedish BankID on Ubuntu 11.10 64-bits'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-6303324445011383339</id><published>2011-11-21T23:20:00.000+01:00</published><updated>2011-11-21T23:20:23.360+01:00</updated><title type='text'>Can Programmers Learn Something from Industrial Design?</title><content type='html'>Another interest of mine is design and art. Which I will not write more about on this technical blog, but I recently got aquinted with the designer Dieter Rams (&lt;a href="http://en.wikipedia.org/wiki/Dieter_Rams" target="_blank"&gt;http://en.wikipedia.org/wiki/Dieter_Rams&lt;/a&gt;) who is interesting in many ways, but one thing that I think is of interest to share on this blog is his famous:&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Ten Principles for Good Desing&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. Good design is innovative.&lt;br /&gt;&lt;br /&gt;2. Good design makes a product useful.&lt;br /&gt;&lt;br /&gt;3. Good design is aesthetic.&lt;br /&gt;&lt;br /&gt;4. Good desing makes a product understandable.&lt;br /&gt;&lt;br /&gt;5. Good design is unobtrusive.&lt;br /&gt;&lt;br /&gt;6. Good design is honest.&lt;br /&gt;&lt;br /&gt;7. Good design is long-lasting.&lt;br /&gt;&lt;br /&gt;8. Good desing is thorough, down to the last detail.&lt;br /&gt;&lt;br /&gt;9. Good design is environmentally-friendly.&lt;br /&gt;&lt;br /&gt;10. Good design is as little design as possible.&lt;br /&gt;&lt;br /&gt;Where my favourite is the last ”Good design is as little design as possible.”. Like James Bond would have said it ”Less is more.” Or maybe as a programmers would have put it ”KISS”.&lt;br /&gt;&lt;br /&gt;You can read more of these principles here &lt;a href="http://www.vitsoe.com/en/gb/about/dieterrams/gooddesign" target="_blank"&gt;http://www.vitsoe.com/en/gb/about/dieterrams/gooddesign&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-6303324445011383339?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/6303324445011383339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=6303324445011383339&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6303324445011383339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6303324445011383339'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2011/11/can-programmers-learn-something-from.html' title='Can Programmers Learn Something from Industrial Design?'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8210394685901653050</id><published>2011-11-21T22:55:00.000+01:00</published><updated>2011-11-21T22:55:43.587+01:00</updated><title type='text'>Is Oracle Making any Progress with Pushing Java Forword?</title><content type='html'>Well in one sense, Oracle have managed to release a new Java version 7, but there are still some differences to solve to make the work go faster and smother.&lt;br /&gt;&lt;br /&gt;Read more about the Java 7 ballot &lt;br /&gt;&lt;a href="http://jcp.org/en/jsr/results?id=5111" target="_blank"&gt;http://jcp.org/en/jsr/results?id=5111&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and for the Java 8 ballot release.&lt;br /&gt;&lt;a href="http://jcp.org/en/jsr/results?id=5112" target="_blank"&gt;http://jcp.org/en/jsr/results?id=5112&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One can clearly see that the fighting of lawyers are still going on for the license of Java. I hope they solve it and comes to an agrement so that the evolving of Java progresses faster, than it has since Java 5.&lt;br /&gt;&lt;br /&gt;For history of previous Java releases, please read &lt;br /&gt;&lt;a href="http://magnus-k-karlsson.blogspot.com/2010/10/jaoo-day-4-java-future-at-oracle.html" target="_blank"&gt;http://magnus-k-karlsson.blogspot.com/2010/10/jaoo-day-4-java-future-at-oracle.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8210394685901653050?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8210394685901653050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8210394685901653050&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8210394685901653050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8210394685901653050'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2011/11/is-oracle-making-any-progress-with.html' title='Is Oracle Making any Progress with Pushing Java Forword?'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-6352458369116814675</id><published>2011-11-21T22:34:00.000+01:00</published><updated>2011-11-21T22:34:50.886+01:00</updated><title type='text'>How to Disable the Overlay Scrollbar in Ubuntu 11.01 and 11.10</title><content type='html'>How to Disable the Overlay Scrollbar in Ubuntu 11.01 and 11.10&lt;br /&gt;&lt;br /&gt;I like the new look of Unity, but there is one thing that keeps bugging me and that is the new Overlay Scrollbar. To remove it, do the following from the Terminal.&lt;br /&gt;&lt;br /&gt;First you need to become root&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[sudo su]]&gt;&lt;/script&gt;&lt;br /&gt;Then export the following setting:&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[echo export LIBOVERLAY_SCROLLBAR=0 &gt; /etc/X11/Xsession.d/80overlayscrollbars]]&gt;&lt;/script&gt;&lt;br /&gt;Last reboot and voilà the classical scrollbar is back.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-6352458369116814675?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/6352458369116814675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=6352458369116814675&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6352458369116814675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6352458369116814675'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2011/11/how-to-disable-overlay-scrollbar-in.html' title='How to Disable the Overlay Scrollbar in Ubuntu 11.01 and 11.10'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-7233873765354015192</id><published>2011-02-28T04:36:00.004+01:00</published><updated>2011-02-28T05:12:20.715+01:00</updated><title type='text'>Java Bug hangs the JVM</title><content type='html'>I'm not sure about publishing bugs, but I guess it's already out there and there is also a patch available. The problem is in java.lang.Double and the handling of maximum doouble value, i.e. 2.2250738585072012e-308. The following code will send the older JVM to an infinitive loop.&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[Double.parseDouble(2.2250738585072012e-308)]]&gt;&lt;/script&gt;&lt;br /&gt;Ok, but is this really a problem? Yes, it is for Java server connected to Internet. Let's imagine a Bank Server written in Java and exposed/available from the Internet. And you can be quite certain there will some fields taking double as input. These html fields are all Strings, but when processing at the server they are parsed to Double. And this is a typical exploit scenario a hacker can use for hanging the server/DoS attack.&lt;br /&gt;&lt;br /&gt;The solution is either patching your current JVM version or upgrading to the latest JVM, i.e. Java 6 Update 24.&lt;br /&gt;&lt;a href="http://www.blogger.com/goog_199321715"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.oracle.com/security/2011/02/security_alert_for_cve-2010-44.html" target="_blank"&gt;http://blogs.oracle.com/security/2011/02/security_alert_for_cve-2010-44.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This bug is foremost for server application, since desktop application can always be restarted, but if you want to upgrade your desktop java version, please go to &lt;a href="http://java.com/" target="_blank"&gt;http://java.com/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-7233873765354015192?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/7233873765354015192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=7233873765354015192&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7233873765354015192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7233873765354015192'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2011/02/java-bugs-hangs-jvm.html' title='Java Bug hangs the JVM'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-7335099107315648515</id><published>2011-02-23T09:59:00.048+01:00</published><updated>2011-02-23T12:41:12.260+01:00</updated><title type='text'>Best Practice Aspect-Oriented Programming with JBoss AOP</title><content type='html'>In my recent project I have been working with JBoss AOP. There have been some pitfalls, I have fallen into and in this blog I will share those you.&lt;br /&gt;&lt;br /&gt;First of all. Do not choose aspect-oriented programming to solve everyday Java problems. Example of good cases are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Logging&lt;/li&gt;&lt;li&gt;Caching &lt;/li&gt;&lt;li&gt;Security&lt;/li&gt;&lt;li&gt;Error Handling&lt;/li&gt;&lt;/ul&gt;But why does AOP does not suites to solve common Java problem? Lets look at an example with Spring and AspectJ. &lt;br /&gt;&lt;br /&gt;The Logic class:&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[public class FooPojo { public void setFoo(Object inparam) { /* logic goes here... */ } }&lt;/script&gt;The Aspect class:&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[@Aspect public class FooAspect {    @Before("execution(void set*(*))") public void handle() { /* logic goes here... */ }}&lt;/script&gt;Boilerplate XML configuration files&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;beans&gt;    &lt;aop:aspectj-autoproxy&gt;        &lt;aop:include name="fooAspect" /&gt;    &lt;/aop:aspectj-autoproxy&gt;    &lt;bean id="fooAspect" class="se.msc.example.aop.FooAspect" /&gt;&lt;/beans&gt;&lt;beans&gt;    &lt;import resource= "aspects-config.xml"/&gt;    &lt;bean name="foo" class="se.msc.example.aop.FooPojo" /&gt;&lt;/beans&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And now call it&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[((FooPojo) new ClassPathXmlApplicationContext(“application-config.xml”).getBean(“foo”)).setFoo(null);&lt;/script&gt;The problem with the code above, is that in FooPojo there is no hint at all, that other code will be called. This can be very confusing for a junior programmer and also to a much more skilled programmer that is not familiar with AOP.So how to make AOP more clearer and more understandable?The answer is to look at other framework and how they have solved it. Take for example Spring. They use AOP very heavily under the hood, to solve common tasks as marking classes as transactional (@Transactional). And in J2EE, Oracle uses also Annotation, e.g. in JAX-WS they have the method Annotation @WebMethod, to signal that a method is a Web Service method.So lets copy that pattern, to write your own Annotation, as marker in the code that you want to apply apsect-oriented programming to.Our own Annotation, to trigger Aspect: &lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.aop;import static java.lang.annotation.ElementType.METHOD;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * Cache Annotation. *  * @author &lt;a href="mailto:magnus.k.karlsson@msc.se"&gt;Magnus K Karlsson&lt;/a&gt; */@Retention(RetentionPolicy.RUNTIME)@Target({ METHOD })public @interface Cache { String attribute() default "";    // String value() default ""; if attribute name is 'value', you do not need to specify it }&lt;/script&gt;&lt;br /&gt;Our Aspect. Here we use interface implementation. This solution works on JBoss 4.3.0 - 5.1.0:&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.aop;import java.lang.annotation.Annotation;import java.util.concurrent.ConcurrentHashMap;import org.apache.log4j.Logger;import org.jboss.aop.advice.Interceptor;import org.jboss.aop.joinpoint.Invocation;import org.jboss.aop.joinpoint.MethodInvocation;/** * Cache interceptor demo. See also jboss-aop.xml.  *  * @author &lt;a href="mailto:magnus.k.karlsson@msc.se"&gt;Magnus K Karlsson&lt;/a&gt; */public class CacheInterceptor implements Interceptor { protected final Logger log = Logger.getLogger(this.getClass()); private final ConcurrentHashMap&lt;Long, Object&gt; cache = new ConcurrentHashMap&lt;Long, Object&gt;();  /**  * @see org.jboss.aop.advice.Interceptor#getName()  */ public String getName() {  return this.getClass().getSimpleName(); } /**  * @see org.jboss.aop.advice.Interceptor#invoke(Invocation)  */ public Object invoke(Invocation invocation) throws Throwable {  Object rtnObject = beforeInvocation((MethodInvocation) invocation);  if (rtnObject != null) {   if (log.isDebugEnabled()) log.debug("CACHED.");   return rtnObject; // if cached, return   }  try {   rtnObject = invocation.invokeNext();   afterInvocation((MethodInvocation) invocation, rtnObject);  } catch (Throwable t) {   onInvocationException((MethodInvocation) invocation, t);  }  return rtnObject; } protected Object beforeInvocation(MethodInvocation invocation) throws Throwable {  if (log.isDebugEnabled()) log.debug("beforeInvocation...");  Object[] args = invocation.getArguments();  // always check for null and array length, when using reflection  if (args.length &gt; 0 &amp;&amp; args[0] != null &amp;&amp; (args[0] instanceof Long)) return cache.get(args[0]);  return null; } protected void afterInvocation(MethodInvocation invocation, Object rtnObject) throws Throwable {  if (log.isDebugEnabled()) log.debug("afterInvocation...");  if (rtnObject == null) return;  Object[] args = invocation.getArguments();  // always check for null and array length, when using reflection  if (args.length &gt; 0 &amp;&amp; args[0] != null &amp;&amp; (args[0] instanceof Long)) {   if (log.isDebugEnabled()) log.debug("ADD id=" + args[0] + ", object='" + rtnObject + "'.");   cache.put((Long) args[0], rtnObject);  } } protected void onInvocationException(MethodInvocation invocation, Throwable invocationException)         throws Throwable {  if (log.isDebugEnabled()) log.debug("onInvocationException...");  log.error("onInvocationException", invocationException);  // if nothing we can do, re-throw  throw invocationException; }  // ----------------------- Helper Method -----------------------  protected &lt;t extends Annotation&gt; T getMethodAnnotation(MethodInvocation invocation,         Class&lt;t&gt; annotationClass) {  return invocation.getMethod().getAnnotation(annotationClass); } }&lt;/script&gt;&lt;br /&gt;The JBoss AOP configuration file, META-INF/jboss-aop.xml&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;aop xmlns="urn:jboss:aop-beans:1.0"&gt; &lt;!-- Singleton Interceptor --&gt; &lt;!-- http://docs.jboss.com/aop/1.3/aspect-framework/reference/en/html_single/index.html --&gt; &lt;interceptor name="Cache" class="se.msc.example.aop.CacheInterceptor" scope="PER_VM" /&gt; &lt;bind pointcut="all(@se.msc.example.aop.Cache)"&gt;  &lt;interceptor-ref name="Cache" /&gt; &lt;/bind&gt;&lt;/aop&gt;&lt;/script&gt;&lt;br /&gt;Now lets create a Test class, that we annotate with our own Annotation: &lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.aop;import java.util.HashMap;import java.util.Map;/** * Simulate DB Service. *  * @author &lt;a href="mailto:magnus.k.karlsson@msc.se"&gt;Magnus K Karlsson&lt;/a&gt; */public class Dummy { private Map&lt;Long, String&gt; db = new HashMap&lt;Long, String&gt;();  @Cache public String load(Long id) {  if (!db.containsKey(id)) db.put(id, "NEW " + id);  return db.get(id); }  public void update(long id, String str) {  db.put(id, str); }}&lt;/script&gt;&lt;br /&gt;And a Unit Test to verify it is working.&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.aop;import java.util.HashMap;import java.util.Map;/** * Simulate DB Service. *  * @author &lt;a href="mailto:magnus.k.karlsson@msc.se"&gt;Magnus K Karlsson&lt;/a&gt; */public class Dummy { private Map&lt;Long, String&gt; db = new HashMap&lt;Long, String&gt;();  @Cache public String load(Long id) {  if (!db.containsKey(id)) db.put(id, "NEW " + id);  return db.get(id); }  public void update(long id, String str) {  db.put(id, str); }}&lt;/script&gt;&lt;br /&gt;And here is the maven pom.xml&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8" ?&gt;&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt; &lt;modelversion&gt;4.0.0&lt;/modelVersion&gt; &lt;groupid&gt;se.msc.example&lt;/groupId&gt; &lt;artifactid&gt;aop-demo&lt;/artifactId&gt; &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt; &lt;packaging&gt;jar&lt;/packaging&gt; &lt;name&gt;MSC Example :: AOP Demo&lt;/name&gt; &lt;url&gt;http://www.msc.se/example&lt;/url&gt; &lt;developers&gt;  &lt;developer&gt;   &lt;id&gt;magnus.k.karlsson&lt;/id&gt;   &lt;name&gt;Magnus K Karlsson&lt;/name&gt;   &lt;email&gt;magnus.k.karlsson@msc.se&lt;/email&gt;   &lt;organization&gt;MSC&lt;/organization&gt;  &lt;/developer&gt; &lt;/developers&gt; &lt;organization&gt;  &lt;name&gt;MSC&lt;/name&gt;  &lt;url&gt;http://wwww.msc.se&lt;/url&gt; &lt;/organization&gt; &lt;properties&gt;  &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;  &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt;  &lt;jbossaop.version&gt;2.1.1.GA&lt;/jbossaop.version&gt; &lt;/properties&gt; &lt;repositories&gt;  &lt;repository&gt;   &lt;id&gt;repository.jboss.org&lt;/id&gt;   &lt;name&gt;Jboss Repository for Maven&lt;/name&gt;   &lt;url&gt;http://repository.jboss.org/maven2/&lt;/url&gt;  &lt;/repository&gt; &lt;/repositories&gt; &lt;pluginrepositories&gt;  &lt;pluginrepository&gt;   &lt;id&gt;repository.jboss.org&lt;/id&gt;   &lt;name&gt;Jboss Repository for Maven&lt;/name&gt;   &lt;url&gt;http://repository.jboss.org/maven2/&lt;/url&gt;  &lt;/pluginRepository&gt; &lt;/pluginRepositories&gt; &lt;dependencies&gt;  &lt;!-- JBoss 5.1.0.GA --&gt;  &lt;dependency&gt;   &lt;groupid&gt;org.jboss.aop&lt;/groupId&gt;   &lt;artifactid&gt;jboss-aop&lt;/artifactId&gt;   &lt;version&gt;2.1.1.GA&lt;/version&gt;  &lt;/dependency&gt;  &lt;!-- Test support --&gt;  &lt;dependency&gt;   &lt;groupid&gt;junit&lt;/groupId&gt;   &lt;artifactid&gt;junit&lt;/artifactId&gt;   &lt;version&gt;4.8.1&lt;/version&gt;   &lt;scope&gt;test&lt;/scope&gt;  &lt;/dependency&gt; &lt;/dependencies&gt; &lt;build&gt;  &lt;pluginmanagement&gt;   &lt;plugins&gt;    &lt;plugin&gt;     &lt;groupid&gt;org.apache.maven.plugins&lt;/groupId&gt;     &lt;artifactid&gt;maven-compiler-plugin&lt;/artifactId&gt;     &lt;version&gt;2.0.2&lt;/version&gt;     &lt;configuration&gt;      &lt;source&gt;1.6&lt;/source&gt;      &lt;target&gt;1.6&lt;/target&gt;      &lt;!-- Plugin ignores default value 'project.build.sourceEncoding' --&gt;      &lt;encoding&gt;${project.build.sourceEncoding}&lt;/encoding&gt;     &lt;/configuration&gt;    &lt;/plugin&gt;    &lt;plugin&gt;     &lt;groupid&gt;org.apache.maven.plugins&lt;/groupId&gt;     &lt;artifactid&gt;maven-jar-plugin&lt;/artifactId&gt;     &lt;version&gt;2.2&lt;/version&gt;     &lt;configuration&gt;      &lt;archive&gt;       &lt;manifest&gt;        &lt;!-- Adding Implementation And Specification Details --&gt;        &lt;adddefaultimplementationentries&gt;true&lt;/addDefaultImplementationEntries&gt;       &lt;/manifest&gt;      &lt;/archive&gt;     &lt;/configuration&gt;    &lt;/plugin&gt;    &lt;plugin&gt;     &lt;groupid&gt;org.apache.maven.plugins&lt;/groupId&gt;     &lt;artifactid&gt;maven-surefire-plugin&lt;/artifactId&gt;     &lt;version&gt;2.4.3&lt;/version&gt;     &lt;configuration&gt;      &lt;!-- Konfiguration för AOP loadtime-weaving --&gt;      &lt;argline&gt;-javaagent:"${settings.localRepository}/org/jboss/aop/jboss-aop/${jbossaop.version}/jboss-aop-${jbossaop.version}.jar"&lt;/argLine&gt;     &lt;/configuration&gt;    &lt;/plugin&gt;       &lt;/plugins&gt;  &lt;/pluginManagement&gt; &lt;/build&gt; &lt;reporting&gt;  &lt;plugins&gt;   &lt;plugin&gt;    &lt;groupid&gt;org.codehaus.mojo&lt;/groupId&gt;    &lt;artifactid&gt;cobertura-maven-plugin&lt;/artifactId&gt;    &lt;version&gt;2.3&lt;/version&gt;   &lt;/plugin&gt;  &lt;/plugins&gt; &lt;/reporting&gt;&lt;/project&gt;&lt;/script&gt;&lt;br /&gt;To make the example complete, we also need to supply a log4j configuration file.&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd"&gt;&lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"&gt; &lt;appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"&gt;  &lt;param name="Target" value="System.out" /&gt;  &lt;layout class="org.apache.log4j.PatternLayout"&gt;   &lt;param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] %c:%L - %m%n" /&gt;  &lt;/layout&gt; &lt;/appender&gt; &lt;appender name="FILE_APPENDER" class="org.apache.log4j.RollingFileAppender"&gt;  &lt;param name="File" value="/tmp/server.log" /&gt;  &lt;param name="Append" value="true" /&gt;  &lt;layout class="org.apache.log4j.PatternLayout"&gt;   &lt;param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n" /&gt;  &lt;/layout&gt; &lt;/appender&gt; &lt;logger name="se.msc.example.aop"&gt;  &lt;level value="DEBUG" /&gt;  &lt;appender-ref ref="CONSOLE" /&gt; &lt;/logger&gt; &lt;root&gt;  &lt;level value="WARN" /&gt;  &lt;appender-ref ref="CONSOLE" /&gt; &lt;/root&gt;&lt;/log4j:configuration&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;To run/debug this inside Eclipse we need to copy the argLine from the maven pom file to the unit test file configuration.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-tjlA1x0pCDE/TWTx9FmjGDI/AAAAAAAAAGc/z1CT_ym5zE8/s1600/Screenshot-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="206" src="http://2.bp.blogspot.com/-tjlA1x0pCDE/TWTx9FmjGDI/AAAAAAAAAGc/z1CT_ym5zE8/s320/Screenshot-2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For more about JBoss AOP Maven plugin , see &lt;a href="http://community.jboss.org/wiki/JBossAOPMavenPlugin" target="_blank"&gt;http://community.jboss.org/wiki/JBossAOPMavenPlugin&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-7335099107315648515?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/7335099107315648515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=7335099107315648515&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7335099107315648515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7335099107315648515'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2011/02/best-practice-aspect-oriented.html' title='Best Practice Aspect-Oriented Programming with JBoss AOP'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-tjlA1x0pCDE/TWTx9FmjGDI/AAAAAAAAAGc/z1CT_ym5zE8/s72-c/Screenshot-2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-3491794326034336042</id><published>2010-10-27T09:43:00.001+02:00</published><updated>2010-10-27T09:45:32.093+02:00</updated><title type='text'>The Default Timeout Value for Standard Java Socket is Infinitive!</title><content type='html'>In my last week I have been doing some stability testing using both the Java standard &lt;a href="http://download.oracle.com/javase/6/docs/api/java/net/Socket.html" target="_blank"&gt;java.net.Socket&lt;/a&gt; and &lt;a href="http://download.oracle.com/javase/6/docs/api/javax/net/ssl/SSLSocket.html" target="_blank"&gt;javax.net.ssl.Socket&lt;/a&gt;. Which are both are part of the J2SE standard library. What I found out to my big surprise, was the standard value for socket timeout&amp;nbsp;(&lt;a href="http://download.oracle.com/javase/6/docs/api/java/net/Socket.html#getSoTimeout()" target="_blank"&gt;getSOTimeout()&lt;/a&gt;)&amp;nbsp;is infinitive!&lt;br /&gt;&lt;br /&gt;What are the consequences of this? Well, except that all blocking socket operation will hang forever. But maybe the biggest problem is, it opens up for Denial of Service (DoS) problems.&lt;br /&gt;&lt;br /&gt;Example DoS: A server is overloaded and services it's request slower and slower. And now, if new additional clients connected, even more resources are consumed. What will happen with this system in the end is it will ran out of memory or IO. This is not wanted!&lt;br /&gt;&lt;br /&gt;What is wanted is a fail-fast strategy, i.e. client that do not get response in a certain time will close it Socket and report back to interactive user or machine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-3491794326034336042?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/3491794326034336042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=3491794326034336042&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3491794326034336042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3491794326034336042'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/10/default-timeout-value-for-standard-java.html' title='The Default Timeout Value for Standard Java Socket is Infinitive!'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-2789025487893586506</id><published>2010-10-24T22:46:00.000+02:00</published><updated>2010-10-24T22:46:00.677+02:00</updated><title type='text'>Ubuntu 10.04 Change Default Size of Terminal</title><content type='html'>One of the&amp;nbsp;probably&amp;nbsp;first thing you want to change when starting using Ubuntu is to change the default size of the Terminal window. In earlier version of Ubuntu that could be accomplished via the Edit -&amp;gt; Profile Preference menu from the Terminal, but with Ubuntu 10.04 that is no longer possible. Instead do the following:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Go to System -&amp;gt; Preferences -&amp;gt; Preferred Applications -&amp;gt; System (tab)&lt;br /&gt;&lt;br /&gt;Change Terminal Emulator to "Custom".&lt;br /&gt;Command: gnome-terminal --geometry=237x24&lt;br /&gt;Execution flag: -x&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DPdQE6b-uQw/TMSavfu4IkI/AAAAAAAAAGI/0W0bAuXNLOw/s1600/Screenshot-PreferredApplications.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="260" src="http://2.bp.blogspot.com/_DPdQE6b-uQw/TMSavfu4IkI/AAAAAAAAAGI/0W0bAuXNLOw/s320/Screenshot-PreferredApplications.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-2789025487893586506?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/2789025487893586506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=2789025487893586506&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2789025487893586506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2789025487893586506'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/10/ubuntu-1004-change-default-size-of.html' title='Ubuntu 10.04 Change Default Size of Terminal'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DPdQE6b-uQw/TMSavfu4IkI/AAAAAAAAAGI/0W0bAuXNLOw/s72-c/Screenshot-PreferredApplications.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-549585040888948860</id><published>2010-10-08T00:13:00.000+02:00</published><updated>2010-10-08T00:13:15.090+02:00</updated><title type='text'>JAOO Day 4 – Not Only SQL, NOSQL</title><content type='html'>Today I listened to Emil Eifrem CTO at Neo Technology. What I liked most of his talk was the categorization of the today existing NOSQL solution:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Key-Value Database&lt;/b&gt;&lt;br /&gt;An Amazons project that uses global key-value mapping to for DB.&lt;br /&gt;&lt;br /&gt;Dynamo: Amazon's Highly Available Key-value Store (2007) (&lt;a href="http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf"&gt;http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Other Example:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Project Voldemort. &lt;a href="http://project-voldemort.com/"&gt;http://project-voldemort.com/&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Column Database&lt;/b&gt;&lt;br /&gt;A Google project that uses a big table, with column families.&lt;br /&gt;&lt;br /&gt;BigTable: A Distributed Storage System for Structured&lt;br /&gt;&amp;nbsp;Data (2006) (&lt;a href="http://labs.google.com/papers/bigtable.html"&gt;http://labs.google.com/papers/bigtable.html&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Other Example:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Apache HBase. &lt;a href="http://hbase.apache.org/"&gt;http://hbase.apache.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Apache Cassandra. &lt;a href="http://cassandra.apache.org/"&gt;http://cassandra.apache.org/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Document Database&lt;/b&gt;&lt;br /&gt;Data is organized as document and a document is a key-value pair.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Apache CouchDB. &lt;a href="http://couchdb.apache.org/"&gt;http://couchdb.apache.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;MongoDB. &lt;a href="http://www.mongodb.org/"&gt;http://www.mongodb.org/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Graph Database&lt;/b&gt;&lt;br /&gt;Data is organized in a graph, which Nodes and Relationships have properties.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Neo4J. &lt;a href="http://neo4j.org/"&gt;http://neo4j.org/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt; &lt;div style="margin-bottom: 0in;"&gt;&lt;b&gt;Example of company using NOSQL&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-weight: normal;"&gt;Google:  Bigtable &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-weight: normal;"&gt;Amazon:  Dynamo &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-weight: normal;"&gt;Amazon:  SimpleDB &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-weight: normal;"&gt;Yahoo:  HBase &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-weight: normal;"&gt;Microsoft:  Dynomite &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-weight: normal;"&gt;Facebook:  Cassandra &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;span style="font-weight: normal;"&gt;LinkedIn:  Voldemort&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-549585040888948860?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/549585040888948860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=549585040888948860&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/549585040888948860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/549585040888948860'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/10/jaoo-day-4-not-only-sql-nosql.html' title='JAOO Day 4 – Not Only SQL, NOSQL'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-1068314554267710506</id><published>2010-10-07T23:26:00.001+02:00</published><updated>2010-10-07T23:29:52.340+02:00</updated><title type='text'>JAOO Day 4 – Java Future at Oracle</title><content type='html'>Today I was listening at Brian Goetz in his talk “Java Future at Oracle”. This talk was a warn welcome, since yesterday Java User Group, where it was not so much warmth about the evolving of the Java language, due to the problem in the Java Community Process (JCP). And how this has set footprint in the deliveries of new JDK version.&lt;br /&gt;&lt;br /&gt;JDK 1.0 1996&lt;br /&gt;JDK 1.1 1997&lt;br /&gt;JDK 1.2 1998&lt;br /&gt;JDK 1.3 2000&lt;br /&gt;JDK 1.4 2002&lt;br /&gt;JDK 5.0 2004&lt;br /&gt;JDK 6.0 2006&lt;br /&gt;…&lt;br /&gt;JDK 7.0 2011?&lt;br /&gt;JDK 8.0 ???&lt;br /&gt;&lt;br /&gt;So what about new feature, well he said that they going to push out JDK 7.0, but of the expense of cutting functionality, which means in short:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Some feature from Project Coin. &lt;a href="http://openjdk.java.net/projects/coin/"&gt;http://openjdk.java.net/projects/coin/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Some feature from the Da Vinci Machine Project. &lt;a href="http://openjdk.java.net/projects/mlvm/"&gt;http://openjdk.java.net/projects/mlvm/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;And that's it.&lt;br /&gt;&lt;br /&gt;But on the other hand he also said that JDK 8.0 will be planned to be released thereafter 1-2 years, which sounds promising. Which Project Lambda (&lt;a href="http://openjdk.java.net/projects/lambda/"&gt;http://openjdk.java.net/projects/lambda/&lt;/a&gt;) will among other stuff be included. Other stuff in the pipe is also the Project Jigsaw (&lt;a href="http://openjdk.java.net/projects/jigsaw/"&gt;http://openjdk.java.net/projects/jigsaw/&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;But the most interesting stuff was the news that they plan to merge the HotSpot with the JRockit! Wow, what a killer that will be! But, an unanswered question is, if they will change the license model of the JDK. It is like Brian put it: Oracle is really an easy company to understand, it is about making money.&lt;br /&gt;&lt;br /&gt;And what about the JCP? Well, he quickly mentioned the problem, and this a top priority for Oracle to solve. And I really do hope that they solve this and quickly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-1068314554267710506?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/1068314554267710506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=1068314554267710506&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1068314554267710506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1068314554267710506'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/10/jaoo-day-4-java-future-at-oracle.html' title='JAOO Day 4 – Java Future at Oracle'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-4623110135473015047</id><published>2010-10-05T23:48:00.002+02:00</published><updated>2010-10-05T23:49:37.765+02:00</updated><title type='text'>JAOO Day 3. The Stagnation of the Java Language</title><content type='html'>Today I visited one of Java User Group (JUG) at the JAOO conference – the “Next next step for the Java ecosystem.” There were three person in panel James Gosling, Kevlin Henney and Dave Thomas and they all three confirmed on the misfortune fact that the Java Community Process (JCP) is not working properly or as Rod Johnson (member of JCP board) put it in his session “Where Next for Enterprise Java”. Compare the number of Java Specification Request (JSR) produced this year with the number produced 2-3 years back.&lt;br /&gt;&lt;br /&gt;And one can really ask when JDK 7 will be released and how much really will be included of the project Coin (minor language feature change), Jigsaw (effort to make Java more modular) and Lambda (bring closure to Java)?!?&lt;br /&gt;&lt;br /&gt;And I guess this fact is the why there today are so many new language created for the JVM – the community is responding and will not wait.&lt;br /&gt;&lt;br /&gt;But there is rescue to the help and as James put it, if you cannot wait use Scala.&lt;br /&gt;&lt;br /&gt;James Gosling&lt;br /&gt;&lt;a href="http://nighthacks.com/jag"&gt;http://nighthacks.com/jag&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Kevlin Henney&lt;br /&gt;&lt;a href="http://blogs.stickyminds.com/"&gt;http://blogs.stickyminds.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programmer.97things.oreilly.com/"&gt;http://programmer.97things.oreilly.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://curbralan.com/"&gt;http://curbralan.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dave Thomas&lt;br /&gt;&lt;a href="http://www.davethomas.net/"&gt;davethomas.net &lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.eclipse.org/"&gt;eclipse.org &lt;/a&gt;&lt;br /&gt;&lt;a href="http://agilealliance.org/"&gt;agilealliance.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Rod Johnson&lt;br /&gt;&lt;a href="http://blog.springsource.com/author/rodj/"&gt;http://blog.springsource.com/author/rodj/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-4623110135473015047?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/4623110135473015047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=4623110135473015047&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4623110135473015047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4623110135473015047'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/10/jaoo-day-3-stagnation-of-java-language.html' title='JAOO Day 3. The Stagnation of the Java Language'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-4972242350916188595</id><published>2010-10-05T23:09:00.001+02:00</published><updated>2010-10-05T23:10:22.714+02:00</updated><title type='text'>Getting Started with Scala - IDE support</title><content type='html'>The key thing when start using a new library or as in this blog, start writing a completely new language, is to have an IDE that is working with and not against you. &lt;br /&gt;&lt;br /&gt;I had the pleasure of talking with both Martin Odersky and Jonas Bonér at JAOO in Aarhus Denmark and they both recommended the IntelliJ Scala plugin, but Martin also added that he had started a company &lt;a href="http://scalasolutions.com/"&gt;scalasolutions.com&lt;/a&gt; with one of the aim to write a better Scala plugin for Eclipse, and when that comes out, I would really recommend you to test it. Another question which IDE to choose is also of course which IDE you have previously worked with and acquainted with.&lt;br /&gt;&lt;br /&gt;In this blog I will share my experience of using both the IntelliJ and Eclipse IDE, but also how to build your Scala code with Maven.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IntelliJ&lt;/b&gt;&lt;br /&gt;Since I don't have a business license of IntelliJ I used the Community edition, you can find the comparison matrix between the free and commercial edition and also the download link from.&lt;br /&gt;&lt;a href="http://www.jetbrains.com/idea/features/editions_comparison_matrix.html"&gt;http://www.jetbrains.com/idea/features/editions_comparison_matrix.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After installing IntelliJ, you install the Scala plugin with the Plugin Manager&lt;br /&gt;&lt;br /&gt;File | Settings | Plugins&lt;br /&gt;&lt;br /&gt;Select tab Available and search for Scala, then right click to install. &lt;br /&gt;&lt;br /&gt;After restarting, you create a new Java Module and add Scala Library from local downloaded Scala distro.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Experience&lt;/b&gt;&lt;br /&gt;&lt;u&gt;Plus&lt;/u&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Normal code completion and code navigation works.&lt;/li&gt;&lt;li&gt;&lt;b&gt;OBS&lt;/b&gt; when debugging, you have to append the name mangling '$1' to every variable to be able to Evaluate. This seems a bug in the Plugin, since the name mangling should be shielded from you and is strict Scala internal, to overcome Java restriction of operating overloading, etc.&lt;/li&gt;&lt;/ul&gt;&lt;u&gt;Minus&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The IntelliJ Scala plugin compiler is really slow, even for small amount of code. There are ways to get around this by using Scala background compiler server, but I have not got that up and running yet. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Eclipse&lt;/b&gt;&lt;br /&gt;I used the Eclipse 3.5.2 (Galileo) and install the Eclipse Scala plugin (&lt;a href="http://www.scala-ide.org/"&gt;http://www.scala-ide.org/&lt;/a&gt;) with the Eclipse built in Software Installation.&lt;br /&gt;&lt;br /&gt;Help | Install New Software... | http://download.scala-ide.org/update-current Add&lt;br /&gt;&lt;br /&gt;After that you can create a new Scala Eclipse Project.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Experience&lt;/b&gt;&lt;br /&gt;&lt;u&gt;Plus&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The Scala Plugin compiles code enormous time faster compared with the IntelliJ, but it also have drawbacks.&lt;/li&gt;&lt;li&gt;Code completion is not always working if program Scala in it most compact form, sometime it then helps to program a little more verbose, e.g. anonymous function "kalOk".exists(char =&amp;gt; char.isUpperCase) instead of the more compact "kalOk".exists(_.isUpperCase)&lt;/li&gt;&lt;li&gt;&lt;b&gt;OBS&lt;/b&gt; when debugging, you have to append the name mangling '$1' to every variable to be able to Evaluate. This seems a bug in the Plugin, since the name mangling should be shielded from you and is strict Scala internal, to overcome Java restriction of operating overloading, etc.&lt;/li&gt;&lt;/ul&gt;&lt;u&gt;Minus&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Code completion is not always working.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;After testing both IDE, I must say that Eclipse wins, and mostly because of the slow compilation in IntelliJ. But I hope even if you choose to use another IDE, that this blog post helped you with choosing which IDE you will use.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Maven&lt;/b&gt;&lt;br /&gt;After choosen IDE, you clearly also want to have build tool support and I will here discuss Maven, but I also knew that SBT (&lt;u&gt;http://code.google.com/p/simple-build-tool/&lt;/u&gt;) is also a great alternative, but I will not cover that in this blog.&lt;br /&gt;&lt;br /&gt;The simplest way is to use the scala archetype, but before please check the page &lt;a href="http://docs.codehaus.org/display/MAVENUSER/Archetypes+List"&gt;http://docs.codehaus.org/display/MAVENUSER/Archetypes+List&lt;/a&gt;, to see that not a newer version has been released.&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[mvn archetype:generate -DarchetypeGroupId=org.scala-tools.archetypes -DarchetypeArtifactId=scala-archetype-simple -DarchetypeVersion=1.2 -DremoteRepositories=http://scala-tools.org/repo-releases -DgroupId=se.msc.example -DartifactId=scala-maven -Dversion=1.0-SNAPSHOT]]&gt;&lt;/script&gt;&lt;br /&gt;To check that everything worked install the new Maven project.&lt;br /&gt;&lt;br /&gt;Now lets open the new pom and see what has been generated. The first thing you see is that Scala 2.7.0 is used, change that to 2.8.0 but also remove the Scala Spec Test in &lt;br /&gt;&lt;br /&gt;scala-maven/src/test/scala/se/msc/example/MySpec.scala&lt;br /&gt;&lt;br /&gt;Finally you can also remove the specs dependency. I will in coming post discuss Scala Unit Testing, but for now simply use JUnit 4, that you are probably familiar with.&lt;br /&gt;&lt;br /&gt;Thats it happy coding!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-4972242350916188595?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/4972242350916188595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=4972242350916188595&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4972242350916188595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4972242350916188595'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/10/getting-started-with-scala-ide-support.html' title='Getting Started with Scala - IDE support'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-4048787640977107069</id><published>2010-10-05T00:56:00.000+02:00</published><updated>2010-10-05T00:56:16.092+02:00</updated><title type='text'>Day 2 at JAOO. A Compact Day with James Gosling, Jim Webber and GIT</title><content type='html'>Day 2 was a packed day with big stars as James Gosling and for you that don't know it, Gosling have quited Oracle, if you want to read more, google or read Gosling own blog &lt;a href="http://nighthacks.com/roller/jag/"&gt;http://nighthacks.com/roller/jag/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But the day started with Cliff Click from Azul Systems (&lt;a href="http://azulsystems.com/"&gt;azulsystems.com&lt;/a&gt;) and talked about top ten performance problem they seen of hosted Java application in production. This was interesting and I will probably get back with a better blog about that. What also was interesting was suggested tools for detecting different kind of problem:&lt;br /&gt;&lt;br /&gt;JVM&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;dtrace, hprof, introscope, jconsole, visual vm yourkit&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;OS&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;dtrace, oprofile&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Network&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ganglia, iostat, lsof, nagios and netstat&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The next talk was from Google about Scalability, Availability and Stability, which in mine humble opinion, brought not so much new solution to the problems. It all cooked down to sharding, fanning out, &amp;nbsp;replication vs. caching, eventual consistency and asynchronous calling.&lt;br /&gt;&lt;br /&gt;After lunch did Jim Webber talked. Jim Webber is mainly the guy behing REST and if you are intrested about that you should definitely read his book. REST in Practise.&lt;br /&gt;&lt;a href="http://www.amazon.com/REST-Practice-Hypermedia-Systems-Architecture/dp/0596805829/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1286232319&amp;amp;sr=1-1"&gt;http://www.amazon.com/REST-Practice-Hypermedia-Systems-Architecture/dp/0596805829/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1286232319&amp;amp;sr=1-1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At the end of evening I had the pleasure of talking to both Martin Odersky and Jonas Bonér about the new started company Scala Solution (&lt;a href="http://www.scalasolutions.com/"&gt;http://www.scalasolutions.com/&lt;/a&gt;) IDE plugns, faster compile time, who is owning the code, founding and Scala akka (&lt;a href="http://akkasource.org/"&gt;http://akkasource.org/&lt;/a&gt;), but I will get back more about that later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-4048787640977107069?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/4048787640977107069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=4048787640977107069&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4048787640977107069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4048787640977107069'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/10/day-2-at-jaoo-compact-day-with-james.html' title='Day 2 at JAOO. A Compact Day with James Gosling, Jim Webber and GIT'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-3782525212671074273</id><published>2010-10-03T17:43:00.003+02:00</published><updated>2010-10-03T18:12:40.096+02:00</updated><title type='text'>Day 1 at JAOO Object-Orienteed meets functional: An Overview of Scala</title><content type='html'>The first Training at JAOO 2010 was held by Martin Odersky in Scala. Scala is truly an interesting new programming language, it runs on top of the JVM, but brings so much new programming technique that is not possible with the existing Java language.&lt;br /&gt;&lt;br /&gt;It was a truly refreshing talk, but also a sadly realization that the evolution of the Java language has really slowed down since the release of Java 5. The difference between Java 6 and Java 5 is mostly a faster JVM, that is not bad, but on the functional side of new language technique is quite depressing to see such a short list of new feature. And it is not getting better. A couple of days ago a checked out the Oracle web page of new programmatic feature in Java 7 one can see the list is short.&lt;br /&gt;&lt;a href="http://www.oracle.com/technetwork/java/7-138633.html" target="_blank"&gt;http://www.oracle.com/technetwork/java/7-138633.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And what is happening the other main stream programming corner at Microsoft? Well they have not been lazy. On could right fairly argue that C# has been become a more advance language than Java. So with this in mind, I'm really looking forward to participate the Training. So what did Martin talk about. Well, the Scala language is really huge, so the talk for 4 hours, did not covered all parts, but one thing is sure. Looking at Scala is almost like learning a new language. For you out there, that have not started looking at Scala I only got one question for you:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Do you want to program Java 6 or 10?&lt;/b&gt;&amp;nbsp;See the complete video of Martin Odersky.&amp;nbsp;&lt;a href="http://www.scala-lang.org/node/1305" target="_blank"&gt;http://www.scala-lang.org/node/1305&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"If I were to pick a language to use today other than Java, it would be Scala"&lt;br /&gt;by James Gosling, creator of Java&lt;br /&gt;&lt;a href="http://www.adam-bien.com/roller/abien/entry/java_net_javaone_which_programming" target="_blank"&gt;http://www.adam-bien.com/roller/abien/entry/java_net_javaone_which_programming&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"I can honestly say if someone had shown me the Programming in Scala book by by Martin Odersky, Lex Spoon &amp;amp; Bill Venners back in 2003 I’d probably have never created Groovy."&lt;br /&gt;by James Strachan, creator of Groovy&lt;br /&gt;&lt;a href="http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html" target="_blank"&gt;http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"Scala, it must be stated, is the current heir apparent to the Java throne. No other language on the JVM seems as capable of being a "replacement for Java" as Scala, and the momentum behind Scala is now unquestionable. While Scala is not a dynamic language, it has many of the characteristics of popular dynamic languages, through its rich and flexible type system, its sparse and clean syntax, and its marriage of functional and object paradigms."&lt;br /&gt;Charles Nutter, creator of JRuby&lt;br /&gt;&lt;a href="http://blog.headius.com/2009/04/future-part-one.html" target="_blank"&gt;http://blog.headius.com/2009/04/future-part-one.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-3782525212671074273?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/3782525212671074273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=3782525212671074273&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3782525212671074273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3782525212671074273'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/10/day-1-at-jaoo-object-orienteed-meets.html' title='Day 1 at JAOO Object-Orienteed meets functional: An Overview of Scala'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-3527076455957564558</id><published>2010-08-05T00:05:00.000+02:00</published><updated>2010-08-05T00:05:27.643+02:00</updated><title type='text'>Opening New Window in Ubuntu 10.04 Does Not Get Focused</title><content type='html'>I had a really annoying problem after installing Ubuntu 10.04 which I found a solution to today. The problem was whenever I was opening a new window that new opened window was not focused. Quite annoying! The solution is following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;System → Preferences → CompizConfig Settings Manager&lt;/li&gt;&lt;li&gt;Select &lt;i&gt;General&lt;/i&gt; in the right hand window.&lt;/li&gt;&lt;li&gt;Select &lt;i&gt;General Options&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;Select the &lt;i&gt;Focus &amp;amp; Raise Behaviour&lt;/i&gt; tab.&lt;/li&gt;&lt;li&gt;Change &lt;i&gt;Focus Prevention Level&lt;/i&gt; to &lt;b&gt;Off&lt;/b&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_DPdQE6b-uQw/TFnkEJzuAMI/AAAAAAAAAF4/VFyvMaxus2Y/s1600/Screenshot-CompizConfig+Settings+Manager.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_DPdQE6b-uQw/TFnkEJzuAMI/AAAAAAAAAF4/VFyvMaxus2Y/s320/Screenshot-CompizConfig+Settings+Manager.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-3527076455957564558?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/3527076455957564558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=3527076455957564558&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3527076455957564558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3527076455957564558'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/08/opening-new-window-in-ubuntu-1004-does.html' title='Opening New Window in Ubuntu 10.04 Does Not Get Focused'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DPdQE6b-uQw/TFnkEJzuAMI/AAAAAAAAAF4/VFyvMaxus2Y/s72-c/Screenshot-CompizConfig+Settings+Manager.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-6419984553286690054</id><published>2010-07-05T19:24:00.003+02:00</published><updated>2010-12-16T10:09:54.852+01:00</updated><title type='text'>Your First Cup of Coffee</title><content type='html'>A friend of mine asked me to provide a simple getting started guide for a first time Java programmer and it so happened it were other people that also wanted the same thing, so all of you out there here it  comes, a simple learning by example guide in Java. &lt;br /&gt;&lt;br /&gt;The example is a simple Web application that do simple Create, Retrieve, Update and Delete (CRUD) operation against a MySQL database.&lt;br /&gt;&lt;br /&gt;Before starting writing you need to install the following on your system. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Java 1.6 SE (&lt;a href="http://java.sun.com/javase/downloads/index.jsp" target="_blank"&gt;http://java.sun.com/javase/downloads/index.jsp&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;MySQL Server and Query Browser (&lt;a href="http://dev.mysql.com/downloads/" target="_blank"&gt;http://dev.mysql.com/downloads/&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Maven2 (&lt;a href="http://maven.apache.org/download.html" target="_blank"&gt;http://maven.apache.org/download.html&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Eclipse EE 3.5.2 (&lt;a href="http://eclipse.org/downloads/" target="_blank"&gt;http://eclipse.org/downloads/&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;Installing programs on Windows is a pain and I will leave that as an exercise and instead show you how that this is done on a Linux platform, Ubuntu (ubuntu.com).&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[sudo apt-get install sun-java6-jdk mysql-server mysql-query-browser maven2 ]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;That's it! That took 3 minutes on a modest Internet connection. Are you still stuck on downloading the files on your Windows machine? And thereafter looking forward to reboot you system after each installation?&lt;br /&gt;&lt;br /&gt;The Eclipse Ubuntu installation bundle is sadly quite old and therefore it is better to download the zip file manually and extracted it anywhere of you liking and run eclipse.exe (eclipse) in the eclipse folder.&lt;br /&gt;&lt;br /&gt;Now lets create your database. Start the MySQL Query Browser and right click in the Schemata dockable window and then select Create Schema.... Enter simpledb.&lt;br /&gt;Now double click on the newly created schema and then right click again to create a new table.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DPdQE6b-uQw/TDIUcHOMLcI/AAAAAAAAAFg/7LAQJcMqf1U/s1600/Screenshot-Table+Editor-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DPdQE6b-uQw/TDIUcHOMLcI/AAAAAAAAAFg/7LAQJcMqf1U/s320/Screenshot-Table+Editor-1.png" /&gt;&lt;span id="goog_1588409709"&gt;&lt;/span&gt;&lt;span id="goog_1588409710"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DPdQE6b-uQw/TDIUcHOMLcI/AAAAAAAAAFg/7LAQJcMqf1U/s1600/Screenshot-Table+Editor-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DPdQE6b-uQw/TDIUcHOMLcI/AAAAAAAAAFg/7LAQJcMqf1U/s320/Screenshot-Table+Editor-1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;From here you can take several paths, either create a new project with maven archetype 'simple-webapp' (&lt;a href="http://www.sonatype.com/books/mvnex-book/reference/web-sect-creating-project.html" target="_blank"&gt;http://www.sonatype.com/books/mvnex-book/reference/web-sect-creating-project.html&lt;/a&gt;) or you can install the m2eclipse plugin (&lt;a href="http://m2eclipse.sonatype.org/installing-m2eclipse.html" target="_blank"&gt;http://m2eclipse.sonatype.org/installing-m2eclipse.html&lt;/a&gt;) and create your project from Eclipse. Here, I will hopefully, choose the easiest way and do it manually, since we only will be needing two source files, where one will be empty – web.xml and index.jsp. &lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[cd [your local workspace directory] mkdir -p first-coffee/src/main/webapp/WEB-INF]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now create you Maven Project Object Model file pom.xml in first-coffee/pom.xml&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt; &lt;modelversion&gt;4.0.0&lt;/modelVersion&gt; &lt;groupid&gt;se.msc.example&lt;/groupId&gt; &lt;artifactid&gt;first-coffee&lt;/artifactId&gt; &lt;packaging&gt;war&lt;/packaging&gt; &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt; &lt;name&gt;first-coffee Maven Webapp&lt;/name&gt; &lt;url&gt;http://www.msc.se/example&lt;/url&gt; &lt;dependencies&gt;  &lt;!-- mysql jdbc driver --&gt;  &lt;dependency&gt;   &lt;groupid&gt;mysql&lt;/groupId&gt;   &lt;artifactid&gt;mysql-connector-java&lt;/artifactId&gt;   &lt;version&gt;5.1.13&lt;/version&gt;  &lt;/dependency&gt;   &lt;!-- test support --&gt;  &lt;dependency&gt;   &lt;groupid&gt;junit&lt;/groupId&gt;   &lt;artifactid&gt;junit&lt;/artifactId&gt;   &lt;version&gt;4.8.1&lt;/version&gt;   &lt;scope&gt;test&lt;/scope&gt;  &lt;/dependency&gt; &lt;/dependencies&gt; &lt;build&gt;  &lt;finalname&gt;first-coffee&lt;/finalName&gt;  &lt;pluginmanagement&gt;   &lt;plugins&gt;    &lt;!-- to compile with JDK 1.6 --&gt;    &lt;plugin&gt;     &lt;groupid&gt;org.apache.maven.plugins&lt;/groupId&gt;     &lt;artifactid&gt;maven-compiler-plugin&lt;/artifactId&gt;     &lt;configuration&gt;      &lt;source&gt;1.6&lt;/source&gt;      &lt;target&gt;1.6&lt;/target&gt;     &lt;/configuration&gt;    &lt;/plugin&gt;   &lt;/plugins&gt;  &lt;/pluginManagement&gt;  &lt;plugins&gt;   &lt;!-- built-in web server 'mvn jetty:run' --&gt;   &lt;plugin&gt;    &lt;groupid&gt;org.mortbay.jetty&lt;/groupId&gt;    &lt;artifactid&gt;maven-jetty-plugin&lt;/artifactId&gt;    &lt;configuration&gt;     &lt;scanintervalseconds&gt;1&lt;/scanIntervalSeconds&gt;     &lt;stopkey&gt;foo&lt;/stopKey&gt;     &lt;stopport&gt;9999&lt;/stopPort&gt;    &lt;/configuration&gt;   &lt;/plugin&gt;  &lt;/plugins&gt; &lt;/build&gt;&lt;/project&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now create your first-coffee/src/main/webapp/WEB-INF/web.xml&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"&gt;&lt;/web-app&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And finally your dynamic web page (first-coffee/src/main/webapp/index.jsp), where all your work be done.&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;%@ page import="java.sql.*" %&gt;&lt;html&gt;&lt;body&gt;&lt;% // Step 1: Load the JDBC driver.  Class.forName("com.mysql.jdbc.Driver"); // Step 2: Establish the connection to the database.  String url = "jdbc:mysql://localhost:3306/simpledb"; Connection conn = DriverManager.getConnection(url, "root", "root"); // Step 3: Do possible posted logic - Create, Update or Delete if ("Create".equals(request.getParameter("submitCreate"))) {  String name = request.getParameter("Name");  Statement statement = conn.createStatement();  statement.executeUpdate("INSERT INTO Person (Name) VALUES ('" + name + "')"); } else if ("Update".equals(request.getParameter("submitUpdate"))) {  String personId = request.getParameter("PersonId");  String name = request.getParameter("Name");  Statement statement = conn.createStatement();  statement.executeUpdate("UPDATE Person SET Name='" + name + "' WHERE PersonId=" + personId);   } else if ("Delete".equals(request.getParameter("submitDelete"))) {  String personId = request.getParameter("PersonId");  Statement statement = conn.createStatement();  statement.executeUpdate("DELETE FROM Person WHERE PersonId=" + personId);   }%&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;PersonId&lt;/th&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Action&lt;/th&gt;&lt;/tr&gt;&lt;% // Step 4: Load all content from table Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT PersonId, Name FROM Person"); while (rs.next()) {%&gt;&lt;!-- Here we display the content of the DB table. --&gt;&lt;form action="index.jsp" method="get"&gt;&lt;input type="hidden" name="PersonId" value='&lt;%=rs.getString("PersonId")%&gt;' /&gt;&lt;tr&gt;&lt;td&gt;&lt;%=rs.getString("PersonId")%&gt;&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="Name" value="&lt;%=rs.getString("Name")%&gt;" /&gt;&lt;/td&gt;&lt;td&gt;&lt;!-- Provide simple Update and Delete Action for each DB table row. --&gt;&lt;input type="submit" name="submitUpdate" value="Update" /&gt;&lt;input type="submit" name="submitDelete" value="Delete" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/form&gt;&lt;% }%&gt;&lt;!-- Provide an empty row for creating new DB table row.  --&gt;&lt;form action="index.jsp" method="get"&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="Name" /&gt;&lt;/td&gt;&lt;td&gt;&lt;input type="submit" name="submitCreate" value="Create" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/form&gt;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;To test your application, simply start the Maven built in web server, from your first-coffee directory.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[mvn jetty:run]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now open your web browser and enter the address http://localhost:8080/first-coffee/.&lt;br /&gt;&lt;br /&gt;If you want to continue to further evolve this simple example, you can leave the jetty server running and simply refresh you web server, after saving your changes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-6419984553286690054?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/6419984553286690054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=6419984553286690054&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6419984553286690054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6419984553286690054'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/07/your-first-cup-of-coffee.html' title='Your First Cup of Coffee'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DPdQE6b-uQw/TDIUcHOMLcI/AAAAAAAAAFg/7LAQJcMqf1U/s72-c/Screenshot-Table+Editor-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8268187052853918729</id><published>2010-07-01T03:29:00.000+02:00</published><updated>2010-07-01T03:29:59.428+02:00</updated><title type='text'>Getting Started with Apache Camel and Prepare for Apache ServiceMix Deployment</title><content type='html'>Apache Camel is dream framework for any developers that is confronting with any type of integration task. What makes Apache Camel so great is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Testability. It is design from the beginning to be a framework that going to support Test Driven Development. With this follows a fast development cycle, since all code can be debugged and executed from a simple JUnit test case.&lt;/li&gt;&lt;li&gt;Solves the two foremost problem that an integrator faces:&lt;/li&gt;&lt;li&gt;Seamless protocol crossing, i.e. no coding for fetching data from e.g. HTTP and forwarding it to JMS.&lt;/li&gt;&lt;li&gt;Default implementation of Enterprise Integration Pattern (&lt;a href="http://www.eaipatterns.com/toc.html" target="_blank"&gt;http://www.eaipatterns.com/toc.html&lt;/a&gt;) that is easy to extend and configure. If you are not familiar with EIP, I recommend you to take the time and read the EIP homepage or if you do not want to miss a thing read the complete book written by Hophe and Woolf (&lt;a href="http://www.amazon.com/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683" target="_blank"&gt;http://www.amazon.com/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The next best thing is that Apache Camel is a POJO based solution, which means that it can be deployed and ran in any deployment environment:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Standalone Java Application&lt;/li&gt;&lt;li&gt;Web Container&lt;/li&gt;&lt;li&gt;J2EE Container&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;When talking of deployment and integration the most common question is. What about ESB? And this is also when Apache Camel shines. Apache Camel is fully supported by Apache Camel parent project Apache ServiceMix, that supports the industry standard Java Business Integration standard. The JBI specification has been criticized about being a slow way of developing integration software and in many aspect that is true, but with Apache Camel as core developing framework that is no longer true.&lt;br /&gt;&lt;br /&gt;The reason to select an ESB platform to deploy your integration software is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Management. The ESB platform is specially design to manage integration programs.&lt;/li&gt;&lt;li&gt;Redundancy and Scalability. A good ESB platform is specifically design to handle these issues when the load and uptime requirements increases.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;But one thing, that in my opinion, the Apache Camel homepage lack is good starting example of showing the above strength. So lets get started with NOT writing a production code example, but instead lets write a JUnit test case that you can debug, then you can continue of writing your production code.&lt;br /&gt;&lt;br /&gt;In the below example I will also take into account that one day, you might want or NOT take the next step and move your Apache Camel code into a full blown ESB environment.&lt;br /&gt;&lt;br /&gt;Lets first look at your Maven pom.xml.&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt; &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt; &lt;groupId&gt;se.msc.example&lt;/groupId&gt; &lt;artifactId&gt;camel&lt;/artifactId&gt; &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt; &lt;packaging&gt;jar&lt;/packaging&gt; &lt;!-- &lt;packaging&gt;jbi-service-unit&lt;/packaging&gt; --&gt; &lt;name&gt;MSC Example :: Camel&lt;/name&gt; &lt;properties&gt;  &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;  &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt;  &lt;servicemix-version&gt;4.2.0&lt;/servicemix-version&gt;  &lt;!--   servicemix 4.2.0 ships with 'servicemix-camel', thats support camel   2.2.0  --&gt;  &lt;camel-version&gt;2.2.0&lt;/camel-version&gt;  &lt;!--   'servicemix-camel' has a deviating version compared with 'camel-core'  --&gt;  &lt;servicemix-camel-version&gt;2010.01&lt;/servicemix-camel-version&gt;  &lt;!-- supported version for tooling in servicemix 4.2.0 --&gt;  &lt;servicemix-jbi-plugin-version&gt;4.3&lt;/servicemix-jbi-plugin-version&gt; &lt;/properties&gt; &lt;build&gt;  &lt;pluginManagement&gt;   &lt;plugins&gt;    &lt;!-- to compile with JDK 1.6 --&gt;    &lt;plugin&gt;     &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;     &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;     &lt;!--      Use version      $M2_HOME/lib/maven-&lt;version&gt;-uber.jar/org/apache/maven/project/pom-4.0.0.xml     --&gt;     &lt;configuration&gt;      &lt;source&gt;1.6&lt;/source&gt;      &lt;target&gt;1.6&lt;/target&gt;      &lt;!-- Plugin ignores default value 'project.build.sourceEncoding' --&gt;      &lt;encoding&gt;${project.build.sourceEncoding}&lt;/encoding&gt;     &lt;/configuration&gt;    &lt;/plugin&gt;    &lt;plugin&gt;     &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;     &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;     &lt;!--      Use version      $M2_HOME/lib/maven-&lt;version&gt;-uber.jar/org/apache/maven/project/pom-4.0.0.xml     --&gt;     &lt;configuration&gt;      &lt;archive&gt;       &lt;manifest&gt;        &lt;!-- To include versionnumber in MANIFEST.MF --&gt;        &lt;addDefaultImplementationEntries&gt;true&lt;/addDefaultImplementationEntries&gt;       &lt;/manifest&gt;      &lt;/archive&gt;     &lt;/configuration&gt;    &lt;/plugin&gt;   &lt;/plugins&gt;  &lt;/pluginManagement&gt;  &lt;plugins&gt;   &lt;!--    creates the JBI deployment unit &lt;plugin&gt;    &lt;groupId&gt;org.apache.servicemix.tooling&lt;/groupId&gt;    &lt;artifactId&gt;jbi-maven-plugin&lt;/artifactId&gt;    &lt;version&gt;${servicemix-jbi-plugin-version}&lt;/version&gt;    &lt;extensions&gt;true&lt;/extensions&gt; &lt;/plugin&gt;   --&gt;  &lt;/plugins&gt; &lt;/build&gt; &lt;dependencies&gt;  &lt;!-- servicemix camel core --&gt;  &lt;dependency&gt;   &lt;groupId&gt;org.apache.servicemix&lt;/groupId&gt;   &lt;artifactId&gt;servicemix-camel&lt;/artifactId&gt;   &lt;version&gt;${servicemix-camel-version}&lt;/version&gt;   &lt;scope&gt;provided&lt;/scope&gt;  &lt;/dependency&gt;  &lt;!-- optional camel components --&gt;  &lt;dependency&gt;   &lt;groupId&gt;org.apache.camel&lt;/groupId&gt;   &lt;artifactId&gt;camel-http&lt;/artifactId&gt;   &lt;version&gt;${camel-version}&lt;/version&gt;  &lt;/dependency&gt;  &lt;!-- test support --&gt;  &lt;dependency&gt;   &lt;groupId&gt;junit&lt;/groupId&gt;   &lt;artifactId&gt;junit&lt;/artifactId&gt;   &lt;!-- version inherited from 'camel-core' --&gt;   &lt;version&gt;3.8.2&lt;/version&gt;   &lt;scope&gt;test&lt;/scope&gt;  &lt;/dependency&gt;  &lt;dependency&gt;   &lt;groupId&gt;org.apache.camel&lt;/groupId&gt;   &lt;artifactId&gt;camel-core&lt;/artifactId&gt;   &lt;version&gt;${camel-version}&lt;/version&gt;   &lt;type&gt;test-jar&lt;/type&gt;   &lt;scope&gt;test&lt;/scope&gt;  &lt;/dependency&gt; &lt;/dependencies&gt;&lt;/project&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.camel;import org.apache.camel.ContextTestSupport;import org.apache.camel.builder.RouteBuilder;import org.apache.camel.component.mock.MockEndpoint;public class MyFirstCamelTest extends ContextTestSupport { @Override protected RouteBuilder createRouteBuilder() {  return new RouteBuilder() {   public void configure() {    from("direct:start").to("file:///tmp?fileName=foo.txt").to("mock:result");    // another example, without mocking start endpoint    // from("http://camel.apache.org/http.html").to("file:///tmp?fileName=foo.txt").to("mock:result");   }  }; } public void test_OK() throws Exception {  MockEndpoint result = resolveMandatoryEndpoint("mock:result", MockEndpoint.class);  result.expectedMessageCount(1);  // send somtething from 'direct:start'  String ls = System.getProperty("line.separator");  String txt = "Dummy Body åäö";  template.sendBody("direct:start", txt + ls + txt + ls + txt + ls);  // execute and assert above 'result.expectedMessageCount(1);'  result.assertIsSatisfied(); }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;To read more about all configuration options for the above endpoints, see &lt;a href="http://camel.apache.org/components.html" target="_blank"&gt;http://camel.apache.org/components.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;An Apache Camel route can also be configured in a XML file, which is the natural choice since you want&amp;nbsp; things to configurable and not static defined in a Java class, but more about in my next blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8268187052853918729?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8268187052853918729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8268187052853918729&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8268187052853918729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8268187052853918729'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/07/getting-started-with-apache-camel-and.html' title='Getting Started with Apache Camel and Prepare for Apache ServiceMix Deployment'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-3237050782023001419</id><published>2010-06-28T08:42:00.000+02:00</published><updated>2010-06-28T08:42:26.912+02:00</updated><title type='text'>Problem Running Eclipse on Ubuntu 10.04 (Lucid Lynx)</title><content type='html'>I have been using Ubuntu for some time and it is really a great OS, but it is amazing why it is always Eclipse that brings the most headache when upgrading Ubuntu. For a couple a days ago I upgraded to Ubuntu 10.04, and everything works smoothly until I started Eclipse 3.5 SR1, with bug fixes I have previously described.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://magnus-k-karlsson.blogspot.com/2009/11/problem-running-eclipse-in-ubuntu-910.html"&gt;http://magnus-k-karlsson.blogspot.com/2009/11/problem-running-eclipse-in-ubuntu-910.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This time the solution was to upgrade to Eclipse 3.5 SR 2 (Galileo), without the above bug fix. But thereafter m2eclipse gave me some problem, but now it seams to work after reinstalling m2eclipse and following the guideline in &lt;br /&gt;&lt;br /&gt;&lt;a href="http://m2eclipse.sonatype.org/installing-m2eclipse.html"&gt;http://m2eclipse.sonatype.org/installing-m2eclipse.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;“Note about 0.9.8 Workspace Incompatibility: If you are using m2eclipse 0.10.0 with a workspace that contains projects created under m2eclipse 0.9.8, you must remove the workspaceState.ser file. The workspaceState.ser file is located within the workspace directory in $workspacedir/.metadata/.plugins/org.maven.ide.eclipse/workspaceState.ser. If you remove this file, m2eclipse 0.10.0 will regenerate it as needed.”&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-3237050782023001419?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/3237050782023001419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=3237050782023001419&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3237050782023001419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3237050782023001419'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/06/problem-running-eclipse-on-ubuntu-1004.html' title='Problem Running Eclipse on Ubuntu 10.04 (Lucid Lynx)'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-2577023230822676723</id><published>2010-06-25T03:29:00.002+02:00</published><updated>2010-07-04T01:03:09.582+02:00</updated><title type='text'>Getting Starting with Google Web Toolkit, GWT, Development</title><content type='html'>To get started first install appropriate plug-in for your IDE, in this article we will use Eclipse, but there are other great plug-in for other IDE as well.&lt;br /&gt;&lt;br /&gt;Eclipse GWT plugin&lt;br /&gt;&lt;a href="http://code.google.com/eclipse/docs/download.html" target="_blank"&gt;http://code.google.com/eclipse/docs/download.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One of the biggest difference between GWT 1.* and 2.* is the ability to debug and run your GWT application without the need to render/compile it. Now you can directly run/debug your GWT Java code without the time consuming compile step. But to do this you first need to install a plug-in to your web browser.&lt;br /&gt;&lt;br /&gt;GWT Development Mode plugin for Firefox, IE and Safari&lt;br /&gt;&lt;a href="http://groups.google.com/group/google-web-toolkit/msg/51c5a09630ac61dc" target="_blank"&gt;http://groups.google.com/group/google-web-toolkit/msg/51c5a09630ac61dc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After restarting Eclipse and your Web browser you are now ready to start developing. Begin with creating a new project and select Google → Web Application Project.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DPdQE6b-uQw/TCQGFRnBuPI/AAAAAAAAAE4/1oTl5EO2InM/s1600/Screenshot-NewProject.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DPdQE6b-uQw/TCQGFRnBuPI/AAAAAAAAAE4/1oTl5EO2InM/s320/Screenshot-NewProject.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Enter project details. In this article we will not create a Google App Engine Application, which is a platform for writing cloud application for the Google cloud platform. To read more about Google App Engine, visit http://code.google.com/appengine/.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DPdQE6b-uQw/TCQGO71m-cI/AAAAAAAAAFA/3SoGRrQrdqg/s1600/Screenshot-NewWebApplicationProject.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_DPdQE6b-uQw/TCQGO71m-cI/AAAAAAAAAFA/3SoGRrQrdqg/s320/Screenshot-NewWebApplicationProject.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;After finishing creating your project. Lets fire it up and start debug the complete GWT project. The GWT team has already configured a default debug goal. So simple press the debug icon in the Eclipse toolbar.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DPdQE6b-uQw/TCQGQvcqOgI/AAAAAAAAAFI/kVcRNImIJqc/s1600/Screenshot-DebugConfigurations.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DPdQE6b-uQw/TCQGQvcqOgI/AAAAAAAAAFI/kVcRNImIJqc/s320/Screenshot-DebugConfigurations.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now is a URL presented in the Eclipse Console output View. Right click on that URL and select Copy. Paste the URL in your web browser.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DPdQE6b-uQw/TCQGSLmq3BI/AAAAAAAAAFQ/u2aUpLBP3JI/s1600/Screenshot-Java+EE-gwt-demo-src-se-msc-example-gwt-client-GreetingService.java-Eclipse.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DPdQE6b-uQw/TCQGSLmq3BI/AAAAAAAAAFQ/u2aUpLBP3JI/s320/Screenshot-Java+EE-gwt-demo-src-se-msc-example-gwt-client-GreetingService.java-Eclipse.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now lets set a breakpoint in your application and the enter a name in your browser and click submit. And now you are debugging your first GWT application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-2577023230822676723?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/2577023230822676723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=2577023230822676723&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2577023230822676723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2577023230822676723'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/06/getting-starting-with-google-web.html' title='Getting Starting with Google Web Toolkit, GWT, Development'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DPdQE6b-uQw/TCQGFRnBuPI/AAAAAAAAAE4/1oTl5EO2InM/s72-c/Screenshot-NewProject.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-741596960757020051</id><published>2010-04-18T23:13:00.000+02:00</published><updated>2010-04-18T23:13:53.921+02:00</updated><title type='text'>Administrating JBoss MBean From the Command Line Using twiddle</title><content type='html'>In production environment you usually monitor and administrate the JBoss Application Server through ssh and command line and this is adequate when starting, stopping and reading logs, but when you want to inspect, see status and change MBean values, the command line alternative is quite limited and since the MBean architecture is central in JBoss one really wants to use the JMX-console. The JMX-console is not the most user friendly tool, but has improved with JBoss 5 and the Web Console. &lt;br /&gt;&lt;br /&gt;But there is an alternative if you want (or must) stick with the command line alternative – twiddle. The twiddle tool is not new and has been around since JBoss 4.3. And here follows a short walk through by examples.&lt;br /&gt;&lt;br /&gt;To print out help information use:&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[./twiddle.sh -h]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Here you see the most imported commands: info, get, invoke and setattrs.&lt;br /&gt;&lt;br /&gt;To get attribute and operation info:&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[./twiddle.sh info jboss:service=JNDIView]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;To get attribute value:&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[./twiddle.sh get jboss:service=JNDIView StateString]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;To invoke an operation:&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[./twiddle.sh invoke jboss:service=JNDIView list true]]&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-741596960757020051?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/741596960757020051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=741596960757020051&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/741596960757020051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/741596960757020051'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/04/administrating-jboss-mbean-from-command.html' title='Administrating JBoss MBean From the Command Line Using twiddle'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-2238073727744891701</id><published>2010-03-24T00:51:00.000+01:00</published><updated>2010-03-24T00:51:56.201+01:00</updated><title type='text'>How To Remove Automatically Started Programs in Ubuntu 9.10 Karmic Koala</title><content type='html'>I while ago I blogged about how to setup &lt;a href="http://magnus-k-karlsson.blogspot.com/2010/02/configure-apache-web-server-as-reverse.html" target="_blank"&gt;Apache mod_proxy as a reverse proxy&lt;/a&gt; and I installed Tomcat and Apache Web Server with Synaptic Package Manager. The Synaptic Package Manager worked flawless&amp;nbsp; as usual, but it left me with one problem. The Tomcat Server did start automatically every time I booted Ubuntu, this is typically not wanted on a developer laptop, since you probably also are using some other Java Container that is default using port 8080. &lt;br /&gt;&lt;br /&gt;Before we dive into how to remove the auto start in Ubuntu, lets first see how things are configured to be automatically started. As you know the start scripts are located in the &lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&gt;/etc/init.d]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And to make programs autostart then there are soft links in the &lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&gt;/etc/rcX.d]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;There are several /etc/rc catalogs, and here follows the extract from one of mine catalog.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&gt;ls -al /etc/rc0.d/lrwxrwxrwx&amp;nbsp;&amp;nbsp; 1 root root&amp;nbsp;&amp;nbsp;&amp;nbsp; 17 2010-02-19 07:34 K09apache2 -&gt; ../init.d/apache2]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;So one obvious option would be to directly delete all the soft links in these catalogs, but this is error prone and not recommended, but also it exists a tool to do exactly this – update-rc.d.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&gt; sudo update-rc.d -f tomcat6 remove &amp;nbsp;Removing any system startup links for /etc/init.d/tomcat6 ... &amp;nbsp;&amp;nbsp; /etc/rc0.d/K08tomcat6 &amp;nbsp;&amp;nbsp; /etc/rc1.d/K08tomcat6 &amp;nbsp;&amp;nbsp; /etc/rc2.d/S92tomcat6 &amp;nbsp;&amp;nbsp; /etc/rc3.d/S92tomcat6 &amp;nbsp;&amp;nbsp; /etc/rc4.d/S92tomcat6 &amp;nbsp;&amp;nbsp; /etc/rc5.d/S92tomcat6 &amp;nbsp;&amp;nbsp; /etc/rc6.d/K08tomcat6]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now is Tomcat no longer automatically started when booting Ubuntu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-2238073727744891701?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/2238073727744891701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=2238073727744891701&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2238073727744891701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2238073727744891701'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/03/how-to-remove-automatically-started.html' title='How To Remove Automatically Started Programs in Ubuntu 9.10 Karmic Koala'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-4864289368988870498</id><published>2010-02-28T08:36:00.000+01:00</published><updated>2010-02-28T08:36:14.871+01:00</updated><title type='text'>Using JAX-WS in a Web Archive, as a Servlet, Running on JBoss 5.1</title><content type='html'>In my previous blog I showed how to get started with JAX-WS in a EJB archieve, in this blog I will show you how to do the same thing, but in a web archive instead, as a Servlet. If you think about it, the two different approaches ends with the same result – a Servlet that answer HTTP request with SOAP content. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DPdQE6b-uQw/S4objbY3NVI/AAAAAAAAAEY/s3gF5lcb4ck/s1600-h/WebServiceTerminology.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DPdQE6b-uQw/S4objbY3NVI/AAAAAAAAAEY/s3gF5lcb4ck/s320/WebServiceTerminology.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now lets create a simple web archieve with Maven archetype plugin.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[mvn archetype:create -DgroupId=se.msc.example -DartifactId=ws-web -DarchetypeArtifactId=maven-archetype-webapp]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now lets add EJB dependency and JBoss Maven plugin that will do our deployment work.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt; &lt;modelversion&gt;4.0.0&lt;/modelVersion&gt; &lt;groupid&gt;se.msc.example&lt;/groupId&gt; &lt;artifactid&gt;ws-web&lt;/artifactId&gt; &lt;packaging&gt;war&lt;/packaging&gt; &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt; &lt;name&gt;ws-web Maven Webapp&lt;/name&gt; &lt;url&gt;http://www.msc.se/example/ws-web&lt;/url&gt; &lt;developers&gt;  &lt;developer&gt;   &lt;id&gt;magnus.k.karlsson&lt;/id&gt;   &lt;name&gt;Magnus K Karlsson&lt;/name&gt;   &lt;email&gt;magnus.k.karlsson@msc.se&lt;/email&gt;   &lt;organization&gt;MSC&lt;/organization&gt;  &lt;/developer&gt; &lt;/developers&gt; &lt;properties&gt;  &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;  &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt;  &lt;jboss.home&gt;/home/magnus/applications/jboss-5.1.0.GA-jdk6&lt;/jboss.home&gt; &lt;/properties&gt; &lt;dependencies&gt;  &lt;!-- sun's ejb 3.0 api --&gt;  &lt;dependency&gt;   &lt;groupid&gt;javax.ejb&lt;/groupId&gt;   &lt;artifactid&gt;ejb-api&lt;/artifactId&gt;   &lt;version&gt;3.0&lt;/version&gt;   &lt;scope&gt;provided&lt;/scope&gt;  &lt;/dependency&gt;  &lt;!-- jboss logging impl (jboss 5.1.0 GA) --&gt;  &lt;dependency&gt;   &lt;groupid&gt;log4j&lt;/groupId&gt;   &lt;artifactid&gt;log4j&lt;/artifactId&gt;   &lt;version&gt;1.2.14&lt;/version&gt;   &lt;scope&gt;provided&lt;/scope&gt;  &lt;/dependency&gt;  &lt;!-- unit testing --&gt;  &lt;dependency&gt;   &lt;groupid&gt;junit&lt;/groupId&gt;   &lt;artifactid&gt;junit&lt;/artifactId&gt;   &lt;version&gt;4.7&lt;/version&gt;   &lt;scope&gt;test&lt;/scope&gt;  &lt;/dependency&gt; &lt;/dependencies&gt; &lt;build&gt;  &lt;finalname&gt;ws-web&lt;/finalName&gt;  &lt;plugins&gt;   &lt;!-- to compile with jdk 1.6 --&gt;   &lt;plugin&gt;    &lt;groupid&gt;org.apache.maven.plugins&lt;/groupId&gt;    &lt;artifactid&gt;maven-compiler-plugin&lt;/artifactId&gt;    &lt;version&gt;2.1&lt;/version&gt;    &lt;configuration&gt;     &lt;source&gt;1.6&lt;/source&gt;     &lt;target&gt;1.6&lt;/target&gt;     &lt;debug&gt;true&lt;/debug&gt;     &lt;debuglevel&gt;lines,vars,source&lt;/debuglevel&gt;     &lt;optimize&gt;true&lt;/optimize&gt;     &lt;showdeprecation&gt;true&lt;/showDeprecation&gt;     &lt;showwarnings&gt;true&lt;/showWarnings&gt;    &lt;/configuration&gt;   &lt;/plugin&gt;            &lt;!-- plugin to harddeploy, hardundeploy, start and stop jboss --&gt;            &lt;plugin&gt;                &lt;groupid&gt;org.codehaus.mojo&lt;/groupId&gt;                &lt;artifactid&gt;jboss-maven-plugin&lt;/artifactId&gt;                &lt;version&gt;1.4&lt;/version&gt;                &lt;configuration&gt;                    &lt;jbosshome&gt;${jboss.home}&lt;/jbossHome&gt;                    &lt;servername&gt;default&lt;/serverName&gt;                    &lt;port&gt;8080&lt;/port&gt;                &lt;/configuration&gt;            &lt;/plugin&gt;     &lt;/plugins&gt; &lt;/build&gt;&lt;/project&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Then we continue with our Web Service class.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.ws.web;import javax.jws.WebMethod;import javax.jws.WebService;@WebServicepublic class PersonServiceBean { @WebMethod    public String getName() {     return "Magnus K Karlsson";    }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Not that we don't need to define a interface. Then we write our web.xml, that points to our concrete Web Service class.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;web-app xmlns="http://java.sun.com/xml/ns/javaee"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"&gt; &lt;display-name&gt;MSC Demo Web Service&lt;/display-name&gt; &lt;servlet&gt;    &lt;servlet-name&gt;PersonServiceBean&lt;/servlet-name&gt;    &lt;servlet-class&gt;se.msc.example.ws.web.PersonServiceBean&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt;    &lt;servlet-name&gt;PersonServiceBean&lt;/servlet-name&gt;    &lt;url-pattern&gt;/personServiceBean&lt;/url-pattern&gt; &lt;/servlet-mapping&gt;&lt;/web-app&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Finally we need to add the JBoss specific web deployment descriptor. Note the location of the file – src/main/webapp/META-INF/jboss-web.xml, i.e. not in the WEB-INF directory, beside the web.xml. &lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_5_1.xsd" version="5.1"&gt;  &lt;!-- Read about Schema documentation in $JBOSS_HOME/docs/schema/jboss-web_5_1.xsd --&gt;&lt;/jboss-web&gt;    ]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now we are ready to build and deploy our archieve&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[mvn clean install jboss:harddeploy]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Then we start our JBoss server and opens a web browser pointing to &lt;a href="http://localhost:8080/ws-web/personServiceBean?wsdl" target="blank"&gt;http://localhost:8080/ws-web/personServiceBean?wsdl&lt;/a&gt; and checks that the web service is working. Instead of building a web service client by hand, we use the soapUI tool.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DPdQE6b-uQw/S4ochQB9vrI/AAAAAAAAAEg/WXB3Xxx5DEI/s1600-h/Screenshot-NewsoapUIProject.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DPdQE6b-uQw/S4ochQB9vrI/AAAAAAAAAEg/WXB3Xxx5DEI/s320/Screenshot-NewsoapUIProject.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://1.bp.blogspot.com/_DPdQE6b-uQw/S4oco5H9jWI/AAAAAAAAAEo/h2LOB_y3UJc/s1600-h/Screenshot-GenerateTestSuite.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DPdQE6b-uQw/S4oco5H9jWI/AAAAAAAAAEo/h2LOB_y3UJc/s320/Screenshot-GenerateTestSuite.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now soapUI has created us a testcase that we can double click and click the green play button on.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DPdQE6b-uQw/S4oc5wN_sUI/AAAAAAAAAEw/pMNGRLCPGVk/s1600-h/Screenshot-soapUI3.5-beta1+.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DPdQE6b-uQw/S4oc5wN_sUI/AAAAAAAAAEw/pMNGRLCPGVk/s320/Screenshot-soapUI3.5-beta1+.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-4864289368988870498?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/4864289368988870498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=4864289368988870498&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4864289368988870498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4864289368988870498'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/02/using-jax-ws-in-web-archive-as-servlet.html' title='Using JAX-WS in a Web Archive, as a Servlet, Running on JBoss 5.1'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DPdQE6b-uQw/S4objbY3NVI/AAAAAAAAAEY/s3gF5lcb4ck/s72-c/WebServiceTerminology.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-1718463341143423789</id><published>2010-02-25T20:00:00.000+01:00</published><updated>2010-02-25T20:00:01.109+01:00</updated><title type='text'>How To See Expiration Date and other Information of a p12 File (PKCS12).</title><content type='html'>Sooner or later your client or server certificate will expire and it will be nice to update that before it really happens, but to do that you need to know how to get that information. In this blog I will show you how to do that in a Linux environment with openssl, that is a typical scenario when the certificate is located on a remote Linux server that you access with ssh.&lt;br /&gt;&lt;br /&gt;First thing to do is to convert the p12 file (PKCS12 format) to X509 format, to do so we use the openssl command.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[openssl pkcs12 -in maka.p12 -info]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;When prompted enter the password. Now is the content printed out, find out which CN (Common Name) that is for the server, typically it is the dns name of the server. After located the certificate then copy everything between the below start and end tag,&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[-----BEGIN CERTIFICATE-----The content to copy...-----END CERTIFICATE-----]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Past the copied content into a file with prefix .crt. If you were on a Windows system you could now simple double click the crt-file and the information of the certification would be display, but here we will continue using openssl. To use openssl, use the below command using the file name of the file you pasted the certificate into.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[openssl x509 -in &lt;your_file.crt&gt; -inform PEM -text]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now is the expiration date printed among other information.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-1718463341143423789?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/1718463341143423789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=1718463341143423789&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1718463341143423789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1718463341143423789'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/02/how-to-see-expiration-date-and-other.html' title='How To See Expiration Date and other Information of a p12 File (PKCS12).'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-2457523252044750686</id><published>2010-02-21T23:41:00.000+01:00</published><updated>2010-02-21T23:41:55.303+01:00</updated><title type='text'>Configure Apache Web Server as Reverse Proxy in front of a Tomcat or J2EE Container</title><content type='html'>One production like scenario when using SSL or load balancing is to use a Apache Web Server in front of a Java Web Container or J2EE Container. There are two ways to make the Apache Web Server and the behind Java container – mod_proxy or mod_jk. In this blog I will show you how to use the mod_proxy alternative, acting as a reverse proxy. I will also use Ubuntu to show you how easy there is to install software on Ubuntu with Synaptic Package Manager.&lt;br /&gt;&lt;br /&gt;The first thing to do is to install Apache Web Server and the Tomcat Container.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[sudo apt-get install apache2 tomcat6]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;After installing the above software you can use the apache2ctl command to view the active sites configuration&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[sudo apache2ctl -S]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;or you can also list the files in /etc/apache2/sites-enabled&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[magnus@magnus-laptop:/etc/apache2/sites-enabled$ ls -al lrwxrwxrwx 1 root root&amp;nbsp;&amp;nbsp; 26 2010-02-19 07:34 000-default -&gt; ../sites-available/default ]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Before continue you can also check that everything is working by open a web browser and open http://localhost/ (Apache Web Server) and http://localhost:8080/ (Tomcat)&lt;br /&gt;&lt;br /&gt;Now we go ahead and creating a new virtual host that is going to act as reverse proxy.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[cd /etc/apache2/sites-available sudo gedit customerapp]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;virtualhost *:80=""&gt;&amp;nbsp; ServerName customerapp.msc.se&amp;nbsp; ServerAlias *.customer.msc.se&amp;nbsp; ProxyRequests Off&amp;nbsp; &lt;proxy *=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Order deny,allow&amp;nbsp;&amp;nbsp;&amp;nbsp; Allow from all&amp;nbsp; &lt;/proxy&gt;&amp;nbsp; ProxyPass / http://localhost:8080/examples/&amp;nbsp; ProxyPassReverse / http://localhost:8080/examples/&lt;/virtualhost&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;After creating the new site we need to link it from sites-enabled, either use ln -s or you can use the apache tool – a2ensite.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[sudo a2ensite customerapp]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;With the configuration in place, you need to separate the virtual host in customapp and default. For a locale environment you can separate them by using different IP – 127.0.0.1 and your computer IP.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;virtualhost 192.168.1.4:80=""&gt;&lt;virtualhost 127.0.0.1:80=""&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The last thing before restarting the Apache Web Server is to install proxy and proxy_http modules you can do that with the Apache tool a2enmod&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[sudo a2enmod proxysudo a2enmod proxy_http]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And finally you need to restart the Apache Web Server.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[sudo /etc/init.d/apache2 restart&lt;/virtualhost&gt;&lt;/virtualhost&gt;]]&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-2457523252044750686?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/2457523252044750686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=2457523252044750686&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2457523252044750686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2457523252044750686'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/02/configure-apache-web-server-as-reverse.html' title='Configure Apache Web Server as Reverse Proxy in front of a Tomcat or J2EE Container'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-3855514062827194524</id><published>2010-02-18T03:12:00.000+01:00</published><updated>2010-02-18T03:12:20.929+01:00</updated><title type='text'>Getting Started with JBoss Web Serivce using JAX-WS on JBoss 5.1 using Maven, OpenEJB and eviware soapUI</title><content type='html'>The easiest way to get started with writing Web Service is using Java API for XML Web Service, JAX-WS. The downside with this is that the creation of the WSDL file is automatic, and that is not the preferred way of writing cross platform independent web service. If that is your design goal, you should handwrite the WSDL, i.e. contract first. But if you know that the only clients are going to be Java client, than automatically generating the WSDL could be fine.&lt;br /&gt;&lt;br /&gt;A good practice when writing all kind of code, is to make the code testable and also make it testable outside the container. To achieve that I will use OpenEJB, if have never heard or used OpenEJB and you are writing EJB 3.0 applications, it is definitely worth the time to check it out. &lt;br /&gt;&lt;br /&gt;Lets start with writing a standard Stateless EJB.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.jbossws;import javax.ejb.Remote;import javax.jws.WebService;@Remotepublic interface HelloService { public String sayHello();}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.jbossws;import javax.ejb.Stateless;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;import javax.jws.soap.SOAPBinding.Style;@Statelesspublic class HelloServiceBean implements HelloService { @Override public String sayHello() {  return "Hello World."; }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;src/main/resources/META-INF/ejb-jar.xml&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0"&gt;&lt;/ejb-jar&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;src/main/resources/META-INF/jboss.xml&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;!-- &lt;jboss xmlns="http://www.jboss.com/xml/ns/javaee"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss_5_1.xsd"       version="3.0"&gt; --&gt;&lt;jboss&gt;        &lt;/jboss&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;pom.xml&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt; &lt;modelversion&gt;4.0.0&lt;/modelVersion&gt; &lt;groupid&gt;se.msc.example&lt;/groupId&gt; &lt;artifactid&gt;jbossws&lt;/artifactId&gt; &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt; &lt;packaging&gt;ejb&lt;/packaging&gt; &lt;name&gt;JBoss WS Test&lt;/name&gt; &lt;url&gt;http://www.msc.se/example/jbossws&lt;/url&gt; &lt;developers&gt;  &lt;developer&gt;   &lt;id&gt;magnus.k.karlsson&lt;/id&gt;   &lt;name&gt;Magnus K Karlsson&lt;/name&gt;   &lt;email&gt;magnus.k.karlsson@msc.se&lt;/email&gt;   &lt;organization&gt;MSC&lt;/organization&gt;  &lt;/developer&gt; &lt;/developers&gt; &lt;repositories&gt;  &lt;repository&gt;   &lt;id&gt;repository.jboss.org&lt;/id&gt;   &lt;name&gt;Jboss Repository for Maven&lt;/name&gt;   &lt;url&gt;http://repository.jboss.org/maven2/&lt;/url&gt;  &lt;/repository&gt; &lt;/repositories&gt; &lt;pluginrepositories&gt;  &lt;pluginrepository&gt;   &lt;id&gt;repository.jboss.org&lt;/id&gt;   &lt;name&gt;Jboss Repository for Maven&lt;/name&gt;   &lt;url&gt;http://repository.jboss.org/maven2/&lt;/url&gt;  &lt;/pluginRepository&gt; &lt;/pluginRepositories&gt; &lt;properties&gt;  &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;  &lt;jboss.home&gt;/home/magnus/applications/jboss-5.1.0.GA-jdk6&lt;/jboss.home&gt; &lt;/properties&gt; &lt;dependencies&gt;  &lt;!-- sun's ejb 3.0 api --&gt;  &lt;dependency&gt;   &lt;groupid&gt;javax.ejb&lt;/groupId&gt;   &lt;artifactid&gt;ejb-api&lt;/artifactId&gt;   &lt;version&gt;3.0&lt;/version&gt;   &lt;scope&gt;provided&lt;/scope&gt;  &lt;/dependency&gt;  &lt;!-- jboss logging impl (jboss 5.1.0 GA) --&gt;  &lt;dependency&gt;   &lt;groupid&gt;log4j&lt;/groupId&gt;   &lt;artifactid&gt;log4j&lt;/artifactId&gt;   &lt;version&gt;1.2.14&lt;/version&gt;   &lt;scope&gt;provided&lt;/scope&gt;  &lt;/dependency&gt;  &lt;!-- unit testing --&gt;  &lt;dependency&gt;   &lt;groupid&gt;junit&lt;/groupId&gt;   &lt;artifactid&gt;junit&lt;/artifactId&gt;   &lt;version&gt;4.7&lt;/version&gt;   &lt;scope&gt;test&lt;/scope&gt;  &lt;/dependency&gt; &lt;/dependencies&gt; &lt;build&gt;  &lt;finalname&gt;jbossws-example&lt;/finalName&gt;  &lt;plugins&gt;   &lt;!-- to compile with jdk 1.6 --&gt;   &lt;plugin&gt;    &lt;groupid&gt;org.apache.maven.plugins&lt;/groupId&gt;    &lt;artifactid&gt;maven-compiler-plugin&lt;/artifactId&gt;    &lt;version&gt;2.1&lt;/version&gt;    &lt;configuration&gt;     &lt;source&gt;1.6&lt;/source&gt;     &lt;target&gt;1.6&lt;/target&gt;    &lt;/configuration&gt;   &lt;/plugin&gt;   &lt;!-- ejb 3.0 plugin --&gt;   &lt;plugin&gt;    &lt;groupid&gt;org.apache.maven.plugins&lt;/groupId&gt;    &lt;artifactid&gt;maven-ejb-plugin&lt;/artifactId&gt;    &lt;version&gt;2.2&lt;/version&gt;    &lt;configuration&gt;     &lt;ejbversion&gt;3.0&lt;/ejbVersion&gt;    &lt;/configuration&gt;   &lt;/plugin&gt;   &lt;!-- plugin to harddeploy, hardundeploy, start and stop jboss --&gt;   &lt;plugin&gt;    &lt;groupid&gt;org.codehaus.mojo&lt;/groupId&gt;    &lt;artifactid&gt;jboss-maven-plugin&lt;/artifactId&gt;    &lt;version&gt;1.4&lt;/version&gt;    &lt;configuration&gt;     &lt;jbosshome&gt;${jboss.home}&lt;/jbossHome&gt;     &lt;servername&gt;default&lt;/serverName&gt;     &lt;port&gt;8080&lt;/port&gt;    &lt;/configuration&gt;   &lt;/plugin&gt;  &lt;/plugins&gt; &lt;/build&gt;&lt;/project&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now lets test our EJB with OpenEJB. The first thing we need to do, is to add the OpenEJB dependency to our pom.xml&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[  &lt;dependency&gt;   &lt;groupid&gt;org.apache.openejb&lt;/groupId&gt;   &lt;artifactid&gt;openejb-core&lt;/artifactId&gt;   &lt;version&gt;3.1.2&lt;/version&gt;   &lt;scope&gt;test&lt;/scope&gt;  &lt;/dependency&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Then we write our JUnit test case.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.jbossws;import static org.junit.Assert.assertEquals;import static org.junit.Assert.assertNotNull;import static org.junit.Assert.assertTrue;import java.util.Properties;import javax.naming.Context;import javax.naming.InitialContext;import org.junit.After;import org.junit.AfterClass;import org.junit.Before;import org.junit.BeforeClass;import org.junit.Test;public class HelloServiceStatelessTest { private InitialContext ctx; @BeforeClass public static void oneTimeSetUp() throws Exception { } @AfterClass public static void oneTimeTearDown() throws Exception { } @Before public void setUp() throws Exception {  Properties prop = new Properties();  prop.setProperty(Context.INITIAL_CONTEXT_FACTORY,    "org.apache.openejb.client.LocalInitialContextFactory");  ctx = new InitialContext(prop); } @After public void tearDown() throws Exception { } @Test public void testSayHello() throws Exception {  Object obj = ctx.lookup("HelloServiceBeanRemote");  assertNotNull(obj);  assertTrue(obj instanceof HelloService);  HelloService remote = (HelloService) obj;  assertEquals("Hello World.", remote.sayHello()); }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;After verifying that our Stateless Session Bean is working, we now continue to deploy it to the JBoss container.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[mvn clean install jboss:harddeploy]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;We start our JBoss container and checks that the EJB is successfully deployed.&lt;br /&gt;&lt;br /&gt;Now lets add Web Service support to our EJB.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.jbossws;import javax.ejb.Remote;import javax.jws.WebService;@Remote@WebService(targetNamespace = "http://www.msc.se/examples/jbossws/wsdl")public interface HelloService { public String sayHello();}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.jbossws;import javax.ejb.Stateless;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;import javax.jws.soap.SOAPBinding.Style;@Stateless@WebService(serviceName = "HelloService",   targetNamespace = "http://www.msc.se/examples/jbossws/wsdl",   endpointInterface = "se.msc.example.jbossws.HelloService")@SOAPBinding(style = Style.DOCUMENT)public class HelloServiceBean implements HelloService { @Override public String sayHello() {  return "Hello World."; }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now lets write our JUnit test case, to test our web service outside the JBoss container.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.jbossws;import static org.junit.Assert.assertEquals;import static org.junit.Assert.assertNotNull;import java.net.URL;import java.util.Properties;import javax.naming.Context;import javax.naming.InitialContext;import javax.xml.namespace.QName;import javax.xml.ws.Service;import org.junit.After;import org.junit.AfterClass;import org.junit.Before;import org.junit.BeforeClass;import org.junit.Test;public class HelloServiceWebServiceTest { private InitialContext ctx; @BeforeClass public static void oneTimeSetUp() throws Exception { } @AfterClass public static void oneTimeTearDown() throws Exception { } @Before public void setUp() throws Exception {  Properties prop = new Properties();  prop.setProperty(Context.INITIAL_CONTEXT_FACTORY,    "org.apache.openejb.client.LocalInitialContextFactory");  prop.setProperty("openejb.embedded.remotable", "true");  ctx = new InitialContext(prop); } @After public void tearDown() throws Exception { } @Test public void testWebService() throws Exception {  Service service = Service.create(    new URL("http://127.0.0.1:4204/HelloServiceBean?wsdl"),     new QName("http://www.msc.se/examples/jbossws/wsdl", "HelloService"));  assertNotNull(service);  HelloService hello = service.getPort(HelloService.class);  assertEquals("Hello World.", hello.sayHello()); }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Before running the testcase we need to update our pom.xml with a concrete web service implementation.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[  &lt;dependency&gt;   &lt;groupid&gt;org.apache.openejb&lt;/groupId&gt;   &lt;artifactid&gt;openejb-cxf&lt;/artifactId&gt;   &lt;version&gt;3.1.2&lt;/version&gt;   &lt;scope&gt;test&lt;/scope&gt;  &lt;/dependency&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;After running the testcase from withing Eclipse, we can now be confident that we our is executing as expected. Now lets deploy our EJB to the JBoss container.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[mvn clean install jboss:harddeploy]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;If you have stopped the JBoss, then restarted and verify that everything is looking healthy in the server log. Verify that the web service is working by firing up a web browser and go to http://localhost:8080/jbossws-example/HelloServiceBean?wsdl, to verify that you see the wsdl file.&lt;br /&gt;&lt;br /&gt;Instead of writing a web service client, we are going to use a good test tool for testing web service – eviware soapUI. Start the soapUI and then select new project.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DPdQE6b-uQw/S3yh1yE9J0I/AAAAAAAAAEA/XN6-BzcViS0/s1600-h/Screenshot-NewSoapUIProject.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DPdQE6b-uQw/S3yh1yE9J0I/AAAAAAAAAEA/XN6-BzcViS0/s320/Screenshot-NewSoapUIProject.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/_DPdQE6b-uQw/S3yh7g7l9uI/AAAAAAAAAEI/Ma9PYxuWoQc/s1600-h/Screenshot-GenerateTestSuite.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_DPdQE6b-uQw/S3yh7g7l9uI/AAAAAAAAAEI/Ma9PYxuWoQc/s320/Screenshot-GenerateTestSuite.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/_DPdQE6b-uQw/S3yh_uTZuxI/AAAAAAAAAEQ/nBaIKOBzWX0/s1600-h/Screenshot-soapUI3.5-beta1+.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_DPdQE6b-uQw/S3yh_uTZuxI/AAAAAAAAAEQ/nBaIKOBzWX0/s320/Screenshot-soapUI3.5-beta1+.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-3855514062827194524?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/3855514062827194524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=3855514062827194524&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3855514062827194524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3855514062827194524'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/02/getting-started-with-jboss-web-serivce.html' title='Getting Started with JBoss Web Serivce using JAX-WS on JBoss 5.1 using Maven, OpenEJB and eviware soapUI'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DPdQE6b-uQw/S3yh1yE9J0I/AAAAAAAAAEA/XN6-BzcViS0/s72-c/Screenshot-NewSoapUIProject.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-7848854808460181981</id><published>2010-02-17T22:27:00.000+01:00</published><updated>2010-02-17T22:27:28.064+01:00</updated><title type='text'>Viewing/Monitoring your Log4j Generated Log File with Chainsaw</title><content type='html'>&lt;a href="http://logging.apache.org/chainsaw/index.html" target="_blank"&gt;Chainsaw&lt;/a&gt; is a open source tool for viewing and/or monitoring Log4j generating system. But the documentation on the homepage lack some explanation how to get started. To begin with maybe the simplest scenario, to view a log4j generated log file. The first thing one might misunderstand is that you need to defines a new configuration file for Chainsaw, so just pointing to your log4j.xm configuration file is not enough. Lets start with a example.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd"&gt;&lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"&gt; &lt;appender name="FILE_APPENDER" class="org.apache.log4j.RollingFileAppender"&gt;  &lt;param name="File" value="/tmp/server.log" /&gt;  &lt;param name="Append" value="true" /&gt;  &lt;layout class="org.apache.log4j.PatternLayout"&gt;   &lt;param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n" /&gt;  &lt;/layout&gt; &lt;/appender&gt; &lt;logger name="se.msc.example.log4j.ChainsawTest"&gt;  &lt;level value="DEBUG" /&gt; &lt;/logger&gt; &lt;root&gt;  &lt;level value="ERROR" /&gt;  &lt;appender-ref ref="FILE_APPENDER" /&gt; &lt;/root&gt;&lt;/log4j:configuration&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And the configuration file for Chainsaw.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8" ?&gt;&lt;!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd"&gt; &lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true"&gt;   &lt;plugin name="logFileReceiver" class="org.apache.log4j.varia.LogFilePatternReceiver"&gt;     &lt;param name="fileURL" value="file:///tmp/server.log" /&gt;     &lt;param name="timestampFormat" value="yyyy-MM-d HH:mm:ss,SSS"/&gt;      &lt;param name="logFormat" value="TIMESTAMP LEVEL [THREAD] CLASS (FILE:LINE) - MESSAGE"/&gt;      &lt;param name="name" value="Reciever-name-in-Chainsaw" /&gt;     &lt;param name="tailing" value="true" /&gt;    &lt;/plugin&gt;   &lt;root&gt;      &lt;level value="debug"/&gt;   &lt;/root&gt;&lt;/log4j:configuration&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Before we open Chainsaw lets write a small test program, that generates some log post, so we have something to view.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.log4j;import org.apache.log4j.Logger;import org.junit.Test;public class ChainsawTest { private static final Logger log = Logger.getLogger(ChainsawTest.class);  @Test public void test() throws Exception {  log.debug("DEBUG text");  log.info("INFO text");  log.warn("WARN text");  log.error("ERROR text"); }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now lets open Chainsaw. When first starting Chainsaw you are prompted to define a Receiver. Here we select our configuration file.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_DPdQE6b-uQw/S3xe4zAWU_I/AAAAAAAAADw/S0phkMaJiwc/s1600-h/Screenshot-Warning-YouHaveNoReceiversDefined....png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_DPdQE6b-uQw/S3xe4zAWU_I/AAAAAAAAADw/S0phkMaJiwc/s320/Screenshot-Warning-YouHaveNoReceiversDefined....png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After selecting our Chainsaw configuration file, Chainsaw opens our log file in a new tab.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_DPdQE6b-uQw/S3xfBCzIhBI/AAAAAAAAAD4/heCoY2rgXjQ/s1600-h/Screenshot-Chainsaw_v2-LogViewer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_DPdQE6b-uQw/S3xfBCzIhBI/AAAAAAAAAD4/heCoY2rgXjQ/s320/Screenshot-Chainsaw_v2-LogViewer.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You might have already noticed the different formatting of logFormat attribute, compared with the Log4j and it is a question to me why they have done that. You can read more about the format in the  &lt;a href="http://logging.apache.org/log4j/companions/receivers/apidocs/org/apache/log4j/varia/LogFilePatternReceiver.html" target="_blank"&gt;LogFilePatternReceiver&lt;/a&gt; Javadoc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-7848854808460181981?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/7848854808460181981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=7848854808460181981&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7848854808460181981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7848854808460181981'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/02/viewingmonitoring-your-log4j-generated.html' title='Viewing/Monitoring your Log4j Generated Log File with Chainsaw'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DPdQE6b-uQw/S3xe4zAWU_I/AAAAAAAAADw/S0phkMaJiwc/s72-c/Screenshot-Warning-YouHaveNoReceiversDefined....png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-3622366497634434055</id><published>2010-02-14T01:12:00.000+01:00</published><updated>2010-02-14T01:12:16.113+01:00</updated><title type='text'>Sending Log Errors with Log4j and SMTPAppender</title><content type='html'>Log4j comes with several &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Appender.html" target="_blank"&gt;Appenders&lt;/a&gt; and if you like to send mail notification if severe errors occur the you will be pleased to see, that Log4j comes with a &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/net/SMTPAppender.html" target="_blank"&gt;SMTPAppender&lt;/a&gt;, but there are some pitfalls when using the SMTP appender:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The SMTP apppender does not out of the box support a different SMTP port.&lt;/li&gt;&lt;li&gt;Using secure connection, such as SSL or TLS.&lt;/li&gt;&lt;li&gt;The derived standardized method setThreshold is ignored, and replaced with TriggeringEventEvaluator class.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Configure SMTP appender to use a different port, than the default 25&lt;/b&gt;&lt;br /&gt;If your mailserver is configured to answer on a different port than the default 25 for SMTP, you need to configure the underlying javax.mail.Session property  "mail.smtp.port". But when looking at the API for SMTPAppender you see no set method for that. What to do? Writing you own extended log4j class? No, that is not neccessary. If you look at the source code of SMTPAppender, you see the following in the createSession():&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[props = new Properties (System.getProperties());]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;These means that SMTPAppender is reading system properties, which means you can add the following argument when starting you application.&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[-Dmail.smtp.port=587]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;This is a not gracefefully way, and sometimes also not applicable, because you are not in charge of the deployment environment. And what happens when you have two different application hosted on the same server, that wants to use different ports? &lt;br /&gt;There is also the oppurtunity to do it programmatically:&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[System.setProperty("mail.smtp.port", "587");]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;This has also drawbacks. For examaple if your application is a J2EE application or a web application your code is not the main start class. You can of course always write a boot strap class, but what happens when you have several bootstrap classes, then things starts to get more hard to overlook for a more junior programmer.  &lt;br /&gt;&lt;br /&gt;Another way if you have problems settings the System Property is to create a class that implements the interface org.apache.log4j.spi.TriggeringEventEvaluator and there set the system properties and then in your log4j properties or xml file override the default EvaluatorClass for SMTPAppender. This is a little hacky, but it will get the work done and it keeps your code clean from log4j configuration code that should in the first place be placed in the log4j configration file. &lt;br /&gt;&lt;br /&gt;Also what is lacking is, if you are deploying to a container you might want to define your java.mail.Session properties in the container and then bind them to JNDI, then it should be nice if Log4j could read these property from JNDI, but that is not possible. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using Secure Connection&lt;/b&gt;&lt;br /&gt;The next problem comes when your mailserver uses secure connection as TLS or SSL, then you need to add the following javax.mail.Session properties:&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[System.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");System.setProperty("mail.smtp.socketFactory.port", "465");System.setProperty("mail.smtp.socketFactory.fallback", "false");]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Bellow follows the source code for the example.&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[# configure the root loggerlog4j.rootLogger=INFO, STDOUT# configure the console appenderlog4j.appender.STDOUT=org.apache.log4j.ConsoleAppenderlog4j.appender.STDOUT.Target=System.outlog4j.appender.STDOUT.layout=org.apache.log4j.PatternLayoutlog4j.appender.STDOUT.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] %c:%L - %m%nlog4j.logger.se.msc.examples.log4j.Log4jNoSecureConnectionTest=ERROR, SMTP_NO_SECURE_CONNECTIONlog4j.appender.SMTP_NO_SECURE_CONNECTION.layout=org.apache.log4j.SimpleLayoutlog4j.appender.SMTP_NO_SECURE_CONNECTION=org.apache.log4j.net.SMTPAppender#log4j.appender.SMTP_NO_SECURE_CONNECTION.Bcc=# the maximum number of logging events to collect in a cyclic bufferlog4j.appender.SMTP_NO_SECURE_CONNECTION.BufferSize=1#log4j.appender.SMTP_NO_SECURE_CONNECTION.Cc=log4j.appender.SMTP_NO_SECURE_CONNECTION.From=system.alert@examples.msc.selog4j.appender.SMTP_NO_SECURE_CONNECTION.LocationInfo=truelog4j.appender.SMTP_NO_SECURE_CONNECTION.SMTPDebug=truelog4j.appender.SMTP_NO_SECURE_CONNECTION.SMTPHost=smtp.XXX.selog4j.appender.SMTP_NO_SECURE_CONNECTION.SMTPPassword=YYYlog4j.appender.SMTP_NO_SECURE_CONNECTION.SMTPUsername=ZZZlog4j.appender.SMTP_NO_SECURE_CONNECTION.Subject=System Alert NO SECURE CONNECTIONlog4j.appender.SMTP_NO_SECURE_CONNECTION.To=DDDlog4j.logger.se.msc.examples.log4j.Log4jTLSTest=ERROR, SMTP_TLSlog4j.appender.SMTP_TLS.layout=org.apache.log4j.SimpleLayoutlog4j.appender.SMTP_TLS=org.apache.log4j.net.SMTPAppender#log4j.appender.SMTP_TLS.Bcc=# the maximum number of logging events to collect in a cyclic bufferlog4j.appender.SMTP_TLS.BufferSize=1#log4j.appender.SMTP_TLS.Cc=log4j.appender.SMTP_TLS.From=system.alert@examples.msc.selog4j.appender.SMTP_TLS.LocationInfo=truelog4j.appender.SMTP_TLS.SMTPDebug=truelog4j.appender.SMTP_TLS.SMTPHost=smtp.gmail.comlog4j.appender.SMTP_TLS.SMTPPassword=FOOlog4j.appender.SMTP_TLS.SMTPUsername=foo.bar@gmail.comlog4j.appender.SMTP_TLS.Subject=System Alert TLSlog4j.appender.SMTP_TLS.To=foo.bar@gmail.com]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.log4j;import org.apache.log4j.Logger;import org.junit.Test;public class Log4jNoSecureConnectionTest { private static final Logger log = Logger.getLogger(Log4jNoSecureConnectionTest.class);  @Test public void testFoo() throws Exception {  // Either set smtp properties programmatically or via JVM argument -D  System.setProperty("mail.smtp.port", "587");  log.error("Fatal log message.", new NullPointerException("Null pointer exceptopn.")); }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[package se.msc.example.log4j;import org.apache.log4j.Logger;import org.junit.Test;public class Log4jTLSTest { private static final Logger log = Logger.getLogger(Log4jTLSTest.class);  @Test public void testFoo() throws Exception {  // Either set smtp properties programmatically or via JVM argument -D  System.setProperty("mail.smtp.port", "465");  System.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");  System.setProperty("mail.smtp.socketFactory.port", "465");  System.setProperty("mail.smtp.socketFactory.fallback", "false");  log.error("Fatal log message.", new NullPointerException("Null pointer exceptopn.")); }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script class="brush: js" type="syntaxhighlighter"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt; &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt; &lt;groupId&gt;se.msc.example&lt;/groupId&gt; &lt;artifactId&gt;log4j&lt;/artifactId&gt; &lt;packaging&gt;jar&lt;/packaging&gt; &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt; &lt;name&gt;Log4J Test&lt;/name&gt; &lt;url&gt;http://www.msc.se/example/log4j&lt;/url&gt; &lt;developers&gt;  &lt;developer&gt;   &lt;id&gt;magnus.k.karlsson&lt;/id&gt;   &lt;name&gt;Magnus K Karlsson&lt;/name&gt;   &lt;email&gt;magnus.k.karlsson@msc.se&lt;/email&gt;   &lt;organization&gt;MSC&lt;/organization&gt;  &lt;/developer&gt; &lt;/developers&gt; &lt;properties&gt;  &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt; &lt;/properties&gt; &lt;dependencies&gt;  &lt;dependency&gt;   &lt;groupId&gt;log4j&lt;/groupId&gt;   &lt;artifactId&gt;log4j&lt;/artifactId&gt;   &lt;version&gt;1.2.15&lt;/version&gt;  &lt;/dependency&gt;  &lt;!-- sun java mail --&gt;  &lt;dependency&gt;   &lt;groupId&gt;javax.mail&lt;/groupId&gt;   &lt;artifactId&gt;mail&lt;/artifactId&gt;   &lt;version&gt;1.4.1&lt;/version&gt;  &lt;/dependency&gt;    &lt;!-- unit testing --&gt;    &lt;dependency&gt;   &lt;groupId&gt;junit&lt;/groupId&gt;   &lt;artifactId&gt;junit&lt;/artifactId&gt;   &lt;version&gt;4.7&lt;/version&gt;   &lt;scope&gt;test&lt;/scope&gt;  &lt;/dependency&gt; &lt;/dependencies&gt; &lt;build&gt;  &lt;plugins&gt;   &lt;!-- to compile with JDK 1.6 --&gt;   &lt;plugin&gt;    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;    &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;    &lt;configuration&gt;     &lt;source&gt;1.6&lt;/source&gt;     &lt;target&gt;1.6&lt;/target&gt;    &lt;/configuration&gt;   &lt;/plugin&gt;  &lt;/plugins&gt; &lt;/build&gt;&lt;/project&gt;]]&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-3622366497634434055?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/3622366497634434055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=3622366497634434055&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3622366497634434055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/3622366497634434055'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/02/sending-log-errors-with-log4j-and.html' title='Sending Log Errors with Log4j and SMTPAppender'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-5678733336667960642</id><published>2010-02-01T18:55:00.000+01:00</published><updated>2010-02-01T18:55:41.058+01:00</updated><title type='text'>Java Generics Example Strategy Pattern</title><content type='html'>With Java Generics Java has continued its path to make it's language more strong typed, with comparison to all new dynamic language where they have thrown out strong typing. But Java Generics can also be hard to understand and one of the best example to show the main benefit with it is the strategy pattern. Lets start to look of a example.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_DPdQE6b-uQw/S2cUoyhA1NI/AAAAAAAAADo/zdBTcY_85oU/s1600-h/DomainDiagram.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_DPdQE6b-uQw/S2cUoyhA1NI/AAAAAAAAADo/zdBTcY_85oU/s320/DomainDiagram.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If we were using Java JDK 1.4 we have to do down-casting in the concrete strategy classes, but with Generics that is not necessary.&lt;br /&gt;&lt;br /&gt;The Strategy Context/Client&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: js"&gt;&lt;![CDATA[package se.msc.examples.generics;public abstract class Data&lt;D extends Data&lt;D&gt;&gt; { public static final Strategy&lt;FooData&gt; FOO_STRATEGY = new FooStrategy(); public static final Strategy&lt;BarData&gt; BAR_STRATEGY = new BarStrategy(); }]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The Strategy itself&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: js"&gt;&lt;![CDATA[package se.msc.examples.generics;public abstract class Strategy&lt;D extends Data&lt;?&gt;&gt; { public abstract String exec(D data); }]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And the extended Data classes&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: js"&gt;&lt;![CDATA[package se.msc.examples.generics;public class FooData extends Data&lt;FooData&gt; { public final double value;   public FooData(double value) {  this.value = value; } public double getValue() {  return value; }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And the extended Strategy&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: js"&gt;&lt;![CDATA[package se.msc.examples.generics;public class FooStrategy extends Strategy&lt;FooData&gt; { public String exec(FooData data) {  return "Hi " + data.getValue(); }}]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And our test class.&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: js"&gt;&lt;![CDATA[package se.msc.examples.generics;import static org.junit.Assert.*;import org.junit.After;import org.junit.AfterClass;import org.junit.Before;import org.junit.BeforeClass;import org.junit.Test;public class StrategyTest { @BeforeClass public static void oneTimeSetUp() throws Exception { } @AfterClass public static void oneTimeTearDown() { } @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public void testFooStrategy() throws Exception {  assertEquals("Hi 3.0", Data.FOO_STRATEGY.exec(new FooData(3))); }}]]&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-5678733336667960642?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/5678733336667960642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=5678733336667960642&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/5678733336667960642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/5678733336667960642'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/02/java-generics-example-strategy-pattern.html' title='Java Generics Example Strategy Pattern'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DPdQE6b-uQw/S2cUoyhA1NI/AAAAAAAAADo/zdBTcY_85oU/s72-c/DomainDiagram.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-1466056965943750012</id><published>2010-01-30T13:10:00.008+01:00</published><updated>2010-01-30T20:14:13.172+01:00</updated><title type='text'>Maven Reporting with Cobertura, Dashboard, Change Report, FindBugs and PMD</title><content type='html'>I have been using &lt;a href="http://mojo.codehaus.org/cobertura-maven-plugin/" target="_blank"&gt;maven coberture plugin&lt;/a&gt; before but it has one unimplemented function, aggregate cobertura report from multiple module. This can be solved by &lt;a href="http://mojo.codehaus.org/sonar-maven-plugin/" target="_blank"&gt;sonar&lt;/a&gt; and &lt;a href="http://mojo.codehaus.org/dashboard-maven-plugin/" target="_blank"&gt;dashboard maven plugin&lt;/a&gt;, but Sonar requires that is run on a server, i.e. that you have a continuous integration server, but in some cases you have not got there and still is building your application locally than you can use the maven Dashboard plugin.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The parent pom.xml&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: js"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8" ?&gt;&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt; &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt; &lt;groupId&gt;se.msc.examples&lt;/groupId&gt; &lt;artifactId&gt;reporting-parent&lt;/artifactId&gt; &lt;version&gt;0.1-SNAPSHOT&lt;/version&gt; &lt;packaging&gt;pom&lt;/packaging&gt; &lt;url&gt;http://www.msc.se/examples&lt;/url&gt;    &lt;organization&gt;        &lt;name&gt;Msc.se&lt;/name&gt;    &lt;/organization&gt;    &lt;developers&gt;     &lt;developer&gt;      &lt;name&gt;Magnus K Karlsson&lt;/name&gt;      &lt;email&gt;magnus.k.karlsson@msc.se&lt;/email&gt;     &lt;/developer&gt;    &lt;/developers&gt;     &lt;modules&gt;  &lt;module&gt;reporting-demo&lt;/module&gt;  &lt;module&gt;reporting-core&lt;/module&gt; &lt;/modules&gt;  &lt;dependencies&gt;  &lt;dependency&gt;   &lt;groupId&gt;junit&lt;/groupId&gt;   &lt;artifactId&gt;junit&lt;/artifactId&gt;   &lt;version&gt;3.8.2&lt;/version&gt;   &lt;scope&gt;test&lt;/scope&gt;  &lt;/dependency&gt; &lt;/dependencies&gt; &lt;build&gt;  &lt;plugins&gt;   &lt;plugin&gt;    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;    &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;    &lt;version&gt;2.0.2&lt;/version&gt;    &lt;configuration&gt;     &lt;source&gt;1.5&lt;/source&gt;     &lt;target&gt;1.5&lt;/target&gt;     &lt;encoding&gt;UTF-8&lt;/encoding&gt;    &lt;/configuration&gt;   &lt;/plugin&gt;  &lt;/plugins&gt; &lt;/build&gt; &lt;reporting&gt;  &lt;plugins&gt;   &lt;!-- Generate 'Changes Report' from src/changes/changes.xml --&gt;   &lt;plugin&gt;    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;    &lt;artifactId&gt;maven-changes-plugin&lt;/artifactId&gt;    &lt;version&gt;2.3&lt;/version&gt;    &lt;reportSets&gt;     &lt;reportSet&gt;      &lt;reports&gt;       &lt;report&gt;changes-report&lt;/report&gt;      &lt;/reports&gt;     &lt;/reportSet&gt;    &lt;/reportSets&gt;   &lt;/plugin&gt;   &lt;!-- JXR - Source code as HTML --&gt;    &lt;plugin&gt;    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;    &lt;artifactId&gt;maven-jxr-plugin&lt;/artifactId&gt;    &lt;version&gt;2.1&lt;/version&gt;    &lt;configuration&gt;     &lt;!-- Enable aggregation for multimodule projects. --&gt;     &lt;aggregate&gt;true&lt;/aggregate&gt;     &lt;inputEncoding&gt;utf-8&lt;/inputEncoding&gt;     &lt;outputEncoding&gt;utf-8&lt;/outputEncoding&gt;    &lt;/configuration&gt;   &lt;/plugin&gt;   &lt;!-- JavaDoc - API-documentation --&gt;   &lt;plugin&gt;    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;    &lt;artifactId&gt;maven-javadoc-plugin&lt;/artifactId&gt;    &lt;version&gt;2.6.1&lt;/version&gt;     &lt;configuration&gt;     &lt;!-- Enable aggregation for multimodule projects. --&gt;     &lt;aggregate&gt;true&lt;/aggregate&gt;                    &lt;show&gt;public&lt;/show&gt;                    &lt;charset&gt;utf-8&lt;/charset&gt;                    &lt;docencoding&gt;utf-8&lt;/docencoding&gt;                    &lt;encoding&gt;utf-8&lt;/encoding&gt;         &lt;/configuration&gt;   &lt;/plugin&gt;   &lt;!-- Surefire - JUnit testing--&gt;   &lt;plugin&gt;    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;    &lt;artifactId&gt;maven-surefire-report-plugin&lt;/artifactId&gt;    &lt;version&gt;2.5&lt;/version&gt;    &lt;configuration&gt;     &lt;!-- Required to properly link JXR --&gt;     &lt;xrefLocation&gt;${project.reporting.outputDirectory}/../xref-test&lt;/xrefLocation&gt;    &lt;/configuration&gt;   &lt;/plugin&gt;   &lt;!-- JDepend - Package dependencies --&gt;   &lt;plugin&gt;    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;    &lt;artifactId&gt;jdepend-maven-plugin&lt;/artifactId&gt;    &lt;version&gt;2.0-beta-2&lt;/version&gt;   &lt;/plugin&gt;   &lt;!-- Cobertura - Test code coverage report. --&gt;   &lt;plugin&gt;    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;    &lt;artifactId&gt;cobertura-maven-plugin&lt;/artifactId&gt;    &lt;version&gt;2.3&lt;/version&gt;   &lt;/plugin&gt;      &lt;!-- PMD - Generate PMD and CPD reports using the PMD code analysis tool. --&gt;            &lt;plugin&gt;             &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;                &lt;artifactId&gt;maven-pmd-plugin&lt;/artifactId&gt;                &lt;version&gt;2.4&lt;/version&gt;                &lt;configuration&gt;                 &lt;linkXref&gt;true&lt;/linkXref&gt;                 &lt;!-- Required to properly link JXR --&gt;     &lt;xrefLocation&gt;${project.reporting.outputDirectory}/../xref-test&lt;/xrefLocation&gt;                 &lt;sourceEncoding&gt;utf-8&lt;/sourceEncoding&gt;                    &lt;aggregate&gt;true&lt;/aggregate&gt;                    &lt;targetJdk&gt;1.5&lt;/targetJdk&gt;                &lt;/configuration&gt;            &lt;/plugin&gt;               &lt;!-- FindBugs - Finds potential bugs in your source code --&gt;   &lt;plugin&gt;    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;    &lt;artifactId&gt;findbugs-maven-plugin&lt;/artifactId&gt;    &lt;version&gt;2.3&lt;/version&gt;    &lt;configuration&gt;     &lt;xmlOutput&gt;true&lt;/xmlOutput&gt;     &lt;effort&gt;Max&lt;/effort&gt;    &lt;/configuration&gt;   &lt;/plugin&gt;   &lt;!-- JavaNCSS - Source code metrics --&gt;   &lt;plugin&gt;    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;    &lt;artifactId&gt;javancss-maven-plugin&lt;/artifactId&gt;    &lt;version&gt;2.0&lt;/version&gt;   &lt;/plugin&gt;   &lt;!-- TagList - Creates a list with TODO:s etc --&gt;   &lt;plugin&gt;    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;    &lt;artifactId&gt;taglist-maven-plugin&lt;/artifactId&gt;    &lt;version&gt;2.4&lt;/version&gt;                &lt;configuration&gt;                    &lt;aggregate&gt;true&lt;/aggregate&gt;                    &lt;tags&gt;                        &lt;tag&gt;TODO&lt;/tag&gt;                        &lt;tag&gt;FIXME&lt;/tag&gt;                        &lt;tag&gt;@todo&lt;/tag&gt;                    &lt;/tags&gt;                &lt;/configuration&gt;       &lt;/plugin&gt;   &lt;!-- The dashboard plugin should be specified as the last report. --&gt;   &lt;plugin&gt;    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;    &lt;artifactId&gt;dashboard-maven-plugin&lt;/artifactId&gt;    &lt;version&gt;1.0.0-beta-1&lt;/version&gt;   &lt;/plugin&gt;  &lt;/plugins&gt; &lt;/reporting&gt;&lt;/project&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The jar module pom.xml&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: js"&gt;&lt;![CDATA[&lt;?xml version="1.0" encoding="UTF-8" ?&gt;&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt; &lt;parent&gt;  &lt;groupid&gt;se.msc.examples&lt;/groupId&gt;  &lt;artifactid&gt;reporting-parent&lt;/artifactId&gt;  &lt;version&gt;0.1-SNAPSHOT&lt;/version&gt; &lt;/parent&gt; &lt;modelversion&gt;4.0.0&lt;/modelVersion&gt; &lt;artifactid&gt;reporting-demo&lt;/artifactId&gt; &lt;packaging&gt;jar&lt;/packaging&gt; &lt;name&gt;Demo Reporting&lt;/name&gt; &lt;reporting&gt;  &lt;!-- Needed in order to generate the dashboard report properly. --&gt;  &lt;outputdirectory&gt;            ${basedir}/../target/site/${project.artifactId}        &lt;/outputDirectory&gt; &lt;/reporting&gt;&lt;/project&gt;]]&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-1466056965943750012?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/1466056965943750012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=1466056965943750012&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1466056965943750012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1466056965943750012'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2010/01/maven-reporting-with-cobertura.html' title='Maven Reporting with Cobertura, Dashboard, Change Report, FindBugs and PMD'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-2596094929127170775</id><published>2009-12-14T23:37:00.000+01:00</published><updated>2009-12-14T23:37:11.500+01:00</updated><title type='text'>How to handle XML Schema Version?</title><content type='html'>&lt;b&gt;Use the Schema verison attribute.&lt;/b&gt;&lt;br /&gt;Pros:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Simple&lt;/li&gt;&lt;/ul&gt;Cons:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No XML Schema enforcement when stepping version and version number is concealed for user.&lt;/li&gt;&lt;/ul&gt;Recommendation:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Do no use.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Change the Schema location and keep the namespace.&lt;/b&gt;&lt;br /&gt;Pros:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Good för maintaining backward compability. No depending XML files needs to be altered, simply upgrade implementing jar.&lt;/li&gt;&lt;/ul&gt;Cons: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cannot tell from the XML file which implementing jar version is used.&lt;/li&gt;&lt;/ul&gt;Recommendation:&lt;ul&gt;&lt;li&gt;Use this technique to handle minor version upgrade.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Example:&lt;br /&gt;http://camel.apache.org/schema/spring/camel-spring-1.6.X.xsd, in version 1.6.0-1.6.3 is the same &lt;i&gt;targetNamespace&lt;/i&gt; used.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Change the Schema location and the namespace.&lt;/b&gt;&lt;br /&gt;Pros:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Forces the user to upgrade the client code, when stepping version. Hard versioning control, no chanse to make misstake.&lt;/li&gt;&lt;/ul&gt;Cons:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No seamless upgrade. Upgrade will cost.&lt;/li&gt;&lt;/ul&gt;Recommendation:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use this when stepping major version.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;For you using JAXB, is it a good reminder that the namspace versionnumber is direclty reflected in the package name. So when uppgrading and if the depending generated code has changed namespace, i.e. package name will the depending code not compile. This can be a advantage since it will directly be apparent where in your code you have the dependencies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-2596094929127170775?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/2596094929127170775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=2596094929127170775&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2596094929127170775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2596094929127170775'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/12/how-to-handle-xml-schema-version.html' title='How to handle XML Schema Version?'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8941917070848550716</id><published>2009-12-14T22:29:00.000+01:00</published><updated>2009-12-14T22:29:42.047+01:00</updated><title type='text'>XML Schema Design Pattern - Handling Versioning and Reuse</title><content type='html'>In my last project I have been working with service orientated integration and ESB, in such an architecture the domain model is represented with a canonical model of a XML schema. There several way you can design your schema which I will describe bellow, but what is more imported is the implication it has on:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Level of possibility to &lt;i&gt;reuse&lt;/i&gt; your canonical model in different service.&lt;/li&gt;&lt;li&gt;Level of possibility to handle different &lt;i&gt;version&lt;/i&gt; of same service.&lt;/li&gt;&lt;li&gt;Level of possibility to split your &lt;i&gt;canonical data model&lt;/i&gt; into bit of pieces and process them in parallel.&lt;/li&gt;&lt;/ul&gt;Before laying out the different patterns I will explain different definition that I will use when evaluating the different patterns&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Definition:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Root element&lt;/i&gt; – the first element a XML must contain. If a schema contains several root element it is possible to slice the XML document into several new XML document.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Global element&lt;/i&gt; – the elements that directly comes after the root element, possibly elements are  'element', 'complexType' and 'simpleType'.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Local element&lt;/i&gt; – nested element inside global element.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Russian Doll Example&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Pros:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;One root element, good for encapsulation.&lt;/li&gt;&lt;li&gt;All elements are local and encapsulated.&lt;/li&gt;&lt;/ul&gt;Cons:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No reuse of elements.&lt;/li&gt;&lt;li&gt;Easier to get started with.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Example Book-RussianDoll-v1.0.0.xsd&lt;/b&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" &lt;br /&gt;     targetNamespace="http://ns.msc.se/examples/book-russiandoll/v1_0_0"&lt;br /&gt;     xmlns:russ="http://ns.msc.se/examples/book-russiandoll/v1_0_0" &lt;br /&gt;     elementFormDefault="qualified"&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;xs:element name="book"&amp;gt;&lt;br /&gt;  &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;   &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="Title" type="xs:string" /&amp;gt;&lt;br /&gt;    &amp;lt;xs:choice&amp;gt;&lt;br /&gt;     &amp;lt;xs:element name="AuthorList" minOccurs="0" maxOccurs="unbounded"&amp;gt;&lt;br /&gt;      &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;       &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;        &amp;lt;xs:element name="Author"&amp;gt;&lt;br /&gt;         &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;          &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;           &amp;lt;xs:element name="givenName" type="xs:string" /&amp;gt;&lt;br /&gt;          &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;         &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;        &amp;lt;/xs:element&amp;gt;&lt;br /&gt;       &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;      &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;     &amp;lt;/xs:element&amp;gt;&lt;br /&gt;    &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;   &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;  &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt; &amp;lt;/xs:element&amp;gt; &lt;br /&gt; &lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Salami Slide&lt;/b&gt;&lt;br /&gt;Pros&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Many root elements, the XML file can be sliced into numerous ways.&lt;/li&gt;&lt;li&gt;All elements are global, which allows reuse in other Schemas.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Cons&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Does not encapsulate and hide the schema.&lt;/li&gt;&lt;li&gt;Usage of namespaces are almost a most, which makes usage more complex.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Example Book-SalamiSlice-v1.0.0.xsd&lt;/b&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" &lt;br /&gt;     targetNamespace="http://ns.msc.se/examples/book-salamislice/v1_0_0"&lt;br /&gt;     xmlns:salv1_0_0="http://ns.msc.se/examples/book-salamislice/v1_0_0" &lt;br /&gt;     elementFormDefault="qualified"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;xs:element name="book"&amp;gt;&lt;br /&gt;  &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;   &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;xs:element ref="salv1_0_0:Title" /&amp;gt;&lt;br /&gt;    &amp;lt;xs:element ref="salv1_0_0:AuthorList" /&amp;gt;&lt;br /&gt;   &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;  &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt; &amp;lt;/xs:element&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;xs:element name="Title" type="xs:string" /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;xs:element name="AuthorList"&amp;gt;&lt;br /&gt;  &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;   &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;xs:element ref="salv1_0_0:Author" minOccurs="0" maxOccurs="unbounded" /&amp;gt;&lt;br /&gt;   &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;  &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt; &amp;lt;/xs:element&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;xs:element name="Author"&amp;gt;&lt;br /&gt;  &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;   &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;xs:element ref="salv1_0_0:GivenName" /&amp;gt;&lt;br /&gt;    &amp;lt;xs:element ref="salv1_0_0:Surname" /&amp;gt;&lt;br /&gt;   &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;  &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt; &amp;lt;/xs:element&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;xs:element name="GivenName" type="xs:string" /&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;xs:element name="Surname" type="xs:string" /&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;When generating code via JAXB, wee can see that several classes are annotated with the @XmlRootElement. This says that we have several possible root element.&lt;br /&gt;&lt;br /&gt;In the next example we show how to handle version and extending previous schema version.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example Book-SalamiSlice-v1.0.1.xsd&lt;/b&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" &lt;br /&gt;     targetNamespace="http://ns.msc.se/examples/book-salamislice/v1_0_1"&lt;br /&gt;     xmlns:salv1_0_0="http://ns.msc.se/examples/book-salamislice/v1_0_0"&lt;br /&gt;     xmlns:salv1_0_1="http://ns.msc.se/examples/book-salamislice/v1_0_1" &lt;br /&gt;     elementFormDefault="qualified"&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;xs:import namespace="http://ns.msc.se/examples/book-salamislice/v1_0_0" schemaLocation="Book-SalamiSlice-v1.0.0.xsd" /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;xs:element name="book"&amp;gt;&lt;br /&gt;  &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;   &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;xs:element ref="salv1_0_1:Title" /&amp;gt;&lt;br /&gt;    &amp;lt;xs:element ref="salv1_0_1:Category" /&amp;gt;&lt;br /&gt;    &amp;lt;xs:element ref="salv1_0_0:AuthorList" /&amp;gt;&lt;br /&gt;   &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;  &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt; &amp;lt;/xs:element&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;xs:element name="Title"&amp;gt;&lt;br /&gt;  &amp;lt;xs:simpleType&amp;gt;&lt;br /&gt;   &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;    &amp;lt;xs:minLength value="3" /&amp;gt;&lt;br /&gt;   &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt; &amp;lt;/xs:element&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;xs:element name="Category" type="xs:string" /&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Venetian Blind&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Pros:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Only one root element, good for encapsulation.&lt;/li&gt;&lt;li&gt;All element are global, which allows reuse in other Schemas. &lt;/li&gt;&lt;/ul&gt;Cons: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Usage of namespaces are almost a most, which makes usage more complex.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Example Book-VenetianBlind-v1.0.0.xsd&lt;/b&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" &lt;br /&gt;     targetNamespace="http://ns.msc.se/examples/book-venetianblind/v1_0_0"&lt;br /&gt;     xmlns:ven="http://ns.msc.se/examples/book-venetianblind/v1_0_0" &lt;br /&gt;     elementFormDefault="qualified"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;xs:element name="Book"&amp;gt;&lt;br /&gt;  &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;   &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="Title" type="ven:TitleType" /&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="AuthorList" type="ven:AuthorListType" /&amp;gt;&lt;br /&gt;   &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;  &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt; &amp;lt;/xs:element&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;xs:simpleType name="TitleType"&amp;gt;&lt;br /&gt;  &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;  &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt; &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;xs:complexType name="AuthorListType"&amp;gt;&lt;br /&gt;  &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;   &amp;lt;xs:element name="Author" type="ven:AuthorType" minOccurs="0" maxOccurs="unbounded" /&amp;gt;&lt;br /&gt;  &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt; &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;xs:complexType name="AuthorType"&amp;gt;&lt;br /&gt;  &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;   &amp;lt;xs:element name="GivenName" type="ven:GivenNameType" /&amp;gt;&lt;br /&gt;   &amp;lt;xs:element name="Surname" type="ven:SurnameType" /&amp;gt;&lt;br /&gt;  &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt; &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;xs:simpleType name="GivenNameType"&amp;gt;&lt;br /&gt;  &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;  &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt; &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;xs:simpleType name="SurnameType"&amp;gt;&lt;br /&gt;  &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;  &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt; &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Example Book-VenetianBlind-v1.0.1.xsd&lt;/b&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" &lt;br /&gt;     targetNamespace="http://ns.msc.se/examples/book-venetianblind/v1_0_1"&lt;br /&gt;     xmlns:ven1_0_0="http://ns.msc.se/examples/book-venetianblind/v1_0_0"&lt;br /&gt;     xmlns:ven1_0_1="http://ns.msc.se/examples/book-venetianblind/v1_0_1" &lt;br /&gt;     elementFormDefault="qualified"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;xs:import namespace="http://ns.msc.se/examples/book-venetianblind/v1_0_0" schemaLocation="Book-VenetianBlind-v1.0.0.xsd" /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;xs:element name="Book"&amp;gt;&lt;br /&gt;  &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;   &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="Title" type="ven1_0_1:TitleType" nillable="true" /&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="Category" type="ven1_0_1:CategoryType" nillable="true" /&amp;gt;&lt;br /&gt;    &amp;lt;xs:element name="AuthorList" type="ven1_0_0:AuthorListType" /&amp;gt;&lt;br /&gt;   &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;  &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt; &amp;lt;/xs:element&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;xs:simpleType name="TitleType"&amp;gt;&lt;br /&gt;  &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;  &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt; &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;xs:simpleType name="CategoryType"&amp;gt;&lt;br /&gt;  &amp;lt;xs:restriction base="xs:string"&amp;gt;&lt;br /&gt;   &amp;lt;xs:enumeration value="SPORT" /&amp;gt;&lt;br /&gt;   &amp;lt;xs:enumeration value="COOKING" /&amp;gt;&lt;br /&gt;   &amp;lt;xs:enumeration value="PROGRAMMING" /&amp;gt;&lt;br /&gt;  &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt; &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;When starting of thinking of Schema one come to the conclusion that schema design is much like tradition OO design, where one must always consider if a properties and method should be hidden or exposed to other classes. The same yields for Schemas and in the real world one would scarcely use just one design pattern, but rather combine them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8941917070848550716?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8941917070848550716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8941917070848550716&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8941917070848550716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8941917070848550716'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/12/xml-schema-design-pattern-handling.html' title='XML Schema Design Pattern - Handling Versioning and Reuse'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-1099503024755145925</id><published>2009-11-02T20:31:00.000+01:00</published><updated>2009-11-02T20:31:37.270+01:00</updated><title type='text'>Problem Running Eclipse in Ubuntu 9.10 Karmic Koala</title><content type='html'>After upgrading to Ubuntu 9.10, Eclipse started to behave strangely. Button seams to be non-responsive, so I googled for a solution and came up with this link.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.norio.be/blog/2009/10/problems-eclipse-buttons-ubuntu-910" target="_blank"&gt;http://www.norio.be/blog/2009/10/problems-eclipse-buttons-ubuntu-910&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-1099503024755145925?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/1099503024755145925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=1099503024755145925&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1099503024755145925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1099503024755145925'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/11/problem-running-eclipse-in-ubuntu-910.html' title='Problem Running Eclipse in Ubuntu 9.10 Karmic Koala'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-5433928962320636734</id><published>2009-11-01T00:14:00.001+01:00</published><updated>2009-11-01T00:14:39.454+01:00</updated><title type='text'>Writing to Syslog with Log4J and Testing It on Ubuntu 9.04 Jaunty</title><content type='html'>The preferred way to log in Linux is to write to the Syslog. For you that comes from the Windows world, Syslog is the equivalent for the Windows NT Event Log. Before you can ran the example below you need to enable Syslog Facility LOCAL1 on Ubuntu. The Facility can be looked as a filter and if you are running multiple programs on the same server, you might want to consider to let each program write to different Facility LOCAL[0-7].&lt;br /&gt;&lt;br /&gt;To enable Facility LOCAL1 on Ubuntu 9.04 you first need to edit /etc/syslog.conf&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;gt;sudo gedit /etc/syslog.conf &amp;amp;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and add the following line&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;local1.*   /var/log/local1.log&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But we are not done yet, since Log4J &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/net/SyslogAppender.html" target="_blank"&gt;org.apache.log4j.net.SyslogAppender&lt;/a&gt; is using the underlying writer class &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/helpers/SyslogWriter.html" target="_blank"&gt;org.apache.log4j.helpers.SyslogWriter&lt;/a&gt; that is using the &lt;a href="http://java.sun.com/javase/6/docs/api/java/net/DatagramPacket.html" target="_blank"&gt;java.net.DatagramPacket&lt;/a&gt; which is writing to the syslog remotely, we need to enable remote access to Syslog. We do that by changing:&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;gt;sudo gedit /etc/default/syslogd &amp;amp;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And changing the following:&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;SYSLOGD="-r"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now we are done and we need to restarts the system log daemon, to make our changes take affect:&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;gt;sudo /etc/init.d/sysklogd restart&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finally we add the following configuration to our log4j.properties.&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;# configure the root logger&lt;br /&gt;log4j.rootLogger=INFO, STDOUT, DAILY, SYSLOG_LOCAL1&lt;br /&gt;&lt;br /&gt;# configure Syslog facility LOCAL1 appender&lt;br /&gt;log4j.appender.SYSLOG_LOCAL1=org.apache.log4j.net.SyslogAppender&lt;br /&gt;log4j.appender.SYSLOG_LOCAL1.threshold=WARN&lt;br /&gt;log4j.appender.SYSLOG_LOCAL1.syslogHost=localhost&lt;br /&gt;log4j.appender.SYSLOG_LOCAL1.facility=LOCAL1&lt;br /&gt;log4j.appender.SYSLOG_LOCAL1.facilityPrinting=false&lt;br /&gt;log4j.appender.SYSLOG_LOCAL1.layout=org.apache.log4j.PatternLayout&lt;br /&gt;log4j.appender.SYSLOG_LOCAL1.layout.conversionPattern=[%p] %c:%L - %m%n&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-5433928962320636734?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/5433928962320636734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=5433928962320636734&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/5433928962320636734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/5433928962320636734'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/10/writing-to-syslog-with-log4j-and.html' title='Writing to Syslog with Log4J and Testing It on Ubuntu 9.04 Jaunty'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-1838873278207440943</id><published>2009-11-01T00:14:00.000+01:00</published><updated>2009-11-01T00:14:27.754+01:00</updated><title type='text'>Maven2 Reference Literature</title><content type='html'>For some time the best book on Maven2 was “Better Builds with Maven” which can be downloaded from &lt;a href="http://www.maestrodev.com/better-build-maven" target="_blank"&gt;http://www.maestrodev.com/better-build-maven&lt;/a&gt;, but now there is finally a more updated book, “Maven: The Definitive Guide“. Which is available from&lt;br /&gt;&lt;a href="http://www.sonatype.com/books/maven-book/reference/public-book.html" target="_blank"&gt;&lt;br /&gt;http://www.sonatype.com/books/maven-book/reference/public-book.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-1838873278207440943?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/1838873278207440943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=1838873278207440943&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1838873278207440943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1838873278207440943'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/10/maven2-reference-literature.html' title='Maven2 Reference Literature'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-6022370219460290019</id><published>2009-11-01T00:13:00.000+01:00</published><updated>2009-11-01T00:13:02.045+01:00</updated><title type='text'>The Promising Standardized JSR 303 Bean Validation and Example of Usage</title><content type='html'>For too long have the Java world lived without a standardized bean validation specification and soon will the final approval hopefully be approved (2 Nov 2009). What does this imply?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Better Domain Driven Design, by putting the shallow domain validation in the POJO where it belongs.&lt;/li&gt;&lt;li&gt;Hopefully we can finally get rid of Value Objects Pattern which is a dark heritage from the EJB 2.1 age and instead use domain POJO beans through out our architecture. There is of course exception to this rule, e.g. in service layer where the exposed model is totally different than the domain model or in a UI layer with heavy usage of line charts, there an OO model does not fit into a point orientation representation.&lt;/li&gt;&lt;/ol&gt;What is still to be proven is how the specification will fit into other framework, such as JPA, Apache Wicket or Spring Remoting. But one can rest ashore if one is using the standard validation model, the odds increase dramatically. And presumably will big framework such as Spring Framework and Apache Wicket adjust there framework to the standard.&lt;br /&gt;&lt;br /&gt;Here follows a simple example of the usage of Bean Validation.&lt;br /&gt;&lt;br /&gt;pom.xml&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="&lt;br /&gt;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;se.msc.examples&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;validation-domain&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;Validation :: Domain&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;url&amp;gt;http://www.msc.se/examples/validation&amp;lt;/url&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;properties&amp;gt;&lt;br /&gt;&amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;&lt;br /&gt;&amp;lt;/properties&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;repositories&amp;gt;&lt;br /&gt;&amp;lt;repository&amp;gt;&lt;br /&gt;&amp;lt;id&amp;gt;repository.jboss.org&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;lt;url&amp;gt;http://repository.jboss.org/maven2&amp;lt;/url&amp;gt;&lt;br /&gt;&amp;lt;releases&amp;gt;&lt;br /&gt;&amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;&lt;br /&gt;&amp;lt;/releases&amp;gt;&lt;br /&gt;&amp;lt;snapshots&amp;gt;&lt;br /&gt;&amp;lt;enabled&amp;gt;false&amp;lt;/enabled&amp;gt;&lt;br /&gt;&amp;lt;/snapshots&amp;gt;&lt;br /&gt;&amp;lt;/repository&amp;gt;&lt;br /&gt;&amp;lt;/repositories&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&amp;lt;!-- common logging library --&amp;gt;&lt;br /&gt;&amp;lt;!-- version is depended on hibernate-annotations v3.4.0.GA --&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;http://repo1.maven.org/maven2/org/hibernate/hibernate-annotations/3.4.0.GA/hibernate-annotations-3.4.0.GA.pom&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;1.4.2&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;!-- sun bean validation api --&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;javax.validation&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;validation-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;1.0.0.GA&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;!-- hibernate bean validation impl --&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;hibernate-validator&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;4.0.0.GA&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;!-- test support --&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;4.7&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;build&amp;gt;&lt;br /&gt;&amp;lt;defaultGoal&amp;gt;install&amp;lt;/defaultGoal&amp;gt;&lt;br /&gt;&amp;lt;plugins&amp;gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;source&amp;gt;1.6&amp;lt;/source&amp;gt;&lt;br /&gt;&amp;lt;target&amp;gt;1.6&amp;lt;/target&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&amp;lt;/plugins&amp;gt;&lt;br /&gt;&amp;lt;/build&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;package se.msc.examples.validation.domain;&lt;br /&gt;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;&lt;br /&gt;import javax.validation.constraints.NotNull;&lt;br /&gt;import javax.validation.constraints.Pattern;&lt;br /&gt;import javax.validation.constraints.Size;&lt;br /&gt;&lt;br /&gt;public class Person implements Serializable {&lt;br /&gt;private static final long serialVersionUID = 1L;&lt;br /&gt;private Long personId;&lt;br /&gt;private String firstName;&lt;br /&gt;@NotNull&lt;br /&gt;@Size(min=1)&lt;br /&gt;private String surname;&lt;br /&gt;@NotNull&lt;br /&gt;@Pattern(regexp=".+@.+\\.[a-z]+")&lt;br /&gt;private String mail;&lt;br /&gt;&lt;br /&gt;public Long getPersonId() {&lt;br /&gt;return personId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void setPersonId(Long personId) {&lt;br /&gt;this.personId = personId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getFirstName() {&lt;br /&gt;return firstName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setFirstName(String firstName) {&lt;br /&gt;this.firstName = firstName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getSurname() {&lt;br /&gt;return surname;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setSurname(String surname) {&lt;br /&gt;this.surname = surname;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getMail() {&lt;br /&gt;return mail;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setMail(String mail) {&lt;br /&gt;this.mail = mail;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;package se.msc.examples.validation.domain;&lt;br /&gt;&lt;br /&gt;import static org.junit.Assert.*;&lt;br /&gt;&lt;br /&gt;import java.util.Set;&lt;br /&gt;&lt;br /&gt;import javax.validation.ConstraintViolation;&lt;br /&gt;import javax.validation.Validation;&lt;br /&gt;import javax.validation.Validator;&lt;br /&gt;&lt;br /&gt;import org.junit.After;&lt;br /&gt;import org.junit.AfterClass;&lt;br /&gt;import org.junit.Before;&lt;br /&gt;import org.junit.BeforeClass;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;&lt;br /&gt;public class PersonTest {&lt;br /&gt;private Validator validator;&lt;br /&gt;private Person person;&lt;br /&gt;&lt;br /&gt;@BeforeClass&lt;br /&gt;public static void oneTimeSetUp() throws Exception {  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@AfterClass&lt;br /&gt;public static void oneTimeTearDown() throws Exception {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Before&lt;br /&gt;public void setUp() throws Exception {&lt;br /&gt;validator = Validation.buildDefaultValidatorFactory().getValidator();&lt;br /&gt;person = new Person();&lt;br /&gt;person.setFirstName("Magnus K");&lt;br /&gt;person.setSurname("Karlsson");&lt;br /&gt;person.setMail("magnus.k.karlsson@domain.se");  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@After&lt;br /&gt;public void tearDown() throws Exception {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private &lt;t&gt; void debugPrint(Set&lt;constraintviolation&gt;&lt;t&gt;&amp;gt; violations) {&lt;br /&gt;for (ConstraintViolation&lt;t&gt; violation : violations) {&lt;br /&gt;String propertyPath = violation.getPropertyPath().toString();&lt;br /&gt;String message = violation.getMessage();&lt;br /&gt;System.out.println("invalid value for: '" + propertyPath + "': " + message);&lt;br /&gt;}  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testValidate_OK() throws Exception {&lt;br /&gt;Set&lt;constraintviolation&gt;&lt;person&gt;&amp;gt; violations = validator.validate(person);&lt;br /&gt;assertTrue(violations.size() == 0);&lt;br /&gt;debugPrint(violations);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testValidate_FAIL_MAIL() throws Exception {&lt;br /&gt;person.setMail("magnus.k.karlsson@domain");&lt;br /&gt;Set&lt;constraintviolation&gt;&lt;person&gt;&amp;gt; violations = validator.validate(person);&lt;br /&gt;assertTrue(violations.size() == 1);&lt;br /&gt;debugPrint(violations);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testValidate_FAIL_SURNAME() throws Exception {&lt;br /&gt;person.setSurname(null);&lt;br /&gt;Set&lt;constraintviolation&gt;&lt;person&gt;&amp;gt; violations1 = validator.validate(person);&lt;br /&gt;assertTrue(violations1.size() == 1);&lt;br /&gt;debugPrint(violations1);&lt;br /&gt;&lt;br /&gt;person.setSurname("");&lt;br /&gt;Set&lt;constraintviolation&gt;&lt;person&gt;&amp;gt; violations2 = validator.validate(person);&lt;br /&gt;assertTrue(violations2.size() == 1);&lt;br /&gt;debugPrint(violations2);  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/person&gt;&lt;/constraintviolation&gt;&lt;/person&gt;&lt;/constraintviolation&gt;&lt;/person&gt;&lt;/constraintviolation&gt;&lt;/person&gt;&lt;/constraintviolation&gt;&lt;/t&gt;&lt;/t&gt;&lt;/constraintviolation&gt;&lt;/t&gt;&lt;/pre&gt;&lt;br /&gt;The resource bundle message ValidationMessages.properties&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;javax.validation.constraints.Null.message=must be null&lt;br /&gt;javax.validation.constraints.NotNull.message=must not be null&lt;br /&gt;javax.validation.constraints.AssertTrue.message=must be true&lt;br /&gt;javax.validation.constraints.AssertFalse.message=must be false&lt;br /&gt;javax.validation.constraints.Min.message=must be greater than or equal to {value}&lt;br /&gt;javax.validation.constraints.Max.message=must be less than or equal to {value}&lt;br /&gt;javax.validation.constraints.Size.message=size must be between {min} and {max}&lt;br /&gt;javax.validation.constraints.Digits.message=numeric value out of bounds (&amp;lt;{integer} digits&amp;gt;.&amp;lt;{fraction} digits&amp;gt; expected)&lt;br /&gt;javax.validation.constraints.Past.message=must be a past date&lt;br /&gt;javax.validation.constraints.Future.message=must be a future date&lt;br /&gt;javax.validation.constraints.Pattern.message=must match the following regular expression: {regexp}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;References:&lt;/span&gt;&lt;br /&gt;JSR 303: Bean Validation&lt;br /&gt;&lt;a href="http://jcp.org/en/jsr/detail?id=303" target="_blank"&gt;http://jcp.org/en/jsr/detail?id=303&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Article comparing JSR 303 Reference Implementation And Spring 2.5 Validation &lt;br /&gt;&lt;a href="http://blog.jteam.nl/2009/08/04/bean-validation-integrating-jsr-303-with-spring/" target="_blank"&gt;http://blog.jteam.nl/2009/08/04/bean-validation-integrating-jsr-303-with-spring/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;JSR 303 Reference Material&lt;br /&gt;&lt;a href="http://people.redhat.com/%7Eebernard/validation/" target="_blank"&gt;http://people.redhat.com/~ebernard/validation/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;JSR 303 Specification Leads Emmanuel Bernard Blog&lt;br /&gt;&lt;a href="http://in.relation.to/Bloggers/Emmanuel" target="_blank"&gt;http://in.relation.to/Bloggers/Emmanuel&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-6022370219460290019?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/6022370219460290019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=6022370219460290019&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6022370219460290019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6022370219460290019'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/10/promising-standardized-jsr-303-bean.html' title='The Promising Standardized JSR 303 Bean Validation and Example of Usage'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-4396528108488977367</id><published>2009-11-01T00:12:00.000+01:00</published><updated>2009-11-01T00:12:24.456+01:00</updated><title type='text'>Integrate JSR 303 Bean Validation And ApacheWicket</title><content type='html'>In my previous &lt;a href="http://magnus-k-karlsson.blogspot.com/2009/10/promising-standardized-jsr-303-bean.html" target="_blank"&gt;blog&lt;/a&gt; I was writing about the new promising standard &lt;a href="http://jcp.org/en/jsr/detail?id=303" target="_blank"&gt;JSR 303 Bean Validation&lt;/a&gt;. In this article I will write about JSR 303 Bean Validation and &lt;a href="http://wicket.apache.org/" target="_blank"&gt;Apache Wicket&lt;/a&gt;. Let start with recapitulate the domain object Person and see how we used the Bean Validation annotation to annotate our property constraints.&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;package se.msc.examples.validation.domain;&lt;br /&gt;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;&lt;br /&gt;import javax.persistence.Column;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.GeneratedValue;&lt;br /&gt;import javax.persistence.GenerationType;&lt;br /&gt;import javax.persistence.Id;&lt;br /&gt;import javax.validation.constraints.NotNull;&lt;br /&gt;import javax.validation.constraints.Pattern;&lt;br /&gt;import javax.validation.constraints.Size;&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;public class Person implements Serializable {&lt;br /&gt;private static final long serialVersionUID = 1L;&lt;br /&gt;@Id&lt;br /&gt;@GeneratedValue(strategy = GenerationType.AUTO)&lt;br /&gt;private Long personId;&lt;br /&gt;@NotNull&lt;br /&gt;@Size(min = 1, max = 250)&lt;br /&gt;@Column(length = 250)&lt;br /&gt;private String givenName;&lt;br /&gt;@NotNull&lt;br /&gt;@Size(min = 1)&lt;br /&gt;@Column(length = 250)&lt;br /&gt;private String surname;&lt;br /&gt;@NotNull&lt;br /&gt;@Pattern(regexp = ".+@.+\\.[a-z]+")&lt;br /&gt;@Column(length = 250)&lt;br /&gt;private String mail;&lt;br /&gt;&lt;br /&gt;public Long getPersonId() {&lt;br /&gt;return personId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void setPersonId(Long personId) {&lt;br /&gt;this.personId = personId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getGivenName() {&lt;br /&gt;return givenName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setGivenName(String givenName) {&lt;br /&gt;this.givenName = givenName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getSurname() {&lt;br /&gt;return surname;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setSurname(String surname) {&lt;br /&gt;this.surname = surname;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getMail() {&lt;br /&gt;return mail;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setMail(String mail) {&lt;br /&gt;this.mail = mail;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This time I also have added sun's JPA annotation, because this is a domain object and sooner we want the domain objects to be persisted. We also the see that there is an overlap between the Bean Validation annotation and the JPA annotation. My approach to these is to use an open constraint approach for persistence and a narrowing/stricter definition with the Bean Validation for the domain layer. This way enables us to have a more flexible database, DBA would probably argue that this leads to bad data quality, but since we are building in validation directly in our domain object and writing small and easy to run unit test, to test these validation, there are no risk against bad data quality slipping through to the persistence layer. Actually we are protecting bad data to even reach the persistence layer long before, first in the presentation layer, but also we will use the same Bean Validation in the service layer. And all validation using the same code, the Bean Validation annotation, no more inventing the wheel over and over again in the different layers.&lt;br /&gt;&lt;br /&gt;So how do we use the Bean Validation with the Apache Wicket? Well, there is no out-of-box integration, so I have written a few helper classes that will do that for us. These helper classes are actually worth using already how ever you will be using Bean Validation or not in your next project, because Apache Wicket is really to low-tech, like Swing, and when writing Apache Wicket classes from ground up requires you to write quite lengthy masses of code, this is not good. So lets start with our helper classes for writing org.apache.wicket.markup.html.form.Form.&lt;br /&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;package se.msc.examples;&lt;br /&gt;&lt;br /&gt;import org.apache.wicket.markup.html.form.Button;&lt;br /&gt;import org.apache.wicket.markup.html.form.Form;&lt;br /&gt;import org.apache.wicket.markup.html.form.TextField;&lt;br /&gt;import org.apache.wicket.model.CompoundPropertyModel;&lt;br /&gt;import org.apache.wicket.model.LoadableDetachableModel;&lt;br /&gt;&lt;br /&gt;public class FormBuilder&amp;lt;T&amp;gt; extends Form&amp;lt;T&amp;gt; {&lt;br /&gt;private static final long serialVersionUID = 1L;&lt;br /&gt;public static final String SUBMIT = "submit";&lt;br /&gt;&lt;br /&gt;public FormBuilder(final String id, final T modelObject) {&lt;br /&gt;super(id, new CompoundPropertyModel&amp;lt;T&amp;gt;(new LoadableDetachableModel&amp;lt;T&amp;gt;(&lt;br /&gt;modelObject) {&lt;br /&gt;private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;protected T load() {&lt;br /&gt;return modelObject;&lt;br /&gt;}&lt;br /&gt;}));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void addTextField(final String propertyName) {&lt;br /&gt;TextField&amp;lt;T&amp;gt; textField = new TextField&amp;lt;T&amp;gt;(propertyName);&lt;br /&gt;textField.add(new BeanValidator&amp;lt;T&amp;gt;(getModelObject(), propertyName));&lt;br /&gt;add(textField);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void addSubmitButton(final FormButtonListener&amp;lt;T&amp;gt; listener) {&lt;br /&gt;final FormBuilder&amp;lt;T&amp;gt; parent = this;&lt;br /&gt;add(new Button(SUBMIT) {&lt;br /&gt;private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;public void onSubmit() {&lt;br /&gt;parent.execSubmit(listener);&lt;br /&gt;}&lt;br /&gt;});&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Form&amp;lt;T&amp;gt; create() {&lt;br /&gt;return this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void execSubmit(final FormButtonListener&amp;lt;T&amp;gt; listener) {&lt;br /&gt;listener.onSubmit(getModelObject());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;package se.msc.examples;&lt;br /&gt;&lt;br /&gt;import java.util.Set;&lt;br /&gt;&lt;br /&gt;import javax.validation.ConstraintViolation;&lt;br /&gt;import javax.validation.Validation;&lt;br /&gt;import javax.validation.Validator;&lt;br /&gt;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;import org.apache.wicket.validation.INullAcceptingValidator;&lt;br /&gt;import org.apache.wicket.validation.IValidatable;&lt;br /&gt;import org.apache.wicket.validation.ValidationError;&lt;br /&gt;&lt;br /&gt;public class BeanValidator&amp;lt;T&amp;gt; implements INullAcceptingValidator&amp;lt;T&amp;gt; {&lt;br /&gt;private static final long serialVersionUID = 1L;&lt;br /&gt;private static final Logger log = Logger.getLogger(BeanValidator.class);&lt;br /&gt;private final Class&amp;lt;T&amp;gt; beanClass;&lt;br /&gt;private final String propertyName;&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("unchecked")&lt;br /&gt;public BeanValidator(final T beanObject, final String propertyName) {&lt;br /&gt;this.beanClass = (Class&amp;lt;T&amp;gt;) beanObject.getClass();&lt;br /&gt;this.propertyName = propertyName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void validate(IValidatable&amp;lt;T&amp;gt; validatable) {&lt;br /&gt;log.info("validate... " + validatable.getValue());&lt;br /&gt;ReflectionUtil&amp;lt;T&amp;gt; util = new ReflectionUtil&amp;lt;T&amp;gt;();&lt;br /&gt;T beanObject = util.createInstance(beanClass);&lt;br /&gt;util.setPropertyValue(beanObject, propertyName, validatable.getValue());&lt;br /&gt;Validator validator = Validation.buildDefaultValidatorFactory().getValidator();&lt;br /&gt;Set&amp;lt;ConstraintViolation&amp;lt;T&amp;gt;&amp;gt; violations = validator.validateProperty(beanObject, propertyName);&lt;br /&gt;for (ConstraintViolation&amp;lt;T&amp;gt; violation : violations) {&lt;br /&gt;String propertyPath = violation.getPropertyPath().toString();&lt;br /&gt;String message = violation.getMessage();&lt;br /&gt;log.error("invalid value for: '" + propertyPath + "': " + message);&lt;br /&gt;&lt;br /&gt;ValidationError validationError = new ValidationError();&lt;br /&gt;validationError.setMessage(message);&lt;br /&gt;validatable.error(validationError);&lt;br /&gt;}  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public String toString() {&lt;br /&gt;return "[BeanValidator beanObject='" + beanClass + "']";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lets now see how we use it in our Apache Wicket controller class.&lt;br /&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;package se.msc.examples;&lt;br /&gt;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;import org.apache.wicket.PageParameters;&lt;br /&gt;import org.apache.wicket.markup.html.WebPage;&lt;br /&gt;import org.apache.wicket.markup.html.form.Form;&lt;br /&gt;import org.apache.wicket.markup.html.panel.FeedbackPanel;&lt;br /&gt;&lt;br /&gt;import se.msc.examples.validation.domain.Person;&lt;br /&gt;&lt;br /&gt;public class PersonEditPage extends WebPage implements FormButtonListener&amp;lt;Person&amp;gt; {&lt;br /&gt;private static final long serialVersionUID = 1L;&lt;br /&gt;private static final Logger log = Logger.getLogger(PersonEditPage.class);&lt;br /&gt;protected static final String FEEDBACK_PANEL = "feedbackPanel";&lt;br /&gt;protected static final String PERSON_FORM = "personForm";&lt;br /&gt;protected static final String GIVEN_NAME = "givenName";&lt;br /&gt;&lt;br /&gt;public PersonEditPage(final PageParameters parameters) {&lt;br /&gt;log.info("PersonPage...");&lt;br /&gt;add(new FeedbackPanel(FEEDBACK_PANEL));&lt;br /&gt;add(createForm(new Person()));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private Form&amp;lt;Person&amp;gt; createForm(Person person) {&lt;br /&gt;FormBuilder&amp;lt;Person&amp;gt; builder = new FormBuilder&amp;lt;Person&amp;gt;(PERSON_FORM, person);&lt;br /&gt;builder.addTextField(GIVEN_NAME);&lt;br /&gt;builder.addSubmitButton(this);&lt;br /&gt;return builder.create();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void onSubmit(Person modelObject) {&lt;br /&gt;log.info("onSubmit " + modelObject);&lt;br /&gt;info("Successfully created '" + modelObject.getGivenName() + "'.");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And the accompanying html file&lt;br /&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"&lt;br /&gt;xml:lang="en" lang="en"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Person Edit Page&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div id="feedbackPanel" wicket:id="feedbackPanel"&amp;gt;Feedback Panel&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;form id="personForm" wicket:id="personForm"&amp;gt;&lt;br /&gt;&amp;lt;fieldset style="width: 30em"&amp;gt;&lt;br /&gt;&amp;lt;legend&amp;gt;Person Edit&amp;lt;/legend&amp;gt;&lt;br /&gt;&amp;lt;table border="1" style="width: 100%"&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td align="right"&amp;gt;Given Name:&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;input id="givenName" wicket:id="givenName" type="text" style="width: 98%" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td colspan="2" align="right"&amp;gt;&lt;br /&gt;&amp;lt;button id="submit" wicket:id="submit" type="submit"&amp;gt;Submit&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now lets write a simple test case to test our Apache Wicket validation.&lt;br /&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;package se.msc.examples;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import junit.framework.TestCase;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import org.apache.wicket.markup.html.form.Form;&lt;br /&gt;&lt;br /&gt;import org.apache.wicket.markup.html.panel.FeedbackPanel;&lt;br /&gt;&lt;br /&gt;import org.apache.wicket.util.tester.FormTester;&lt;br /&gt;&lt;br /&gt;import org.apache.wicket.util.tester.WicketTester;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class PersonEditPageTest extends TestCase {&lt;br /&gt;&lt;br /&gt;private WicketTester tester;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;&lt;br /&gt;public void setUp() throws Exception {&lt;br /&gt;&lt;br /&gt;tester = new WicketTester(new WicketApplication());&lt;br /&gt;&lt;br /&gt;tester.startPage(PersonEditPage.class);&lt;br /&gt;&lt;br /&gt;tester.assertRenderedPage(PersonEditPage.class);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void testLayout() throws Exception {&lt;br /&gt;&lt;br /&gt;tester.assertComponent(PersonEditPage.FEEDBACK_PANEL,&lt;br /&gt;&lt;br /&gt;FeedbackPanel.class);&lt;br /&gt;&lt;br /&gt;tester.assertComponent(PersonEditPage.PERSON_FORM, Form.class);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void testCreate_OK() throws Exception {&lt;br /&gt;&lt;br /&gt;FormTester form = tester.newFormTester(PersonEditPage.PERSON_FORM);&lt;br /&gt;&lt;br /&gt;form.setValue(PersonEditPage.GIVEN_NAME, "Magnus");&lt;br /&gt;&lt;br /&gt;form.submit(FormBuilder.SUBMIT);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;tester.assertRenderedPage(PersonEditPage.class);&lt;br /&gt;&lt;br /&gt;tester.assertNoErrorMessage();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void testCreate_GIVENNAME_FAIL() throws Exception {&lt;br /&gt;&lt;br /&gt;FormTester form = tester.newFormTester(PersonEditPage.PERSON_FORM);&lt;br /&gt;&lt;br /&gt;form.setValue(PersonEditPage.GIVEN_NAME, "");&lt;br /&gt;&lt;br /&gt;form.submit(FormBuilder.SUBMIT);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;tester.assertRenderedPage(PersonEditPage.class);&lt;br /&gt;&lt;br /&gt;tester.assertErrorMessages(new String[] { "Field givenName is required." });&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;form = tester.newFormTester(PersonEditPage.PERSON_FORM);&lt;br /&gt;&lt;br /&gt;form.setValue(PersonEditPage.GIVEN_NAME, " ");&lt;br /&gt;&lt;br /&gt;form.submit(FormBuilder.SUBMIT);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;tester.assertRenderedPage(PersonEditPage.class);&lt;br /&gt;&lt;br /&gt;tester.assertErrorMessages(new String[] { "Field givenName is required." });  &lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-4396528108488977367?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/4396528108488977367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=4396528108488977367&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4396528108488977367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4396528108488977367'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/10/integrate-jsr-303-bean-validation-and.html' title='Integrate JSR 303 Bean Validation And ApacheWicket'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8988023660092184977</id><published>2009-10-19T21:12:00.002+02:00</published><updated>2009-11-01T00:14:57.438+01:00</updated><title type='text'>How to Install Swedish Dictionary and Thesaurus for Open Office Writer</title><content type='html'>If you have installed a English distribution of Ubuntu you have already Open Office installed, but with no Swedish dictionary or Thesaurus. Do this to install:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Open Office Writer.&lt;/li&gt;&lt;li&gt;Select Tools-&amp;gt;Language-&amp;gt;More Dictionaries Online...&lt;/li&gt;&lt;li&gt;Download the two wanted files Dictionary and Thesaurus. Now you have to oxt-files on your computer.&lt;/li&gt;&lt;li&gt;Select Tools-&amp;gt;Extension Manager and click Add then select oxt-file.&lt;/li&gt;&lt;li&gt;Restart Open Office and from Tools-&amp;gt;Language-&amp;gt;For All Text-&amp;gt;More. In the window select installed language for selected document.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8988023660092184977?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8988023660092184977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8988023660092184977&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8988023660092184977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8988023660092184977'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/10/how-to-install-swedish-dictionary-and.html' title='How to Install Swedish Dictionary and Thesaurus for Open Office Writer'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-7768659852931650963</id><published>2009-10-19T20:33:00.003+02:00</published><updated>2009-11-01T00:15:10.998+01:00</updated><title type='text'>Clearlook Theme for Ubuntu – Clearlooks OSX</title><content type='html'>In the beginning I found it quite hard to find new themes, that was compatible with the standard Ubuntu way to install theme, i.e. from  System-&amp;gt;Preferences-&amp;gt;Appearance.&lt;br /&gt;&lt;br /&gt;But yesterday I found a nice OSX look that is not so grey as Mac OSX, it is also packaged in the standard Ubuntu installation way.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gnome-look.org/content/show.php/ClearlooksOSX?content=69487"&gt;http://www.gnome-look.org/content/show.php/ClearlooksOSX?content=69487&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_DPdQE6b-uQw/StyxEyZoeMI/AAAAAAAAADc/9Yv_nQSLuWs/s1600-h/Screenshot-Appearance+Preferences.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5394381149489887426" src="http://2.bp.blogspot.com/_DPdQE6b-uQw/StyxEyZoeMI/AAAAAAAAADc/9Yv_nQSLuWs/s320/Screenshot-Appearance+Preferences.png" style="cursor: pointer; display: block; height: 276px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-7768659852931650963?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/7768659852931650963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=7768659852931650963&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7768659852931650963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7768659852931650963'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/10/clearlook-theme-for-ubuntu-clearlooks.html' title='Clearlook Theme for Ubuntu – Clearlooks OSX'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DPdQE6b-uQw/StyxEyZoeMI/AAAAAAAAADc/9Yv_nQSLuWs/s72-c/Screenshot-Appearance+Preferences.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-2520332749795889881</id><published>2009-10-19T20:14:00.005+02:00</published><updated>2009-11-01T00:15:19.913+01:00</updated><title type='text'>How to Enable Code Completion and Syntax Control Against XML Schema with Eclipse</title><content type='html'>When I was writing Apache Camel configuration XML files, I was frustrated over that I had no code completion or XML syntax check against Apache Camel Schema, but of source is that doable in Eclipse. Simple download the Schema to your computer and then open Eclipe:&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;Window-&amp;gt;Preferences-&amp;gt;XML-&amp;gt;XML Catalog&lt;br /&gt;&lt;/pre&gt;Click on Add and File System and select the downloaded Schema.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_DPdQE6b-uQw/StyslE1vNtI/AAAAAAAAADU/MTm-hBC3Pm8/s1600-h/Untitled.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5394376206637283026" src="http://2.bp.blogspot.com/_DPdQE6b-uQw/StyslE1vNtI/AAAAAAAAADU/MTm-hBC3Pm8/s320/Untitled.png" style="cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 224px;" /&gt;&lt;/a&gt;Now you can right-click in your XML file and select Validate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-2520332749795889881?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/2520332749795889881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=2520332749795889881&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2520332749795889881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2520332749795889881'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/10/how-to-enable-code-completion-and.html' title='How to Enable Code Completion and Syntax Control Against XML Schema with Eclipse'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DPdQE6b-uQw/StyslE1vNtI/AAAAAAAAADU/MTm-hBC3Pm8/s72-c/Untitled.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-2913583874214942887</id><published>2009-10-11T21:18:00.002+02:00</published><updated>2009-11-01T00:15:28.031+01:00</updated><title type='text'>Presentation for "Efficient J2EE Development with JPA, EJB3, Wicket, Maven2 and JBoss 5"</title><content type='html'>For some ago I held a presentation for "Efficient J2EE Development with JPA, EJB3, Wicket, Maven2 and JBoss 5" and here comes the material:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://docs.google.com/fileview?id=0BxdWn5V3EudmNmRiNGEyZGMtMDFjZC00Zjg4LWJiYWEtODJmNDE1MGI5OTM5&amp;amp;hl=en" target="_blank"&gt;http://docs.google.com/fileview?id=0BxdWn5V3EudmNmRiNGEyZGMtMDFjZC00Zjg4LWJiYWEtODJmNDE1MGI5OTM5&amp;amp;hl=en&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-2913583874214942887?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/2913583874214942887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=2913583874214942887&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2913583874214942887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/2913583874214942887'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/10/presentation-for-efficient-j2ee.html' title='Presentation for &quot;Efficient J2EE Development with JPA, EJB3, Wicket, Maven2 and JBoss 5&quot;'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-6389949188880977038</id><published>2009-10-11T20:56:00.002+02:00</published><updated>2009-11-01T00:15:38.148+01:00</updated><title type='text'>Presentation for "Integration solutions with agile framework and Enterprise Service Bus, ESB"</title><content type='html'>Here comes the presentation for the "Integration solutions with agile framework and Enterprise Service Bus, ESB" seminar I held for some time ago.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://docs.google.com/fileview?id=0BxdWn5V3EudmY2U3MGYxNGMtMGE0NS00NzhiLTk2Y2QtMDI4OWI5YTA4YTlk&amp;amp;hl=en" target="_blank"&gt;http://docs.google.com/fileview?id=0BxdWn5V3EudmY2U3MGYxNGMtMGE0NS00NzhiLTk2Y2QtMDI4OWI5YTA4YTlk&amp;amp;hl=en&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-6389949188880977038?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/6389949188880977038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=6389949188880977038&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6389949188880977038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6389949188880977038'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/10/presentation-for-frukostseminarium.html' title='Presentation for &quot;Integration solutions with agile framework and Enterprise Service Bus, ESB&quot;'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8906069645975904424</id><published>2009-09-29T19:41:00.005+02:00</published><updated>2009-11-01T00:15:49.756+01:00</updated><title type='text'>Getting rid of notification “Network service discovery disabled” in Ubunut 9.04</title><content type='html'>After installing the latest Ubuntu I have haunted with the annoying notification “Network service discovery disabled. You current network has a .local domain, which is not recommended and incompatible with the Avahi network service discovery. The service has been disabled.”&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_DPdQE6b-uQw/SsJG6W5QRYI/AAAAAAAAADM/mvDVjFva_LQ/s1600-h/NetworkServiceDiscoveryDisabled.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5386946072680613250" src="http://2.bp.blogspot.com/_DPdQE6b-uQw/SsJG6W5QRYI/AAAAAAAAADM/mvDVjFva_LQ/s320/NetworkServiceDiscoveryDisabled.png" style="cursor: pointer; display: block; height: 194px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;First of all I have to google what Avahi is and found the following short summary here:&lt;a href="https://help.ubuntu.com/community/HowToZeroconf" target="_blank"&gt; https://help.ubuntu.com/community/HowToZeroconf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After that, I got rid of the notification message, by removing the below file and then starting the Avahi service, since some files where not properly auto-created during installation.&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;sudo rm /var/run/avahi-daemon/disabled-for-unicast-local&lt;br /&gt;sudo /etc/ini.d/avahi-daemon start&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After that I disabled the Avahi service, because I could not see any reason to autostart it when Ubuntu booted. You can disabled auto-services from System-&amp;gt;Administration-&amp;gt;Services. The last thing I did was to reboot and the problem was gone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8906069645975904424?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8906069645975904424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8906069645975904424&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8906069645975904424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8906069645975904424'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/09/getting-rid-of-notification-network.html' title='Getting rid of notification “Network service discovery disabled” in Ubunut 9.04'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DPdQE6b-uQw/SsJG6W5QRYI/AAAAAAAAADM/mvDVjFva_LQ/s72-c/NetworkServiceDiscoveryDisabled.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-9007784212752764082</id><published>2009-08-24T21:26:00.003+02:00</published><updated>2009-11-01T00:15:57.153+01:00</updated><title type='text'>Firefox 3.5 brakes Eclipse 3.4</title><content type='html'>In mine previous blog I was writing about how to install &lt;a href="http://magnus-k-karlsson.blogspot.com/2009/08/installing-firefox-35-on-ubunut-904.html" target="_blank"&gt;Firefox 3.5 on Ubuntu 9.04&lt;/a&gt;, but that also had some unwanted side effect - it broke the Eclipse 3.4 installation!! Read more about &lt;a href="http://hello-world-2-0.blogspot.com/2009/08/firefox-upgrade-broke-eclipse.html" target="_blank"&gt;http://hello-world-2-0.blogspot.com/2009/08/firefox-upgrade-broke-eclipse.html&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-9007784212752764082?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/9007784212752764082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=9007784212752764082&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/9007784212752764082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/9007784212752764082'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/08/firefox-35-brakes-eclipse-34.html' title='Firefox 3.5 brakes Eclipse 3.4'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-6933277666952020804</id><published>2009-08-24T03:09:00.005+02:00</published><updated>2009-11-01T00:16:03.949+01:00</updated><title type='text'>Configure Log4J DailyRollingFileAppender with custom PatternLayout</title><content type='html'>For some time I haven been planning to learn the mystic configuration of the org.apache.log4j.PatternLayout for Log4j and finally I have taken the time to do so.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;c - The calling class name, if giving without precision is the fully qualified name returned.&lt;/li&gt;&lt;li&gt;C - The fully qualified class name.&lt;/li&gt;&lt;li&gt;d - The date of the logging request, can be formatted with java.text.SimpleDateFormat, i.e.  %d{yyyy-MM-dd}&lt;/li&gt;&lt;li&gt;F - The name of the calling File.&lt;/li&gt;&lt;li&gt;l - The location information, same as %C%M(%F:%L). This can be slow.&lt;/li&gt;&lt;li&gt;L - The calling class line number&lt;/li&gt;&lt;li&gt;m - The logging message.&lt;/li&gt;&lt;li&gt;M - The calling class method.&lt;/li&gt;&lt;li&gt;n - The platform dependent line separator.&lt;/li&gt;&lt;li&gt;p - The logging Level.&lt;/li&gt;&lt;li&gt;r - The relative date in millisecond since application start.&lt;/li&gt;&lt;li&gt;t - The invoking thread.&lt;/li&gt;&lt;li&gt;[x|X] - the Message Diagnostic (MDC) information. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Now for some example. To be compliant with large open-source project such as Hibernate Annotation we use SLF4J as Logger interface. To use SLF4J, simply add the following to your Maven pom.xml&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;version&amp;gt;1.4.2&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And if we run 'mvn dependency:tree', we see that the artifact also contains the log4j.jar implementation.&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;[INFO] Scanning for projects...&lt;br /&gt;&lt;br /&gt;[INFO] Searching repository for plugin with prefix: 'dependency'.&lt;br /&gt;&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;[INFO] Building Log4J Test&lt;br /&gt;&lt;br /&gt;[INFO]    task-segment: [dependency:tree]&lt;br /&gt;&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;[INFO] [dependency:tree]&lt;br /&gt;&lt;br /&gt;[INFO] se.msc.development:log4j-test:jar:1.0-SNAPSHOT&lt;br /&gt;&lt;br /&gt;[INFO] +- org.slf4j:slf4j-log4j12:jar:1.4.2:compile&lt;br /&gt;&lt;br /&gt;[INFO] |  +- org.slf4j:slf4j-api:jar:1.4.2:compile&lt;br /&gt;&lt;br /&gt;[INFO] |  \- log4j:log4j:jar:1.2.13:compile&lt;br /&gt;&lt;br /&gt;[INFO] +- javax.mail:mail:jar:1.4.1:compile&lt;br /&gt;&lt;br /&gt;[INFO] |  \- javax.activation:activation:jar:1.1.1:compile&lt;br /&gt;&lt;br /&gt;[INFO] \- junit:junit:jar:4.5:test&lt;br /&gt;&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;[INFO] BUILD SUCCESSFUL&lt;br /&gt;&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;[INFO] Total time: 4 seconds&lt;br /&gt;&lt;br /&gt;[INFO] Finished at: Mon Aug 24 03:05:27 CEST 2009&lt;br /&gt;&lt;br /&gt;[INFO] Final Memory: 12M/144M&lt;br /&gt;&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And here follows an example of how to use SLF4J in your code.&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;package se.msc.log4j;&lt;br /&gt;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;&lt;br /&gt;import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;br /&gt;&lt;br /&gt;public class Log4JTest {&lt;br /&gt;//import org.slf4j.Logger;&lt;br /&gt;//import org.slf4j.LoggerFactory;&lt;br /&gt;private static final Logger log = LoggerFactory.getLogger(Log4JTest.class);&lt;br /&gt;&lt;br /&gt;//import org.apache.log4j.Logger;&lt;br /&gt;//private static final Logger log = Logger.getLogger(Log4JTest.class);&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testFoo() throws Exception {&lt;br /&gt;log.info("Info log message.");&lt;br /&gt;log.error("Fatal log message.", new NullPointerException("Null pointer exceptopn."));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;An the log4j configuration file log4j.properties&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;# configure the root logger&lt;br /&gt;log4j.rootLogger=INFO, STDOUT, DAILY&lt;br /&gt;&lt;br /&gt;# configure the console appender&lt;br /&gt;log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender&lt;br /&gt;log4j.appender.STDOUT.Target=System.out&lt;br /&gt;log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout&lt;br /&gt;log4j.appender.STDOUT.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] %c:%L - %m%n&lt;br /&gt;&lt;br /&gt;# configure the daily rolling file appender&lt;br /&gt;log4j.appender.DAILY=org.apache.log4j.DailyRollingFileAppender&lt;br /&gt;log4j.appender.DAILY.File=/tmp/log4j/log4jtest.log&lt;br /&gt;log4j.appender.DAILY.DatePattern='.'yyyy-MM-dd&lt;br /&gt;log4j.appender.DAILY.layout=org.apache.log4j.PatternLayout&lt;br /&gt;log4j.appender.DAILY.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] %c:%L - %m%n&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and when running the JUnit test:&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;2009-08-24 03:00:47.775 [INFO] se.msc.log4j.Log4JTest:18 - Info log message.&lt;br /&gt;2009-08-24 03:00:47.783 [ERROR] se.msc.log4j.Log4JTest:19 - Fatal log message.&lt;br /&gt;java.lang.NullPointerException: Null pointer exceptopn.&lt;br /&gt;at se.msc.log4j.Log4JTest.testFoo(Log4JTest.java:19)&lt;br /&gt;at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;at java.lang.reflect.Method.invoke(Method.java:597)&lt;br /&gt;at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)&lt;br /&gt;at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)&lt;br /&gt;at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)&lt;br /&gt;at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)&lt;br /&gt;at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)&lt;br /&gt;at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)&lt;br /&gt;at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)&lt;br /&gt;at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)&lt;br /&gt;at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)&lt;br /&gt;at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)&lt;br /&gt;at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)&lt;br /&gt;at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)&lt;br /&gt;at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)&lt;br /&gt;at org.junit.runners.ParentRunner.run(ParentRunner.java:220)&lt;br /&gt;at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)&lt;br /&gt;at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)&lt;br /&gt;at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)&lt;br /&gt;at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)&lt;br /&gt;at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)&lt;br /&gt;at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And now I final word about the DatePattern for the org.apache.log4j.DailyRollingFileAppender:&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;log4j.appender.DAILY.DatePattern='.'yyyy-MM-dd-a&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Rolls over at midnight each day, as is the expected behaviour of a rolling log.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-6933277666952020804?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/6933277666952020804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=6933277666952020804&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6933277666952020804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6933277666952020804'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/08/configure-log4j-dailyrollingfileappende.html' title='Configure Log4J DailyRollingFileAppender with custom PatternLayout'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-4151802591689279883</id><published>2009-08-19T10:09:00.004+02:00</published><updated>2009-11-01T00:16:15.600+01:00</updated><title type='text'>Bundle a Common Jar Into EJB Jar with Maven Plugin maven-ejb-plugin</title><content type='html'>Yesterday I had some problem with packing an EJB3 jar with Maven plugin maven-ejb-plugin. The problem seemed quite common. To bundle a common jar dependency into an EJB jar, but after reading the documentation for the maven-ejb-plugin at  &lt;a href="http://maven.apache.org/plugins/maven-ejb-plugin/%20target=" target="_blank"&gt;http://maven.apache.org/plugins/maven-ejb-plugin/&lt;/a&gt;, it seemed clear that the plugin lacked this capability. After several hour of failure I ran into a workaround . Instead of configure the maven-ejb-plugin I used the maven-dependency-plugin to copy the desired dependency jar into the target/classes directory and then configure maven-dependency-plugin to run before the package phase.&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;maven-ejb-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;generateClient&amp;gt;false&amp;lt;/generateClient&amp;gt;&lt;br /&gt;&amp;lt;ejbVersion&amp;gt;3.0&amp;lt;/ejbVersion&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;maven-dependency-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;executions&amp;gt;&lt;br /&gt;&amp;lt;execution&amp;gt;&lt;br /&gt;&amp;lt;id&amp;gt;copy-dependencies&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;lt;phase&amp;gt;process-classes&amp;lt;/phase&amp;gt;&lt;br /&gt;&amp;lt;goals&amp;gt;&lt;br /&gt;&amp;lt;goal&amp;gt;copy-dependencies&amp;lt;/goal&amp;gt;&lt;br /&gt;&amp;lt;/goals&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;includeGroupIds&amp;gt;se.msc.development&amp;lt;/includeGroupIds&amp;gt;&lt;br /&gt;&amp;lt;includeArtifactIds&amp;gt;common&amp;lt;/includeArtifactIds&amp;gt;&lt;br /&gt;&amp;lt;outputDirectory&amp;gt;${project.build.outputDirectory}&amp;lt;/outputDirectory&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/execution&amp;gt;&lt;br /&gt;&amp;lt;/executions&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And if you need to add the common.jar to the classpath in the MANIFEST file add the following configuration to maven-ejb-plugin.&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;lt;archive&amp;gt;&lt;br /&gt;&amp;lt;manifest&amp;gt;&lt;br /&gt;&amp;lt;addclasspath&amp;gt;true&amp;lt;/addclasspath&amp;gt;&lt;br /&gt;&amp;lt;/manifest&amp;gt;&lt;br /&gt;&amp;lt;manifestfile&amp;gt;${project.build.outputDirectory}/META-INF/MANIFEST.MF&amp;lt;/manifestfile&amp;gt;&lt;br /&gt;&amp;lt;/archive&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-4151802591689279883?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/4151802591689279883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=4151802591689279883&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4151802591689279883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4151802591689279883'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/08/bundle-common-jar-into-ejb-jar-with.html' title='Bundle a Common Jar Into EJB Jar with Maven Plugin maven-ejb-plugin'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-1889812339275119695</id><published>2009-08-11T11:49:00.002+02:00</published><updated>2009-11-01T00:16:27.625+01:00</updated><title type='text'>Installing Firefox 3.5 on Ubunut 9.04 – the Jaunty Jackalope</title><content type='html'>After several crashes with Firefox 3.0x I decided to install the new Firefox 3.5, since the new version is managed with Synaptic Package Manager everything went smoothly, but with one gotcha. Do not remove the old Firefox, otherwise will panel shortcut and menu item be removed and when clicking on html files will nothing happens. Instead do the following:&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;sudo apt-get install firefox-3.5 firefox-3.5-gnome-support&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Redirect the firefox link to the new version:&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;sudo rm /usr/bin/firefox&lt;br /&gt;sudo ln -s /usr/bin/firefox-3.5 /usr/bin/firefox&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-1889812339275119695?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/1889812339275119695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=1889812339275119695&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1889812339275119695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1889812339275119695'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/08/installing-firefox-35-on-ubunut-904.html' title='Installing Firefox 3.5 on Ubunut 9.04 – the Jaunty Jackalope'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-9007567392456059686</id><published>2009-07-29T02:06:00.003+02:00</published><updated>2009-11-01T00:16:43.560+01:00</updated><title type='text'>Effective Unit Testing EJB 3.0 with OpenEJB</title><content type='html'>In my latest project we used EJB 3.0 and Maven2. And as any good programmer I wanted to have good code quality, which means good unit test test coverage, but my expectation on how to achieve this in an efficient manner was quite low, since mine previous experience with EJB 2.1 did not include any good testing experience. Even if coding EJB 3.0 has been greatly simplified, the fact still remains that the enterprise bean has still to be deployed before it can be tested. Of course can one program such that the logic is in a POJO rather directly in the bean itself, but to really be sure it is working the enterprise bean has to be deployed in a container, to be testable. So I started looking at different Maven plugin such as, &lt;span style="font-style: italic;"&gt;jboss-maven-plugin&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;cargo-maven2-plugin&lt;/span&gt;, but then came across OpenEJB, which is really the salvation if you are developing EJB 3.0 and want good testing possibility. OpenEJB enable unit testing of enterprise beans as any POJO class! Lets look at some examples.&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;public class UserServiceSLSBTest {&lt;br /&gt;private static final String EXPECTED_USERNAME_1 = "fornamn.1.efternamn@domain.com";&lt;br /&gt;private static final String EXPECTED_USERNAME_2 = "fornamn.2.efternamn@domain.com";&lt;br /&gt;private static final String EXPECTED_USERNAME_3 = "fornamn.3.efternamn@domain.com";&lt;br /&gt;private Context ctx;&lt;br /&gt;&lt;br /&gt;@BeforeClass&lt;br /&gt;public static void oneTimeSetUp() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@AfterClass&lt;br /&gt;public static void oneTimeTearDown() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Before&lt;br /&gt;public void setUp() throws Exception {&lt;br /&gt;Properties props = new Properties();&lt;br /&gt;props.setProperty(Context.INITIAL_CONTEXT_FACTORY,&lt;br /&gt;"org.apache.openejb.client.LocalInitialContextFactory");&lt;br /&gt;&lt;br /&gt;props.put("blogUnmanaged", "new://Resource?type=DataSource");&lt;br /&gt;props.put("blogUnmanaged.JtaManaged", "false");&lt;br /&gt;props.put("blogUnmanaged.JdbcDriver", "com.mysql.jdbc.Driver");&lt;br /&gt;props.put("blogUnmanaged.JdbcUrl", "jdbc:mysql://localhost:3306/blog");&lt;br /&gt;props.put("blogUnmanaged.username", "root");&lt;br /&gt;props.put("blogUnmanaged.password", "");&lt;br /&gt;// TODO fix properties hibernate.hbm2ddl.auto=create-drop&lt;br /&gt;&lt;br /&gt;ctx = new InitialContext(props);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@After&lt;br /&gt;public void tearDown() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private UserServiceLocal createUserService() throws Exception {&lt;br /&gt;Object obj = ctx.lookup(UserServiceSLSB.class.getSimpleName() + "Local");&lt;br /&gt;&lt;br /&gt;assertNotNull(obj);&lt;br /&gt;assertTrue(obj instanceof UserServiceLocal);&lt;br /&gt;return (UserServiceLocal) obj;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testCreateUser() throws Exception {&lt;br /&gt;UserServiceLocal userService = createUserService();&lt;br /&gt;&lt;br /&gt;User user = new User();&lt;br /&gt;user.setUsername(EXPECTED_USERNAME_1);&lt;br /&gt;user.setPassword(EXPECTED_USERNAME_1);&lt;br /&gt;user.setRoles(Roles.ADMIN);&lt;br /&gt;&lt;br /&gt;userService.storeUser(user);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And the Stateless Session Bean&lt;br /&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;@Stateless&lt;br /&gt;public class UserServiceSLSB implements UserServiceLocal {&lt;br /&gt;private static final Logger log = LoggerFactory.getLogger(UserServiceSLSB.class);&lt;br /&gt;@PersistenceContext(name = "blog-ejb", unitName = "blog-ejb")&lt;br /&gt;protected EntityManager em;&lt;br /&gt;@Resource&lt;br /&gt;private SessionContext context;&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public User findUserByUsername(String username) {&lt;br /&gt;log.info("findUserByUsername username='" + username + "'...");&lt;br /&gt;Query q = em.createQuery("SELECT u from User as u where u.username=:username");&lt;br /&gt;q.setParameter("username", username);&lt;br /&gt;List list = q.getResultList();&lt;br /&gt;return (list.size() &amp;gt; 0) ? (User) list.get(0) : null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void checkExistingUser(User user) throws DuplicateException {&lt;br /&gt;User existingUser = findUserByUsername(user.getUsername());&lt;br /&gt;if (existingUser != null)&lt;br /&gt;throw new DuplicateException("Duplicate " + user);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void storeUser(User user) throws CredentialException, DuplicateException {&lt;br /&gt;log.info("storeUser " + user + "...");&lt;br /&gt;checkExistingUser(user);&lt;br /&gt;if (user.getUserId() == null)&lt;br /&gt;em.persist(user);&lt;br /&gt;else&lt;br /&gt;em.merge(user);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And the SLSB local interface.&lt;br /&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;@Local&lt;br /&gt;public interface UserServiceLocal {&lt;br /&gt;&lt;br /&gt;public User findUserByUsername(String username);&lt;br /&gt;&lt;br /&gt;public void storeUser(User user) throws CredentialException, DuplicateException;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And in the pom.xml simply add the dependency to OpenEJB and you are ready to go.&lt;br /&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: border; -moz-background-inline-policy: continuous; -moz-background-origin: padding; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.openejb&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;openejb-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;3.1.1&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-9007567392456059686?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/9007567392456059686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=9007567392456059686&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/9007567392456059686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/9007567392456059686'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/07/effective-unit-testing-ejb-30-with.html' title='Effective Unit Testing EJB 3.0 with OpenEJB'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-4633276128905386540</id><published>2009-07-29T01:40:00.001+02:00</published><updated>2009-07-29T01:42:12.188+02:00</updated><title type='text'>Playing Commercial DVD with Ubuntu Jaunty Jackalope 9.04</title><content type='html'>I previously wrote a blog about how to play commercial DVD with &lt;a href="http://magnus-k-karlsson.blogspot.com/2009/01/playing-commercial-dvd-with-ubuntu.html"&gt;Ubuntu Hardy Heron 8.10 Intrepid Ibex&lt;/a&gt;, but here comes an update how it is done with the latest Ubuntu.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;sudo /usr/share/doc/libdvdread4/install-css.sh&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-4633276128905386540?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/4633276128905386540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=4633276128905386540&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4633276128905386540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4633276128905386540'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/07/playing-commercial-dvd-with-ubuntu.html' title='Playing Commercial DVD with Ubuntu Jaunty Jackalope 9.04'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8953603821534020230</id><published>2009-07-22T16:54:00.002+02:00</published><updated>2009-07-22T17:06:07.895+02:00</updated><title type='text'>Why Previous Java Web Framework Have Failed and Why Apache Wicket Will Succeed.</title><content type='html'>There exists numerous Java web framework (e.g. Struts, JSF, Spring MVC, etc.) and most of them are build upon the Model-View-Controller pattern, but though they have been used in numerous successful project, the Java community still produces new Java web framework. Why is that? According to me the previous Java web framework have several flaws:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The JSP technique is messy and clutters down the view page, maybe not for simple pages, but definitely for more complex pages.&lt;/li&gt;&lt;li&gt;The round trip when developing JSP pages is long since JSP pages can not be viewed, without first compiling them and running them in a web container. This severely slows down the project . This is especially true when one is fixing layout issues. &lt;/li&gt;&lt;li&gt;Web and JSP developer have different code base. This also slows down the project productivity, since when the web team ships new code or fixes, the JSP developer must copy past that into different JSP code.&lt;/li&gt;&lt;li&gt;Verbose XML configuration, is something the entire Java community is trying to get away from via Annotation and better default values. For example look at the EJB or Spring developing.&lt;/li&gt;&lt;li&gt;It is hard and verbose to unit test and even harder to maintain.&lt;/li&gt;&lt;/ul&gt;Though these many flaws there has not been any good alternative around to develop Java web solution, but now I would say the missing link is found – &lt;span style="font-weight: bold;"&gt;Apache Wicket&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The Apache Wicket architecture differs in two major way.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It does not use JSP technology for coding Views, instead it uses simple HTML and extend it with attributes.&lt;/li&gt;&lt;li&gt;You create components (TextField, CheckBox, etc.) in the Controller and add behavioral via Listener classes, such as in Swing.&lt;/li&gt;&lt;/ul&gt;These two major differences make a huge different:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Web and View developer use the same code base.&lt;/li&gt;&lt;li&gt;No need to compile and run the View in a container, simply open the View in a web browser and watch differences.&lt;/li&gt;&lt;li&gt;Easy to write unit test code. &lt;/li&gt;&lt;/ul&gt;Before going through an example, lets first take a brief overview over the main Wicket classes. Component are simple Java classes with supporting HTML markup.&lt;br /&gt;Each Components holds a Model that is a simple Java class with data.&lt;br /&gt;&lt;br /&gt;What is here imported is that the default Model are stateful and most example for Wicket uses the default model. This is unfortunate because that is not best practice, because stateful objects consume memory and make the application less scalable. The two most imported classes two use to make the application stateless is&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;      IModel usersModel = new LoadableDetachableModel() {&lt;br /&gt;          protected Object load() {&lt;br /&gt;              return WicketApplication.get().getUserService().getUsers();&lt;br /&gt;          }&lt;br /&gt;      };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;      new BookmarkablePageLink(“newUser”, UserEditPage.class);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and if you need to pass data use Link with as little data as possible.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;              Link view = new Link("editUser", itemList.getModel()) {&lt;br /&gt;                  public void onClick() {&lt;br /&gt;                      setResponsePage(new UserEditPage(user.getUserId()));&lt;br /&gt;                  }&lt;br /&gt;              };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now look how easy and clean the unit test is:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;public class UserEditPageTest extends TestCase {&lt;br /&gt; protected static final Logger log = Logger.getLogger(UserEditPageTest.class);&lt;br /&gt; private WicketTester tester;&lt;br /&gt;&lt;br /&gt; public void setUp() {&lt;br /&gt;  tester = new WicketTester(new WicketApplication());&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private void setUpNewUserEditPage() {&lt;br /&gt;  tester.startPage(UserEditPage.class);&lt;br /&gt;  tester.assertRenderedPage(UserEditPage.class);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void testLayout() {&lt;br /&gt;  setUpNewUserEditPage();&lt;br /&gt;&lt;br /&gt;  tester.assertComponent(UserEditPage.FEEDBACK_PANEL, FeedbackPanel.class);&lt;br /&gt;  tester.assertComponent(UserEditPage.USER_FORM, Form.class);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void testNewUser() {&lt;br /&gt;  setUpNewUserEditPage();&lt;br /&gt;&lt;br /&gt;  FormTester form = tester.newFormTester(UserEditPage.USER_FORM);&lt;br /&gt;  form.setValue(UserEditPage.USERNAME, "kalle.stropp@fake.com");&lt;br /&gt;  form.setValue(UserEditPage.PASSWORD, "validpassword");&lt;br /&gt;  form.select(UserEditPage.ROLES, 0);&lt;br /&gt;  form.submit(FormBuilder.BUTTON_SAVE);&lt;br /&gt;&lt;br /&gt;  tester.assertRenderedPage(UserListPage.class);&lt;br /&gt;  tester.assertNoErrorMessage();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And here follows the rest of the code:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;public class UserEditPage extends TemplatePage implements ButtonListener, IChoiceRenderer {&lt;br /&gt; private static final long serialVersionUID = 1L;&lt;br /&gt; protected static final String FEEDBACK_PANEL = "feedbackPanel";&lt;br /&gt; protected static final String USER_FORM = "userForm";&lt;br /&gt; protected static final String USER_ID = "userId";&lt;br /&gt; protected static final String USERNAME = "username";&lt;br /&gt; protected static final String PASSWORD = "password";&lt;br /&gt; protected static final String ROLES = "roles";&lt;br /&gt; protected static final Logger log = Logger.getLogger(UserEditPage.class);&lt;br /&gt;&lt;br /&gt; public UserEditPage() {&lt;br /&gt;     setModel(new CompoundPropertyModel(new LoadableDetachableModel() {&lt;br /&gt;   private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;   protected Object load() {&lt;br /&gt;             return new User();&lt;br /&gt;         }&lt;br /&gt;     }));&lt;br /&gt;     init(false);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public UserEditPage(final long userId) {&lt;br /&gt;     setModel(new CompoundPropertyModel(new LoadableDetachableModel() {&lt;br /&gt;      private static final long serialVersionUID = 1L;&lt;br /&gt;      &lt;br /&gt;         protected Object load() {&lt;br /&gt;             User user =  WicketApplication.get().getUserService().loadUser(userId);&lt;br /&gt;             user.setPassword(null); // hide current password&lt;br /&gt;             return user;&lt;br /&gt;         }&lt;br /&gt;     }));&lt;br /&gt;     init(true);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;   protected String getPageTitle() {&lt;br /&gt;    return "userEditPage.title";&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt; public void init(boolean readOnly) {&lt;br /&gt;  add(new FeedbackPanel(FEEDBACK_PANEL));&lt;br /&gt;  add(createForm(readOnly));&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Form createForm(boolean readOnly) {&lt;br /&gt;  FormBuilder builder = new FormBuilder(USER_FORM, getModel());&lt;br /&gt;  builder.addLabel(USER_ID);&lt;br /&gt;  builder.addTextField(USERNAME, true, 30, readOnly);&lt;br /&gt;  builder.addPasswordTextField(PASSWORD);&lt;br /&gt;  User user = (User) builder.getModelObject();&lt;br /&gt;  builder.addDropDownChoice(ROLES, Arrays.asList(user.getRoles().getValues()), this);&lt;br /&gt;  builder.addSubmitButton(this);&lt;br /&gt;  return builder.create();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onSubmit(Object modelObject) {  &lt;br /&gt;  log.info("onSubmit " + modelObject);&lt;br /&gt;  WicketApplication.get().getUserService().storeUser((User) modelObject);&lt;br /&gt;       setResponsePage(UserListPage.class);  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public Object getDisplayValue(Object object) {&lt;br /&gt;       return ((Roles) object).getRole();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public String getIdValue(Object object, int index) {&lt;br /&gt;  return ((Roles) object).getRole();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And the HTML&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt; &amp;lt;html &amp;gt;&lt;br /&gt; &amp;lt;head &amp;gt; &amp;lt;/head &amp;gt;&lt;br /&gt; &amp;lt;body &amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;wicket:extend &amp;gt;&lt;br /&gt; &lt;br /&gt;  &amp;lt;div wicket:id="feedbackPanel" &amp;gt;Feedback Panel &amp;lt;/div &amp;gt; &lt;br /&gt;  &lt;br /&gt;  &amp;lt;form wicket:id="userForm" &amp;gt;&lt;br /&gt;  &amp;lt;fieldset style="width:250px;" &amp;gt;&lt;br /&gt;   &amp;lt;legend &amp;gt; &amp;lt;wicket:message key="userEditPage.userForm" &amp;gt;User Form &amp;lt;/wicket:message &amp;gt; &amp;lt;/legend &amp;gt; &lt;br /&gt;   &amp;lt;table &amp;gt;&lt;br /&gt;    &amp;lt;tr &amp;gt;&lt;br /&gt;     &amp;lt;td align="right" &amp;gt; &amp;lt;wicket:message key="userEditPage.userId" &amp;gt;UserId &amp;lt;/wicket:message &amp;gt;: &amp;lt;/td &amp;gt;&lt;br /&gt;     &amp;lt;td &amp;gt; &amp;lt;span wicket:id="userId" id="userId" &amp;gt;1 &amp;lt;/span &amp;gt; &amp;lt;/td &amp;gt;&lt;br /&gt;    &amp;lt;/tr &amp;gt;&lt;br /&gt;    &amp;lt;tr &amp;gt;&lt;br /&gt;     &amp;lt;td align="right" &amp;gt; &amp;lt;wicket:message key="userEditPage.username" &amp;gt; &amp;lt;u &amp;gt;U &amp;lt;/u &amp;gt;sername &amp;lt;/wicket:message &amp;gt;: &amp;lt;/td &amp;gt;&lt;br /&gt;     &amp;lt;td &amp;gt; &amp;lt;input wicket:id="username" type="text" name="username" accesskey="u" / &amp;gt; &amp;lt;/td &amp;gt;&lt;br /&gt;    &amp;lt;/tr &amp;gt;&lt;br /&gt;    &amp;lt;tr &amp;gt;&lt;br /&gt;     &amp;lt;td align="right" &amp;gt; &amp;lt;wicket:message key="userEditPage.newPassword" &amp;gt;New  &amp;lt;u &amp;gt;p &amp;lt;/u &amp;gt;assword &amp;lt;/wicket:message &amp;gt;: &amp;lt;/td &amp;gt;&lt;br /&gt;     &amp;lt;td &amp;gt; &amp;lt;input wicket:id="password" type="password" name="password" accesskey="p" / &amp;gt; &amp;lt;/td &amp;gt;&lt;br /&gt;    &amp;lt;/tr &amp;gt;&lt;br /&gt;    &amp;lt;tr &amp;gt;&lt;br /&gt;     &amp;lt;td align="right" &amp;gt; &amp;lt;wicket:message key="userEditPage.roles" &amp;gt; &amp;lt;u &amp;gt;R &amp;lt;/u &amp;gt;oles &amp;lt;/wicket:message &amp;gt;: &amp;lt;/td &amp;gt;&lt;br /&gt;     &amp;lt;td &amp;gt; &amp;lt;select wicket:id="roles" &amp;gt; &amp;lt;/select &amp;gt; &amp;lt;/td &amp;gt;&lt;br /&gt;    &amp;lt;/tr &amp;gt;   &lt;br /&gt;    &amp;lt;tr &amp;gt;&lt;br /&gt;     &amp;lt;td colspan="2" align="right" &amp;gt;     &lt;br /&gt;      &amp;lt;button wicket:id="save" type="submit" accesskey="s" &amp;gt; &amp;lt;wicket:message key="userEditPage.save" &amp;gt; &amp;lt;u &amp;gt;S &amp;lt;/u &amp;gt;ave &amp;lt;/wicket:message &amp;gt; &amp;lt;/button &amp;gt;&lt;br /&gt;     &amp;lt;/td &amp;gt;&lt;br /&gt;    &amp;lt;/tr &amp;gt;  &lt;br /&gt;   &amp;lt;/table &amp;gt;&lt;br /&gt;  &amp;lt;/fieldset &amp;gt;&lt;br /&gt;     &amp;lt;/form &amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/wicket:extend &amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;/body &amp;gt;&lt;br /&gt; &amp;lt;/html &amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8953603821534020230?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8953603821534020230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8953603821534020230&amp;isPopup=true' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8953603821534020230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8953603821534020230'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/07/why-previous-java-web-framework-have.html' title='Why Previous Java Web Framework Have Failed and Why Apache Wicket Will Succeed.'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-6522929311647538680</id><published>2009-07-05T09:59:00.001+02:00</published><updated>2009-07-05T10:01:34.786+02:00</updated><title type='text'>Good Java Open-Source Summary Site</title><content type='html'>Sometimes you come across good sites that you want to share with others. And today it happened I came across a good site that summaries a lot of Java open-source project. Which is a good starting page if you are looking for new Java library, for your new Java project. Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java-source.net/" target="_blank"&gt;http://java-source.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-6522929311647538680?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/6522929311647538680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=6522929311647538680&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6522929311647538680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/6522929311647538680'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/07/good-java-open-source-summary-site.html' title='Good Java Open-Source Summary Site'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8582246659198886730</id><published>2009-05-06T07:57:00.002+02:00</published><updated>2009-05-06T08:01:44.121+02:00</updated><title type='text'>Thunderbird Lightning 0.9 on Ubuntu 9.04 (Jaunty Jackalope)</title><content type='html'>Yesterday I upgraded to Ubuntu 9.04, every thing went smoothly as always with Ubuntu. The day before I did a new installation of Windows XP and what a pain it was! I have to manually install literally every drivers – chipset, graphic, network, etc. And after every install you did have to restart. But when installing Ubuntu everything just works, but when doing the upgrade I did discover one thing. You should not install Lightning 0.9 by downloading the xpi-file and from Thunderbird install the add-ons, but instead use synaptic.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;sudo apt-get install lightning-extension&lt;br /&gt;&lt;/pre&gt;And if you are still using Ubuntu 8.1 you should install libstdc++5&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;sudo apt-get install libstdc++5&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;For more details of the bug read:&lt;br /&gt;&lt;a href="https://bugs.launchpad.net/ubuntu/+source/thunderbird/+bug/278853" target="_blank"&gt;&lt;br /&gt;https://bugs.launchpad.net/ubuntu/+source/thunderbird/+bug/278853&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8582246659198886730?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8582246659198886730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8582246659198886730&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8582246659198886730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8582246659198886730'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/05/thunderbird-lightning-09-on-ubuntu-904.html' title='Thunderbird Lightning 0.9 on Ubuntu 9.04 (Jaunty Jackalope)'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-916455118054770818</id><published>2009-04-15T12:39:00.002+02:00</published><updated>2009-04-15T12:43:12.949+02:00</updated><title type='text'>Frukostseminarium Integrationsresa från lättviktigt ramverk till fullskalig standardiserad Enterprise Service Bus (ESB)</title><content type='html'>Den 29 april kommer jag att hålla frukostseminarium om Apache Camel, Enterprise Integration Pattern och Apache ServiceMix på &lt;a href="http://www.msc.se/"&gt;MSC&lt;/a&gt; kontor. Seminariumet är riktat till utvecklare och projektledare och kommer innehålla rikligt med demos, så om du är intresserad att lära dig mera om de olika integrationslösningar, anmäl dig då till &lt;a href="mailto:magnus.k.karlsson@msc.se"&gt;magnus.k.karlsson@msc.se&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mer information finns på &lt;a href="http://www.msc.se/tjanster/utbud-it-seminarier/it-konsulter-Integrationsresa_fran_lattviktigt-ramverk_till_fullskalig_standardiserad_Enterprise_Service_Bus_ESB.html"&gt;http://www.msc.se/tjanster/utbud-it-seminarier/it-konsulter-Integrationsresa_fran_lattviktigt-ramverk_till_fullskalig_standardiserad_Enterprise_Service_Bus_ESB.html&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-916455118054770818?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/916455118054770818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=916455118054770818&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/916455118054770818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/916455118054770818'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/04/frukostseminarium-integrationsresa-fran.html' title='Frukostseminarium Integrationsresa från lättviktigt ramverk till fullskalig standardiserad Enterprise Service Bus (ESB)'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8019622344288508745</id><published>2009-03-06T13:29:00.003+01:00</published><updated>2009-03-06T13:36:45.704+01:00</updated><title type='text'>SOA by Examples</title><content type='html'>SOA is a buzz word that have been round for some time, but when you search for information about SOA it is hard to find hands on information what SOA really is and also examples of SOA. The lack of concrete example is a problem for us practical people which tend to learn new thing by examples and not read abstract theories about new technology. We do that but not before we got a god grasp of what we are learning. It is with that background I decided to write this blog.&lt;br /&gt;&lt;br /&gt;Before going through examples, let us look what does SOA promises us, i.e. the goals of SOA:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The reuse of existing system, when building new application.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So how do we do that?&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Encapsulate existing system with a fronting API and build the rest of the functionality as reusable services/components.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Enough with theory, now lets take some examples.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_DPdQE6b-uQw/SbEYHT5gStI/AAAAAAAAACc/utvJTw6gf2I/s1600-h/CustomerOrder.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 106px;" src="http://1.bp.blogspot.com/_DPdQE6b-uQw/SbEYHT5gStI/AAAAAAAAACc/utvJTw6gf2I/s320/CustomerOrder.jpg" alt="" id="BLOGGER_PHOTO_ID_5310051949526141650" border="0" /&gt;&lt;/a&gt;In this example the business case is to create a new application that can place customer orders, but with the criteria to reuse existing back-end solutions.&lt;br /&gt;&lt;br /&gt;The SOA solution is built of the following reusable block&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Basic Data Service - CRUD operations.&lt;/li&gt;&lt;li&gt;Composed Services - business logic.&lt;/li&gt;&lt;li&gt;Process Services – complex business logic.&lt;/li&gt;&lt;/ul&gt;Another example is a unified patience journal system.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_DPdQE6b-uQw/SbEYP25RZHI/AAAAAAAAACk/1BNiVinvW2I/s1600-h/MedicalJournalSystem.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 146px;" src="http://4.bp.blogspot.com/_DPdQE6b-uQw/SbEYP25RZHI/AAAAAAAAACk/1BNiVinvW2I/s320/MedicalJournalSystem.jpg" alt="" id="BLOGGER_PHOTO_ID_5310052096359359602" border="0" /&gt;&lt;/a&gt;An additional example could be &lt;span style="font-weight: bold;"&gt;Package Tour Operation&lt;/span&gt; containing the following services:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Flight Booking&lt;/li&gt;&lt;li&gt;Hotel Booking&lt;/li&gt;&lt;li&gt;Car Rental&lt;/li&gt;&lt;li&gt;Event Booking.&lt;/li&gt;&lt;/ul&gt;What is imported when talking about SOA is not to get stuck which techniques to use, but to focus on which service to use and what to fill them with, so they are reusable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8019622344288508745?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8019622344288508745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8019622344288508745&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8019622344288508745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8019622344288508745'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/03/soa-by-examples.html' title='SOA by Examples'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DPdQE6b-uQw/SbEYHT5gStI/AAAAAAAAACc/utvJTw6gf2I/s72-c/CustomerOrder.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-1965292513198511141</id><published>2009-02-28T21:27:00.005+01:00</published><updated>2009-02-28T21:34:57.081+01:00</updated><title type='text'>Enterprise Integration Diagram for Apache ServiceMix, Camel and Petal</title><content type='html'>One of the challenge when doing integration job with an ESB solution is to visualize it. If you are using Eclipse rescue is on the way - &lt;a href="http://wiki.eclipse.org/STP"&gt;Eclipse Enterprise Integration Designer, STP&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The Eclipse STP project implement, some of the &lt;a href="http://help.eclipse.org/stable/index.jsp?topic=/org.eclipse.stp.eid.doc/html/creating_diagram.html"&gt;most imported pattern&lt;/a&gt; of the &lt;a href="http://www.eaipatterns.com/toc.html"&gt;Enterprise Integration Pattern&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The project is still in incubation and there are some problem to run it, even if you follow the &lt;a href="http://wiki.eclipse.org/STP/EID_Component/GetGanymedeUpdate"&gt;installation instruction&lt;/a&gt; from the STP site.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Installation &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Download Eclipse Ganymede SR1 Enterprise edition. &lt;/li&gt;&lt;li&gt;Start Eclipse and open Help → Software Updates... &lt;/li&gt;&lt;li&gt;Select Ganymede → SOA → STP Designer, see snapshot. and install.&lt;/li&gt;&lt;li&gt;After restart, close Eclipse and download patch from &lt;a href="http://webui.sourcelabs.com/eclipse/issues/240077"&gt;http://webui.sourcelabs.com/eclipse/issues/240077&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Extract the zip file to eclipse/plugins folder and start Eclipse.&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_DPdQE6b-uQw/Same0t885mI/AAAAAAAAAB0/22_X3PkAqaw/s1600-h/Screenshot-Software+Updates+and+Add-ons+.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 310px;" src="http://2.bp.blogspot.com/_DPdQE6b-uQw/Same0t885mI/AAAAAAAAAB0/22_X3PkAqaw/s320/Screenshot-Software+Updates+and+Add-ons+.png" alt="" id="BLOGGER_PHOTO_ID_5307948264358471266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Creating Integration Patterns Diagram&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create a pattern project, e.g. a simple Java project.&lt;/li&gt;&lt;li&gt;Create New and Other and select Integration Patterns Diagram. &lt;/li&gt;&lt;li&gt;At the time being is unfortunately only ServiceMix and Petal, supported, so select ServiceMix.&lt;/li&gt;&lt;li&gt;End the guide and finish.&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_DPdQE6b-uQw/Same-bqDODI/AAAAAAAAAB8/TAyAbtz9p9s/s1600-h/Screenshot-New++++.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 251px;" src="http://4.bp.blogspot.com/_DPdQE6b-uQw/Same-bqDODI/AAAAAAAAAB8/TAyAbtz9p9s/s320/Screenshot-New++++.png" alt="" id="BLOGGER_PHOTO_ID_5307948431246047282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;After that you are set to create diagrams.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_DPdQE6b-uQw/SamfF4R0H2I/AAAAAAAAACE/kE7wDcTuDRg/s1600-h/EIP-Transform.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 87px;" src="http://3.bp.blogspot.com/_DPdQE6b-uQw/SamfF4R0H2I/AAAAAAAAACE/kE7wDcTuDRg/s320/EIP-Transform.png" alt="" id="BLOGGER_PHOTO_ID_5307948559188107106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_DPdQE6b-uQw/SamfMowSk2I/AAAAAAAAACM/mnHQzAwHk4s/s1600-h/filter.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 35px;" src="http://4.bp.blogspot.com/_DPdQE6b-uQw/SamfMowSk2I/AAAAAAAAACM/mnHQzAwHk4s/s320/filter.png" alt="" id="BLOGGER_PHOTO_ID_5307948675280048994" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-1965292513198511141?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/1965292513198511141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=1965292513198511141&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1965292513198511141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1965292513198511141'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/02/enterprise-integration-diagram-for.html' title='Enterprise Integration Diagram for Apache ServiceMix, Camel and Petal'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DPdQE6b-uQw/Same0t885mI/AAAAAAAAAB0/22_X3PkAqaw/s72-c/Screenshot-Software+Updates+and+Add-ons+.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-5762261768499628927</id><published>2009-02-27T02:47:00.002+01:00</published><updated>2009-02-27T02:49:02.153+01:00</updated><title type='text'>Clustering and CAP Theorem</title><content type='html'>When designing an application for clustering one should first be aware of the CAP (Consistency, Availability and Partitioning) theorem. &lt;span style="font-style: italic;"&gt;The theorem states that you can only have two of the three CAP properties at the same time.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-weight: bold;"&gt;Consistency&lt;/span&gt; means that all users see the same set of data, even when data updated or deleted. This is normally achieved with storing data to a database and using transactions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Availability&lt;/span&gt; is achieved through replicating data, so that data is always available even in case of failure.&lt;br /&gt;&lt;br /&gt;The last, &lt;span style="font-weight: bold;"&gt;Partitioning&lt;/span&gt;, means that the system is partitioning tolerant, i.e. the system holds when it is distributed over several servers and machines.&lt;br /&gt;&lt;br /&gt;So which one should go? Well when building highly loaded applications as Google or Amazon the natural answer is Consistency, because letting the system not be available during failure or being not responsive during high load is not a options. This is quite interesting because most programmers are raised with the idea of using a database as a foundation for an application. And this idea must now go. Or? Well it is not so black and white.&lt;br /&gt;&lt;br /&gt;The main key of building clustered application is twofold:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Asynchronous communication. E.g. Amazon has a separate service displaying what books  other people has also bought. Failure of this service should not hinder the rest of the page to be  rendered.&lt;/li&gt;&lt;li&gt;Brake down your application and analyze each part individually according to CAP properties. Does payment must be consistent? Probably. Does user information needs to be consistent. Probably not. Etc.&lt;/li&gt;&lt;/ul&gt;After you analyzed your application into different clustering functions you keep these data separated, because they will be deployed differently and independently.&lt;br /&gt;&lt;br /&gt;So to achieve an High Availability and Partitioned Tolerant application is through scaling out, I.e. using more machines and using:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Stateless data, i.e. the applications server only holds request data.&lt;/li&gt;&lt;li&gt;Replicate read intensive data through a master/slave setup.&lt;/li&gt;&lt;li&gt;Caching data.&lt;/li&gt;&lt;li&gt;Sharding database, i.e. using multiple databases and manually decide which tables goes into which database.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-5762261768499628927?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/5762261768499628927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=5762261768499628927&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/5762261768499628927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/5762261768499628927'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/02/clustering-and-cap-theorem.html' title='Clustering and CAP Theorem'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-1335267102165969222</id><published>2009-02-22T12:08:00.005+01:00</published><updated>2009-02-22T14:53:12.877+01:00</updated><title type='text'>Hibernate Search Example</title><content type='html'>In my previous blog I was writing about Hibernate Search in general, but in this blog I will show you code examples of using Hibernate Search.&lt;br /&gt;&lt;br /&gt;The preferred and easiest way to get started is to use Maven2, if you are not able to use Maven2 then please download the relevant jar file.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0"&lt;br /&gt;   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0&lt;br /&gt;       http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;se.msc&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;hibernatesearch&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;repositories&amp;gt;&lt;br /&gt; &amp;lt;repository&amp;gt;&lt;br /&gt;  &amp;lt;id&amp;gt;repository.jboss.org&amp;lt;/id&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;JBoss Maven Repository&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;url&amp;gt;http://repository.jboss.org/maven2&amp;lt;/url&amp;gt;&lt;br /&gt;  &amp;lt;layout&amp;gt;default&amp;lt;/layout&amp;gt;&lt;br /&gt; &amp;lt;/repository&amp;gt;&lt;br /&gt;&amp;lt;/repositories&amp;gt;&lt;br /&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt; &amp;lt;!-- For Test --&amp;gt;&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;4.5&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt;&lt;br /&gt; &amp;lt;!-- Hibernate Core --&amp;gt;&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;hibernate-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;3.3.1.GA&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt;&lt;br /&gt; &amp;lt;!-- Hibernate Annotation --&amp;gt;&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;hibernate-annotations&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;3.4.0.GA&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt;&lt;br /&gt; &amp;lt;!-- Hibernate Annotation uses SLF4J --&amp;gt;&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt; &lt;br /&gt; &amp;lt;!-- Hibernate EntityManager --&amp;gt;&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;hibernate-entitymanager&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;3.4.0.GA&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt;&lt;br /&gt; &amp;lt;!-- Hibernate Validator&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;hibernate-validator&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;3.0.0.ga&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt; --&amp;gt; &lt;br /&gt; &amp;lt;!-- Hibernate Search --&amp;gt;&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;hibernate-search&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;3.1.0.GA&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt;&lt;br /&gt; &amp;lt;!-- Hibernate Search 3part Lib --&amp;gt;&lt;br /&gt; &amp;lt;!-- Solr's Analyzer Framework --&amp;gt;&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.apache.solr&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;solr-common&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;1.3.0&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt;&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.apache.solr&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;solr-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;1.3.0&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt;&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.apache.lucene&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;lucene-snowball&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;2.4.0&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt;&lt;br /&gt; &amp;lt;!-- MySQL JDBC connector --&amp;gt;&lt;br /&gt; &amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;5.1.6&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;/dependencies&amp;gt;&lt;br /&gt;&amp;lt;build&amp;gt;&lt;br /&gt; &amp;lt;plugins&amp;gt;&lt;br /&gt;  &amp;lt;plugin&amp;gt;&lt;br /&gt;   &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;   &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;   &amp;lt;configuration&amp;gt;&lt;br /&gt;    &amp;lt;source&amp;gt;1.6&amp;lt;/source&amp;gt;&lt;br /&gt;    &amp;lt;target&amp;gt;1.6&amp;lt;/target&amp;gt;&lt;br /&gt;   &amp;lt;/configuration&amp;gt;&lt;br /&gt;  &amp;lt;/plugin&amp;gt;&lt;br /&gt; &amp;lt;/plugins&amp;gt;&lt;br /&gt;&amp;lt;/build&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;In this example I will be using &lt;span style="font-style: italic;"&gt;Hibernate Core&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Hibernate Annotation&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Hibernate Search&lt;/span&gt;. I will not use &lt;span style="font-style: italic;"&gt;Hibernate EntityManager&lt;/span&gt;, but using EntityManager instead of Session is and easy thing to do and will not impact the concept or code significantly.&lt;br /&gt;&lt;br /&gt;Lets start with configure our Hibernate Core with &lt;span style="font-weight: bold;"&gt;hibernate.cfg.xml&lt;/span&gt;.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; overflow: scroll; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE hibernate-configuration PUBLIC&lt;br /&gt;   "-//Hibernate/Hibernate Configuration DTD 3.0//EN"&lt;br /&gt;   "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;hibernate-configuration&amp;gt;&lt;br /&gt;&amp;lt;session-factory&amp;gt;&lt;br /&gt; &amp;lt;property name="hibernate.dialect"&amp;gt;org.hibernate.dialect.MySQLInnoDBDialect&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;property name="hibernate.connection.driver_class"&amp;gt;com.mysql.jdbc.Driver&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;property name="hibernate.connection.url"&amp;gt;&lt;br /&gt;  jdbc:mysql://localhost:3306/test?createDatabaseIfNotExist=true&amp;amp;amp;useUnicode=true&amp;amp;amp;characterEncoding=utf-8&lt;br /&gt; &amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;property name="hibernate.connection.username"&amp;gt;root&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;property name="hibernate.connection.password"&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;property name="hibernate.hbm2ddl.auto"&amp;gt;create-drop&amp;lt;/property&amp;gt; &amp;lt;!-- update --&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Hibernate Search --&amp;gt;&lt;br /&gt; &amp;lt;!-- org.hibernate.search.store.FSDirectoryProvider --&amp;gt;&lt;br /&gt; &amp;lt;!-- org.hibernate.search.store.RAMDirectoryProvider for test --&amp;gt;&lt;br /&gt; &amp;lt;property name="hibernate.search.default.directory_provider"&amp;gt;&lt;br /&gt;  org.hibernate.search.store.RAMDirectoryProvider&lt;br /&gt; &amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;property name="hibernate.search.default.indexBase"&amp;gt;&lt;br /&gt;  /home/magnus/tmp/lucene/indexes&lt;br /&gt; &amp;lt;/property&amp;gt;  &lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Mapped classes --&amp;gt;&lt;br /&gt; &amp;lt;mapping class="se.msc.hibernatesearch.domain.Person" /&amp;gt;&lt;br /&gt;&amp;lt;/session-factory&amp;gt;&lt;br /&gt;&amp;lt;/hibernate-configuration&amp;gt;&lt;br /&gt;&lt;/pre&gt;The Hibernate Search comes with sensible default values and there is actually only two values that needs configuring the &lt;span style="font-style: italic;"&gt;directory provider&lt;/span&gt; and the &lt;span style="font-style: italic;"&gt;base directory&lt;/span&gt; of the index files.&lt;br /&gt;&lt;br /&gt;In this example I will be using &lt;span style="font-style: italic;"&gt;JUnit&lt;/span&gt; as start class and since unit tested class are run over and over again I will for consistency use an &lt;span style="font-style: italic;"&gt;in-memory index&lt;/span&gt; in combination with &lt;span style="font-style: italic;"&gt;drop and create&lt;/span&gt; the database schema. This way I will always get a clean start whenever restarting the &lt;span style="font-style: italic;"&gt;JUnit&lt;/span&gt; text.&lt;br /&gt;&lt;br /&gt;To make our example complete here is the log4j.properties file.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; overflow: scroll; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;# Root logger option&lt;br /&gt;log4j.rootLogger=INFO, stdout&lt;br /&gt;&lt;br /&gt;# Log native SQL&lt;br /&gt;log4j.logger.org.hibernate.SQL=debug&lt;br /&gt;log4j.logger.org.hibernate.bind=debug&lt;br /&gt;&lt;br /&gt;# Direct log messages to stdout&lt;br /&gt;log4j.appender.stdout=org.apache.log4j.ConsoleAppender&lt;br /&gt;log4j.appender.stdout.Target=System.out&lt;br /&gt;log4j.appender.stdout.layout=org.apache.log4j.PatternLayout&lt;br /&gt;log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n&lt;br /&gt;&lt;/pre&gt;To be able to use Hibernate from JUnit we need the popular a &lt;span style="font-weight: bold;"&gt;HibernateUtil&lt;/span&gt;.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;public class HibernateUtil {&lt;br /&gt;&lt;br /&gt;private static final SessionFactory sessionFactory;&lt;br /&gt;&lt;br /&gt;static {&lt;br /&gt; try {&lt;br /&gt;  AnnotationConfiguration conf = new AnnotationConfiguration();&lt;br /&gt;  sessionFactory = conf.configure().buildSessionFactory();&lt;br /&gt; } catch (Throwable ex) {&lt;br /&gt;  throw new ExceptionInInitializerError(ex);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static Session getSession() throws HibernateException {&lt;br /&gt; return sessionFactory.openSession();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Now lets start with annotating our domain class. For simplicity I will only use one class here.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;@Entity&lt;br /&gt;@Table(name = "PERSON")&lt;br /&gt;@Indexed&lt;br /&gt;public class Person implements Serializable {&lt;br /&gt;&lt;br /&gt;private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;@Id&lt;br /&gt;@Column(name = "PERSON_ID", updatable = false)&lt;br /&gt;@GeneratedValue(strategy = GenerationType.IDENTITY)&lt;br /&gt;@DocumentId&lt;br /&gt;private Long id = null;&lt;br /&gt;&lt;br /&gt;@Column(name = "FIRSTNAME", nullable = false, length = 250)&lt;br /&gt;@Field(index = Index.TOKENIZED, store = Store.YES)&lt;br /&gt;private String firstname = "";&lt;br /&gt;&lt;br /&gt;@Column(name = "BIRTHDATE", nullable = false)&lt;br /&gt;@Field(index = Index.UN_TOKENIZED, store = Store.YES)&lt;br /&gt;@DateBridge(resolution = Resolution.DAY)&lt;br /&gt;private Date birthdate = new Date();&lt;br /&gt;&lt;br /&gt;public Person() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Person(String firstname, String birthdate)&lt;br /&gt;  throws IllegalArgumentException {&lt;br /&gt; setFirstnameFromInput(firstname);&lt;br /&gt; setBirthdateFromInput(birthdate);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Long getId() {&lt;br /&gt; return id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void setId(Long id) {&lt;br /&gt; this.id = id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getFirstname() {&lt;br /&gt; return firstname;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setFirstname(String firstname) {&lt;br /&gt; this.firstname = StringUtil.setEmptyStringAsNull(firstname);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setFirstnameFromInput(String firstname) {&lt;br /&gt; this.firstname = StringUtil.setEmptyStringAsNullAndTrim(firstname);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Date getBirthdate() {&lt;br /&gt; return birthdate;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setBirthdate(Date birthdate) {&lt;br /&gt; this.birthdate = DateUtil.setTodayAsNull(birthdate);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setBirthdateFromInput(String birthdate)&lt;br /&gt;  throws IllegalArgumentException {&lt;br /&gt; this.birthdate = DateUtil.setTodayAsNullAndParse(birthdate);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String toString() {&lt;br /&gt; return "Person {" + "id=" + id + ", firstname='" + firstname&lt;br /&gt;   + "', birthdate='" + DateUtil.format(birthdate) + "'}";&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;There is not much to it. We use &lt;span style="font-weight: bold;"&gt;@Indexed&lt;/span&gt; to mark the class searchable, &lt;span style="font-weight: bold;"&gt;@DocumentId&lt;/span&gt; for primary key,  &lt;span style="font-weight: bold;"&gt;@Field&lt;/span&gt; for simple properties and &lt;span style="font-weight: bold;"&gt;@DateBride&lt;/span&gt; for properties that need transformation, remember that Lucene only works with strings.&lt;br /&gt;&lt;br /&gt;All Hibernate Search annotation are documented in &lt;a href="http://www.hibernate.org/hib_docs/search/api/org/hibernate/search/annotations/package-tree.html"&gt;org.hibernate.search.annotations&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is only two annotation that need further explanation:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;index&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;Index.TOKENIZED&lt;/span&gt; | &lt;span style="font-style: italic;"&gt;Index.UN_TOKENIZED&lt;/span&gt;)&lt;br /&gt;Tokenized split the text into words (Tokens) and removes insignificant words. See example.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_DPdQE6b-uQw/SaEzDPN3FEI/AAAAAAAAABk/FFcce6LkoL0/s1600-h/Screenshot-Luke+-+Lucene+Index+Toolbox,+v+0.9.1+%282008-11-22%29.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 242px;" src="http://3.bp.blogspot.com/_DPdQE6b-uQw/SaEzDPN3FEI/AAAAAAAAABk/FFcce6LkoL0/s320/Screenshot-Luke+-+Lucene+Index+Toolbox,+v+0.9.1+%282008-11-22%29.png" alt="" id="BLOGGER_PHOTO_ID_5305577966736446530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Untokenized leaves the text unchanged.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;store&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;Store.YES&lt;/span&gt; | &lt;span style="font-style: italic;"&gt;Store.NO&lt;/span&gt;)    &lt;br /&gt;Both options indexed the field, but &lt;span style="font-style: italic;"&gt;Store.YES&lt;/span&gt; writes the field to Lucene index file and makes it available via Luke. But the main difference is that now one can utilize &lt;span style="font-style: italic;"&gt;projection&lt;/span&gt; which means you can avoid even touching the database, that is the benefit we are looking for when writing high speed search application. The main drawback when using project is that raw Object, containing String value, are returned, instead of domain object graphs.&lt;br /&gt;&lt;br /&gt;Using &lt;span style="font-style: italic;"&gt;Store.YES&lt;/span&gt; should be the preferred way whenever you want high performance, and if you need to further manipulate the object, simple do a database round trip and grab the persisted domain object via the primary key.&lt;br /&gt;&lt;br /&gt;Another drawback of &lt;span style="font-style: italic;"&gt;projection&lt;/span&gt; is that you can only index simple properties and on-to-one (&lt;span style="font-style: italic;"&gt;embedded&lt;/span&gt;) object, but not other many relations. This is due of difference in the object mode between Lucene and Hibernate.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;public class HibernateTemplate {&lt;br /&gt;&lt;br /&gt;public Object execute(HibernateCallback action) throws HibernateException {&lt;br /&gt; Session session = null;&lt;br /&gt; Transaction tx = null;&lt;br /&gt; Object object = null;&lt;br /&gt; try {&lt;br /&gt;  session = HibernateUtil.getSession();&lt;br /&gt;  tx = session.getTransaction();&lt;br /&gt;  tx.begin();&lt;br /&gt;  object = action.execute(session);&lt;br /&gt;  tx.commit();&lt;br /&gt; } catch (HibernateException e) {&lt;br /&gt;  if (tx != null &amp;amp;&amp;amp; tx.isActive())&lt;br /&gt;   tx.rollback();&lt;br /&gt;  throw e;&lt;br /&gt; } finally {&lt;br /&gt;  if (session != null)&lt;br /&gt;   session.close();&lt;br /&gt; }&lt;br /&gt; return object;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void saveOrUpdate(final Object entity) throws HibernateException {&lt;br /&gt; execute(new HibernateCallback() {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public Object execute(Session session) throws HibernateException {&lt;br /&gt;   session.saveOrUpdate(entity);&lt;br /&gt;   return null;&lt;br /&gt;  }&lt;br /&gt; });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public List find(final String query) throws HibernateException {&lt;br /&gt; return (List) execute(new HibernateCallback() {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public Object execute(Session session) throws HibernateException {&lt;br /&gt;   return session.createQuery(query).list();&lt;br /&gt;  }&lt;br /&gt; });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public List findWithFullText(String query, String field,&lt;br /&gt;  final Class entity) throws HibernateException, ParseException {&lt;br /&gt;&lt;br /&gt; QueryParser parser = new QueryParser(field, new StandardAnalyzer());&lt;br /&gt; final org.apache.lucene.search.Query lucQuery = parser.parse(query);&lt;br /&gt;&lt;br /&gt; return (List) execute(new HibernateCallback() {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public Object execute(Session session) throws HibernateException {&lt;br /&gt;   FullTextSession ftSess = Search.getFullTextSession(session);&lt;br /&gt;   return ftSess.createFullTextQuery(lucQuery, entity).list();&lt;br /&gt;  }&lt;br /&gt; });&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public List findWithFullTextAndProjection(String query, String field,&lt;br /&gt;  final Class entity) throws HibernateException, ParseException {&lt;br /&gt;&lt;br /&gt; QueryParser parser = new QueryParser(field, new StandardAnalyzer());&lt;br /&gt; final org.apache.lucene.search.Query lucQuery = parser.parse(query);&lt;br /&gt;&lt;br /&gt; return (List) execute(new HibernateCallback() {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public Object execute(Session session) throws HibernateException {&lt;br /&gt;   FullTextSession fTS = Search.getFullTextSession(session);&lt;br /&gt;   FullTextQuery fTQ = fTS.createFullTextQuery(lucQuery, entity);&lt;br /&gt;   fTQ.setProjection("id", "firstname", "birthdate");&lt;br /&gt;   return fTQ.list();&lt;br /&gt;  }&lt;br /&gt; });&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public interface HibernateCallback {&lt;br /&gt;&lt;br /&gt;public Object execute(Session session) throws HibernateException;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class SessionTest {&lt;br /&gt;&lt;br /&gt;private static final Person[] INIT_DATA = new Person[] {&lt;br /&gt;  new Person("Magnus", "1974-01-01"),&lt;br /&gt;  new Person("Bertil", "1973-02-02"),&lt;br /&gt;  new Person("Klara", "1972-03-03") };&lt;br /&gt;&lt;br /&gt;private static final String FIELD = "firstname";&lt;br /&gt;&lt;br /&gt;private static final Class ENTITY = Person.class;&lt;br /&gt;&lt;br /&gt;HibernateTemplate temp = new HibernateTemplate();&lt;br /&gt;&lt;br /&gt;private void printPersonResult(Person[] persons) {&lt;br /&gt; System.out.println("Number of hits: " + persons.length);&lt;br /&gt; for (Person person : persons) {&lt;br /&gt;  System.out.println(person);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void printObjectResult(List res) {&lt;br /&gt; System.out.println("Number of hits: " + res.size());&lt;br /&gt; for (Object row : res) {&lt;br /&gt;  Object[] objects = (Object[]) row; &lt;br /&gt;  for (Object o : objects)&lt;br /&gt;   System.out.println(o);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testSaveAll() throws Exception {&lt;br /&gt; for (Person person : INIT_DATA)&lt;br /&gt;  temp.saveOrUpdate(person);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testFindAll() throws Exception {&lt;br /&gt; List res = temp.find("from Person");&lt;br /&gt; Assert.assertEquals("Testing find all.", 3, res.size());&lt;br /&gt; printPersonResult(res.toArray(new Person[0]));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testFullText() throws Exception {&lt;br /&gt; String query = "firstname:Magnus";&lt;br /&gt; List res = temp.findWithFullText(query, FIELD, ENTITY);&lt;br /&gt; Assert.assertEquals("Testing firstname search.", 1, res.size());&lt;br /&gt; printPersonResult(res.toArray(new Person[0]));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testFullText2() throws Exception {&lt;br /&gt; String query = "birthdate:19720303";&lt;br /&gt; List res = temp.findWithFullText(query, FIELD, ENTITY);&lt;br /&gt; Assert.assertEquals("Testing birthdate search.", 1, res.size());&lt;br /&gt; printPersonResult(res.toArray(new Person[0]));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testFullTextProjection() throws Exception {&lt;br /&gt; String query = "firstname:Magnus OR birthdate:19730202";&lt;br /&gt; List res = temp.findWithFullTextAndProjection(query, FIELD, ENTITY);&lt;br /&gt; Assert.assertEquals("Testing search projection.", 2, res.size());&lt;br /&gt; printObjectResult(res);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-1335267102165969222?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/1335267102165969222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=1335267102165969222&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1335267102165969222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1335267102165969222'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/02/hibernate-search-example.html' title='Hibernate Search Example'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DPdQE6b-uQw/SaEzDPN3FEI/AAAAAAAAABk/FFcce6LkoL0/s72-c/Screenshot-Luke+-+Lucene+Index+Toolbox,+v+0.9.1+%282008-11-22%29.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-1422941562969108921</id><published>2009-02-20T01:03:00.002+01:00</published><updated>2009-02-20T01:18:43.959+01:00</updated><title type='text'>Hibernate Search</title><content type='html'>In my last project I worked with Apache Lucene doing full-text/free-text search. I was quite impress of the Lucene library and what it was capable of and the speed it was executing the search. After that I was thrill to look at the Hibernate Search project that unite the popular ORM library Hibarnate and Apache Lucene and this is what I concluded.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Using the Database Free-Text Capability&lt;/span&gt;&lt;br /&gt;The full-text feature is not new and several popular databases already implement that feature, as Oracle  DB, Microsft SQL Server and MySQL, but the problem with this are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You cannot use HQL, but must use native SQL, i.e. your solution will not be portable.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;But the greatest problem is scalability. Most of the tier of an server solution can easily be clustered, but the database is normally not deployed in that way, since its primary task is to upright hold atomicity. Normally you mirroring a database for fail-over, but not clustering it. And since full-text search can be very CPU and memory intensive doing full-text search directly against a database is not the best way.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;SQL shortcoming&lt;/span&gt;&lt;br /&gt;But there also other problems that SQL poorly addresses.&lt;br /&gt;&lt;br /&gt;First when searching a text one is not interested of all the “glue"-words, e.g. a, the, over, under, but merely  noun and verbs. The same thing goes for the query. This analyzing is not part of SQL where query are based on the same order and all words, that the query contains.&lt;br /&gt;&lt;br /&gt;Another importing feature of a rich text-search library is handling of words with the same root and meaning, e.g. save, saving, saved. This should a good search-text library take into account.&lt;br /&gt;&lt;br /&gt;To make a search library appreciated, it should also understand typos, it should have a more phonetic approach.&lt;br /&gt;&lt;br /&gt;The last, but not the least, is returning search result sorted by relevance. Relevance is often defined as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If a query contain multiple word, search result where the same word order is more resembled, should have a higher rank.&lt;/li&gt;&lt;li&gt;If a query contain multiple word, search result with the most word match frequntly, should have a higher rank.&lt;/li&gt;&lt;li&gt;If the query contains typos, the better resembles, the higher rank.&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;When NOT to use Hibernate Search&lt;/span&gt;&lt;br /&gt;Even if Lucene is great there are some time, when you do not want to use it. These cases are when you want to search after a specific column, e.g. date, integer column or when you want to wild card search a specific word, then you are better off with SQL queries. This is of course natural when you think about it since these are not free-text field, merely singular value columns.&lt;br /&gt;&lt;br /&gt;All this does Apache Lucene promise, but then why Hibernate Search, what does it offer? The problem between Lucene and hibernate is twofold:&lt;br /&gt;Hibernate uses a structured domain model with association, etc., but where Lucene stores indexed in a flat hierarchy.&lt;br /&gt;How to handle synchronization between Hibernate ACID CRUDE operation and the Lucene Index. Once updating the database one expects the index also be updated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-1422941562969108921?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/1422941562969108921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=1422941562969108921&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1422941562969108921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1422941562969108921'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/02/hibernate-search.html' title='Hibernate Search'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8357700151550167817</id><published>2009-02-19T21:24:00.005+01:00</published><updated>2009-02-19T21:35:14.284+01:00</updated><title type='text'>Remove Gnome Globalmenu</title><content type='html'>I have been playing around with making Ubuntu look like Mac OSX, and when doing so I installed &lt;a href="http://code.google.com/p/gnome2-globalmenu/"&gt;gnome2-globalmenu&lt;/a&gt;. Before the latest version there where no synaptic package available so one was left with manually compile and install the applet by hand. This worked and there are several guides written to guide you, but the problem arise when you want to uninstall it.  I have been search the web but found only one forum discussion in german how to completely uninstall the gnome global menu.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;First remove the applet and the environment variable GTK_MODULES.&lt;br /&gt;&lt;/pre&gt;After doing this normally one think you should be done, but NO you are not. Every time you start an application you get the error message.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;Gtk-Message: Failed to load module "globalmenu-gnome": &lt;br /&gt;libglobalmenu-gnome.so: cannot open shared object file: No such file or &lt;br /&gt;directory&lt;br /&gt;&lt;/pre&gt;To get rid of this, do the following:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;Open gconf-editor, press alt+f2 and then run.&lt;br /&gt;Disable globalmenu-gnome&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_DPdQE6b-uQw/SZ3B2bdxirI/AAAAAAAAABc/JDmNlT8_2HM/s1600-h/Screenshot-Configuration+Editor+-+gtk-modules.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 222px;" src="http://2.bp.blogspot.com/_DPdQE6b-uQw/SZ3B2bdxirI/AAAAAAAAABc/JDmNlT8_2HM/s320/Screenshot-Configuration+Editor+-+gtk-modules.png" alt="" id="BLOGGER_PHOTO_ID_5304609076942047922" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8357700151550167817?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8357700151550167817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8357700151550167817&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8357700151550167817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8357700151550167817'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/02/remove-gnome-globalmenu.html' title='Remove Gnome Globalmenu'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DPdQE6b-uQw/SZ3B2bdxirI/AAAAAAAAABc/JDmNlT8_2HM/s72-c/Screenshot-Configuration+Editor+-+gtk-modules.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-7336036452940361951</id><published>2009-02-14T02:19:00.003+01:00</published><updated>2009-02-14T02:25:50.319+01:00</updated><title type='text'>Make Ubuntu 8.10 Intrepid Look Like Mac OSX</title><content type='html'>There are numerous site describing how to make Ubuntu look like Mac OSX, but must site that I have come across are quite buggy. And even the home page for the Google Global Menu is not correct. But yesterday I came across I really good web page that works and maybe even more imported have to uninstall the theme.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://maketecheasier.com/turn-your-ubuntu-intrepid-into-mac-osx-leopard/2009/01/08"&gt;http://maketecheasier.com/turn-your-ubuntu-intrepid-into-mac-osx-leopard/2009/01/08&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And if you are annoyed with the close, minimize and maximize (metacity) buttons you can change that with the following.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;Open gconf-editor, press alt+f2 and then run.&lt;br /&gt;&lt;/pre&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;Edit the key: app → metacity → general&lt;br /&gt;&lt;/pre&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;Set the button_layout to: menu:close,minimize,maximize&lt;br /&gt;&lt;/pre&gt;And a last that is forgotten is that Mac4Lin comes with themes and plugins for firefox and thunderbird. These packages are located in Mac4Lin directory and under Mozilla.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-7336036452940361951?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/7336036452940361951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=7336036452940361951&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7336036452940361951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7336036452940361951'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/02/make-ubuntu-810-intrepid-look-like-mac.html' title='Make Ubuntu 8.10 Intrepid Look Like Mac OSX'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-5000242057607137486</id><published>2009-02-11T13:52:00.004+01:00</published><updated>2009-02-11T23:32:59.642+01:00</updated><title type='text'>Java Concurrency: How to Share Data Between Threads.</title><content type='html'>One of challenging thing of writing multi thread safe application is to share data between different threads. The problem is twofold:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Visibility&lt;/span&gt;, i.e. one reading thread must see the latest value that another thread writes to.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Atomicity&lt;/span&gt;, e.g. one thread increment a shared class variable must be consistent with another thread setting the same class variable to a new value.&lt;/li&gt;&lt;/ul&gt;The simplest case is when one class variable is not depending on its previous state/value. A typical example is a boolean value that is explicit set and does not make use of its previous value.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;public class Worker {&lt;br /&gt;&lt;br /&gt;private volatile boolean working = false;&lt;br /&gt;&lt;br /&gt;private long workCount = 0L;&lt;br /&gt;&lt;br /&gt;public boolean isWorking() {&lt;br /&gt;return working;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void startWorking() {&lt;br /&gt;working = true;&lt;br /&gt;work();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void stopWorking() {&lt;br /&gt;working = false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void work() {&lt;br /&gt;while (working) {&lt;br /&gt; ++workCount;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In this example we do not use synchronization, but instead we use &lt;span style="font-style: italic;"&gt;volatile&lt;/span&gt;. What volatile do is force the JVM to store the variable value in memory, instead of local registers that each thread otherwise read and writes from.&lt;br /&gt;&lt;br /&gt;What is imported to not forget about volatile it does not upright hold &lt;span style="font-weight: bold;"&gt;Atomicity&lt;/span&gt;, so if the class variable was depending on it's previous state/value, this implementation would not be thread safe. Instead one should use one of the classes in &lt;span style="font-style: italic;"&gt;java.util.concurrent.atomic&lt;/span&gt; package.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-5000242057607137486?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/5000242057607137486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=5000242057607137486&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/5000242057607137486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/5000242057607137486'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/02/java-concurrency-how-to-share-data.html' title='Java Concurrency: How to Share Data Between Threads.'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-7711762810523402401</id><published>2009-01-22T00:48:00.000+01:00</published><updated>2009-01-22T01:10:03.855+01:00</updated><title type='text'>Java Concurrency</title><content type='html'>Writing a thread safe application is a challenging task, but with Java 1.5 and 1.6 a lot of the plumbing infrastructure has been moved into the Java language. But before looking at these new feature, one must first be able to write thread safe classes. Writing thread safe classes is most about sharing object's state in a safe way. That can be achieved in four ways:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Use Thread Confinement, that is to ensure that data is only accessed by one thread at a time. Examples of that are:&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Swing Event Dispatch Thread, that is accessed via the javax.swing.SwingWorker&lt;/li&gt;&lt;li&gt;java.sql.Connection that is retrieved from a server application pool.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Use Read-Only data.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Make object thread safe.&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;java.util.concurrent.atomic.AtomicLong&lt;/li&gt;&lt;br /&gt;&lt;li&gt;java.util.concurrent.ConcurrentHashMap&lt;/li&gt;&lt;br /&gt;&lt;li&gt;java.util.concurrent.ConcurrentLinkedQueue&lt;/li&gt;&lt;br /&gt;&lt;li&gt;java.util.concurrent.CopyOnWriteArrayList is the concurrent replacement of . java.util.Collections.synchronizedList(), but should only be used when iteration is far more common than modification. The reason is that copying arrays becomes very costly when the size of the list grows.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Guard object.&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;synchronized methods&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Intrinsic Lock: Using private class variable to synchronize blocks in methods.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;If you are not depending of the previous value of a variable, you can get away of adding volatile to the class variable. Volatile ensures that the most recent values are always visible between different threads memory areas. Using volatile can simplify implementing thread safety, but beware that volatile only guarantee visibility, not Atomicity. &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Now to show all the goodies that the latest Java comes with. If you want to move out one task of a code that could be done asynchronously, you need a Producer-Consumer. The Producer is the original code and the asynchronously task is put in the Consumer.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;public class Producer implements Runnable {&lt;br /&gt;&lt;br /&gt; private final File root;&lt;br /&gt;&lt;br /&gt; private final BlockingQueue&lt;String&gt; queue;&lt;br /&gt;&lt;br /&gt; public Producer(String path, BlockingQueue&lt;String&gt; queue) {&lt;br /&gt;  this.root = new File(path);&lt;br /&gt;  this.queue = queue;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void run() {&lt;br /&gt;  for (File file : root.listFiles()) {&lt;br /&gt;   if (file.isFile()) {&lt;br /&gt;    readHeadOfFile(file);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  System.out.println("Finished producing!");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void readHeadOfFile(File file) {&lt;br /&gt;  System.out.println("Reading '" + file.getName() + "'...");&lt;br /&gt;  BufferedReader reader = null;&lt;br /&gt;  try {&lt;br /&gt;   reader = new BufferedReader(new FileReader(file));&lt;br /&gt;   queue.add(reader.readLine());&lt;br /&gt;  } catch (IOException e) {&lt;br /&gt;   System.out.println("Failed to read '" + file.getAbsolutePath() + "'. " + e.getMessage());&lt;br /&gt;   Thread.currentThread().interrupt();&lt;br /&gt;  } finally {&lt;br /&gt;   closeQuitly(reader);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void closeQuitly(Reader reader) {&lt;br /&gt;  if (reader != null) {&lt;br /&gt;   try {&lt;br /&gt;    reader.close();&lt;br /&gt;   } catch (IOException e) {&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Consumer implements Runnable {&lt;br /&gt;&lt;br /&gt; private final BlockingQueue&lt;String&gt; queue;&lt;br /&gt;&lt;br /&gt; public Consumer(BlockingQueue&lt;String&gt; queue) {&lt;br /&gt;  this.queue = queue;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void run() {&lt;br /&gt;  try {&lt;br /&gt;   while (true) {&lt;br /&gt;    String str = queue.take();&lt;br /&gt;    System.out.println("Consuming '" + str + "'.");&lt;br /&gt;   }&lt;br /&gt;  } catch (InterruptedException e) {&lt;br /&gt;   System.out.println("Consumer interrupted!");&lt;br /&gt;   Thread.currentThread().interrupt();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class ProducerConsumerTest {&lt;br /&gt;&lt;br /&gt; private final ExecutorService pool = Executors.newFixedThreadPool(10);&lt;br /&gt;&lt;br /&gt; private final BlockingQueue&lt;String&gt; queue = new LinkedBlockingQueue&lt;String&gt;();&lt;br /&gt; &lt;br /&gt; @Before&lt;br /&gt; public void setUp() {&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @After&lt;br /&gt; public void tearDown() {&lt;br /&gt;  pool.shutdown(); // Disable new tasks from being submitted&lt;br /&gt;  try {&lt;br /&gt;   System.out.println("Wait 30s for existing tasks to terminate...");&lt;br /&gt;   if (!pool.awaitTermination(30, TimeUnit.SECONDS)) {&lt;br /&gt;    System.out.println("Cancel currently executing tasks");&lt;br /&gt;    pool.shutdownNow();  &lt;br /&gt;    // Wait a while for tasks to respond to being cancelled&lt;br /&gt;    if (!pool.awaitTermination(60, TimeUnit.SECONDS))&lt;br /&gt;     System.err.println("Pool did not terminate");&lt;br /&gt;   }&lt;br /&gt;  } catch (InterruptedException ie) {&lt;br /&gt;   // (Re-)Cancel if current thread also interrupted&lt;br /&gt;   pool.shutdownNow();&lt;br /&gt;   // Preserve interrupt status&lt;br /&gt;   Thread.currentThread().interrupt();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Test&lt;br /&gt; public void test() {&lt;br /&gt;  try {&lt;br /&gt;   pool.execute(new Producer("/home/magnus/documents/", queue));&lt;br /&gt;   pool.execute(new Consumer(queue));&lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;   pool.shutdown();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Examples of applicable scenarios are:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Moving logic operation out from the IO code.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Moving logging code out of the logic code.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Another convenient function is a Latch. I used it when writing a test harness and wanted to make sure all the test threads were released at the same time and then wait for them to finish, before exiting the test harness.&lt;br /&gt;See &lt;span style="font-style:italic;"&gt;java.util.concurrent.CountDownLatch&lt;/span&gt; API for a good example.&lt;br /&gt;&lt;br /&gt;If you want a reusable Latch, then look at &lt;span style="font-style:italic;"&gt;java.util.concurrent.CyclicBarrier&lt;/span&gt;. I used that one when doing calculation that should take place every time unit. See the API for a good example.&lt;br /&gt;&lt;br /&gt;One of the best thing that comes out of the box are all the Thread Pools:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;java.util.concurrent.Executors.newFixedThreadPool&lt;/li&gt;&lt;br /&gt;&lt;li&gt;java.util.concurrent.Executors.newCacheThreadPool&lt;/li&gt;&lt;br /&gt;&lt;li&gt;java.util.concurrent.Executors.newSingleThreadPool. Good because if single thread goes down a new one is automatically started.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;java.util.concurrent.Executors.newScheduledThreadPool&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-7711762810523402401?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/7711762810523402401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=7711762810523402401&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7711762810523402401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7711762810523402401'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/01/java-concurrency.html' title='Java Concurrency'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-477886810589392894</id><published>2009-01-20T10:18:00.000+01:00</published><updated>2009-01-20T10:24:26.715+01:00</updated><title type='text'>Firefox freezes when oping grails.org</title><content type='html'>I had my first real bad experience with Ubuntu when I was looking at the grails project. The Firfox web browser totally hanged when opened grails.org. I have google around but could not directly find any solution to this problem, but yesterday I found a bug report about it. It is the nvidia graphical drivers that is not working properly. To fix this install a newer nvidia driver:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;sudo apt-get install nvidia-180-kernel-source nvidia-180-modaliases nvidia-glx-180&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This will remove the old drivers:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;nvidia-177-kernel-source&lt;br /&gt;nvidia-glx-177&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After installation reboot and after login should "Hardware Drivers" dialog appear and prompt you to grant that restricted drivers be used. Select the new nvidia 180 drivers.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-177/+bug/289964"&gt;https://bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-177/+bug/289964&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-477886810589392894?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/477886810589392894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=477886810589392894&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/477886810589392894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/477886810589392894'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/01/firefox-freezes-when-oping-grailsorg.html' title='Firefox freezes when oping grails.org'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8795103654961384842</id><published>2009-01-02T04:16:00.000+01:00</published><updated>2009-01-02T04:19:58.885+01:00</updated><title type='text'>Removing White Spaces in File Name</title><content type='html'>Sometimes when you are transferring files to or from different devices or even computer running different OS, using spaces in file names can cause problems. Therefore I wrote this little script that removes white spaces from all the files in a given directory.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;for f in *; do mv "$f" `echo $f | tr --delete ' '`; done&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8795103654961384842?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8795103654961384842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8795103654961384842&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8795103654961384842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8795103654961384842'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/01/removing-white-spaces-in-file-name.html' title='Removing White Spaces in File Name'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-4227930847039393727</id><published>2009-01-02T04:13:00.000+01:00</published><updated>2009-01-02T04:20:30.688+01:00</updated><title type='text'>Using Different Date and Time Format in Thunderbird</title><content type='html'>If you are running a non-localized Ubuntu installation, but going crazy on the America date and time format in Thunderbird, then you should use this script to start Thunderbird. The script alter the date and time format to yyyy-MM-dd.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;export LC_TIME=en_DK.utf8&lt;br /&gt;/usr/bin/thunderbird $*&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-4227930847039393727?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/4227930847039393727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=4227930847039393727&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4227930847039393727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/4227930847039393727'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/01/using-different-date-and-time-format-in.html' title='Using Different Date and Time Format in Thunderbird'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8034343639127464622</id><published>2009-01-02T01:53:00.000+01:00</published><updated>2009-01-02T04:20:41.915+01:00</updated><title type='text'>Playing Commercial DVD with Ubuntu</title><content type='html'>Like Adobe Flash and proprietary media formats cannot be distributed with Ubuntu since they are not open source, but playing commercial DVD on Ubuntu is not hard. Simply install the below script and you will be able to play commercial DVD.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;sudo /usr/share/doc/libdvdread3/install-css.sh&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Once the scripts has finished simply insert a DVD and Totem player will automatically be launch. One downside with Totem player is it is not handling DVD menu very well, actually you could say it does not handle it at all. A better choice is then using VLC for playing DVD.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;sudo apt-get install vlc&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8034343639127464622?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8034343639127464622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8034343639127464622&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8034343639127464622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8034343639127464622'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/01/playing-commercial-dvd-with-ubuntu.html' title='Playing Commercial DVD with Ubuntu'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-7592224956246226235</id><published>2009-01-01T16:51:00.000+01:00</published><updated>2009-01-02T04:20:57.301+01:00</updated><title type='text'>Building Standalone Application with Maven2</title><content type='html'>If you are building standalone application in Java, Maven is your friend when packing your application, There are two way to let Maven package your application, either as a single jar with all your dependencies jar.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt; &amp;lt;plugin&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;maven-assembly-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;configuration&amp;gt;&lt;br /&gt;   &amp;lt;descriptorRefs&amp;gt;&lt;br /&gt;    &amp;lt;descriptorRef&amp;gt;jar-with-dependencies&amp;lt;/descriptorRef&amp;gt;&lt;br /&gt;   &amp;lt;/descriptorRefs&amp;gt;&lt;br /&gt;  &amp;lt;/configuration&amp;gt;&lt;br /&gt; &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;One advantage if you choose to do this way is if you need to sign your application jar. This is needed if you are building a Java Web Start client and you need more access than connecting back to the server. To read more about have Maven signing your jar read &lt;a href="http://maven.apache.org/plugins/maven-jar-plugin/usage.html"&gt;http://maven.apache.org/plugins/maven-jar-plugin/usage.html&lt;/a&gt;.&lt;br /&gt;But if you choose to go this way, make sure that all license agreement are shipped with your one single jar.&lt;br /&gt;&lt;br /&gt;Another way is to let Maven package your source code only and then referring the dependent jar file from the MANIFEST file. &lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt; &amp;lt;plugin&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;maven-jar-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;configuration&amp;gt;&lt;br /&gt;   &amp;lt;archive&amp;gt;&lt;br /&gt;    &amp;lt;manifest&amp;gt;&lt;br /&gt;     &amp;lt;addClasspath&amp;gt;true&amp;lt;/addClasspath&amp;gt;&lt;br /&gt;     &amp;lt;mainClass&gt;se.msc.adapter.Main&amp;lt;/mainClass&amp;gt;&lt;br /&gt;     &amp;lt;classpathPrefix&gt;lib/&amp;lt;/classpathPrefix&amp;gt;&lt;br /&gt;    &amp;lt;/manifest&amp;gt;&lt;br /&gt;   &amp;lt;/archive&amp;gt;&lt;br /&gt;  &amp;lt;/configuration&amp;gt;&lt;br /&gt; &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-7592224956246226235?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/7592224956246226235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=7592224956246226235&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7592224956246226235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/7592224956246226235'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/01/building-standalone-application-with.html' title='Building Standalone Application with Maven2'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-9162586665906948372</id><published>2009-01-01T16:09:00.002+01:00</published><updated>2011-07-19T21:28:21.788+02:00</updated><title type='text'>Listening on Internet Radio with Ubuntu</title><content type='html'>Listening on Internet Radio while programming is a must, but the common player with Ubuntu, Rythmbox Music Player, does not have many preinstalled internet radio stations. Of course is there way to fix this, the below site shows you have to add the popoular swedish internet radio stations radioseven.se to Rythmbox.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://henrikan.wordpress.com/2008/02/29/svenska-internetradiokanaler-for-rhythmbox/" target="_blank"&gt;http://henrikan.wordpress.com/2008/02/29/svenska-internetradiokanaler-for-rhythmbox/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But a better player that have SHOUTcast search engine preinstalled, which is the same search engine that ships with Winamp, is StreamTuner. The SHOUTcast search engine can almost find any internet radio station that will satisfy almost all music flavor.&lt;br /&gt;&lt;br /&gt;And as always Ubuntu shine when it comes to install new programs.&lt;br /&gt;&lt;br /&gt;&lt;pre style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: rgb(247, 247, 247) none repeat scroll 0% 0%; border: 1px solid rgb(215, 215, 215);"&gt;sudo apt-get install streamtuner streamripper&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-9162586665906948372?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/9162586665906948372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=9162586665906948372&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/9162586665906948372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/9162586665906948372'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2009/01/listening-on-internet-radio-with-ubuntu.html' title='Listening on Internet Radio with Ubuntu'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-289891912088210133</id><published>2008-12-20T02:58:00.001+01:00</published><updated>2008-12-20T03:01:49.086+01:00</updated><title type='text'>Maven2 Goodies</title><content type='html'>Here is a short summary of good Maven2 goodies that I have came across.&lt;br /&gt;&lt;br /&gt;The imported dependencies are located at the Central Maven2 Repository: &lt;a href="http://repo1.maven.org/maven2/"&gt;http://repo1.maven.org/maven2/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Archetypes&lt;/span&gt;&lt;br /&gt;The simplest way to start a new project is to use an archetype. To browse available archetypes go to &lt;a href="http://docs.codehaus.org/display/MAVENUSER/Archetypes+List"&gt;http://docs.codehaus.org/display/MAVENUSER/Archetypes+List&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Plugin&lt;/span&gt;&lt;br /&gt;One good thing about Maven except the standirezed directore structure is all the plugin to maven.&lt;br /&gt;&lt;br /&gt;List of all Maven Internal Plugins: &lt;a href="http://maven.apache.org/plugins/"&gt;http://maven.apache.org/plugins/&lt;/a&gt;&lt;br /&gt;External Plugin Search Page: &lt;a href="http://mvnrepository.com/"&gt;http://mvnrepository.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To list available goals for a plugin: &lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;mvn help:describe -Dplugin=jaxb2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To list available configurations for a plugin: &lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;mvn help:describe -Dplugin=jaxb2 -Dfull&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Source and Javadoc&lt;/span&gt;&lt;br /&gt;How to add source files and javadoc to maven project:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;mvn dependency:sources&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And when to generate eclipse project&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;mvn eclipse:eclipse -DdownloadSources=true -DdownloadJavadocs=true&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Name convention for source and javadoc resources:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;foo-1.0.jar (or whatever artifact is referred to in the pom.xml)&lt;br /&gt;foo-1.0-sources.jar (optional, jar containing java sources)&lt;br /&gt;foo-1.0-javadoc.jar (optional, jar containing javadocs)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Dependency&lt;/span&gt;&lt;br /&gt;When using Maven the number of dependencies tends to grow and after a while there is no way to tell if a jar file is really needed, but there is, use the below command to resolve unuzed dependency. On caution is that some jar file are not directly referenced from the code, but rather dynamically loaded during runtime. I have seen that these are not always correctly resolved, so always test your system after removing a dependency. &lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; &lt;br /&gt;mvn dependency:resolve&lt;br /&gt;...&lt;br /&gt;[WARNING] Unused declared dependencies found:&lt;br /&gt;[WARNING]    javax.xml.bind:jaxb-api:jar:2.1:compile&lt;br /&gt;[WARNING]    com.sun.xml.bind:jaxb-impl:jar:2.1.9:compile&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;mvn dependency:tree&lt;br /&gt;...&lt;br /&gt;[INFO] [dependency:tree]&lt;br /&gt;[INFO] se.msc:xml:jar:0.0.1-SNAPSHOT&lt;br /&gt;[INFO] +- junit:junit:jar:4.5:test&lt;br /&gt;[INFO] +- javax.xml.bind:jaxb-api:jar:2.1:compile&lt;br /&gt;[INFO] |  +- javax.xml.stream:stax-api:jar:1.0-2:compile&lt;br /&gt;[INFO] |  \- javax.activation:activation:jar:1.1:compile&lt;br /&gt;[INFO] \- com.sun.xml.bind:jaxb-impl:jar:2.1.9:compile&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Eclipse Maven Integration - m2eclipse&lt;/span&gt;&lt;br /&gt;If you are developing with eclipse and using Maven2 you should use m2eclipse plugin.&lt;br /&gt;&lt;br /&gt;Some times when creating new workspace the central maven repository disappear, you experience that when getting zero find result, when adding a new depency. To fix that open View 'Maven Index' and add the central maven repository.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Building Standalone with Maven2&lt;/span&gt;&lt;br /&gt;If you are building a standalone app and want to run it from the command line, and you want to get all dependencies classpath, execute the following command.&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;mvn dependency:build-classpath&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-289891912088210133?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/289891912088210133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=289891912088210133&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/289891912088210133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/289891912088210133'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2008/12/maven2-goodies.html' title='Maven2 Goodies'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8714717558052433004</id><published>2008-10-25T00:23:00.000+02:00</published><updated>2008-10-25T00:43:00.707+02:00</updated><title type='text'>JMX, MBeans, jconsole, VisualVM och Spring MBean</title><content type='html'>&lt;style type="text/css"&gt;  &lt;!--   @page { size: 8.5in 11in; margin: 0.79in }   P { margin-bottom: 0.08in }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0in;"&gt;Java Management Extension (JMX) är enkelt sätt att managera produktionssatt kod. Dels man kan inspektera property värden, men även anropa exponerade metoder och slutligen skicka och ta emot event. För exponera metoder/klasser använder man MBeans. Det finns fem MBeans:&lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;Statiska MBeans:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Standard MBeans&lt;/li&gt;&lt;li&gt;MXBeans (J2SE 5/6)&lt;/li&gt;&lt;/ul&gt;Dynamiska MBeans:&lt;ul&gt;&lt;li&gt; Dynamic MBeans&lt;/li&gt;&lt;li&gt; Model MBeans&lt;/li&gt;&lt;li&gt; Open MBeans&lt;/li&gt;&lt;/ul&gt;        &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:180%;"&gt;Statiska MBeans&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:130%;"&gt;Standard MBeans&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;Standard MBeans är den enklaste MBean typen och bygger på att man använder fördefinierade namnsättningar på sina klasser (introspection).  &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;package se.msc.jmx;&lt;br /&gt;&lt;br /&gt;public interface CalculatorMBean {&lt;br /&gt;&lt;br /&gt;   public int getMemory();&lt;br /&gt; &lt;br /&gt;   public void setMemory(int memory);&lt;br /&gt; &lt;br /&gt;   public int add(int x, int y);&lt;br /&gt; &lt;br /&gt;   public int divide(int x, int y);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;package se.msc.jmx;&lt;br /&gt;&lt;br /&gt;public class Calculator implements CalculatorMBean {&lt;br /&gt;&lt;br /&gt;   private int memory;&lt;br /&gt; &lt;br /&gt;   public int getMemory() {&lt;br /&gt;       return memory;&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   public void setMemory(int memory) {&lt;br /&gt;       this.memory = memory;&lt;br /&gt;       System.out.println("New memory=" + memory);&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   public int add(int x, int y) {&lt;br /&gt;       return x + y;&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   public int divide(int x, int y) {&lt;br /&gt;       return x / y;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;package se.msc.jmx;&lt;br /&gt;&lt;br /&gt;import java.lang.management.ManagementFactory;&lt;br /&gt;&lt;br /&gt;import javax.management.MBeanServer;&lt;br /&gt;import javax.management.ObjectName;&lt;br /&gt;&lt;br /&gt;public class Bootstrap {&lt;br /&gt;&lt;br /&gt;   public static void main(String[] args) throws Exception {&lt;br /&gt;       MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();&lt;br /&gt;     &lt;br /&gt;       mbs.registerMBean(new Calculator(), &lt;br /&gt;           new ObjectName("se.msc.jmx:type=Calculator"));&lt;br /&gt;&lt;br /&gt;       System.out.println("Running...");&lt;br /&gt;       Thread.sleep(Long.MAX_VALUE);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;    &lt;style type="text/css"&gt;  &lt;!--   @page { size: 8.5in 11in; margin: 0.79in }   P { margin-bottom: 0.08in }  --&gt;  &lt;/style&gt; &lt;br /&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0in;"&gt;Kompilera koden och start sedan:&lt;/p&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;java se.msc.jmx.Bootstrap&lt;/pre&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0in;"&gt;Starta sedan jconsole:&lt;/p&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(215, 215, 215); background: rgb(247, 247, 247) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;jconsole&lt;/pre&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0in;"&gt;och dubbelklicka se.msc.jmx  &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_DPdQE6b-uQw/SQJLGwkUztI/AAAAAAAAABM/nkKwBQjMkhc/s1600-h/JMX_StandardMBeans_Attributes.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 260px;" src="http://4.bp.blogspot.com/_DPdQE6b-uQw/SQJLGwkUztI/AAAAAAAAABM/nkKwBQjMkhc/s320/JMX_StandardMBeans_Attributes.png" alt="" id="BLOGGER_PHOTO_ID_5260849894210719442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Bild 1. Attribut&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_DPdQE6b-uQw/SQJLNo4YvGI/AAAAAAAAABU/FV_PI1k-zFU/s1600-h/JMX_StandardMBeans_Operations.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 260px;" src="http://3.bp.blogspot.com/_DPdQE6b-uQw/SQJLNo4YvGI/AAAAAAAAABU/FV_PI1k-zFU/s320/JMX_StandardMBeans_Operations.png" alt="" id="BLOGGER_PHOTO_ID_5260850012406463586" border="0" /&gt;&lt;/a&gt;Bild 2: Metoder&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;    &lt;style type="text/css"&gt;  &lt;!--   @page { size: 8.5in 11in; margin: 0.79in }   P { margin-bottom: 0.08in }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:130%;"&gt;MXBeans&lt;/span&gt;  &lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;MXBeans skiljer sig inte mycket från Standard MBeans utan tillkom för att adressera brister i Standard implementationen:&lt;/p&gt; &lt;ul&gt;&lt;li&gt; Interface och implementation måste ligga i samma paket.&lt;/li&gt;&lt;li&gt; Man behöver inte följa namnstandard längre utan kan använda annotation - @MXBean.  &lt;/li&gt;&lt;li&gt; Man kan nu använda enum (Open Types)&lt;/li&gt;&lt;/ul&gt;   &lt;p style="margin-bottom: 0in;"&gt;Intressant är också att JRE tillhandahåller en hel del MXBeans, t.ex. GarbageCollectorMXBean och ThreadMXBean, se java.lang.management för komplett lista.&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:180%;"&gt;Dynamiska MBeans&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;Skillnaden mellan statiska och dynamiska MBeans är att dynamiska MBeans exponerar sina attribut och metoder i runtime och är inte hårt satta som i det statiska fallet.&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;      &lt;style type="text/css"&gt;  &lt;!--   @page { size: 8.5in 11in; margin: 0.79in }   P { margin-bottom: 0.08in }  --&gt;  &lt;/style&gt;  &lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:180%;"&gt;Nyheter i J2SE 6&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;I J2SE 6 så har det inte tillkommit så mycket för JMX, men en stor skillnad på verktyg sidan är VisualVM. VisualVM är en sammanslagning av:&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt; jconsole – JMX console för Java SE 5/6&lt;/li&gt;&lt;li&gt; jstat – JVM statistik monitoreringsverktyg  &lt;/li&gt;&lt;li&gt; jstack – stack trace för java processer&lt;/li&gt;&lt;li&gt; jinfo – konfiguration av java processer&lt;/li&gt;&lt;li&gt; jmap – minnesanvändning av java processer&lt;/li&gt;&lt;/ul&gt;&lt;p style="margin-bottom: 0in;"&gt;       &lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-size:180%;"&gt;Spring och JMX&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;Spring Framework gör livet enklare (som vanligt) för JMX utvecklare och om du redan använder Spring i ditt projekt, så rekommenderar jag varmt att använda Spring JMX. Det Spring JMX erbjuder:&lt;/p&gt; &lt;ul&gt;&lt;li&gt; Exponering av vanliga klasser (icke JMX klasser) som MBeans&lt;/li&gt;&lt;li&gt; Enklare notifieringshantering.&lt;/li&gt;&lt;li&gt; Rikare metadata via annotering  &lt;/li&gt;&lt;/ul&gt;   &lt;br /&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0in;"&gt;Se Spring JMX &lt;a href="http://static.springframework.org/spring/docs/2.0.x/reference/jmx.html"&gt;http://static.springframework.org/spring/docs/2.0.x/reference/jmx.html&lt;/a&gt; för fullständig dokumentation.&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;Referenser:&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;Bugg i JMX local JMX registry: &lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672"&gt;http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672&lt;/a&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;J2SE 6 JMX Guide: &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/jmx/"&gt;http://java.sun.com/javase/6/docs/technotes/guides/jmx/&lt;/a&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;Remote Monitoring and Management: &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#remote"&gt;http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#remote&lt;/a&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;    &lt;style type="text/css"&gt;  &lt;!--   @page { size: 8.5in 11in; margin: 0.79in }   P { margin-bottom: 0.08in }  --&gt;&lt;/style&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8714717558052433004?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8714717558052433004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8714717558052433004&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8714717558052433004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8714717558052433004'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2008/10/jmx-mbeans-jconsole-visualvm-och-spring.html' title='JMX, MBeans, jconsole, VisualVM och Spring MBean'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DPdQE6b-uQw/SQJLGwkUztI/AAAAAAAAABM/nkKwBQjMkhc/s72-c/JMX_StandardMBeans_Attributes.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-5975493752358461782</id><published>2008-10-23T06:16:00.000+02:00</published><updated>2008-10-24T23:25:21.886+02:00</updated><title type='text'>Maven2, m2eclipse och Nexus</title><content type='html'>För er som fortfarande använder Ant som byggstöd, borde kolla Maven2. Maven2 är ett komplett byggverktyg, fast med tre skillnader:&lt;br /&gt;&lt;br /&gt;Det har inbyggt stöd för Code Lifecycle, vilket innebär om ska bygga ett projektet ska koden gå igenom alla livscyklar upp till package. Detta tänkande är väldigt uppfostrande och innebär att innan man kodat klart en komponent ska man även ha skrivet testfall, och dessa testfall ska gå igenom innan man skeppar en jar.&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #f7f7f7; border: 1px solid #d7d7d7; "&gt;&lt;br /&gt;Validate → Generate Source → Generate Resource → Compile → Test → Package → Install → Deploy&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Nästa är att Maven2 Project Object Model, POM, blir väldigt kompakt om man använder de fördefinierade katalogstrukturer, vilket innebär om en ny utvecklare ska sättas in i projektet och är bekant med Maven2, genast kommer att hitta i projektkatalogerna, men också veta hur han eller hon bygger eller testar kod utan att detta är dokumenterat.&lt;br /&gt;&lt;br /&gt;Sist men inte minst, finns de flesta tänkbara plugins till Maven2, som kommer med vettiga defaultvärden, vilket leder till att de flesta plugins fungerar out-of-the-box.&lt;br /&gt;&lt;br /&gt;Men ett byggverktyg blir inte komplett om det inte finns bra IDE stöd och för eclipse är det m2eclipse. M2eclipse har genomgått stora förändringar de senaste 8 månader då 6 personer på heltid arbetat med m2eclipse plugin. För att enklast installera m2eclipse, så använder man Eclipse Software Update och anger:&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #f7f7f7; border: 1px solid #d7d7d7; "&gt;&lt;br /&gt;http://m2eclipse.sonatype.org/update-dev/&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I större organisationer där man vill dela byggda moduler eller där säkerhetspolicys begränsar användare att vara direkt uppkopplad mot Internet finns Nexus. Nexus blir den repository som man användare frågar efter moduler, istället för att direkt gå till Maven2 centrala repository.&lt;br /&gt;&lt;br /&gt;Sist men inte minst så behöver man inte längre komma ihåg vilka archetypes det finns för Maven2, alla tillgängliga finns direkt sökbara via m2eclipse, då man skapar nytt Maven2 projekt innefrån Eclipse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-5975493752358461782?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/5975493752358461782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=5975493752358461782&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/5975493752358461782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/5975493752358461782'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2008/10/maven2-m2eclipse-och-nexus.html' title='Maven2, m2eclipse och Nexus'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-1563255849685170055</id><published>2008-10-23T03:45:00.000+02:00</published><updated>2008-10-24T23:28:22.664+02:00</updated><title type='text'>Apache Camel presentation av Bruce Snyder på Colorado Software Summit 2008</title><content type='html'>I måndags var jag på en riktig bra presentation av Bruce Snyder (&lt;a href="http://softwaresummit.com/2008/speakers/snyder.htm"&gt;http://softwaresummit.com/2008/speakers/snyder.htm&lt;/a&gt;) som presenterade Apache Camel. Camel erbjuder implementation av alla pattern som Gregor Hohpe och Bobby Woolf beskriver I Enterprise Integration Pattern, men det som är fascinerade är hur enkelt det är att använda Camel.&lt;br /&gt;&lt;br /&gt;För att implementera Content-Based Router, dvs. beroende på innehåll i XML-fil från ActiveMQ (JMS) meddelande så skickar man det vidare till olika kataloger på disk.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background: #f7f7f7; border: 1px solid #d7d7d7;"&gt;&lt;br /&gt; RouteBuilder builder = new RouteBuilder() {&lt;br /&gt;public void configure() {&lt;br /&gt; from("activemq:topic:Quotes").choice()&lt;br /&gt;     .when(xpath("/order/item = ‘paper’")).to("file://orders/paper")&lt;br /&gt;     .otherwise().to("file://orders/other");&lt;br /&gt;     }&lt;br /&gt; };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Och för att implementera Message Filer, som här filtrerar mha XPath XML-fil på disk och skickar vidare till ActiveMQ.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background: #f7f7f7; border: 1px solid #d7d7d7;"&gt;&lt;br /&gt;public class MyRouteBuilder extends RouteBuilder {&lt;br /&gt;   public void configure() {&lt;br /&gt;       from("file://orders").&lt;br /&gt;           filter().xpath("/quote/product = ‘widget’").&lt;br /&gt;               to("mqseries:WidgetQuotes");&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Och för Message Translator, som här transformerar XML-fil på disk och skickar transformerad XML till HTTP.&lt;br /&gt;&lt;br /&gt;&lt;pre style="background: #f7f7f7; border: 1px solid #d7d7d7;"&gt;&lt;br /&gt;public class MyRouteBuilder extends RouteBuilder {&lt;br /&gt;   public void configure() {&lt;br /&gt;     from("file://incoming”).&lt;br /&gt;       to("xslt:se/msc/mytransform.xsl").&lt;br /&gt;         to("http://outgoing.msc.se/foo");&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Komplett lista över alla Integration Pattern, finns på  &lt;a href="http://www.enterpriseintegrationpatterns.com/toc.html"&gt;http://www.enterpriseintegrationpatterns.com/toc.html&lt;/a&gt;. Vad också värt att notera är att man definerat ikoner för de flesta pattern, så om man skall modulera flöde i sitt projekt, så behöver man inte tänka på hur man skall representera mönstren.&lt;br /&gt;&lt;br /&gt;Om inte detta redan har övertygat dig att använda Camel, så kolla in listan över de protokoll, som de stödjer out-of-the-box, &lt;a href="http://activemq.apache.org/camel/components.html"&gt;http://activemq.apache.org/camel/components.html&lt;/a&gt;, saknar du något protokoll?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-1563255849685170055?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/1563255849685170055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=1563255849685170055&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1563255849685170055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/1563255849685170055'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2008/10/apache-camel-presentation-av-bruce.html' title='Apache Camel presentation av Bruce Snyder på Colorado Software Summit 2008'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-8979171733501000979</id><published>2008-10-21T14:36:00.000+02:00</published><updated>2008-10-24T23:29:12.669+02:00</updated><title type='text'>Att gå från Windows till Ubuntu 8.04 på Dell Latitude D830</title><content type='html'>För ett tag sedan så gick jag över till att enbart köra Ubunut på min lapptopp och de svårigheter jag hade tänkte jag skriva om nedan.&lt;br /&gt;&lt;br /&gt;Till och börja med så vill jag säga till er alla som funderar att gå över till Linux, välj Ubuntu, det av två anledningar. Dels så kan man först testa att köra Ubuntu utan att installera den (Live CD) och för det andra, så fungerade det mesta direkt, utan strul med drivrutiner eller att behöva konfigurera inställningar till dödsdagar för att nå en acceptabel nivå.&lt;br /&gt;&lt;br /&gt;I mitt fall så hittade Ubuntu alla mina hårdvaror och konfigurerade dem till vettiga standardvärden - Helt otroligt! Så varför denna artikel? Jo, några saker kom inte med i en standardinstallation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;1. Dubbla skärmar.&lt;/span&gt;&lt;br /&gt;Installera nvidia-settings: sudo apt-get install nvidia-settings&lt;br /&gt;För att ändra, kör: sudo nvidia-settings&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;2. Blutooth &lt;/span&gt;&lt;br /&gt;Börja med att kontrollera om den blåa Bluetooth lampan lyser. Om inte kontrollera att skjutreglaget till vänster på datorn är satt till &gt;&gt;. Lyser lampan nu? Om inte måste man aktivera Bluetooth från windows. Start Windows och dubbelklicka på trash icon nere till höger, välj sedan settings och därifrån klicka på on-knappen under settings. Nu kan du gå tillbaka till Ubuntu.&lt;br /&gt;&lt;br /&gt;Installera sedan alla BlueZ (the Bluetooth Stack) komponenter. Enklast från Synaptic Package Manager. Sök efter alla komponenter bluez-* och installera dessa.&lt;br /&gt;&lt;br /&gt;Starta Bluetoot service:  /etc/init.d/bluetooth start&lt;br /&gt;&lt;br /&gt;Kontrollera konfiguration: hciconfig&lt;br /&gt;&lt;br /&gt;Konfigurera: gedit /etc/bluetooth/hcid.conf&lt;br /&gt;&lt;pre style="background: #f7f7f7; border: 1px solid #d7d7d7;"&gt;&lt;br /&gt;#&lt;br /&gt;# HCI daemon configuration file.&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;# HCId options&lt;br /&gt;options {&lt;br /&gt;    # Automatically initialize new devices&lt;br /&gt;    autoinit yes;&lt;br /&gt;&lt;br /&gt;    # Security Manager mode&lt;br /&gt;    #   none - Security manager disabled&lt;br /&gt;    #   auto - Use local PIN for incoming connections&lt;br /&gt;    #   user - Always ask user for a PIN&lt;br /&gt;    #&lt;br /&gt;    security auto;&lt;br /&gt;&lt;br /&gt;    # Pairing mode&lt;br /&gt;    #   none  - Pairing disabled&lt;br /&gt;    #   multi - Allow pairing with already paired devices&lt;br /&gt;    #   once  - Pair once and deny successive attempts&lt;br /&gt;    pairing multi;&lt;br /&gt;&lt;br /&gt;    # Default PIN code for incoming connections&lt;br /&gt;    passkey "1234";&lt;br /&gt;&lt;br /&gt;        # PIN helper&lt;br /&gt;        #pin_helper /etc/bluetooth/pin-helper;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# Default settings for HCI devices&lt;br /&gt;device {&lt;br /&gt;    # Local device name&lt;br /&gt;    #   %d - device id&lt;br /&gt;    #   %h - host name&lt;br /&gt;    name "%h-%d";&lt;br /&gt;&lt;br /&gt;    # Local device class&lt;br /&gt;    class 0x000100;&lt;br /&gt;&lt;br /&gt;    # Default packet type&lt;br /&gt;    #pkt_type DH1,DM1,HV1;&lt;br /&gt;&lt;br /&gt;    # Inquiry and Page scan&lt;br /&gt;    iscan enable; pscan enable;&lt;br /&gt;    #discovto 0;&lt;br /&gt;&lt;br /&gt;    # Default link mode&lt;br /&gt;    #   none   - no specific policy&lt;br /&gt;    #   accept - always accept incoming connections&lt;br /&gt;    #   master - become master on incoming connections,&lt;br /&gt;    #            deny role switch on outgoing connections&lt;br /&gt;    lm accept;&lt;br /&gt;&lt;br /&gt;    # Default link policy&lt;br /&gt;    #   none    - no specific policy&lt;br /&gt;    #   rswitch - allow role switch&lt;br /&gt;    #   hold    - allow hold mode&lt;br /&gt;    #   sniff   - allow sniff mode&lt;br /&gt;    #   park    - allow park mode&lt;br /&gt;    lp rswitch,hold,sniff,park;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Start om bluetooth service: /etc/init.d/bluetooth restart&lt;br /&gt;&lt;br /&gt;Du kan nu kolla dina inställningar: hciconfig -a&lt;br /&gt;&lt;br /&gt;Slå nu på din mobiltelefon eller annan bluetoot device och sök efter den: hcitool scan&lt;br /&gt;&lt;br /&gt;Koppla sedan ihop dem via: hcitool inq&lt;br /&gt;&lt;br /&gt;Du kan nu kolla förbindelse genom att pinga MAC-adressen, mha l2ping.&lt;br /&gt;&lt;br /&gt;Det enklaste sättet sedan att föra över bilder från en mobiltelefon är att göra det från mobiltelefonen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;4. Kalender med Lightner plugin för Thunderbird&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Om du inte redan har installerat thunderbird, gör så: sudo apt-get install thunderbird&lt;br /&gt;&lt;br /&gt;För att lightner skall fungera, måste du installera: sudo apt-get install libstdc++5&lt;br /&gt;&lt;br /&gt;Installera sedan plugin till thunderbird via thunderbird Tools | Adds-on. Inte via synaptic package manager!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7808117296491924045-8979171733501000979?l=magnus-k-karlsson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://magnus-k-karlsson.blogspot.com/feeds/8979171733501000979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7808117296491924045&amp;postID=8979171733501000979&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8979171733501000979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7808117296491924045/posts/default/8979171733501000979'/><link rel='alternate' type='text/html' href='http://magnus-k-karlsson.blogspot.com/2008/10/att-g-frn-windows-till-ubuntu-804-p.html' title='Att gå från Windows till Ubuntu 8.04 på Dell Latitude D830'/><author><name>Magnus K Karlsson</name><uri>http://www.blogger.com/profile/00279910012518682745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyQBSgFCFI/AAAAAAAAAAk/XEocCGd-1_Q/S220/MagnusKarlsson.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7808117296491924045.post-5276682251884324052</id><published>2008-10-20T15:31:00.000+02:00</published><updated>2008-10-20T16:11:11.821+02:00</updated><title type='text'>Domain Driven Design och Dependency Injection</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;För ett tag sedan var jag med i ett projekt, där jag fick möjligheten att använda domän driven design. Det var spännande, men inte helt problemfritt efter ha läst POJO in Actions (Manning Publications), Applying Domain-Driven Design and Patterns (Addison-Wesley Professional) och valda bitar av Domain-Driven Design (Eric Evans), hittade jag fortfarande inte svaren på mina frågor. De problemen som jag stötte på när jag skulle realisera DDD i verkligheten vill jag dela med er, men framförallt höra era synpunkter.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Vad är då domän driven design - DDD? DDD var framtagen från en projektledares ögon, som hade problemet att utvecklare och kravställare/affärsanalytiker pratade förbi varandra. Detta ledde till missförstånd och värdefull tid gick förlorad. Detta är inget nytt och många har lösningen på detta, varav RUP är en. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Men vad DDD skiljer sig mot traditionella metoder är enkelheten. Man skulle bara behöva ett diagram i designdiskussioner mellan utvecklare och kravställare/affärsanalytiker – en domän modell. Detta kan låta som det blir klottrigt, men syftet med detta diagram är att enbart visa objekt som har förankring i funktionella krav och är av arkitekturisk vikt. Låt oss nu arbeta vidare med ett exempel för tydliggöra metodiken.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Anta att vi ska bygga ett biljettbokningssystem åt ett biografföretag och vi har följande krav.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ol style="margin-top: 0cm;" start="1" type="1"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Söka efter föreställningar.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Boka föreställning.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Registrera användare.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Kontrollera kreditkort med 3-partsystem.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Skicka skriftlig bokningsbekräftelse      med 3-partssystem. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Efter att ha läst krav så har vi identifierat följande substantiv, som blir våra domänobjekt:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Föreställning&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Användare&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Av funktionella och arkitekturiska och skäl lägger vi även till:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Salong &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Stol&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Bokning&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;span style="" lang="SV"&gt;Låt oss nu rita domän modellen.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyJTTcVLzI/AAAAAAAAAAM/uY-CHKGbt5I/s1600-h/Dom%C3%A4nModell_EnbartKlasser.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_DPdQE6b-uQw/SPyJTTcVLzI/AAAAAAAAAAM/uY-CHKGbt5I/s320/Dom%C3%A4nModell_EnbartKlasser.png" alt="" id="BLOGGER_PHOTO_ID_5259229429591519026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face  {font-family:Wingdings;  panose-1:5 0 0 0 0 0 0 0 0 0;  mso-font-charset:2;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 268435456 0 0 -2147483648 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:"Times New Roman";} @page Section1  {size:612.0pt 792.0pt;  margin:72.0pt 90.0pt 72.0pt 90.0pt;  mso-header-margin:35.4pt;  mso-footer-margin:35.4pt;  mso-paper-source:0;} div.Section1  {page:Section1;}  /* List Definitions */  @list l0  {mso-list-id:19354778;  mso-list-type:hybrid;  mso-list-template-ids:-1617505404 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l0:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:36.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l1  {mso-list-id:248396261;  mso-list-type:hybrid;  mso-list-template-ids:-1619897678 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l1:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:36.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l2  {mso-list-id:1101494164;  mso-list-type:hybrid;  mso-list-template-ids:313304904 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l2:level1  {mso-level-tab-stop:36.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l3  {mso-list-id:1175339487;  mso-list-type:hybrid;  mso-list-template-ids:-1625290794 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l3:level1  {mso-level-tab-stop:36.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l3:level2  {mso-level-number-format:alpha-lower;  mso-level-tab-stop:72.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;} @list l4  {mso-list-id:1324971122;  mso-list-type:hybrid;  mso-list-template-ids:411749386 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l4:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:36.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l5  {mso-list-id:1879584662;  mso-list-type:hybrid;  mso-list-template-ids:-1519513794 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l5:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:36.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l6  {mso-list-id:1995641235;  mso-list-type:hybrid;  mso-list-template-ids:-872132992 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l6:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:36.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l7  {mso-list-id:2107924554;  mso-list-type:hybrid;  mso-list-template-ids:-2031163788 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l7:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:36.0pt;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} ol  {margin-bottom:0cm;} ul  {margin-bottom:0cm;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Normal tabell";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-parent:"";  mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-para-margin:0cm;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:10.0pt;  font-family:"Times New Roman";  mso-ansi-language:#0400;  mso-fareast-language:#0400;  mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;&lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;I domänmodellen finns det flera designbeslut man kan göra, men jag vill inte fastna i dessa detaljer här, men ett anmärkningsvärd beslut är att duplicera bokningar, dvs. man skapar upp lika många bokningsobjekt som det finns stolar, med flaggan bokad till false, när man skapar en föreställning. Anledning är att snabba upp sökningen av lediga stolar och att det blir enklare att hantera flera samtidiga bokningar. Slutligen så är det rätt osannolikt att antal stolar ändras över tiden.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Nu är det dags att lägga till metoder/funktionalitet, men innan dess behöver vi även lägga till persistenshantering och interaktion med 3-partssystemen. Vi inför 3 facade klasser, som kapslar in detta:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Persistens &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Kreditkort&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Bekräftelse&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Nu börjar problemen komma. Enligt DDD så vill man knyta logik och domän objekt nära varandra. I vårt fall skulle det innebära att Föreställningsobjektet skulle ha metoderna:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;sökaFöreställning&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;bokaFöreställning&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;För Användare skulle det vara:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;spara&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="" lang="SV"&gt;&lt;br /&gt;&lt;/span&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Ett direkt val som jag inte heller tror Eric motstrider är att flytta ut alla direkta persistensanrop, till någon mera övergripande klass. I POJO in Actions kallar man dem tjänsteklasser.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Men hur gör man med den mera komplexa metoden bokaFöreställning? Till och börja kan vi bryta ner den:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Validera.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Är användare registrerad?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Finns önskade platser lediga?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Kontrollera kreditkort.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Genomför bokning.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Skicka bekräftelse.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Det vi ser är att de olika delarna behöver tillgång till våra facade klasser. Hur får de det? Vi vill definitivt inte hårdkoda detta, då vi vill kunna göra systemet testbart, samtidigt som vi vill dölja implementation av facaderna bakom interfaces, så de blir utbytbara.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Som jag ser det finns det 3 alternativt:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ol style="margin-top: 0cm;" start="1" type="1"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Ha all logik i domänobjekten och      skicka med facaderna som inparametrar. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;ol style="margin-top: 0cm;" start="1" type="a"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Nackdel: ohållbart i längden, då       inparameterlistan kan bli väldigt lång.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Ha set-metoder i domänobjektet, som      man måste anropa innan logik metoder. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;ol style="margin-top: 0cm;" start="1" type="a"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Nackdel: inga kompileringsfel om man inte har anropat set-metod och enkelt att skapa fel, för inte insatta utvecklare.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Ha all logik i domänobjekt, som INTE      kräver facade interaktion och resterande kod i tjänsteklasser.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;ol style="margin-top: 0cm;" start="1" type="a"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Nackdel: man sprider ut logiken,       vilket är det DDD försöker motsträva.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Fördelar: Man får en naturlig uppdelning av komplexa och tunga metoder till flera små metoder, vilket leder till mera lättläst kod och gör valet av vilka metoder man skall modultesta naturligare.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Som jag ser det finns det inga andra vettiga alternativ än 3.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Vi har hittills inte pratat om Dependency Injection – DI, men innan dess skulle jag vilja fundera över när vi skapar domänobjekten. Och detta leder in oss till om vi skall använda våra domänobjekt som databärare genom hela applikationen, dvs. genom alla lagren eller inte. I vår enkla applikation är övriga lager här presentationslagret. Jag antar här att de flesta förespråkar Hibernate, som persistenslagerhanterare och där använder man samma modell rakt igenom. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;I de flesta av system så är det nästan ett-till-ett förhållande mellan presentationslagret och domänmodellen och i dessa fall så ser jag inte att ett nytt databärarlager tillför något, därför rekommenderar jag att använda domänobjekten även i presentationslagret. Däremot så ska man INTE införa presentationsspecifika attribut till domänobjektet, utan oftast har man ändå någon presentationsmodell, som man lägger domänobjektet i och det är i denna presentationsmodell, som specifika presentationsattribut hör hemma.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Värt att notera är om vi inte hade valt tredje alternativet ovan, så hade jag inte rekommenderat att använda domänobjekten rakt igenom, för då hade man exponerat spara, sök, etc. logik/metoder i presentationslagret.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;Så svaret på min fråga, var man skapar domänobjekten i en presentationsdriven applikation, är i presentationslagret. Om man däremot har ett integrationslager i form av Web Service eller JMS, så ska man istället använda sig av en gemensam överenskommen modell, som passar alla integrerande system och i det fallet, så måste man konvertera sin applikationsspecifika modell.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;För att avsluta diskussionen med DI, så måste man nu blanda in hur man skall realisera transaktionshantering. Jag tänkte måla upp tre alternativ, men listan kan göras längre, men principen bör kvarstå.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Spring med enbart JTA&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;Spring med SessionBean&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="" lang="SV"&gt;SessionBean utan Spring och DI&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="SV"&gt;För att möjliggöra DI, så rekommenderar jag tjänsteklassen enbart har referenser till facadinterface och man vill använda SessionBean så får de hantera injection av beroenden. Detta leder till den mest flexibla lösningen och mest testbara.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt
