<?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-2399759103741849897</id><updated>2012-02-10T14:04:19.582-08:00</updated><category term='C++'/><category term='Cesarz'/><category term='system'/><category term='java'/><category term='python'/><category term='javahotel'/><category term='quotations'/><category term='gwt'/><category term='Math'/><category term='GoogleAppEngine'/><category term='recenzje'/><category term='database'/><category term='delphi'/><title type='text'>javahotel</title><subtitle type='html'>Blog do projektu Open Source JavaHotel</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default?start-index=101&amp;max-results=100'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>117</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-5959578638959357496</id><published>2012-02-10T14:04:00.000-08:00</published><updated>2012-02-10T14:04:19.589-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotations'/><title type='text'>So wise so young</title><content type='html'>&lt;a href="http://shakespeare.mit.edu/richardiii/full.html"&gt;http://shakespeare.mit.edu/richardiii/full.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;quote&gt;GLOUCESTER&lt;br /&gt;    [Aside] So wise so young, they say, do never    live long.&lt;/quote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-5959578638959357496?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/5959578638959357496/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2012/02/so-wise-so-young.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5959578638959357496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5959578638959357496'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2012/02/so-wise-so-young.html' title='So wise so young'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-7627237266556524332</id><published>2012-02-05T10:27:00.000-08:00</published><updated>2012-02-05T10:37:11.662-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>My next Eclipse plugin, DB2 and PL/SQL</title><content type='html'>&lt;span style="font-size: large;"&gt;Introduction&lt;/span&gt;&lt;br /&gt;I created my next Eclipse plugin. Full source code is available &lt;a href="http://code.google.com/p/javahotel/source/browse/#svn%2Ftrunk%2Fexamples%2FDatabaseObject"&gt;here&lt;/a&gt;. This time a little bit more complicated one. It allows extracting and working with PL/SQL packages (specification and body) and deploy them again. It is not a mistake - PL/SQL (SQL Oracle dialect) packages can be created and run against DB2 by virtue of &lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.db2.luw.wn.doc%2Fdoc%2Fc0054108.html"&gt;Oracle Compatible Mode &lt;/a&gt;in DB2.&lt;br /&gt;Of course - it is rather a lightweight version.&lt;br /&gt;My purpose was also to practice some additional features of Eclipse plugin I have not used so far: project nature, new project wizard, &amp;nbsp;project properties, and integration with &lt;a href="http://eclipse.org/datatools/"&gt;Data Tools Platform&lt;/a&gt; component.&lt;br /&gt;&lt;span style="font-size: large;"&gt;Project nature&lt;/span&gt;&lt;br /&gt;&lt;a href="http://wiki.eclipse.org/FAQ_When_does_my_language_need_its_own_nature%3F"&gt;Eclipse project nature&lt;/a&gt;&amp;nbsp; does not mean anything special. It allows to distinguish one project from another and to define some actions or properties specific to some project. For instance : "Extract PL/SQL objects" actions (look below) makes sense for a project with nature "Database Object" only but does not make any sense for any other project.&lt;br /&gt;Defining project nature is very simple. Just add an entry in &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/DatabaseObject/plugin.xml"&gt;plugin.xml&lt;/a&gt;&amp;nbsp;file.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;extension&lt;br /&gt;         id="databaseobject.category.projectNatureId"&lt;br /&gt;         point="org.eclipse.core.resources.natures"&amp;gt;&lt;br /&gt;      &amp;lt;runtime&amp;gt;&lt;br /&gt;         &amp;lt;run&lt;br /&gt;               class="databaseobject.nature.ProjectNature"&amp;gt;&lt;br /&gt;         &amp;lt;/run&amp;gt;&lt;br /&gt;      &amp;lt;/runtime&amp;gt;&lt;br /&gt;&amp;lt;/extension&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/DatabaseObject/src/databaseobject/nature/ProjectNature.java"&gt;supporting class&lt;/a&gt; (with empty content in this case).&lt;br /&gt;&lt;span style="font-size: large;"&gt;New project wizard&lt;/span&gt;&lt;br /&gt;Having project nature defined I created New Wizard Project action. It creates Database Objects project and applied project nature to it.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; &amp;lt;extension&lt;br /&gt;         id="databaseobject.category.wizards"&lt;br /&gt;         name="Custom Wizard"&lt;br /&gt;         point="org.eclipse.ui.newWizards"&amp;gt;&lt;br /&gt;         &amp;lt;category&lt;br /&gt;            id="databaseobject.category.wizards"&lt;br /&gt;            name="DatabaseObject"&amp;gt;&lt;br /&gt;      &amp;lt;/category&amp;gt;&lt;br /&gt;        &amp;lt;wizard&lt;br /&gt;            category="databaseobject.category.wizards"&lt;br /&gt;            class="databaseobject.wizards.NewProjectWizard"&lt;br /&gt;            id="databseobject.wizard.new.custom"&lt;br /&gt;            name="Database Objects project"&amp;gt;&lt;br /&gt;      &amp;lt;/wizard&amp;gt;&lt;br /&gt;      &amp;lt;/extension&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Wizard class - &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/DatabaseObject/src/databaseobject/wizards/NewProjectWizard.java"&gt;available here&lt;/a&gt;.&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/-h9tz6uUD09c/Ty64YYDN1rI/AAAAAAAAD8Q/B76UYKIyDJo/s1600/databaseobject1.screenshot" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="380" src="http://3.bp.blogspot.com/-h9tz6uUD09c/Ty64YYDN1rI/AAAAAAAAD8Q/B76UYKIyDJo/s400/databaseobject1.screenshot" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Project properties&lt;/span&gt;&lt;br /&gt;Next step is to add some specific properties to the project (identified by project nature).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;extension&lt;br /&gt;      point="org.eclipse.ui.propertyPages"&amp;gt;&lt;br /&gt;   &amp;lt;page&lt;br /&gt;         class="databaseobject.properties.DatabaseObjectPropertyPage"&lt;br /&gt;         id="databaseobject.properties.DatabaseObjectPropertyPage"&lt;br /&gt;         name="Database Objects properties"&amp;gt;&lt;br /&gt;  &amp;lt;filter name="nature"&lt;br /&gt;     value="databaseobject.category.projectNatureId"/&amp;gt;&lt;br /&gt;   &amp;lt;/page&amp;gt;&lt;br /&gt;&amp;lt;/extension&amp;gt;&lt;br /&gt;&lt;/pre&gt;By means of project nature this property will be visible only for this type of project and absent in all other projects.&lt;br /&gt;Supporting class is &amp;nbsp;defined&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/DatabaseObject/src/databaseobject/properties/DatabaseObjectPropertyPage.java"&gt; here&lt;/a&gt;. This property is very simple and allows assign DB2 database connection (look above) to the project.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-nKVho1pXahA/Ty66fymAPVI/AAAAAAAAD8Y/gYNSIRrGkBE/s1600/databaseobject2.screenshot" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="278" src="http://1.bp.blogspot.com/-nKVho1pXahA/Ty66fymAPVI/AAAAAAAAD8Y/gYNSIRrGkBE/s400/databaseobject2.screenshot" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Integration with Eclipse Data Tools Platform&lt;/span&gt;&lt;br /&gt;Every Java developer knows very well how to set up JDBC connection to any database (jar files, driver, URL etc). But Eclipse plugin developer does not need reinvent this wheel again, it is done already. The only effort is to make usage of goodies provided by &lt;a href="http://eclipse.org/datatools/"&gt;Data Tools Platform&lt;/a&gt;.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-HSh2EdrTI7I/Ty676lMtHtI/AAAAAAAAD8g/buSJu4RLFqU/s1600/databaseobject3.screenshot" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-HSh2EdrTI7I/Ty676lMtHtI/AAAAAAAAD8g/buSJu4RLFqU/s400/databaseobject3.screenshot" width="388" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately - integration with Data Tools Platform is not easy task and requires tedious browsing through doc and sample. &amp;nbsp;But after being connected we can run SQL statements by using standard JDBC methods and tools.&lt;br /&gt;Several useful pieces of code can be found &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/DatabaseObject/src/databaseobject/util/PluginUtil.java"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-size: large;"&gt;Extract existing PL/SQL packages from DB2 database&lt;/span&gt;&lt;br /&gt;First step to work with PL/SQL packages is to extract them from DB2 database into our Database Object project.&lt;br /&gt;Enumerating and retrieving PL/SQL packages is performed by several DB2 specific SQL statements.&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/DatabaseObject/src/databaseobject/util/CreateObjectTree.java"&gt;Source code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;     /** Statement enumerating all PL/SQL packages. */&lt;br /&gt;        private static final String SELECTPACKAGESTATEMEN = "SELECT MODULESCHEMA, MODULENAME FROM SYSCAT.MODULES WHERE MODULETYPE = 'P' ORDER BY MODULESCHEMA"; //$NON-NLS-1$&lt;br /&gt;        /** Statement retrieving package specification. */&lt;br /&gt;        private static final String SELECTPACKAGESPEC = "SELECT TEXT FROM DBA_SOURCE WHERE SCHEMA = ? AND TYPE = 'PACKAGE' AND NAME = ?"; //$NON-NLS-1$&lt;br /&gt;        /** Statement retrieving package body. */&lt;br /&gt;        private static final String SELECTPACKAGEBODY = "SELECT TEXT FROM DBA_SOURCE WHERE SCHEMA = ? AND TYPE = 'PACKAGE BODY' AND NAME = ?"; //$NON-NLS-1$&lt;br /&gt;&lt;/pre&gt;To display and select which packages are to be extracted I reused Feature Tree created in my previous &lt;a href="http://hoteljavaopensource.blogspot.com/2011/11/my-next-eclipse-plugin.html"&gt;Eclipse project&lt;/a&gt;.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-m7LyHUfE6x0/Ty6_Bw49Q3I/AAAAAAAAD8o/FTSvt6IWAe0/s1600/databaseobject4.screenshot" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="328" src="http://2.bp.blogspot.com/-m7LyHUfE6x0/Ty6_Bw49Q3I/AAAAAAAAD8o/FTSvt6IWAe0/s400/databaseobject4.screenshot" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After double clicking on any PL/SQL package name the content of this package is displayed.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Lpfvk_0AEg8/Ty6_UkfaKwI/AAAAAAAAD8w/UJQ9yDdkaW0/s1600/databaseobject5.screenshot" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="325" src="http://4.bp.blogspot.com/-Lpfvk_0AEg8/Ty6_UkfaKwI/AAAAAAAAD8w/UJQ9yDdkaW0/s400/databaseobject5.screenshot" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Project with some PL/SQL packages extracted&lt;/span&gt;&lt;br /&gt;After extracting required packages our project contains package specification and body as a plain text file and by using Eclipse text editor it is possible to modify and develop them.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-plj47hehKYU/Ty7AJF-jmzI/AAAAAAAAD84/syrdUs267oY/s1600/databaseobject7.screenshot" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="428" src="http://2.bp.blogspot.com/-plj47hehKYU/Ty7AJF-jmzI/AAAAAAAAD84/syrdUs267oY/s640/databaseobject7.screenshot" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Deploying PL/SQL packages into DB2 database&lt;/span&gt;&lt;br /&gt;Of course - also opposite operation is possible. After modifying package content we can put it again into DB2.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-hbL_6hjiG18/Ty7BK4OGM7I/AAAAAAAAD9A/GBvWR-A5SRU/s1600/databaseobject8.screenshot" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="355" src="http://2.bp.blogspot.com/-hbL_6hjiG18/Ty7BK4OGM7I/AAAAAAAAD9A/GBvWR-A5SRU/s400/databaseobject8.screenshot" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Deploying package into DB2 is done by standard JDBC Statement.execute method. &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/DatabaseObject/src/databaseobject/popup/actions/DeployAction.java"&gt;Source code&lt;/a&gt; :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;// get jdbc connection&lt;br /&gt;                        Connection jdbc = PluginUtil.getConnection(iP);&lt;br /&gt;                        // read and prepare script as string&lt;br /&gt;                        String fileName = PluginUtil.getFileName(sel);&lt;br /&gt;                        FileReader r = new FileReader(new File(fileName));&lt;br /&gt;                        String sql = "";&lt;br /&gt;                        int ch;&lt;br /&gt;                        while ((ch = r.read()) != -1) {&lt;br /&gt;                                sql += (char) ch;&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        // run sql statement (deploy PL/SQL package here)&lt;br /&gt;                        Statement stmt = jdbc.createStatement();&lt;br /&gt;                        stmt.execute(sql);&lt;br /&gt;&lt;/pre&gt;Nothing specific is necessary to accomplish it.&lt;br /&gt;&lt;span style="font-size: large;"&gt;Conclusion, future.&lt;/span&gt;&lt;br /&gt;Of course, this plugin is rather a skeleton and is unlikely to be used in any production environment. But can be used as a starting point for future development.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add "New package" action. Creates empty package specification and body&lt;/li&gt;&lt;li&gt;Deploy action also available from editor&lt;/li&gt;&lt;li&gt;Deploy group of packages at the same time&lt;/li&gt;&lt;li&gt;"Run" action. Allows defining and executing SQL statement which calls some package method for testing purpose.&lt;/li&gt;&lt;li&gt;Better integration with Data Tools Platform, use SQL editor available there. Unfortunately Data Tools Platform package is not enabled for PL/SQL packages in DB2 and it is not possible to deploy them.&lt;/li&gt;&lt;li&gt;Make usage of "SQL Results" view provided with Data Tools Platform for keeping tracks of all database activities (extracting and deploying).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;IBM Data Studio&lt;/span&gt;&lt;/div&gt;&lt;div&gt;One can ask if it makes any sense to develop this skeleton if &lt;a href="http://www.ibm.com/developerworks/downloads/im/data/"&gt;IBM Data Sudio&lt;/a&gt;&amp;nbsp;is available for free and contains all that functionality and much more. IBM Data Studio is a very good choice but I found some problems there.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;It is not possible to deploy package specification only (without package body).&lt;/li&gt;&lt;li&gt;Package content is persisted as XML document and there is no easy method to extract it into plain text file (only by copy and paste).&lt;/li&gt;&lt;li&gt;Because of that also Eclipse "Compare" text does not work as expected (compares XML files).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;But on the other hand IBM Data Studio is still evolving tool (version 3.1 was released on November 2011) and may be the next version will contain a solution to the problems described above.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-7627237266556524332?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/7627237266556524332/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2012/02/my-next-eclipse-plugin-db2-and-plsql.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7627237266556524332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7627237266556524332'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2012/02/my-next-eclipse-plugin-db2-and-plsql.html' title='My next Eclipse plugin, DB2 and PL/SQL'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-h9tz6uUD09c/Ty64YYDN1rI/AAAAAAAAD8Q/B76UYKIyDJo/s72-c/databaseobject1.screenshot' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-3404328964856453006</id><published>2011-12-26T14:20:00.000-08:00</published><updated>2011-12-26T14:20:11.596-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='javahotel'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>XML or not XML</title><content type='html'>&lt;span style="font-size: large;"&gt;Problem&lt;/span&gt;&lt;br /&gt;For some time I have been working on adding invoice making to javahotel application. I had to resolve a problem how to keep invoice data in the database. One invoice contains a lot of data of different data types and it is possible to design a table with a set of columns reflecting invoice data.&lt;br /&gt;But I found the following problems:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;There are a lot of different invoice types and every invoice type contains a set of data common to all invoices and some data specific to the invoice type given. So I have to design a different relational table for every invoice type or one common table containing the superset of all possible data. The second approach means that probably a lot of columns would be empty for&amp;nbsp; a particular invoice.&lt;/li&gt;&lt;li&gt;Invoice contains also a list of invoice details (different&amp;nbsp; for every invoice). So I have to design the second table with invoices details ("details" could be different for every invoice type) and connect them by one-to-many relation.&lt;/li&gt;&lt;li&gt;I cannot predict at this moment&amp;nbsp; all possible invoice types. Probably in the future it will be necessary to add new data to the invoice or redesign existing. But modifying relational data in a production environment is a complicated task and should be avoided as much as possible.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size: large;"&gt;Solution idea&lt;/span&gt;&lt;br /&gt;The solution is to keep invoice data as XML string in relational table. But XML format is convenient at server-side and less convenient at client-side. Although GWT provides tools for handling XML types (&lt;a href="http://code.google.com/intl/pl/webtoolkit/doc/latest/DevGuideCodingBasicsXML.html"&gt;link&lt;/a&gt;) it requires some additional effort and not reads well. Designing a POJO class for keeping invoice data and deserialize XML into POJO object is having the same disadvantages as described above.&lt;br /&gt;But I found that very flexible and useful entity for keeping data is simple Map class. Instead of :&lt;br /&gt;&lt;pre&gt; POJO container;&lt;br /&gt; Object val =&amp;nbsp; container.getInvoiceDate();&lt;br /&gt;&lt;/pre&gt;just use:&lt;br /&gt;&lt;pre&gt;Map container;&lt;br /&gt;Object val = container("InvoiceData");&lt;br /&gt;&lt;/pre&gt;Map does not require redesigning if invoice structure changes and could be the same for any invoice type.&lt;br /&gt;So the solution is to keep invoice data as XML string in the database and transform it to the Map class before transporting to client side and opposite. &lt;br /&gt;&lt;span style="font-size: large;"&gt;Solution&lt;/span&gt;&lt;br /&gt;So I created a general solution for transforming XML to Map (and opposite) at server side and use Map as a transient object. Client is receiving and using Map and is sending Map back to the server. General sequence of actions is as follows.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Client request&lt;/li&gt;&lt;li&gt;Server retrieves XML string from database and transforms to Map&lt;/li&gt;&lt;li&gt;Map is sent back to client&lt;/li&gt;&lt;li&gt;Client sends Map to server&lt;/li&gt;&lt;li&gt;Server transforms Map to XML and XML string is stored in the database.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size: large;"&gt;Common data structure&lt;/span&gt;&lt;br /&gt;This &lt;a href="http://code.google.com/p/javahotel/source/browse/#svn%2Ftrunk%2Fgwtmodelcommon%2Fsrc%2Fcom%2Fgwtmodel%2Ftable%2Fmapxml"&gt;package&lt;/a&gt; is common for client and server.&lt;br /&gt;&lt;br /&gt;It is an interface (Map) for keeping data. Should be extended for concrete implementation.&amp;nbsp; It is a subset of Map interface. Keys are XPath selector for the node containing data.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package com.gwtmodel.table.mapxml;&lt;br /&gt;&lt;br /&gt;import java.util.Set;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author hotel&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public interface IDataContainer {&lt;br /&gt;   &lt;br /&gt;    public Set&lt;string&gt;&lt;string&gt; getKeys();&lt;br /&gt;&lt;br /&gt;    public Object get(Object key);&lt;br /&gt;&lt;br /&gt;    public Object put(String key, Object val);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;It is an abstract template class for the whole data (invoice). It contains main body (as IDataContainer) and list of invoice details (as list of IDataContainer). This class should extended for concrete implementation.&lt;br /&gt;&lt;pre class="java" name="code"&gt;package com.gwtmodel.table.mapxml;&lt;br /&gt;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author hotel Template class for keeping IDataContainer data.&lt;br /&gt; */&lt;br /&gt;@SuppressWarnings("serial")&lt;br /&gt;abstract public class DataMapList&lt;t extends="" idatacontainer=""&gt; implements&lt;br /&gt;        Serializable {&lt;br /&gt;&lt;br /&gt;    /** Main body of data. */&lt;br /&gt;    private T dFields;&lt;br /&gt;    /** List of lines in shape of IDataContainer. */&lt;br /&gt;    private List&lt;t&gt; dLines;&lt;br /&gt;&lt;br /&gt;    public DataMapList(T dFields, List&lt;t&gt; dLines) {&lt;br /&gt;        this.dFields = dFields;&lt;br /&gt;        this.dLines = dLines;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @return the dFields&lt;br /&gt;     */&lt;br /&gt;    public T getdFields() {&lt;br /&gt;        return dFields;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @return the dLines&lt;br /&gt;     */&lt;br /&gt;    public List&lt;t&gt; getdLines() {&lt;br /&gt;        return dLines;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Adds next line to the dLines and returns IDataContainer just added&lt;br /&gt;     * &lt;br /&gt;     * @return IDataContainer added&lt;br /&gt;     */&lt;br /&gt;    abstract public T addToLines();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;/pre&gt;It is limited to one list of data but can be easily extended.&lt;br /&gt;&lt;span style="font-size: large;"&gt;Solution for server-side&lt;/span&gt;&lt;br /&gt;The package is available &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/#trunk%2Fgwtmodelutil%2Fsrc%2Fcom%2Fgwtmodel%2Fmapxml"&gt;here&lt;/a&gt;.&lt;br /&gt;The solution requires to define pattern XML. An example is available &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/javahotel/src/hoteldbres/xsd/Invoice.pattern"&gt;here&lt;/a&gt;. Pattern is an XML file with empty content (only tag structure is defined) and type attribute which describes the content of the tag. Interpreting types and transforming between Map object and XML texts is done by IXMLTypeFactory interface (look below). &lt;br /&gt;So creating XML string from IDataContainer map is done by means of filling the pattern XML with text content. Map keys are XPath pointers for XML document.&lt;br /&gt;And opposite - deserialize XML string into IDataContainer is done by scanning XML file, taking 'type' info from pattern XML and filling the IDataContainer with key values.&lt;br /&gt;For concrete implementation it is necessary to customize&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/gwtmodelutil/src/com/gwtmodel/mapxml/IXMLTypeFactory.java"&gt; IXMLTypeFactory interface.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package com.gwtmodel.mapxml;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author hotel Factory interface providing user specific data&lt;br /&gt; */&lt;br /&gt;public interface IXMLTypeFactory {&lt;br /&gt;&lt;br /&gt;    /** Common types. */&lt;br /&gt;    String DATE = "date";&lt;br /&gt;    String DECIMAL = "decimal";&lt;br /&gt;    String INT = "int";&lt;br /&gt;    String INTEGER = "integer";&lt;br /&gt;    String LONG = "long";&lt;br /&gt;&lt;br /&gt;    /** Name of type attribute. */&lt;br /&gt;    String TYPE = "type";&lt;br /&gt;&lt;br /&gt;    /** Returns name of 'lines' element. */&lt;br /&gt;    String getLinesTag();&lt;br /&gt;&lt;br /&gt;    /** Returns name of single line in 'lines' section. */&lt;br /&gt;    String getLineTag();&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Creates object from string (element text). Object will be inserted into&lt;br /&gt;     * IDataContainer map.&lt;br /&gt;     * &lt;br /&gt;     * @param xType&lt;br /&gt;     *            Type string (or null). Values is taken from 'type' attribute&lt;br /&gt;     * @param s&lt;br /&gt;     *            String value&lt;br /&gt;     * @return Object&lt;br /&gt;     */&lt;br /&gt;    Object contruct(String xType, String s);&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Opposite to construct. Transforms object to string&lt;br /&gt;     * &lt;br /&gt;     * @param xType&lt;br /&gt;     *            Type string (or null).&lt;br /&gt;     * @param o&lt;br /&gt;     *            Object taken from IDataContainer map&lt;br /&gt;     * @return String to be inserted into XML string&lt;br /&gt;     */&lt;br /&gt;    String toS(String xType, Object o);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;There is also available &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/gwtmodelutil/src/com/gwtmodel/mapxml/SimpleXMLTypeFactory.java"&gt;default implementation&lt;/a&gt; of this interface. It can be used "as is" or extended if customization is necessary.&lt;br /&gt;&lt;pre class="java" name="code"&gt;package com.gwtmodel.mapxml;&lt;br /&gt;&lt;br /&gt;import java.math.BigDecimal;&lt;br /&gt;import java.text.ParseException;&lt;br /&gt;import java.text.SimpleDateFormat;&lt;br /&gt;import java.util.Date;&lt;br /&gt;&lt;br /&gt;import com.gwtmodel.table.common.CUtil;&lt;br /&gt;import com.javahotel.common.command.PaymentMethod;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author hotel Default implementation of IXMLType Factory. Can be used 'as is'&lt;br /&gt; *         or extended&lt;br /&gt; */&lt;br /&gt;public class SimpleXMLTypeFactory implements IXMLTypeFactory {&lt;br /&gt;&lt;br /&gt;    protected final SimpleDateFormat fo = new SimpleDateFormat("yyyy-MM-dd");&lt;br /&gt;&lt;br /&gt;    public final static String PAYMENT = "pay";&lt;br /&gt;&lt;br /&gt;    protected boolean isInt(String xType) {&lt;br /&gt;        return xType.equals(INT) || xType.equals(INTEGER);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object contruct(String xType, String s) {&lt;br /&gt;        if (CUtil.EmptyS(xType)) {&lt;br /&gt;            return s;&lt;br /&gt;        }&lt;br /&gt;        if (xType.equals(PAYMENT)) {&lt;br /&gt;            return PaymentMethod.valueOf(s);&lt;br /&gt;        }&lt;br /&gt;        if (xType.equals(DATE)) {&lt;br /&gt;            try {&lt;br /&gt;                return fo.parse(s);&lt;br /&gt;            } catch (ParseException e) {&lt;br /&gt;                e.printStackTrace();&lt;br /&gt;                return null;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        if (xType.equals(DECIMAL)) {&lt;br /&gt;            return new BigDecimal(s);&lt;br /&gt;        }&lt;br /&gt;        if (isInt(xType)) {&lt;br /&gt;            return new Integer(s);&lt;br /&gt;        }&lt;br /&gt;        if (xType.equals(LONG)) {&lt;br /&gt;            return new Long(s);&lt;br /&gt;        }&lt;br /&gt;        return s;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public String toS(String xType, Object o) {&lt;br /&gt;        if (CUtil.EmptyS(xType)) {&lt;br /&gt;            return (String) o;&lt;br /&gt;        }&lt;br /&gt;        if (xType.equals(DATE)) {&lt;br /&gt;            Date d = (Date) o;&lt;br /&gt;            return fo.format(d);&lt;br /&gt;        }&lt;br /&gt;        if (xType.equals(PAYMENT)) {&lt;br /&gt;            PaymentMethod pa = (PaymentMethod) o;&lt;br /&gt;            return pa.toString();&lt;br /&gt;        }&lt;br /&gt;        if (xType.equals(DECIMAL)) {&lt;br /&gt;            BigDecimal b = (BigDecimal) o;&lt;br /&gt;            return b.toString();&lt;br /&gt;        }&lt;br /&gt;        if (xType.equals(LONG)) {&lt;br /&gt;            Long l = (Long) o;&lt;br /&gt;            return l.toString();&lt;br /&gt;        }&lt;br /&gt;        if (isInt(xType)) {&lt;br /&gt;            Integer i = (Integer) o;&lt;br /&gt;            return i.toString();&lt;br /&gt;        }&lt;br /&gt;        return (String) o;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public String getLinesTag() {&lt;br /&gt;        return "//Lines";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public String getLineTag() {&lt;br /&gt;        return "Line";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size: large;"&gt;Additional classes description&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;table cellpadding="0" cellspacing="0" class="list" id="nav_and_rev"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="src_crumbs src_nav" nowrap="nowrap" width="33%"&gt;&lt;span class="ifClosed" id="crumb_links"&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/gwtmodelutil/src/com/gwtmodel/mapxml/ChangeXMLToMap.java"&gt;ChangeXMLToMap.java &lt;/a&gt;: Converts XML string to DataMapList&lt;/span&gt;&lt;/td&gt;&lt;td class="src_crumbs src_nav" nowrap="nowrap" width="33%"&gt;&lt;span class="ifClosed" id="crumb_links"&gt;&amp;nbsp;&lt;/span&gt;   &lt;/td&gt;   &lt;td align="center" nowrap="nowrap" width="33%"&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/gwtmodelutil/src/com/gwtmodel/mapxml/ChangeXMLToMap.java?edit=1"&gt;&lt;img class="edit_icon" src="http://www.gstatic.com/codesite/ph/images/pencil-y14.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/gwtmodelutil/src/com/gwtmodel/mapxml/CreateXML.java"&gt;CreateXML.java&lt;/a&gt; : Opposite to above, convert DataMapList to XML string&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/gwtmodelutil/src/com/gwtmodel/mapxml/VerifyXML.java"&gt;VerifyXML.java&lt;/a&gt; : Additional class, validates XML string&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Example implementation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/javahotel/src/hotelcommon/com/javahotel/common/toobject/DContainer.java"&gt;Implementation &lt;/a&gt;of IDataContainer. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/javahotel/src/hotelcommon/com/javahotel/common/toobject/DMapContainerList.java"&gt;Implementation&lt;/a&gt; of DataMapList.&lt;br /&gt;&lt;br /&gt;Entity bean for keeping invoice data: &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/javahotel/src/hotelgaenginejpa/com/javahotel/db/hotelbase/jpa/Invoice.java"&gt;link&lt;/a&gt;. Invoice data is stored as:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;@Basic(optional = false)&lt;br /&gt;private Text invoiceXML;&lt;/blockquote&gt;Transient object used at client side:&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/javahotel/src/hotelcommon/com/javahotel/common/toobject/InvoiceP.java"&gt; link.&lt;/a&gt; All keys (XPath selector) are defined as constants &lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/javahotel/src/hoteljpa/com/javahotel/db/copy/CopyInvoice.java"&gt;Source code&lt;/a&gt; for Map-&amp;gt;XML transformation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;      sou.getInvoiceD().getdFields()&lt;br /&gt;                .put(InvoiceP.INVOICENUMBER, sou.getName());&lt;br /&gt;        String xml = HotelCreateXML.constructXMLFile(iC, IMess.INVOICEPATTERN,&lt;br /&gt;                sou.getInvoiceD());&lt;br /&gt;        boolean ok = false;&lt;br /&gt;        if (xml != null &amp;amp;&amp;amp; HotelVerifyXML.verify(iC, xml, IMess.INVOICEXSD)) {&lt;br /&gt;            ok = true;&lt;br /&gt;        }&lt;br /&gt;        if (!ok) {&lt;br /&gt;            iC.getLog().getL().info(xml);&lt;br /&gt;            String mess = iC.logEvent(IMessId.INPROPERINVOICEXML,&lt;br /&gt;                    dest.getName(), IMess.INVOICEXSD);&lt;br /&gt;            throw new HotelException(mess);&lt;br /&gt;        }&lt;br /&gt;        dest.setInvoiceXML(xml);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Code for opposite XML-&amp;gt;Map transformation.&lt;br /&gt;&lt;pre class="java" name="code"&gt;        HotelChangeXMLToMap.constructMapFromXML(iC, dest.getInvoiceD(),&lt;br /&gt;                sou.getInvoiceXML());&lt;br /&gt;        String i = (String) dest.getInvoiceD().getdFields()&lt;br /&gt;                .get(InvoiceP.INVOICENUMBER);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size: large;"&gt;Additional information&lt;/span&gt;&lt;br /&gt;There is also additional disadvantage for XML - searching and query running. Because it is not stored as a regular relational columns standard SQL statement cannot be used. So searching in XML requires additional effort - for instance in Google App Engine there is no standard method for scanning through XML. In order to find something one has to scan through table, retrieve XML string and by means of Java programming search through XML.&lt;br /&gt;But there is good news for DB2 users. DB2&amp;nbsp; (available also for DB2-Express free edition) provides built-in engine (&lt;a href="http://en.wikipedia.org/wiki/PureXML"&gt;pureXML&lt;/a&gt;) for querying XML data without extracting them to the application. &lt;br /&gt;For instance:&lt;br /&gt;Finding all invoices greater then 10000$ can be as easy as running a query:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;select * from invoice&lt;br /&gt;&lt;br /&gt;where xmlexists('$c/Invoice/Total/Total &amp;gt; "10000"'&lt;br /&gt;&lt;br /&gt;passing invoice.invoiceXML as "c")&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/2399759103741849897-3404328964856453006?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/3404328964856453006/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/12/xml-or-not-xml.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/3404328964856453006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/3404328964856453006'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/12/xml-or-not-xml.html' title='XML or not XML'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-3474908053056963782</id><published>2011-12-06T07:47:00.001-08:00</published><updated>2011-12-06T09:25:33.773-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='system'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Oracle, awk, tablespace</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: large;"&gt;Problem&lt;/span&gt;&lt;br /&gt;Assume we have the Oracle database schema export and want to deploy this schema to another database.&lt;br /&gt;&lt;pre&gt;CREATE TABLE "SCOTT"."BONUS" &lt;br /&gt;( "ENAME" VARCHAR2(10), &lt;br /&gt;"JOB" VARCHAR2(9), &lt;br /&gt;"SAL" NUMBER, &lt;br /&gt;"COMM" NUMBER &lt;br /&gt;) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING &lt;br /&gt;STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 &lt;br /&gt;PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) &lt;br /&gt;TABLESPACE "T_SPACE1" &lt;br /&gt;&lt;/pre&gt;Probably after deploying this table definition we receive the error message ORA-00959 (Table space T_SPACE1 does not exist). &amp;nbsp;Of course - no problem to create T_SPACE1 table space manually but what to do if we have thousands of tables with tens or even hundreds different table spaces ?&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Solution&lt;/span&gt;&lt;br /&gt;I found the following &lt;a href="http://linux.die.net/man/1/gawk"&gt;awk&lt;/a&gt; script useful. It simply extracts all table spaces names from table schema export and creates a script for creating all table spaces used. Datafile name is the same as table space name.&lt;br /&gt;&lt;pre class="bash" name="code"&gt;BEGIN {  }&lt;br /&gt;&lt;br /&gt;/TABLESPACE/ {&lt;br /&gt;   for (i=1; i &amp;lt; NF; i++) {&lt;br /&gt;     if ($i == "TABLESPACE") {&lt;br /&gt;       TSPACENAME=toupper($(i+1))&lt;br /&gt;       gsub(",.*","",TSPACENAME);&lt;br /&gt;       namespaces[TSPACENAME] = 1;&lt;br /&gt;     }   &lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;END { &lt;br /&gt;  for (i in namespaces) {&lt;br /&gt;    TSPACENAME=i;&lt;br /&gt;    TFILENAME=tolower(TSPACENAME); gsub("\"","",TFILENAME); &lt;br /&gt;    TFILENAME = TFILENAME ".dbf";&lt;br /&gt;&lt;br /&gt;    print "CREATE TABLESPACE " TSPACENAME&lt;br /&gt;    print "DATAFILE '/home/oracle/app/oracle/oradata/test/" TFILENAME "'"&lt;br /&gt;    print "size 1m autoextend on next 1m maxsize 2048m EXTENT MANAGEMENT LOCAL;"&lt;br /&gt;    print&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;You can catch the standard output and modify it before deployment - for instance remove creating TEMP and USERS table space.An example of usage:&lt;br /&gt;&lt;pre class="bash" name="code"&gt;awk -f namespace.awk &amp;lt; MY_USERS_TABLES.SQL &amp;gt;create_tablespace.sql&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Additional remarks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;This script assumes that TABLESPACE clause and the following table space name is in the same line. It does not hold true every time. It is possible to extend this script but it requires more coding.&lt;/li&gt;&lt;li&gt;The predicat &lt;b&gt;i&amp;lt;NF&lt;/b&gt; (not &lt;b&gt;i&amp;lt;=NF&lt;/b&gt;) is on purpose. Just skips if TABLESPACE clause is the last in the line. Probably it makes sense to add a warning message on that.&lt;/li&gt;&lt;li&gt;The &lt;b&gt;gsub(",.*","",TSPACENAME)&lt;/b&gt;; regards the case when table space name is followed by , (coma). For instance&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt; TABLESPACE "T_SPACE", PARTITION .. &lt;/span&gt;Unfortunately awk does not allow to specify more than one field deliminator, so coma is included as a part of table space name and should be removed after that.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-3474908053056963782?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/3474908053056963782/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/12/oracle-awk-tablespace.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/3474908053056963782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/3474908053056963782'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/12/oracle-awk-tablespace.html' title='Oracle, awk, tablespace'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6166813214400857696</id><published>2011-11-28T12:35:00.001-08:00</published><updated>2011-11-28T12:40:38.663-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Logging and Eclipse plugin</title><content type='html'>I added logging to my first Eclipse plugin. It seems to have been much simpler than I previously thought. Just&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/ScriptLaucherDB2/src/com/db2/sb/scriptlauncher/DB2LogUtil.java"&gt; simple class&lt;/a&gt; like that is enough:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package com.db2.sb.scriptlauncher;&lt;br /&gt;&lt;br /&gt;import org.eclipse.core.runtime.ILog;&lt;br /&gt;import org.eclipse.core.runtime.Status;&lt;br /&gt;&lt;br /&gt;import scriptlaucherdb2.Activator;&lt;br /&gt;&lt;br /&gt;public class DB2LogUtil {&lt;br /&gt;&lt;br /&gt;        private static ILog getLog() {&lt;br /&gt;                ILog log = Activator.getDefault().getLog();&lt;br /&gt;                return log;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static void log(String msg, int id, Exception e) {&lt;br /&gt;                getLog().log(new Status(Status.INFO, Activator.PLUGIN_ID, id, msg, null));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        static void log(String msg) {&lt;br /&gt;                log(msg, Status.OK, null);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        static void log(String msg, Exception e) {&lt;br /&gt;                log(msg, Status.ERROR, e);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        static void logError(String msg) {&lt;br /&gt;                log(msg, Status.ERROR, null);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        static void launchererrorLog(Exception e) {&lt;br /&gt;                log(Messages.DB2LauncherError, e);&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/2399759103741849897-6166813214400857696?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6166813214400857696/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/11/logging-and-eclipse-plugin.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6166813214400857696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6166813214400857696'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/11/logging-and-eclipse-plugin.html' title='Logging and Eclipse plugin'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6098571476884012538</id><published>2011-11-22T05:28:00.001-08:00</published><updated>2011-11-23T00:49:18.155-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Delphi, DB2, Oracle compatibility</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: large;"&gt;Introduction&lt;/span&gt;&lt;br /&gt;&lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.plsql.doc/doc/c0053607.html"&gt;DB2 Compatibility Mode&lt;/a&gt;&amp;nbsp;allows to use Oracle PL/SQL server code to run on DB2. Starting from version 9.7 DB2 recognizes two SQL dialects. SQL/PL - native DB2 and PL/SQL - native Oracle. SQL/PL code is compiled into DB2 binary form and run by DB2 engine directly - no emulation, no wrappers. It makes migration from Oracle to DB2 more easy. What's more - it is possible to maintain the same server code for two databases. It could be very interesting option for ISV.&lt;br /&gt;Import : unfortunately Oracle compatibility mode is not available for DB2 Express version (free). But one can download and install 90-day &lt;a href="http://www-01.ibm.com/software/data/db2/linux-unix-windows/download.html"&gt;trial version&lt;/a&gt; of full DB2 release.&lt;br /&gt;Also &lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.gs.doc/doc/c0023432.html"&gt;application client code&lt;/a&gt; is Oracle compatibility enabled. For instance DB2 JDBC driver is also enhanced to give the developer the access to Oracle features, for instance SYS_REFCURSOR OUT parameter in PL/SQL stored procedure.&lt;br /&gt;Unfortunately - Delphi is not on the IBM list of supported languages or application frameworks.&amp;nbsp;But DBExpress DB2 client available with every edition of Delphi can also run application against DB2 enabled for Oracle, although not all features are supported.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;What is under test&lt;/span&gt;&lt;br /&gt;To prove it I created a simple server code and simple Delphi application. Server code and application code contains only some features related to Oracle.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Execute methods in Oracle style packages with IN and OUT parameters.&lt;/li&gt;&lt;li&gt;Execute Oracle PL/SQL stored procedure outside package.&lt;/li&gt;&lt;li&gt;Execute Oracle PL/SQL UDF&lt;/li&gt;&lt;li&gt;Query the table having Oracle NUMBER type (added with DB 9.7)&lt;/li&gt;&lt;li&gt;Query the table having DATE column (there is difference between DB2 and Oracle implementation)&lt;/li&gt;&lt;li&gt;Read cursor returned from stored procedure.&lt;/li&gt;&lt;/ul&gt;Delphi code is created and executed as &lt;a href="http://en.wikipedia.org/wiki/DUnit"&gt;DUNIT&lt;/a&gt; test.&lt;br /&gt;The application and server code is available &lt;a href="http://code.google.com/p/javahotel/source/browse/#svn%2Ftrunk%2Fexamples%2Fdelphi-oracle-db2-test"&gt;here&lt;/a&gt;.&lt;br /&gt;The purpose is to pass all test using the same application and server code for both databases.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Server code and migration&lt;/span&gt;&lt;br /&gt;It is very simple and contains three tables and several simple PL/SQL code objects : packages, UDF and stored procedures. The migration of the server code from Oracle to DB2 was very simple - just deploy all object to DB2 without changing single line. Only stored procedure returning SYS_REFCURSOR should have been modified because of limitation related to Delphi client (not server)&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Application code and migration&lt;/span&gt;&lt;br /&gt;Application code is divided into two parts. One class is a general purpose class used for encapsulating some methods giving access to the database server and the second is the DUNIT test code.&lt;br /&gt;Migration of the application code was more complicated than the server code, more changes were necessary. But - to my thinking - after acquiring know-how and following good programming practices it is possible to migrate application from Delphi and maintain the same application code for both databases.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Connecting to database&lt;/span&gt;&lt;br /&gt;It is pretty easy for DB2. Just install &lt;a href="http://www-01.ibm.com/support/docview.wss?rs=4020&amp;amp;uid=swg27016878"&gt;DB2 Server Client&lt;/a&gt;&amp;nbsp; and it is ready to use by Delphi application. Oracle is a little bit more complicated if one uses&amp;nbsp;&lt;a href="http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html"&gt;instant-client&lt;/a&gt;. After unpacking client bundle it is necessary to manually set ORACLE_HOME variable and %ORACLE_HOME%\network\admin\tnsnames.ora connection profile.&lt;br /&gt;After that the connection code is simple and easy:&lt;br /&gt;&lt;br /&gt;&lt;pre class="delphi" name="code"&gt;procedure DBTest.ConnectOracle;&lt;br /&gt;begin&lt;br /&gt;  With Conn do&lt;br /&gt;  begin&lt;br /&gt;    Conn.DriverName := 'Oracle';&lt;br /&gt;    Params.Values['USER_NAME'] := 'testuser';&lt;br /&gt;    Params.Values['PASSWORD'] := 'testuser';&lt;br /&gt;    Params.Values['DATABASE'] := 'TEST';&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure DBTest.ConnectDB2;&lt;br /&gt;begin&lt;br /&gt;  With Conn do&lt;br /&gt;  begin&lt;br /&gt;    DriverName := 'DB2';&lt;br /&gt;    VendorLib := 'db2cli.dll';&lt;br /&gt;    LibraryName := 'dbxdb2.dll';&lt;br /&gt;    GetDriverFunc := 'getSQLDriverDB2';&lt;br /&gt;    Params.Values['USER_NAME'] := 'db2inst1';&lt;br /&gt;    Params.Values['PASSWORD'] := 'db2inst1';&lt;br /&gt;    Params.Values['DATABASE'] := 'tsample';&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Calling stored procedure&lt;/span&gt;&lt;br /&gt;For some reason to run stored procedure on Oracle requires ParamCheck attribute set as true and while running on DB2 it should be set as false. The solution is to create construct method for creating TSqlStoredProc class which has this attribute set accordingly and reuse this method accross application.&lt;br /&gt;&lt;br /&gt;&lt;pre class="delphi" name="code"&gt;function DBTest.getSP(packName: String; procName: String): TSQLStoredProc;&lt;br /&gt;var&lt;br /&gt;  SP: TSQLStoredProc;&lt;br /&gt;begin&lt;br /&gt;  SP := TSQLStoredProc.Create(Nil);&lt;br /&gt;  with SP do&lt;br /&gt;  begin&lt;br /&gt;    SQLConnection := Conn;&lt;br /&gt;    SchemaName := '';&lt;br /&gt;    PackageName := packName;&lt;br /&gt;    StoredProcName := procName;&lt;br /&gt;    case T of&lt;br /&gt;      Occcracle:&lt;br /&gt;        ParamCheck := true;&lt;br /&gt;      DB2:&lt;br /&gt;        ParamCheck := false;&lt;br /&gt;    end;&lt;br /&gt;    Params.Clear;s&lt;br /&gt;  end;ddd&lt;br /&gt;  result := SP;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;Keeping this limitation in mind there is &amp;nbsp;no problem with running PL/SQL stored procedure on DB2 database the same way as on Oracle. IN/OUT parameters are working as expected. Also stored PL/SQL procedure outside package can be called by omitting PackagName atrribute.&lt;br /&gt;Example&lt;br /&gt;&lt;pre class="delphi" name="code"&gt;procedure DBTest.addMessageToPackageLog(mess: String);&lt;br /&gt;var&lt;br /&gt;  SP: TSQLStoredProc;&lt;br /&gt;begin&lt;br /&gt;  SP := getSP('A_TESTLOG', 'ADD_MESSAGE');&lt;br /&gt;  With SP do&lt;br /&gt;  begin&lt;br /&gt;    Params.CreateParam(TFieldType.ftString, 'MESS', TParamType.ptInput);&lt;br /&gt;    ParamByName('MESS').AsString := mess;&lt;br /&gt;    ExecProc;&lt;br /&gt;  end;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="delphi" name="code"&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;PL/SQL UDF function&lt;/span&gt;&lt;br /&gt;Any PL/SQL UDF function can be used as a part of SQL statement in DB2 also.&lt;br /&gt;UDF Example&lt;br /&gt;&lt;pre class="sql" name="code"&gt;CREATE OR REPLACE FUNCTION ORACLE_FUNC &lt;br /&gt;RETURN INTEGER&lt;br /&gt;AS&lt;br /&gt;VARCOUNT INTEGER := 123;&lt;br /&gt;BEGIN&lt;br /&gt;    RETURN VARCOUNT;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Statement&lt;br /&gt;&lt;pre class="sql" name="code"&gt;procedure TestDBTest.Testfunc;&lt;br /&gt;var   Q: TSQLQuery;&lt;br /&gt;  res : integer;&lt;br /&gt;begin&lt;br /&gt;  FDBTest.connect;&lt;br /&gt;  { important to add ORACLE_FUNC alias, DB2 returns column number }&lt;br /&gt;  Q := FDBTest.getQ('SELECT ORACLE_FUNC AS ORACLE_FUNC FROM DUAL');&lt;br /&gt;  with Q do begin&lt;br /&gt;    Open;&lt;br /&gt;    res := FieldByName('ORACLE_FUNC').AsInteger;&lt;br /&gt;    CheckEquals(123,res);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  FDBTest.disconnect;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;One has to remember that column name in this type of &amp;nbsp;a statement is different in DB2 and Oracle. So to keep the same statement text for both platforms it is necessary to use alias for column name.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;NUMBER data type&lt;/span&gt;&lt;br /&gt;To use NUMBER data type in DB2 DBExpress client it is necessary to update db2ini.cli file and set &lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.cli.doc/doc/r0021614.html"&gt;MapDecimalFloatDescribe&lt;/a&gt; parameter.&lt;br /&gt;Example:&lt;br /&gt;&lt;pre&gt;[TSAMPLE]&lt;br /&gt;MapDecimalFloatDescribe = 3&lt;br /&gt;DBALIAS=TSAMPLE&lt;br /&gt;PWD=db2inst1&lt;br /&gt;UID=db2inst1&lt;br /&gt;&lt;/pre&gt;It will map DECFLOAT datatype (NUMBER) to float data type in Delphi. One has to remember about the risk related to the loss of precision.&lt;br /&gt;For some reason DBExpress requires for NUMBER stored procedure parameter ftBCD for Oracle and ftFloat for DB2. It can be resolved by introducing a function:&lt;br /&gt;&lt;br /&gt;&lt;pre class="delphi" name="code"&gt;function DBTest.getBCDType : TFieldType;&lt;br /&gt;begin&lt;br /&gt;  case T of&lt;br /&gt;  Oracle : result := ftBCD;&lt;br /&gt;  DB2: result := ftFloat;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;After that call sequence can look like:&lt;br /&gt;&lt;pre class="delphi" name="code"&gt;function DBTest.getNumberOfMessage: integer;&lt;br /&gt;var&lt;br /&gt;  SP: TSQLStoredProc;&lt;br /&gt;begin&lt;br /&gt;  SP := getSP('A_TESTLOG', 'GET_NUM');&lt;br /&gt;  With SP do&lt;br /&gt;  begin&lt;br /&gt;    Params.CreateParam(getBCDType, 'NUM', TParamType.ptOutput);&lt;br /&gt;    ExecProc;&lt;br /&gt;    result := ParamByName('NUM').AsInteger;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;NUMBER datatype in different forms (NUMBER, NUMBER(10), NUMBER(14,4)) works as expected.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;DATE data type&lt;/span&gt;&lt;br /&gt;DATE data type behaves differently in DB2 and Oracle. In DB2 it keeps year, month and day, in Oracle also hours, minute and millisecond. But in Oracle Compatibility Mode the DATE behaves the same way as in Oracle.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;ftCursor&lt;/span&gt;&lt;br /&gt;The stored procedure:&lt;br /&gt;&lt;pre class="sql" name="code"&gt;CREATE OR REPLACE PROCEDURE PROC_CURSOR (VARRESULT OUT SYS_REFCURSOR)&lt;br /&gt;AS&lt;br /&gt;STMT VARCHAR2(2000);&lt;br /&gt;BEGIN&lt;br /&gt;  A_TESTNUM.PREPARE_DATA; &lt;br /&gt;  OPEN VARRESULT FOR SELECT * FROM TABLE_NUM;&lt;br /&gt;END;&lt;br /&gt;&lt;/pre&gt;This stored procedure can be deployed and used in DB2 without any problems. But DBExpress DB2 client does not support ftCursor output parameter although it supports returning cursor from native SQL/PL stored procedure. Unfortunately, there is no way to transform PL/SQL cursor to returning cursor in DB2 SQL/PL- even by means of C++/Java/SQL stored procedure just to keep original PL/SQL procedure untouched.&lt;br /&gt;In order to avoid code duplicating (two versions of the cursor stored procedure) small refactoring is necessary in the server and client code to minimize code branching.&lt;br /&gt;Server code:&lt;br /&gt;&lt;pre class="sql" name="code"&gt;CREATE OR REPLACE PROCEDURE PROC_CURSOR (VARRESULT OUT SYS_REFCURSOR)&lt;br /&gt;AS&lt;br /&gt;STMT VARCHAR2(2000);&lt;br /&gt;BEGIN&lt;br /&gt;  PREPARE_PROC_CURSOR(STMT);&lt;br /&gt;  OPEN VARRESULT FOR STMT;&lt;br /&gt;END;&lt;br /&gt;@&lt;br /&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE PREPARE_PROC_CURSOR (STMT OUT VARCHAR) AS&lt;br /&gt;BEGIN&lt;br /&gt;  A_TESTNUM.PREPARE_DATA; &lt;br /&gt;  STMT :=  'SELECT * FROM TABLE_NUM';&lt;br /&gt;END; &lt;br /&gt;@&lt;br /&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE INSERT_NUMS(NUM1 IN A_TESTNUM.N1%TYPE, NUM2 IN A_TESTNUM.N2%TYPE,NUM3 IN A_TESTNUM.N3%TYPE) AS&lt;br /&gt;  BEGIN&lt;br /&gt;    A_TESTNUM.PA_INSERT_NUMS(NUM1,NUM2,NUM3); &lt;br /&gt;  END INSERT_NUMS;&lt;br /&gt;@&lt;br /&gt;&lt;br /&gt;CREATE PROCEDURE DB2_PROC_CURSOR ()&lt;br /&gt;        DYNAMIC RESULT SETS 1&lt;br /&gt;P1: BEGIN&lt;br /&gt;        -- Declare cursor&lt;br /&gt;        DECLARE STMTA VARCHAR2(2000);&lt;br /&gt;        BEGIN&lt;br /&gt;            CALL PREPARE_PROC_CURSOR(STMTA);&lt;br /&gt;        PREPARE STMT_P FROM STMTA;&lt;br /&gt;    END;        &lt;br /&gt;    BEGIN&lt;br /&gt;          DECLARE cursor1 CURSOR WITH RETURN for STMT_P;&lt;br /&gt;          OPEN cursor1;&lt;br /&gt;        END;&lt;br /&gt;END P1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Assuming that the most important logic is hidden in preparing statement text this part of the code can be reused. Only small part responsible for creating a cursor is database dependent. But this parts are pure mechanical ones and there is nothing special there.&lt;br /&gt;Also calling sequence at the application side should be modified.&lt;br /&gt;&lt;br /&gt;&lt;pre class="delphi" name="code"&gt;function TestDBTest.getCursorSP: TSQLStoredProc;&lt;br /&gt;var&lt;br /&gt;  SP: TSQLStoredProc;&lt;br /&gt;begin&lt;br /&gt;  case FDBTest.getT of&lt;br /&gt;    Oracle:&lt;br /&gt;      begin&lt;br /&gt;        SP := FDBTest.getSP('PROC_CURSOR');&lt;br /&gt;        SP.Params.CreateParam(TFieldType.ftCursor, 'VARRESULT',&lt;br /&gt;          TParamType.ptOutput);&lt;br /&gt;      end;&lt;br /&gt;    db2:&lt;br /&gt;      SP := FDBTest.getSP('DB2_PROC_CURSOR');&lt;br /&gt;  end;&lt;br /&gt;  result := SP;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;It is bad news. But good news is that the rest of the code (Open, Next, Eof) is exactly the same for both platforms.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Devart DBExpress&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.devart.com/odac/"&gt;Devart DBExpress client for Oracle&lt;/a&gt;&amp;nbsp;client (purchasable) covers much more functionality than the standard DBExpress client delivered with Delphi. For instance BOOLEAN datatype parameters in stored procedure are supported. Also it is possible to call UDF directly (not as a part of SELECT statement) and retrieve the result. This functionality is not supported by DB2 DBExpress client. &amp;nbsp;Migrating application heavily dependent on this additional functionality requires much more effort.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;Although one cannot say that migrating Delphi application from Oracle to DB2 is a piece of cake it is astonishing that so much can be achieved even the if DBExpress client for DB2 is not Oracle Compatibility Mode enabled. What is more important - ISV can maintain the same code for both platforms just to cover both market shares.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The Grande Finale&lt;/span&gt;&lt;br /&gt;DB2 and Oracle&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mReRBZP4rrI/Tsv2AY8RG2I/AAAAAAAAD4A/-Q1N7lMEIKc/s1600/Capture.GIF" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="460" src="http://3.bp.blogspot.com/-mReRBZP4rrI/Tsv2AY8RG2I/AAAAAAAAD4A/-Q1N7lMEIKc/s640/Capture.GIF" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6098571476884012538?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6098571476884012538/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/11/delphi-db2-oracle-compatibility.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6098571476884012538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6098571476884012538'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/11/delphi-db2-oracle-compatibility.html' title='Delphi, DB2, Oracle compatibility'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-mReRBZP4rrI/Tsv2AY8RG2I/AAAAAAAAD4A/-Q1N7lMEIKc/s72-c/Capture.GIF' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-1274830575471140578</id><published>2011-11-15T08:54:00.000-08:00</published><updated>2011-11-15T08:55:12.164-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>My next Eclipse plugin</title><content type='html'>I created my next simple Eclipse plugin in shape of application launcher. The source code is available &lt;a href="http://code.google.com/p/javahotel/source/browse/#svn%2Ftrunk%2Fexamples%2FTestTreePlugin"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Introduction&lt;/span&gt;&lt;br /&gt;Assume that we want to create a launcher for an external application. The behavior of this application can be customized by a list (tree) of features. Our purpose is to create an application launcher which contains tab allowing to select/enable/disable features available. We also expect current features selection to be persisted.&lt;br /&gt;The output looks like:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UvrODLF3zDU/TsKUiR3IKBI/AAAAAAAAD30/UHFftNoMBGQ/s1600/snapshot19.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="425" src="http://4.bp.blogspot.com/-UvrODLF3zDU/TsKUiR3IKBI/AAAAAAAAD30/UHFftNoMBGQ/s640/snapshot19.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;By virtue of the application launcher manager it is possible to create and use more than one feature set.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Additional information&lt;/span&gt;&lt;br /&gt;This plugin does not contain any logic to define external application to run. The launch extension is empty. The purpose is only to implement displaying and handling list of features.&lt;br /&gt;Handling (displaying) tree of features is done by a separate &lt;a href="http://code.google.com/p/javahotel/source/browse/#svn%2Ftrunk%2Fexamples%2FTestTreePlugin%2Fsrc%2Forg%2Ffeature%2Ftree"&gt;package&lt;/a&gt;. This package can be reused outside configuration launcher context. It contains also 'Main' class to be launched as SWT application.&lt;br /&gt;In the&amp;nbsp;ILaunchConfigurationWorkingCopy interface only features value (true/false) are persisted, without tree structure. So in order to save and restore the content it is necessary to apply the same (here pre-order) tree traverse algorithm.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Future extension&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The tree structure is hardcoded in the plugin. It could be nice to read the tree structure from external resource (e.g. XML file)&lt;/li&gt;&lt;li&gt;Only tree values (without tree structure) are persisted. In case of modifying tree structure the actual list of features could not match the changed tree structure. It could be the cause of problems. This problem can be mitigated by keeping additional tree identifier. In case of changing this modifier simply reset the list to default values.&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/2399759103741849897-1274830575471140578?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/1274830575471140578/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/11/my-next-eclipse-plugin.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1274830575471140578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1274830575471140578'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/11/my-next-eclipse-plugin.html' title='My next Eclipse plugin'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-UvrODLF3zDU/TsKUiR3IKBI/AAAAAAAAD30/UHFftNoMBGQ/s72-c/snapshot19.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-2232095262521727485</id><published>2011-11-13T13:52:00.000-08:00</published><updated>2011-11-13T13:56:29.471-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na koncercie</title><content type='html'>Dnia 9 listopada 2011 byliśmy na koncercie w wykonaniu &lt;a href="http://www.operakameralna.pl/?09112011"&gt;Zespołu Instrumentów Dawnych Warszawskiej Opery Kameralnej&lt;/a&gt;&lt;span id="goog_1943148823"&gt;&lt;/span&gt;&lt;span id="goog_1943148824"&gt;&lt;/span&gt;. Podobało nam się bardzo, ale trudno żeby się nie podobał repertuar złożony z koncertów Bacha i Vivaldiego, w pięknym wnętrzu Sali Balowej Zamku Królewskiego, w bardzo dobrym wykonaniu.&lt;br /&gt;W pierwszej części słyszeliśmy koncerty skrzypcowe Bach i Vivaldiego na skrzypce solo, dwoje i czworo skrzypiec. Nie wiem, czy było dobrym pomysłem żeby partie solowe w każdym koncercie grali kolejno wszyscy członkowie zespołu. Jak na moje ucho, czasami cierpiała na tym precyzja wykonania.&lt;br /&gt;Ale wszystko przyćmiła druga część koncertu na którą złożyły się koncerty klawesynowe Bach, kolejno na klawesyn solo, dwa, trzy i cztery klawesyny. Zwłaszcza, że niemal przez ramię mogliśmy podglądać grę znakomitego klawesynisty Władysława Kłosiewicza. Tak samo oceniła to wykonanie licznie zgromadzona publiczność, która oklaskami zmusiła zespół do wykonania bisu, jakim była brawurowa i dynamiczna ostatnia część Koncertu a-moll na cztery klawesyny.&lt;br /&gt;Dobrym pomysłem było zestawienie w ramach jednego wieczoru koncertów klawesynowych z ich skrzypcowymi pierwowzorami. Wymieniony wyżej koncert a-moll na cztery klawesyny i koncert h-moll Vivaldiego na czworo skrzypiec oraz koncert c-moll na dwa klawesyny który jest identyczny z koncertem d-moll na dwoje skrzypiec. I skrzypcowe oryginały i ich klawesynowe transkrypcje podobały się bardzo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-2232095262521727485?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/2232095262521727485/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/11/bylismy-na-koncercie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2232095262521727485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2232095262521727485'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/11/bylismy-na-koncercie.html' title='Byliśmy na koncercie'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6597897822366620029</id><published>2011-10-29T02:38:00.000-07:00</published><updated>2011-10-29T02:38:11.149-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>DB2 script launcher, Eclipse plugin (continue)</title><content type='html'>I added two small enhancements to DB2 script launcher.&lt;br /&gt;&lt;span style="font-size: large;"&gt;Enhancement 1&lt;/span&gt;&lt;br /&gt;Launch configuration dialog automatically for the first time when user right-clicked "Run as script launcher" and any configuration has been created so far (&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/ScriptLaucherDB2/src/com/db2/sb/scriptlauncher/DB2ScriptShortCut.java"&gt;source&lt;/a&gt;).&lt;br /&gt;Code snippet:&lt;br /&gt;&lt;pre class="java" name="code"&gt;// Open launch configuration dialog for enter first configuration&lt;br /&gt;  String name = manager.generateLaunchConfigurationName(NEW_CONFIGURATION);&lt;br /&gt;  ILaunchConfigurationWorkingCopy wc = type.newInstance(null,name);&lt;br /&gt;  configuration = wc.doSave();&lt;br /&gt;  LaunchConfigurationManager lcm = DebugUIPlugin.getDefault().getLaunchConfigurationManager();&lt;br /&gt;                                &lt;br /&gt;  ILaunchGroup group = lcm.getLaunchGroup(type, ILaunchManager.RUN_MODE);&lt;br /&gt;  DebugUITools.openLaunchConfigurationPropertiesDialog(getShell(), configuration, group.getIdentifier());&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size: large;"&gt;Enhancement 2&lt;/span&gt;&lt;br /&gt;The second is related to the problem of invalidating launch configuration when user is changing something. It was achieved be means of updateLaunchConfigurationDialog() method. Code snippet (&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/ScriptLaucherDB2/src/com/db2/sb/scriptlauncher/DB2ScriptTabView.java"&gt;source&lt;/a&gt;):&lt;br /&gt;&lt;pre class="java" name="code"&gt;ModifyListener listener = new ModifyListener() {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void modifyText(ModifyEvent arg0) {&lt;br /&gt;     updateLaunchConfigurationDialog();&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;............&lt;br /&gt;  db2Alias.addModifyListener(listener);&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/2399759103741849897-6597897822366620029?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6597897822366620029/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/10/db2-script-launcher-eclipse-plugin_29.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6597897822366620029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6597897822366620029'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/10/db2-script-launcher-eclipse-plugin_29.html' title='DB2 script launcher, Eclipse plugin (continue)'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-4438534927649647815</id><published>2011-10-24T05:31:00.000-07:00</published><updated>2011-10-24T05:31:27.261-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na koncercie</title><content type='html'>23 października 2011 byliśmy na &lt;a href="http://www.warsawcamerata.pl/warsaw-camerata-pl/a-la-carte/"&gt;koncercie Warsaw Camerata&lt;/a&gt; w praskiej &lt;a href="http://www.bazylika.salezjanie.pl/"&gt;bazylice&lt;/a&gt; na Kawęczyńskiej, podobało nam się bardzo.&lt;br /&gt;Orkiestra Warsaw Camerata, którą kieruje Paweł Kos-Nowicki, powstała w 2010 roku i jej celem jest prezentowanie muzyki znanych i trochę mniej znanych kompozytorów w bardzo dobrym wykonaniu, podobającej się widzom. I udało się to znakomicie.&lt;br /&gt;Vivaldi napisał 39 koncertów na fagot i orkiestrę, tutaj usłyszeliśmy dwa, solistą był Leszek Wachnik. Wszyscy znamy doskonale 40 symfonię g-moll Mozarta, z przyjemnością wysłuchaliśmy jeszcze raz.&lt;br /&gt;W ostatniej części koncertu orkiestra dała widzom możliwość wyboru jednego z trzech utworów. Do wysłuchania każdego z nich zachęcał jeden z muzyków orkiestry. Trochę żałowałem, że przez aklamację została wybrania "Orawa" Wojciecha Kilara, chętniej bym usłyszał "Lituanię" Romualda Twardowskiego, utwór premierowy, więc muzyka zupełnie nowa. Ale "Orawa", kompozycja rytmiczna i dynamiczna, też podobała się&amp;nbsp; bardzo.&lt;br /&gt;Orkiestra dała też widzom możliwość wyboru repertuaru na następny koncert dnia 20 listopada. My wybraliśmy koncert skrzypcowy D-dur Beethovena oraz symfonię C-Dur Georgesa Bizeta (utwór mniej znany od pozostałych, ale na pewno wart poznania). Jesteśmy ciekawi, czy nasze gusta się pokryją z gustami pozostałych widzów.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-4438534927649647815?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/4438534927649647815/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/10/bylismy-na-koncercie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4438534927649647815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4438534927649647815'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/10/bylismy-na-koncercie.html' title='Byliśmy na koncercie'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6307361633579686620</id><published>2011-10-16T13:21:00.000-07:00</published><updated>2011-10-17T04:10:16.213-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy w teatrze</title><content type='html'>Byliśmy 6 października 2011 na spektaklu &lt;a href="http://www.narodowy.pl/spektakl_szczegoly/?s=6879"&gt;"Sprawa"&lt;/a&gt; w Teatrze Narodowym, podobało nam się bardzo.&lt;br /&gt;&lt;a href="http://pl.wikipedia.org/wiki/Samuel_Zborowski_%28dramat%29"&gt;"Samuel Zborowski"&lt;/a&gt; Słowackiego należy do tzw. "okresu genezyjskiego" w twórczości poety. Nie jest to oczywiście dramat z historii Polski ani głos w dyskusji, jakie właściwie motywy kierowały Zamojskim,&amp;nbsp; że doprowadził do ścięcia Zborowskiego. Temat ten budzi emocje także współcześnie, o czym świadczy znakomita książka &lt;a href="http://merlin.pl/Samuel-Zborowski_Jaroslaw-Marek-Rymkiewicz/browse/product/1,808068.html"&gt;Rymkiewicza "Samuel Zborowski" &lt;/a&gt;.&lt;br /&gt;W dramacie Słowackiego nie sam Zborowski jest nawet głównym bohaterem, w inscenizacji w Teatrze Narodowym nazwa utworu została zamieniona na "Sprawa". Utwór nie ma wyraźnego zakończenia, sprawia wrażenie niekompletnego, jakby autor dopiero tworzył szkice dla późniejszej, bardziej spójnej, finalnej wersji. Dramat nie dzieje się w jakimś określonym czasie, czas jest tutaj rzeczą płynną. Nie dzieje się także w jakimś określonym miejscu, przestrzeni. Duchy i osoby pojawiają się i znikają, jedne zamieniają się w drugie, sam Lucyfer przyjmuje kilka imion i ról. Ale jest rzeczą niezwykłą, że to zdawać by się mogło niesceniczne dzieło, doczekało się już 13 realizacji.&lt;br /&gt;Głównym bohaterem jest Lucyfer, ale nie jest to szatan, przeciwnik Boga. Bardziej przypomina Mefistofelesa z legendy o Fauście, ale Mefistofeles to przecież także szatan starający się wyrwać duszę Fausta Bogu. Lucyfer jest tutaj bardziej stworzeniem duchowym szukającym drogi do Boga, ale poza ramami jakiejkolwiek zorganizowanej religii czy oficjalnej teologii.&lt;br /&gt;Dramat wyraża wiarę w istnienie Ducha przenikającego przez ludzkie dzieje i dążącego do osiągnięcia pełnego zrozumienia planów Boga.&lt;br /&gt;W pierwszym akcie widzimy marzenie senne Eoliona wcielającego się w egipskiego faraona, łącznika między światem bogów i ludzi. W drugim akcie Eolion stawia się na wezwanie Walkirii i spotyka Dziewicę, córkę rybaka. Zaczynają wspólną wędrówkę, ale gdy są już o krok od ostatecznego poznania tajemnicy, Lucyfer wtrąca ich w przepaść, bo nie nadszedł jeszcze na to czas. W trzecim akcie Lucyfer pojawia się na dworze Amfitryty. Królestwo Amfitryty to nie tyle ocean, ale piekło, coś co powstało na samym początku i znajduje się w najniższym kręgu świata. Z tego świata kiedyś wyrwał się Lucyfer, przyoblekł się w ciało i rozpoczął mozolną i bolesną wędrówkę ku górze. W czwartym akcie przenosimy się do Zamku. Książę (ojciec Heliona) stracił zmysły, umiera i przybyli mnisi przygotowują się do wyprawienia pogrzebu. W piątym akcie Zamek zamienia się w sąd, gdzie stają dwaj protagoniści : Książę, w którego wcielił się duch kanclerza Zamojskiego i Samuel Zborowski. Końcową część utworu wypełnia ogromna przemowa Lucyfera-Adwokata. Ale celem nie jest ustalenie czyjejś winy w tym sporze. Tak jak przywoływany kilkakrotnie Jan (autor nowotestamentowej Apokalipsy) pokazuje niebo i wydarzenia na ziemi widziane z nieba, tak Adwokat ukazuje konflikt Zborowski-Zamojski widziany ze świata duchów. Duch objawił się w Samuelu Zborowskim. Miał się rozprzestrzenić na cały naród polski, wynieść go nad inne narody i z Lucyferem na czele wstąpić do niebiańskiego miasta. Ale Zamojski, kierowany suchym legalizmem kazał ściąć Zborowskiego i ten zamysł legł w gruzach. &lt;br /&gt;Przedstawienie w Teatrze Narodowym było bardzo dobrą inscenizacją tego niejasnego i nie wszędzie spójnego dramatu. Autorzy nie starali się za wszelką cenę opowiedzieć jakiejś historii czy szukać współczesnych analogii, ale oddać jak najlepiej treść dramatu. Ale mam wątpliwość czy bez lektury samego tekstu jest możliwe ogarnięcie sensu. Zaś współczesne analogie się nasuwają - słynne słowa Papieża wypowiedziane 2 czerwca 1979 w Warszawie "Niech zstąpi Duch Twój i odnowi oblicze tej ziemi" (odniesienie do Ps 104) nasuwają skojarzenie do ducha, który poprzez Zborowskiego miał zmienić bieg historii. Jak wiemy - tym razem było to skuteczne.&lt;br /&gt;Głównym bohaterem jest Lucyfer znakomicie zagrany przez Mariusza Bonaszewskiego. Lucyfer ma wiele wcieleń, raz wije się jak wąż, mówi głośno i cicho, dużo i mało, spokojnie i gwałtownie, jak przystało na Lucyfera wydrwiwa "urzędników" oficjalnej religii w czwartym akcie.&amp;nbsp; W finalnej scenie Lucyfer-Adwokat uderza w dramatycznie i poważne tony i również brzmi to znakomicie. Dominika Kluźniak doskonale odnalazła się w roli młodzieńczego Eoliona. Pozostałe postacie mają mniej do powiedzenia, ale z przyjemnością oglądaliśmy Jerzego Radziwiłłowicza w roli Księcia/kanclerza Zamojskiego.&lt;br /&gt;W środku przedstawienia wstawiony jest przerywnik w postaci relacji z pogrzebu Słowackiego na Wawelu jaki miał miejsce w 1927 roku. Brzmi to trochę jak relacja nie z tego świata, gdyż współcześnie nie potrafimy sobie wyobrazić żeby państwo miało z takim rozmachem czcić pamięć jakiegokolwiek poety. Na końcu słyszymy - suflowane przez Lucyfera - słynne słowa: "bo królom był równy" i widzowie zadają sobie pytanie "czy był na pewno?". W drugim akcie Amfitryta w otoczeniu "oceanek" (przychodzi na pamięć Tytania z orszakiem elfów w "Śnie Nocy Letniej"), ubrane w stroje płetwonurków tańczą w rytmie hard-metalowej muzyki o natężeniu na progu wytrzymałości widzów. Gdy Lucyfer-Bukary przekonuje mnichów, że potrafi śpiewać dyszkantem, śpiew przechodzi w muzykę z finału "Czarodziejskiego Fletu" Mozarta.&lt;br /&gt;Do końcowej przemowy Lucyfera (w dramacie zajmującej 1/3 całości) znakomicie została wykorzystana nowoczesna scena Teatru Narodowego. Dzięki temu przemowa, z trudnego dla widzów do wytrzymania monologu, zamieniła się w dynamiczne widowisko rozgrywające na kilku poziomach i scenach, nic nie gubiąc z samej treści.&lt;br /&gt;Ponieważ sam dramat nie ma wyraźnego zakończenia, więc realizatorzy obudowali przestawienie na początku i końcu monologiem wygłoszonym przez młodego aktora wyrażający respekt wobec ogromu wszechświata. Ale bym skłamał, gdybym powiedział że treść tego przesłania utkwiła mi w pamięci.&lt;br /&gt;Przedstawianie dramatów genezyjskich Słowackiego to na pewno ciężki kawałek chleba. Parafrazując znane powiedzenie, jeśli realizacja wierna, to ciężka i nużąca, jeśli ma być piękna, to trzeba odejść od samego dramatu. Ale można z całą pewnością powiedzieć, że&amp;nbsp; "Sprawa" w Teatrze Narodowym uniknęła tej pułapki, jest piękna i wierna.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6307361633579686620?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6307361633579686620/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/10/bylismy-w-teatrze.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6307361633579686620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6307361633579686620'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/10/bylismy-w-teatrze.html' title='Byliśmy w teatrze'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-7029029753919825262</id><published>2011-10-07T15:06:00.000-07:00</published><updated>2011-10-07T15:06:59.000-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>DB2 script launcher, Eclipse plugin</title><content type='html'>&lt;span style="font-size: large;"&gt;Introduction &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I created my first Eclipse plug-in. It is quite simple and allows running from Eclipse a script (sql) file against DB2 database.&lt;br /&gt;It is based on &lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=%2Fcom.ibm.db2.udb.apdv.sql.doc%2Fdoc%2Fc0023559.htm"&gt;CLP&lt;/a&gt; - Command Line Processor - and runs script which are valid in terms of this tool. It does not use JDBC connection.&lt;br /&gt;In order to run&amp;nbsp; this plugin it is necessary to install DB2 client package. It is free and available from &lt;a href="https://www-304.ibm.com/support/docview.wss?rs=4020&amp;amp;uid=swg21385217"&gt;IBM web page&lt;/a&gt;. DB2 database (remote or local) should be &lt;a href="http://www.techlabs4u.com/2010/04/how-to-connect-db2-remote-database-from.html"&gt;cataloged&lt;/a&gt; and ready to use. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;How it runs&lt;/span&gt;&lt;br /&gt;Firstly we have to create DB2 script launcher.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-iEzMvidEdFo/To9vDLKyrwI/AAAAAAAAD3U/-0lrGzLO8uU/s1600/zrzut_ekranu-Run+Configurations+.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="427" src="http://2.bp.blogspot.com/-iEzMvidEdFo/To9vDLKyrwI/AAAAAAAAD3U/-0lrGzLO8uU/s640/zrzut_ekranu-Run+Configurations+.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"Database alias name" is an alias (catalog name) to DB2 database. &lt;br /&gt;After having launcher defined we can simply right-click on any file (with .db2 or .sql extension) and run this script using database access connection defined.&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/-gayIC8RZwNc/To9wI3KjerI/AAAAAAAAD3Y/WxhcdZMwces/s1600/snapshot4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="448" src="http://4.bp.blogspot.com/-gayIC8RZwNc/To9wI3KjerI/AAAAAAAAD3Y/WxhcdZMwces/s640/snapshot4.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;More then one database configuration can be defined to have an access to more than one database. In this case the selection dialog will be displayed allowing choosing the database (configuration).&lt;br /&gt;It is also possible to run script launcher in editor. The current content of the editor is copied to temporary file and CLP is launched.&lt;br /&gt;If no configuration has been defined yet than launcher dialog will displayed allowing defining the first one. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Source code&lt;/span&gt;&lt;br /&gt;Source code and plugin.xml file file available &lt;a href="http://code.google.com/p/javahotel/source/browse/#svn%2Ftrunk%2Fexamples%2FScriptLaucherDB2"&gt;here&lt;/a&gt;. It is my first plugin and probably not everything is perfect.&lt;br /&gt;Several problems have been especially troublesome and required scanning through the documentation.&lt;br /&gt;&lt;br /&gt;How to launch the configuration programmatically to allow entering the very first configuration (&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/ScriptLaucherDB2/src/com/db2/b/scriptlauncher/DB2ScriptShortCut.java"&gt;source&lt;/a&gt;).&lt;br /&gt;&lt;pre class="java" name="code"&gt;if (configurations.length == 0) {&lt;br /&gt;    // Open launch configuration dialog for enter first configuration&lt;br /&gt;    String name = manager.generateLaunchConfigurationName(NEW_CONFIGURATION);&lt;br /&gt;    ILaunchConfigurationWorkingCopy wc = type.newInstance(null,name);&lt;br /&gt;    configuration = wc.doSave();&lt;br /&gt;    LaunchConfigurationManager lcm = DebugUIPlugin.getDefault().getLaunchConfigurationManager();&lt;br /&gt;                                &lt;br /&gt;    ILaunchGroup group = lcm.getLaunchGroup(type, ILaunchManager.RUN_MODE);&lt;br /&gt;    DebugUITools.openLaunchConfigurationPropertiesDialog(getShell(), configuration, group.getIdentifier());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;How to extract file path name (necessary to launch CLP) from eclipse IPath (&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/ScriptLaucherDB2/src/com/db2/b/scriptlauncher/DB2ScriptShortCut.java"&gt;source&lt;/a&gt;)&lt;br /&gt;&lt;pre class="java" name="code"&gt;@Override&lt;br /&gt; public void launch(ISelection arg0, String arg1) {&lt;br /&gt;      ITreeSelection iSel = (ITreeSelection) arg0;&lt;br /&gt;      TreePath[] t = iSel.getPaths();&lt;br /&gt;      TreePath fPath = t[0];&lt;br /&gt;      Object o = fPath.getLastSegment();&lt;br /&gt;      File f = (File) o;&lt;br /&gt;      URI locationURI = f.getLocationURI();&lt;br /&gt;      URI u = locationURI;&lt;br /&gt;      String fileName = u.getPath();&lt;br /&gt;      runDB2(fileName, null);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;How to extract content from the open editor (&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/ScriptLaucherDB2/src/com/db2/b/scriptlauncher/DB2ScriptShortCut.java"&gt;source&lt;/a&gt;)&lt;br /&gt;&lt;pre class="java" name="code"&gt;@Override&lt;br /&gt;public void launch(IEditorPart arg0, String arg1) {&lt;br /&gt;  ITextEditor i = (ITextEditor) arg0;&lt;br /&gt;  IDocumentProvider dProvider = i.getDocumentProvider();&lt;br /&gt;  IDocument iDok = dProvider.getDocument(i.getEditorInput());&lt;br /&gt;  String content = iDok.get();&lt;br /&gt;  runDB2(null, content);&lt;br /&gt;}&amp;nbsp;&lt;/pre&gt;&lt;pre class="java" name="code"&gt;&lt;/pre&gt;&lt;span style="font-size: large;"&gt;Future&lt;/span&gt;&lt;br /&gt;This launcher is very simple but can be the basis for future developing. For instance&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Enter the separator between different sql statements inside the file. Now ; is hardcoded.&lt;/li&gt;&lt;li&gt;Keep the history of launching to match previous results.&lt;/li&gt;&lt;li&gt;Catalog database (connection method) from plugin directly.&lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-7029029753919825262?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/7029029753919825262/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/10/db2-script-launcher-eclipse-plugin.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7029029753919825262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7029029753919825262'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/10/db2-script-launcher-eclipse-plugin.html' title='DB2 script launcher, Eclipse plugin'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-iEzMvidEdFo/To9vDLKyrwI/AAAAAAAAD3U/-0lrGzLO8uU/s72-c/zrzut_ekranu-Run+Configurations+.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6759345526289123693</id><published>2011-09-20T14:38:00.000-07:00</published><updated>2011-09-20T14:38:27.975-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>GWT, editable table</title><content type='html'>&lt;span id="goog_525934339"&gt;&lt;/span&gt;&lt;span id="goog_525934340"&gt;&lt;/span&gt;I found very usable a Cell Table which allows to edit its cells (&lt;span id="goog_525934337"&gt;&lt;/span&gt;&lt;span id="goog_525934338"&gt;&lt;/span&gt;&lt;a href="http://gwt.google.com/samples/Showcase/Showcase.html#%21CwCellTable"&gt;sample&lt;/a&gt;). It is quite easy to use it : while adding new column to the table use 'editable' cell in the constructor.&lt;br /&gt;But standard editable cell types (EditTextCell, TextInputCell, DatePickerCell) have one limitation :&amp;nbsp; these columns in all rows are eligible to edit. So I found impossible to implement the following scenario:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;User is browsing through the table. Edit mode is blocked to avoid changing something by accident.&lt;/li&gt;&lt;li&gt;Decides to edit one row.&amp;nbsp; Set on the switch 'edit this row' and this row is transformed to edit mode. But edit mode for all other rows is blocked.&lt;/li&gt;&lt;li&gt;After finishing editing set off the switch and the row is again in look mode.&lt;/li&gt;&lt;/ol&gt;So in order to implement this scenario I was forced to create my own 'editable' cells by extending standard editable cell type.&lt;br /&gt;Example - switchable version of 'TextInputCell'&lt;br /&gt;&lt;pre class="java" name="code"&gt;private class EditStringCell extends TextInputCell implements IGetField {&lt;br /&gt;&lt;br /&gt;        private final IVField v;&lt;br /&gt;&lt;br /&gt;        EditStringCell(IVField v) {&lt;br /&gt;            this.v = v;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public void render(Context context, String value, SafeHtmlBuilder sb) {&lt;br /&gt;            Object key = context.getKey();&lt;br /&gt;            Integer i = (Integer) key;&lt;br /&gt;            boolean editenabled = eCol.isEditable(i, v);&lt;br /&gt;            if (editenabled) {&lt;br /&gt;                super.render(context, value, sb);&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;            // Get the view data.&lt;br /&gt;            // copy and paste from TextInputCell&lt;br /&gt;            // the only difference is different HTML for displaying value&lt;br /&gt;            TemplateDisplay template = GWT.create(TemplateDisplay.class);&lt;br /&gt;            ViewData viewData = getViewData(key);&lt;br /&gt;            if (viewData != null &amp;amp;&amp;amp; viewData.getCurrentValue().equals(value)) {&lt;br /&gt;                clearViewData(key);&lt;br /&gt;                viewData = null;&lt;br /&gt;            }&lt;br /&gt;            String s = (viewData != null) ? viewData.getCurrentValue() : value;&lt;br /&gt;            if (s != null) {&lt;br /&gt;                sb.append(template.input(s));&lt;br /&gt;            } else {&lt;br /&gt;                sb.appendHtmlConstant("");&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;The difference is only in 'render' method. If 'edit mode' is on it simply invokes standard method. If 'edit mode' is off it overrides standard and displays the content. In order to have it working correctly I had to copy and modify the body of standard method to deal with specific way of storing value of the cell in 'ViewData' type.&lt;br /&gt;Although I'm not very happy with that is seems working for me.&lt;br /&gt;The all 'switchable' edit cell I'm using are implemented in this &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/gwtmodel/src/com/gwtmodel/table/view/table/PresentationCellFactory.java"&gt;source&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6759345526289123693?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6759345526289123693/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/09/gwt-editable-table.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6759345526289123693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6759345526289123693'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/09/gwt-editable-table.html' title='GWT, editable table'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6863875904411989480</id><published>2011-09-11T14:48:00.000-07:00</published><updated>2011-09-11T14:48:15.502-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>New version Boa tester</title><content type='html'>New version of &lt;a href="http://code.google.com/p/boatester/"&gt;Boa&lt;/a&gt; test framework.&lt;br /&gt;In order to avoid CR/LF (DOS) and LF (Linux) hell I had to change a method for file comparison. I replaced standard filecmp.cmp function with manual line by line comparison. &lt;a href="http://code.google.com/p/boatester/source/browse/trunk/BoaHarness/src/testharness/TestCaseHelper.py"&gt;Source file&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Before:&lt;br /&gt;&lt;pre class="python" name="code"&gt;&amp;nbsp; eq = filecmp.cmp(sou, dest)&lt;br /&gt;&amp;nbsp; if not eq:&lt;br /&gt;&amp;nbsp; &amp;nbsp; logging.info(" &amp;nbsp;different")&lt;br /&gt;&amp;nbsp; &amp;nbsp; res = 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now:&lt;br /&gt;&lt;pre class="python" name="code"&gt;f1 = open(sou, "r")&lt;br /&gt; f2 = open(dest, "r")&lt;br /&gt; li1 = f1.readlines()&lt;br /&gt; li2 = f2.readlines()&lt;br /&gt; if len(li1) != len(li2) :&lt;br /&gt;    logging.info(" number of lines is different")&lt;br /&gt;    res = 0&lt;br /&gt;    continue&lt;br /&gt; for i in range(0, len(li1))  :&lt;br /&gt; line1 = li1[i].rstrip()&lt;br /&gt; line2 = li2[i].rstrip()&lt;br /&gt; if line1 != line2 : &lt;br /&gt;    logging.info(" line number: " + str(i)  + " different")&lt;br /&gt;    logging.info(line1)&lt;br /&gt;    logging.info(line2)&lt;br /&gt;    res = 0&lt;br /&gt;    break&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/2399759103741849897-6863875904411989480?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6863875904411989480/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/09/new-version-boa-tester.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6863875904411989480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6863875904411989480'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/09/new-version-boa-tester.html' title='New version Boa tester'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-945773140580155479</id><published>2011-08-21T13:46:00.000-07:00</published><updated>2011-08-21T13:46:56.483-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Trusted context and LBAC</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: large;"&gt;Introduction&lt;/span&gt;&lt;br /&gt;I decided to create another example to demonstrate the power of trusted connection. This time I will use LBAC&amp;nbsp;&lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.admin.doc/doc/c0021114.htm"&gt;Label Based Access Control&lt;/a&gt;&amp;nbsp;in DB2. It enables more granular control on access &amp;nbsp;to the data than standard SQL GRANT and REVOKE clause. We can limit access not only the whole database objects (like tables and views) but also to the particular rows and columns in tables. Important: LBAC is not available in DB2 Express Edition (free). But it is accessible in demo (90 day) version of DB 9.7.&lt;br /&gt;More information on LBAC:&amp;nbsp;&lt;a href="http://www.ibm.com/developerworks/data/tutorials/dm0605wong/"&gt;http://www.ibm.com/developerworks/data/tutorials/dm0605wong/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Example&lt;/span&gt;&lt;br /&gt;Let's use the standard SAMPLE database. Assume that out of the blue very restrictive access policy in our HR department has been announced - women can only look at the data of female workers and men only male workers (or opposite). How to enforce that policy without costly and time consuming rewrtiting of our HR software ?&lt;br /&gt;The rescue is the usage of LBAC. To cut the long story short it is based on labels which are assigned to the rows in the EMPLOYEE table. Than the same label is assigned to the user and by comparing these labels DB2 limits access to the row in the table.&lt;br /&gt;Enabling LBAC policy on EMPLOYEE table is little bit complicate and requires several steps. But very important: it is done at the database level, does not involve any changed in the software.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Step1 - create LBAC enabled table&lt;/span&gt;&lt;br /&gt;In order to avoid spoiling SAMPLE database I will create additional LBAC_EMPLOYEE table being a copy of the EMPLOYEE_table&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;create table lbac_employee like employee&lt;br /&gt;grant select on table lbac_employee to role samplereadaccess&lt;br /&gt;insert into lbac_employee (select * from employee)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Step 2 - create security label component and policy&lt;/span&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;CREATE SECURITY LABEL COMPONENT SEX SET {'F','M'}&lt;br /&gt;CREATE SECURITY POLICY SEX_POLICY COMPONENTS SEX WITH DB2LBACRULES&lt;br /&gt;ALTER SECURITY POLICY SEC_POLICY USE ROLE AUTHORIZATIONS&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Step 3 - enable LBAC on a table&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;ALTER TABLE LBAC_EMPLOYEE ADD SECURITY POLICY SEX_POLICY&lt;br /&gt;&lt;br /&gt;ALTER TABLE lbac_employee ADD COLUMN SEX_PROTECTION DB2SECURITYLABEL&lt;br /&gt;DB21034E The command was processed as an SQL statement because it was not a&lt;br /&gt;valid Command Line Processor command. During SQL processing it returned:&lt;br /&gt;SQL20402N Authorization ID "DB2INST1" does not have the LBAC credentials to&lt;br /&gt;perform the "ALTER" operation on table "DB2INST1.LBAC_EMPLOYEE".&lt;br /&gt;SQLSTATE=42519&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The second command failed - it means that our LBAC protection over EMPLOYEE table is working. Only an user having valid LBAC security level can modify the table. Even instance owner (db2inst1) cannot modify LBAC protected table without LBAC authorization !&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Step 4 - create role and security labels&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;CREATE SECURITY LABEL SEX_POLICY.ADM COMPONENT SEX 'F','M'&lt;br /&gt;GRANT SECURITY LABEL SEX_POLICY.ADM TO user db2inst1 FOR WRITE ACCESS&lt;br /&gt;DB21034E The command was processed as an SQL statement because it was not a&lt;br /&gt;valid Command Line Processor command. During SQL processing it returned:&lt;br /&gt;SQL0554N An authorization ID cannot grant a privilege or authority to itself.&lt;br /&gt;SQLSTATE=42502&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Again - the second command failed. Starting from DB2 9.7 security role has been separated from the database administrator role. Only the user having SECAMD (security administrator) role can assign LBAC privileges to users.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Step 5 - create SECADM user&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;# linux commmand&lt;br /&gt;adduser db2sec1&lt;br /&gt;&lt;/pre&gt;&lt;pre class="sql" name="code"&gt;grant secadm on database to user db2sec1&lt;br /&gt;&lt;/pre&gt;# connect to SAMPLE database as db2sec1 user and rerun the command&lt;br /&gt;&lt;pre class="sql" name="code"&gt;GRANT SECURITY LABEL SEX_POLICY.ADM TO user db2inst1 FOR WRITE ACCESS&lt;br /&gt;&lt;/pre&gt;(passed this time)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Step 6 -&amp;nbsp;Finalize LBAC table protection&lt;/span&gt;&lt;br /&gt;Reconnect as db2inst1 user and rerun the command again&lt;br /&gt;&lt;pre class="sql" name="code"&gt;ALTER TABLE lbac_employee ADD COLUMN SEX_PROTECTION DB2SECURITYLABEL&lt;br /&gt;&lt;/pre&gt;(passed this time)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Step 7 -&amp;nbsp;Create roles and additional security labels&lt;/span&gt;&lt;br /&gt;Assume that role LBAC_F enables access to female employees and LBAC_M to male employees.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;create role LBAC_F&lt;br /&gt;create role LBAC_M&lt;br /&gt;CREATE SECURITY LABEL SEX_POLICY.F COMPONENT SEX 'F'&lt;br /&gt;CREATE SECURITY LABEL SEX_POLICY.M COMPONENT SEX 'M'&lt;br /&gt;alter security policy sex_policy user role LBAC_F&lt;br /&gt;alter security policy sex_policy user role LBAC_E&lt;br /&gt;GRANT SECURITY LABEL SEX_POLICY.F TO ROLE LBAC_F for all access&lt;br /&gt;GRANT SECURITY LABEL SEX_POLICY.M TO ROLE LBAC_M for all access&lt;br /&gt;GRANT samplereadaccess to role LBAC_F&lt;br /&gt;GRANT samplereadaccess to role LBAC_M&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Step 8 - assign labels to the LBAC_EMPLOYEE rows&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;update lbac_employee set sex_protection=seclabel('SEX_POLICY','M') where Sex='M'&lt;br /&gt;update lbac_employee set sex_protection=seclabel('SEX_POLICY','F') where Sex='F'&lt;br /&gt;select substr(seclabel_to_char('SEX_POLICY',sex_protection),1,6) from lbac_employee&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Step 9 - modify trusted connection object&lt;/span&gt;&lt;br /&gt;Assume the user 'PETER' is allowed to read only males workers and user 'DOROTHY' only female workers.&lt;br /&gt;&lt;pre class="sql" name="code"&gt;ALTER TRUSTED CONTEXT MYTCX ADD USE FOR PETER ROLE LBAC_M WITHOUT AUTHENTICATION&lt;br /&gt;ALTER TRUSTED CONTEXT MYTCX ADD USE FOR DOROTHY ROLE LBAC_F WITHOUT&lt;br /&gt;AUTHENTICATION&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Step 10 - run application and watch the output&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I modified the application a little bit - look at the &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/TrustedConnection/src/Main.java"&gt;source code&lt;/a&gt;. It is very simply - just run and print the "SELECT * FROM LBAC_EMPLOYEE" statement. The same code is executed firstly by 'PETER' and secondly by 'DOROTHY'. &amp;nbsp;The first time the code yields 23 rows and the second time 11 rows. What more important - the user is unaware about the presence of the other rows so the access to this rows is forbidden at the database (not application) level.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-945773140580155479?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/945773140580155479/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/08/trusted-context-and-lbac.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/945773140580155479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/945773140580155479'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/08/trusted-context-and-lbac.html' title='Trusted context and LBAC'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-1885276214846711151</id><published>2011-07-29T13:27:00.000-07:00</published><updated>2011-07-29T13:27:37.679-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Find all subsets recursively</title><content type='html'>&lt;span style="font-size: large;"&gt;Problem&lt;/span&gt;&lt;br /&gt;Having a set of positive numbers from 0 to 9 find recursively all subsets which sums up to 10.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Algorithm 1&lt;/span&gt;&lt;br /&gt;Take a subset. If sums up to 10 then print it. Is sums less than 10 then break. Then apply the same algorithm for any subset received by removing from the first subset one element.&lt;br /&gt;Start with the initial set.&lt;br /&gt;C++ code :&lt;br /&gt;&lt;pre class="c++" name="code"&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;&lt;br /&gt;const int SET_SIZE = 10;&lt;br /&gt;typedef std::vector&amp;lt;bool&amp;gt; settype;&lt;br /&gt;const int SUM=10;&lt;br /&gt;&lt;br /&gt;void print(const settype &amp;amp;set) {&lt;br /&gt;  for (int i=0; i&amp;lt;SET_SIZE; i++) {&lt;br /&gt;    if (set[i]) std::cout&amp;lt;&amp;lt;i+1&amp;lt;&amp;lt;' ';&lt;br /&gt;  }&lt;br /&gt;  std::cout&amp;lt;&amp;lt;std::endl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void run_set(settype set,int sum, int remove) {&lt;br /&gt;  if (remove != -1) {&lt;br /&gt;    set[remove] = false;&lt;br /&gt;    sum -= (remove + 1);&lt;br /&gt;  }&lt;br /&gt;  if (sum &amp;lt; SUM) return;&lt;br /&gt;  if (sum == SUM) print(set);&lt;br /&gt;&lt;br /&gt;  for (int i = remove+1; i&amp;lt;SET_SIZE; i++) {&lt;br /&gt;    if (set[i]) {&lt;br /&gt;      run_set(set,sum,i);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv) {&lt;br /&gt;    bool init_set[SET_SIZE] = { true,false,true,true,false,true,true,true,false,true};&lt;br /&gt;    settype setOfNum(init_set,init_set + sizeof(init_set) / sizeof(bool));&lt;br /&gt;    int sum = 39;&lt;br /&gt;    run_set(setOfNum,sum,-1);   &lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Algorithm 2&lt;/span&gt;&lt;br /&gt;Apply a variant of&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Knapsack_problem"&gt;0-1 snapsack problem&lt;/a&gt;.&lt;br /&gt;Take a subset.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If subset sums to less than 10 then break. &lt;/li&gt;&lt;li&gt;Remove last element and find all subsets which sums to 10.&lt;/li&gt;&lt;li&gt;Remove last element and find all subsets which sums to 10 minus the last element.&lt;/li&gt;&lt;li&gt;Sums set of sets received in point 1) and set of sets received in point 2) plus the last (removed) element.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;C++ code:&lt;br /&gt;&lt;pre class="c++" name="code"&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;const int SUM=10;&lt;br /&gt;&lt;br /&gt;typedef std::vector&amp;lt;int&amp;gt; settype;&lt;br /&gt;typedef std::vector&amp;lt;settype&amp;gt; listofset;&lt;br /&gt;&lt;br /&gt;void print(const settype &amp;amp;set) {&lt;br /&gt;    for (int k=0; k&amp;lt;set.size(); k++) {&lt;br /&gt;      cout &amp;lt;&amp;lt; set[k] &amp;lt;&amp;lt; ' ';&lt;br /&gt;    }&lt;br /&gt;    cout &amp;lt;&amp;lt; endl;&lt;br /&gt;}  &lt;br /&gt;&lt;br /&gt;void D(int i,int w,const settype &amp;amp;set,listofset &amp;amp;outlist) {&lt;br /&gt;  listofset list1,list2;&lt;br /&gt;  i--;&lt;br /&gt;  if ((w == 0) || (i == -1)) {&lt;br /&gt;    outlist = list1;&lt;br /&gt;    return;&lt;br /&gt;  }&lt;br /&gt;  D(i,w,set,list1);&lt;br /&gt;  D(i,w-set[i],set,list2);&lt;br /&gt;  outlist = list1;&lt;br /&gt;  for (int k=0; k&amp;lt;list2.size(); k++) {&lt;br /&gt;    list2[k].push_back(set[i]);&lt;br /&gt;    outlist.push_back(list2[k]);&lt;br /&gt;  }&lt;br /&gt;  if (set[i] == w) {&lt;br /&gt;    settype t;&lt;br /&gt;    t.push_back(set[i]);&lt;br /&gt;    outlist.push_back(t);&lt;br /&gt;    return;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv) {&lt;br /&gt;    int init_set[] = { 1,9,10,2,7 };&lt;br /&gt;    settype set(init_set,init_set + sizeof(init_set) / sizeof(int));&lt;br /&gt;    listofset outset;&lt;br /&gt;    D(set.size(),SUM,set,outset);&lt;br /&gt;    for (int i=0; i&amp;lt;outset.size(); i++) {      &lt;br /&gt;     cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; ":";&lt;br /&gt;      print(outset[i]);&lt;br /&gt;    }  &lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Remarks&lt;/span&gt;&lt;br /&gt;Of course - it is an artificial problem, the best way is to apply simple iteration without recursion.&lt;br /&gt;Another problem is the complexity. The number of all subsets of n-element set is exponential (2 to power n). So the algorithm is no worse than that. But is it possible to do it faster - in polynomial complexity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-1885276214846711151?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/1885276214846711151/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/07/find-all-subsets-recursively.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1885276214846711151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1885276214846711151'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/07/find-all-subsets-recursively.html' title='Find all subsets recursively'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6309230484903245664</id><published>2011-07-24T13:53:00.000-07:00</published><updated>2011-07-24T13:53:25.271-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>BenchmarkSQL</title><content type='html'>I started playing with the opensource tool &lt;a href="http://sourceforge.net/projects/benchmarksql/"&gt;"BenchmarkSQL"&lt;/a&gt;. It allows to run TPC-C like test allowing measuring OLTP performance on different databases. Unfortunately, I had to fix several minor bugs - it seemed that loading data does not work correctly - the order of columns in several tables does not match INSERT and LOAD command. I also added additional run-time parameters for setting some settings related to test. &lt;br /&gt;&lt;blockquote&gt;-DNoW={number of warehouses}&lt;br /&gt;-DNoT=10 {number of terminales}&lt;br /&gt;-DNoM=5 {number of minutes for test to run}&lt;/blockquote&gt;The fixed version can be downloaded from : &lt;a href="http://code.google.com/p/javahotel/source/browse/#svn%2Ftrunk%2Fexamples%2FBenchmarkSQL-2.3.3%253Fstate%253Dclosed"&gt;BenchmarkSQL&lt;/a&gt;.&amp;nbsp; &lt;br /&gt;I run the test again DB2, Oracle and Postgress databases running on the same box : Ubuntu, ThinkPad T-42, 1.7 GH IntelPentium, 2 GB RAM.&lt;br /&gt;The databases have been installed out of the box, using default settings. The current score is as follows (10 warehouses, 10 terminals, 5 minute test)&lt;br /&gt;&lt;blockquote&gt;Oracle: tpmC = 410&lt;br /&gt;DB2: tpmC = 260&lt;br /&gt;Postgres : tpmC = 240&lt;/blockquote&gt;I will try to improve DB2 performance by providing some tunning.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6309230484903245664?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6309230484903245664/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/07/benchmarksql.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6309230484903245664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6309230484903245664'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/07/benchmarksql.html' title='BenchmarkSQL'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-4567513996385894058</id><published>2011-07-19T14:39:00.000-07:00</published><updated>2011-07-19T14:39:23.940-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na przedstawieniu</title><content type='html'>Dnia 18 lipca 2011 roku byliśmy na &lt;a href="http://www.operakameralna.pl/?2011_kv366a"&gt;przedstawieniu&lt;/a&gt; opery Mozarta "Idomeneo, król Krety" wystawianego w ramach XXI Festiwalu Mozartowskiego, ale wyszliśmy mocno rozczarowani.&lt;br /&gt;&lt;div&gt;"Idomeneo" to mniej znana opera Mozarta, pozostająca trochę w cieniu sławniejszych oper tego kompozytora. A zupełnie niesłusznie, to także piękna muzyka i efektowne arie. Tego samego zdania był przecież sam Mozart, który kilka zapożyczeń z "Idomeneo" przeniósł do późniejszych dzieł. Na przykład, marsz z towarzyszeniem recytatywu Elektry z pierwszego aktu jako żywo przypomina słynny "Ecco la marcia" z trzeciego aktu "Wesela Figara". Tylko, że w tym przedstawieniu zupełnie nie było tego słychać, jakby realizatorzy chcieli nas przekonać, że mniejsza popularność tej opery jest w pełni zasłużona.&lt;/div&gt;&lt;div&gt;Zupełnie zawiódł odtwórca głównej roli, wyraźnie czuł się bardzo niepewnie, kilkakrotnie niezbędna była pomoc suflera. W konsekwencji, w miarę upływu czasu każde pojawienie się tej postaci powodowało rosnący niepokój, czy coś znowu nie pójdzie źle. Zły nastrój udzielił się chyba także orkiestrze, która wyraźnie nie była w formie, czasami bardziej przeszkadzała wykonawcom niż pomagała.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Także inscenizacja nie trafiła mi do przekonania, nie potrafiłem zrozumieć zamiłowania inscenizatora do pogrążania sceny w mroku, cały czas odnosiłem wrażenie, że wykonawcy śpiewają z piwnicy. W operze istotną rolę pełni morski potwór pustoszący Kretę jako karę za złamaną obietnicę Idomenea. Na scenie widzimy dwie istoty z zaświatów - raz to prawdziwe monstrum, zaś potem na scenie nam towarzyszy ubrane w złoto bóstwo, sądząc z trojzębu trzymanego w ręku miał to być bóg Posejdon. Ale to bóstwo pada pod ciosem Idamanta, zaś potem głos z zaświatów oznajmia ostateczną wolę Posejdona i sztuka znajduje szczęśliwe zakończenie. Więc jeśli był tutaj jakiś zamysł inscenizatorski, to sens całkowicie mi umknął.&lt;br /&gt;Na szczęście pozostali wykonawcy stanęli na wysokości zadania. Nie zawiódł ani Sylweser Smulczyński jako Idamante, ani Marta Boberska jako Ilia. Zaś każde pojawienie się Gabrieli Kamińskiej w roli Elektry podnosiło temperaturę o kilka stopni. Końcowe wykonanie brawurowej arii ""D'Oreste, d'Ajace" zapadało w pamięć.&lt;br /&gt;Także chór wypadł znakomicie. W "Idomeneo", inaczej niż w innym operach Mozarta, chór ma dużą rolę do odegrania, w tym partie solowe.&lt;br /&gt;Ale złe wrażenie jednak pozostało. Trzeba mieć tylko nadzieję, że jeśli Warszawska Opera Kameralna utrzyma w programie to przedstawienie w następnym roku, to poprzedzi występ bardziej starannymi przygotowaniami i z lepszym przemyśleniem, co zaprezentować widzom. &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-4567513996385894058?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/4567513996385894058/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/07/bylismy-na-przedstawieniu.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4567513996385894058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4567513996385894058'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/07/bylismy-na-przedstawieniu.html' title='Byliśmy na przedstawieniu'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-1707475975801469750</id><published>2011-07-18T04:08:00.000-07:00</published><updated>2011-07-18T04:08:45.614-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na koncercie</title><content type='html'>16 lipca 2011 roku byliśmy na przedstawieniu (a właściwie projekcji) inscenizacji "Króla Rogera" w ramach tegorocznego &lt;a href="http://ogrodymuzyczne.pl/page/pl/program-2011/wszystkie-wydarzenia/karol-szymanowski-krol-roger-/"&gt;Festiwalu "Ogrody Muzyczne"&lt;/a&gt;, podobało nam się bardzo, chociaż z pewnymi zastrzeżeniami. Była to rejestracja przedstawienia, które miało swoją premierę w 2009 roku w paryskiej "Opéra Bastille". Przedstawienie odbyło się w atmosferze skandalu spowodowanego kontrowersyjną inscenizacją Krzysztofa Warlikowskiego. Przykłady druzgocących recenzji można znaleźć w &lt;a href="http://wyborcza.pl/1,75475,6738460,Triumf_i_kleska__czyli__Krol_Roger__w_Paryzu.html"&gt;Gazecie Wyborczej&lt;/a&gt; lub w polskiej edycji &lt;a href="http://www.newsweek.pl/artykuly/sekcje/kultura/muzyka--warlikowski-polegl-pod-bastylia,40993,1"&gt;Newsweeka&lt;/a&gt;.&amp;nbsp; &lt;br /&gt;Zacytuję fragment z tej drugiej recenzji:&lt;br /&gt;&lt;blockquote&gt;Widzowie znający utwór słabo – Francuzi, którzy go dotąd nie widzieli,  albo Polacy z rzadka bywający w operze – skłonni byli tej inscenizacji  bronić.&lt;/blockquote&gt;&amp;nbsp;Jestem skłonny bronić tej inscenizacji, aczkolwiek z przyczyn innych niż to zakłada autor recenzji.&lt;br /&gt;Gdyż o czym opowiada nam libretto opery (autorstwa Iwaszkiewicza) ? Na dwór mądrego króla Rogera, spędzającego wieczór w towarzystwie uroczej żony Roksany (równolegle odprawiana jest liturgia religijna) przybywa tajemniczy Pasterz, szukający zbłąkanych stad w imieniu nieznanego boga. W zetknięciu z Pasterzem, cały ten uporządkowany i zorganizowany świat świecki i religijny rozpada się w gruzy porywając także Rogerowi ukochaną Roksanę.&lt;br /&gt;Pod to libretto można podkładać czy doszukiwać się dowolnych znaczeń, można także tego nie robić. I wyraźnie tą drugą drogą poszedł Warlikowski. Nie próbuje nam opowiadać jakiejś historii czy sugerować, że kryją się pod tym głębokie i ponadczasowe treści. Na scenie widzimy absurdalny i nierzeczywisty świat, przypominający atmosferą dawne filmy science-fiction. Chociaż końcowa scena, gdzie Pasterz ma założoną głowę Myszki Miki, zaś tłum oddaje cześć słońcu wyobrażonemu w postaci neonu przypominającego wejście do baru sugeruje, że owym nowym bogiem, do którego prowadzi Pasterz są nasze współczesne bożki kultury masowej. &lt;br /&gt;Można próbować to zrozumieć, ale wtedy ryzykujemy porażkę niczym tytułowy król Roger usiłujący zrozumieć, co się wokół niego dzieje.Oczywiście, tego typu inscenizacja odniesiona do np. opery Mozarta pewnie by raziła tanim efekciarstwem.&lt;br /&gt;Głównym zarzutem jaki można postawić tej inscenizacji, jak zauważył we wprowadzeniu Zygmunt Krauze, jest to, że tutaj gubi się niestety piękna i oryginalna muzyka Szymanowskiego. Zamiast słuchać muzyki śledzimy na scenie kolejne pomysły inscenizatorskie.&lt;br /&gt;Ogromnym atutem przedstawienie jest także doskonałe wykonawstwo: Mariusz Kwiecień, Olga Pasiecznik oraz Eric Cutler (jako Pasterz). Chociaż też można odnieść wrażenie, że czasami ekspresja o charakterze aktorskim przytłacza stronę muzyczną.&lt;br /&gt;Część osób zgromadzonych w namiocie, gdzie odbyła się projekcja, była zniecierpliwiona długim wprowadzeniem w muzykę Szymanowskiego Zygmunta Krauze i Krzysztofa Baculewskiego. My jednak słuchaliśmy z zainteresowaniem, obaj rozmówcy doskonale znali temat, zaś Szymanowski - chociaż "pierwszy po Chopinie" - to ciągle człowiek i kompozytor mało znany, także w Polsce.&lt;br /&gt;Uderzała także wysoka frekwencja, namiot na kilkaset osób był prawie pełny, i to pomimo tego, że muzyka Szymanowskiego nie jest łatwa w odbiorze, wymaga pewnego przygotowania od słuchacza. Dzieło Szymanowskiego zostawia dużo swobody wykonawcom,&amp;nbsp; na pewno jest dużo pola do popisu dla innych inscenizatorów i na pewno znajdą się widzowie i słuchacze.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-1707475975801469750?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/1707475975801469750/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/07/bylismy-na-koncercie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1707475975801469750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1707475975801469750'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/07/bylismy-na-koncercie.html' title='Byliśmy na koncercie'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-1221315830582460372</id><published>2011-07-07T13:11:00.000-07:00</published><updated>2011-07-07T13:11:42.553-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>GWT+DB2+Spring</title><content type='html'>Next version of the simple &lt;a href="http://hoteljavaopensource.blogspot.com/2011/05/gwt-db2-birt.html"&gt;database/GWT application&lt;/a&gt;. The whole source code is available and can be &lt;a href="http://code.google.com/p/javahotel/source/browse/#svn%2Ftrunk%2Fexamples%2FSampleGwt"&gt;downloaded&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-size: large;"&gt;Introduction &lt;/span&gt;&lt;br /&gt;The application displays the content of EMPLOYEE table from DB2 sample database. But what is worth personal data without keeping some&amp;nbsp; additional data like: documents, images, scans etc ? So I decided to extend the application by this feature.&lt;br /&gt;&lt;span style="font-size: large;"&gt;Database&lt;/span&gt;&lt;br /&gt;Data like that can be kept in database as blob column. Because more than one document related to a single employee can be stored I decided to create additional table to implement this one-to-many relationship.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: x-small;"&gt;create table empattach (id INTEGER GENERATED ALWAYS AS IDENTITY, empno char(6) NOT NULL, filename varchar2(100) NOT NULL, comment varchar2(100), adddate DATE DEFAULT CURRENT DATE, attach BLOB)&lt;/span&gt; &lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-size: x-small;"&gt;alter table empattach FOREIGN KEY FOREIGN_EMPNO (EMPNO) REFERENCES EMPLOYEE ON DELETE NO ACTION&lt;/span&gt; &lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Defining foreign key (the second statement) is not necessary from the application point of view. But by introducing this constraint we are sure that we would not have "dangling" attachment in our database, it is enforced by the database engine. &lt;br /&gt;Because it is one-to-many relationship the "empno" column is not a primary key for empattach table, additional identity column (generated automatically) is defined.&lt;br /&gt;&lt;span style="font-size: large;"&gt;Client application&lt;/span&gt;&lt;br /&gt;Additional column "Att" was added. This column displays number of attachments related to the employee and also - after clicking at this cell - additional window pop-ups enabling some actions on attachments.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-tFIox_RdjaE/ThRTvC0lCkI/AAAAAAAADBI/FodnZEJUNxw/s1600/zrzut_ekranu-Web+Application+Starter+Project+-+Mozilla+Firefox.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="472" src="http://1.bp.blogspot.com/-tFIox_RdjaE/ThRTvC0lCkI/AAAAAAAADBI/FodnZEJUNxw/s640/zrzut_ekranu-Web+Application+Starter+Project+-+Mozilla+Firefox.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In order to activate this additional window GWT &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/2.1/com/google/gwt/cell/client/ActionCell.html"&gt;ActionCell&lt;/a&gt; extended as Button was used. The &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/src/com/ibm/sampledb/client/RecordPresentation.java"&gt;code&lt;/a&gt; is something like:&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;pre class="java" name="code"&gt;private class AttachClass implements ActionCell.Delegate&lt;onerecord&gt; {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void execute(OneRecord object) {&lt;br /&gt;   AttachmentDialog a = new AttachmentDialog(object, rInfo);&lt;br /&gt;   PopupDraw p = new PopupDraw(a, false);&lt;br /&gt;   p.draw(100, 100);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private class ActionNumberCell extends ActionCell&lt;onerecord&gt; {&lt;br /&gt;&lt;br /&gt;  private final RowFieldInfo f;&lt;br /&gt;&lt;br /&gt;  ActionNumberCell(RowFieldInfo f) {&lt;br /&gt;   super("", new AttachClass());&lt;br /&gt;   this.f = f;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void render(Cell.Context context, OneRecord value,&lt;br /&gt;    SafeHtmlBuilder sb) {&lt;br /&gt;   FieldValue numb = GetField.getValue(f, value);&lt;br /&gt;   sb.appendHtmlConstant("&lt;b&gt;");&lt;br /&gt;   sb.append(numb.getiField());&lt;br /&gt;   sb.appendHtmlConstant("&lt;/b&gt;");&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;       private Column&lt;onerecord, ?=""&gt; constructAction(RowFieldInfo f) {&lt;br /&gt;  ActionNumberCell ce = new ActionNumberCell(f);&lt;br /&gt;  return new ButtonColumn(ce);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/onerecord,&gt;&lt;/onerecord&gt;&lt;/onerecord&gt;&lt;/pre&gt;This column cell behaves like a normal button and activates an action after clicking at it.&lt;br /&gt;&lt;span style="font-size: large;"&gt;Sending attachments to and fro&lt;/span&gt;&lt;br /&gt;Uploading and downloading attachments is done by a traditional servlet, it does not make any sense to do it via RPC call.&lt;br /&gt;So &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/war/WEB-INF/web.xml"&gt;web.xml&lt;/a&gt; file keeps additional definitions for servlets implementing GET and POST method.&lt;br /&gt;In GWT code uploading (sending attachment from client to the server) is done via FormPanel and triggering "SUBMIT"&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/src/com/ibm/sampledb/client/UploadFile.java"&gt; action&lt;/a&gt;. &lt;br /&gt;Downloading (sending attachment from server to the client) is implemented via enabling Anchor (link) to &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/src/com/ibm/sampledb/client/AttachmentDialog.java"&gt;click on&lt;/a&gt;.&lt;br /&gt;Because together with attachment also content-type is sent (based on file name extension) the web browser will try to apply the proper action for the file sent - for instance: to display an image. It is very nice part of it, not trivial action&amp;nbsp; affordable for a song.&lt;br /&gt;&lt;span style="font-size: large;"&gt;Server side&lt;/span&gt;&lt;br /&gt;There is a standard definition of two servlets on the server side, one &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/src/com/ibm/sampledb/server/UpLoadFile.java"&gt;for uploading&lt;/a&gt; and the second &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/src/com/ibm/sampledb/server/DownloadFile.java"&gt;for downloading&lt;/a&gt;. Storing and extracting blob column to and from the database is done via Spring LobHandler class. In order to send a valid content-type very nice feature of Java EE is used&amp;nbsp; :&lt;br /&gt;&lt;a href="http://s/"&gt;MimetypesFileTypeMap&lt;/a&gt; (starting from Java 1.6 it comes also with JRE). &lt;br /&gt;&lt;span style="font-size: large;"&gt;Refactoring&lt;/span&gt;&lt;br /&gt;Unfortunately, by adding this feature the code size doubled. On the other by refactoring the code responsible for displaying a table on the screen (&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/src/com/ibm/sampledb/client/RecordPresentation.java"&gt;RecordPresentation.java&lt;/a&gt;) I was able to reuse this code twicely: to display the rows from the employee table and also for displaying the list of attachments (empattach table).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-1221315830582460372?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/1221315830582460372/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/07/gwtdb2spring.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1221315830582460372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1221315830582460372'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/07/gwtdb2spring.html' title='GWT+DB2+Spring'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-tFIox_RdjaE/ThRTvC0lCkI/AAAAAAAADBI/FodnZEJUNxw/s72-c/zrzut_ekranu-Web+Application+Starter+Project+-+Mozilla+Firefox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-1537876568523356426</id><published>2011-07-04T03:22:00.000-07:00</published><updated>2011-08-21T13:48:25.483-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>BoaTester - new version</title><content type='html'>I added a simple enhancement do Selenium extension to &lt;a href="http://code.google.com/p/boatester/"&gt;BoaTest framework&lt;/a&gt;. I found very annoying using long XPath selectors for GWT Presentation &lt;a href="http://gwt.google.com/samples/Showcase/Showcase.html#!CwCellTable"&gt;CellTable&lt;/a&gt;. It looks like:&lt;br /&gt;&lt;blockquote&gt;xpath=/html/body/table/tbody/tr[2]/td[2]/table/tbody/tr[3]/td/table/tbody/tr[2]/td/table/tbody/tr/td/table/tbody/tr[2]/td[2]/div&lt;/blockquote&gt;or&lt;br /&gt;&lt;blockquote&gt;xpath=/html/body/table/tbody/tr[2]/td[2]/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr/td/table/tbody/tr[2]/td/div[text() = '6']&amp;nbsp;&lt;/blockquote&gt;But - if test case is related to the same table - all that selectors share the same starting xpath. So the solution is to introduce a "macro"or interpolation just avoiding entering repeating sequences. There is very useful option in Python &lt;a href="http://docs.python.org/library/configparser.html"&gt;ConfigParser&lt;/a&gt; class. But action sequence (selenium.file) &amp;nbsp;for Selenium based test case is read by basic File object so this option is not available immediately. So it was necessary to implement it manually through the following &lt;a href="http://code.google.com/p/boatester/source/browse/trunk/BoaHarness/src/testharness/TestCaseHelper.py"&gt;procedure&lt;/a&gt;:&lt;br /&gt;&lt;pre class="python" name="code"&gt;"""Replace variables using format (like ConfigParser) %(..)s&lt;br /&gt;    &lt;br /&gt;    Args:&lt;br /&gt;      line : line to be changed&lt;br /&gt;      param : TestParam &lt;br /&gt;      teparam : OneTestParam&lt;br /&gt;      &lt;br /&gt;    Returns:&lt;br /&gt;      Fixed line&lt;br /&gt;      &lt;br /&gt;    Raises: &lt;br /&gt;      Exception if variable for replacement not found&lt;br /&gt;      &lt;br /&gt;    """&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def replaceLine(line,  param,  teparam):&lt;br /&gt;    while 1 :&lt;br /&gt;        low = line.rfind("%(")&lt;br /&gt;        if low == -1 : break&lt;br /&gt;        up = line.rfind(")s")&lt;br /&gt;        if up == -1 : break&lt;br /&gt;        before = line[0: low]&lt;br /&gt;        after = line[up+2: len(line)]&lt;br /&gt;        key = line[low+2: up]&lt;br /&gt;        value = teparam.getPar(key)&lt;br /&gt;        if value == None : value = param.getPar(key)&lt;br /&gt;        if value == None : &lt;br /&gt;            raise TestException(key + " variable for replacement not found !")&lt;br /&gt;        line = before + value + after&lt;br /&gt;        &lt;br /&gt;    return line     &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I decided to use the same syntax (%(...)s) like in ConfigParser to avoid reinventing the wheel. "Variables" for macro substitution are taken for test.properties file.&lt;br /&gt;&lt;br /&gt;So now it is possible to put long XPath selected sharing the same theme in much simpler and less error prone manner.&lt;br /&gt;&lt;br /&gt;test.properties&lt;br /&gt;&lt;blockquote&gt;tabletestbase=xpath=/html/body/table/tbody/tr[2]/td[2]/table/tbody/tr[3]/td/table/tbody/tr[2]/td/table/tbody/tr/td/table/tbody/tr[2]/td&lt;/blockquote&gt;and Selenium action file :&lt;br /&gt;&lt;blockquote&gt;isPresent : %(tabletestbase)[2]/div&lt;br /&gt;waitFor : &amp;nbsp;%(tabletestbase)s/td/div[text() = '6']&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-1537876568523356426?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/1537876568523356426/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/07/boatester-new-version.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1537876568523356426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1537876568523356426'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/07/boatester-new-version.html' title='BoaTester - new version'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-4279737465989515041</id><published>2011-06-13T11:28:00.000-07:00</published><updated>2011-06-13T11:28:37.366-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na koncercie</title><content type='html'>12 czerwca 2011 byliśmy na koncercie w ramach &lt;a href="http://www.kapitula.org/mfms.html"&gt;XXI Festiwalu Muzyki Sakralnej&lt;/a&gt;, ale wyszliśmy z mieszanymi uczuciami.&lt;br /&gt;Był to koncert zamykający tegoroczną edycje festiwalu, wypełniła go muzyka polska. W pierwszej części usłyszeliśmy &lt;i&gt;Gloria Tibi Trinitas &lt;/i&gt;Wincentego Maxylewicza żyjącego w pierwszej połowie XVIII wieku. Zachowało się po nim niewiele kompozycji, zapewne z tej przyczyny nie ma nawet wpisu w polskiej Wikipedii, chociaż jest notka o nim w &lt;a href="http://de.wikipedia.org/wiki/Wincenty_Maxylewicz"&gt;niemieckiej edycji&lt;/a&gt;.&lt;i&gt; &lt;/i&gt;Ale to co usłyszeliśmy bardzo się podobało, to melodyjna i efektowna muzyka.&lt;br /&gt;Głównym punktem programu była Msza Polska &lt;a href="http://pl.wikipedia.org/wiki/Franciszek_Lessel"&gt;Franciszka Lessela&lt;/a&gt;, kompozytora żyjącego 100 lat później. Po śmierci popadł w kompletne zapomnienie, część jego twórczości przepadła, ale ostatnio ponownie przypomina się tego twórcę publiczności. Jest rzeczą słuszną wydobywanie polskiej muzyki z niepamięci,&amp;nbsp; ale mam wątpliwość czy dotyczy to również tej kompozycji. W połowie tego liczącego&amp;nbsp; siedem części dzieła zaczęło nas ogarniać ogromne znużenie, po prostu jedna część niewiele się różniła od drugiej. Dopiero dwie ostatnie części wniosły pewne ożywienie, linia melodyczna była żywsza i ciekawsza.&lt;br /&gt;Trudno powiedzieć, gdzie został popełniony błąd. Może dzieło wymaga lepszego osłuchania, może powinna być zmieniona koncepcja wykonawcza, może po prostu dzieła tego kompozytora powinny podlegać ściślejszej selekcji przez zaprezentowaniem przed publicznością. Tym bardziej, że sądząc z licznego udziału słuchaczy , muzyka polska, nawet jeśli są to dzieła nieznanych i zapomnianych autorów, może liczyć na duże zainteresowanie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-4279737465989515041?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/4279737465989515041/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/06/bylismy-na-koncercie_13.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4279737465989515041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4279737465989515041'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/06/bylismy-na-koncercie_13.html' title='Byliśmy na koncercie'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-2678297207741153493</id><published>2011-06-12T01:47:00.000-07:00</published><updated>2011-06-12T01:47:29.101-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>NTILE and DB2</title><content type='html'>&lt;span style="font-size: large;"&gt;Problem &lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.databasejournal.com/features/mssql/article.php/3780311/Exploring-SQL-2005146s-Ranking-Functions-150-NTILE-and-ROWNUMBER.htm"&gt;NTILE&lt;/a&gt; is an analytic function. It is implemented in&lt;a href="http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/functions091.htm"&gt; Oracle&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/ms175126.aspx"&gt;MS/SQL&lt;/a&gt; database servers. It simply distributes rows into some number of buckets, something like dealing cards between players. Unfortunately it is not implemented in DB2 and there is no simple and obvious substitution for it. But it is possible to evaluate a similar solution in DB2 although it requires a little more consideration.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Solution&lt;/span&gt;&lt;br /&gt;In DB2 it is not possible to write UDF which works as analytic/ranking function so we cannot provide exactly the same syntax.&lt;br /&gt;But let's try to write a regular function which behaves like NTILE.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;FUNCTION NTILE_FUN(A IN INTEGER, BUCKETNO IN INTEGER, NOFROWS IN INTEGER) &lt;br /&gt;  RETURN INTEGER&lt;br /&gt;  AS&lt;br /&gt;  MINROWS INTEGER;&lt;br /&gt;  MINREST INTEGER;&lt;br /&gt;  X INTEGER;&lt;br /&gt;  FIRSTB INTEGER;&lt;br /&gt;  LASTB INTEGER;&lt;br /&gt;  ACTB INTEGER;&lt;br /&gt;  BEGIN&lt;br /&gt;     MINROWS := FLOOR(NOFROWS / BUCKETNO);&lt;br /&gt;     MINREST := NOFROWS - (BUCKETNO * MINROWS);&lt;br /&gt;&lt;br /&gt;     ACTB := 1;&lt;br /&gt;     FIRSTB := 1;&lt;br /&gt;     WHILE FIRSTB &amp;lt;= NOFROWS LOOP&lt;br /&gt;       LASTB := FIRSTB + MINROWS - 1;&lt;br /&gt;       IF MINREST &amp;gt; 0 THEN&lt;br /&gt;         LASTB := LASTB + 1;&lt;br /&gt;         MINREST := MINREST - 1;&lt;br /&gt;       END IF;&lt;br /&gt;       IF A &amp;lt;= LASTB THEN&lt;br /&gt;         EXIT;&lt;br /&gt;       END IF;&lt;br /&gt;       FIRSTB := LASTB + 1;&lt;br /&gt;       ACTB := ACTB + 1;&lt;br /&gt;     END LOOP;      &lt;br /&gt;     RETURN ACTB;&lt;br /&gt;  END;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This function takes three parameters:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A : number of row to be inserted into bucket&lt;/li&gt;&lt;li&gt;BUCKETNO ; number of buckets&lt;/li&gt;&lt;li&gt;NOFROWS : number of all rows to be distributed&lt;/li&gt;&lt;/ul&gt;Returns the number of bucket (between 1 and BUCKETNO) where row A should be placed. So it works exactly the same way like NTILE. Probably it is possible to get rid of an iteration and provide some arithmetic to calculate the bucket number&amp;nbsp; but it works for me for the time being.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Examples &lt;/span&gt;&lt;br /&gt;Now let's&amp;nbsp; take the following NTILE example.&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;select ntile(4)over(order by empno) grp,&lt;br /&gt;         empno,&lt;br /&gt;         ename&lt;br /&gt;     from empno';&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;DB2 equivalence using function define above:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;select NTILE_FUN(row_number( )over(order by empno),4,&lt;br /&gt;             (SELECT COUNT(*) FROM empno)) grp,&lt;br /&gt;         empno,&lt;br /&gt;         ename&lt;br /&gt;    from empno order by empno &lt;/pre&gt;So in place of calling NTILE function we use NTILE_FUN function with appropriate&amp;nbsp; parameters. The most important point is using ranking function ROW_NUMBER to provide valid row number (the first parameter for NTILE_FUN).&lt;br /&gt;&lt;br /&gt;Another &lt;a href="http://www.databasejournal.com/features/mssql/article.php/3780311/Exploring-SL-2005146s-Ranking-Functions-150-NTILE-and-ROWNUMBER.htm"&gt;example&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SELECT last_name, salary, NTILE(4) OVER (ORDER BY salary DESC) &lt;br /&gt;             AS quartile FROM empsalary&lt;br /&gt;&lt;/pre&gt;DB2 equivalence:&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SELECT last_name, salary, &lt;br /&gt;             NTILE_FUN(row_number( )over(ORDER BY salary DESC),4, &lt;br /&gt;             (SELECT COUNT(*) FROM empsalary)) &lt;br /&gt;             AS quartile FROM empsalary&lt;br /&gt;&lt;/pre&gt;More complicated example with PARTITION BY:&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SELECT&lt;br /&gt;        Category,&lt;br /&gt;        Weight,&lt;br /&gt;        Entrant,&lt;br /&gt;        NTILE(2) OVER (&lt;br /&gt;            PARTITION BY Category&lt;br /&gt;            ORDER BY Weight DESC&lt;br /&gt;        ) AS Ntile&lt;br /&gt;   FROM ContestResults&lt;br /&gt;&lt;/pre&gt;DB2 equivalence:&lt;br /&gt;&lt;pre class="sql" name="code"&gt;SELECT&lt;br /&gt;        Category,&lt;br /&gt;        Weight,&lt;br /&gt;        Entrant,&lt;br /&gt;        NTILE_FUN(row_number( )over(&lt;br /&gt;            PARTITION BY Category&lt;br /&gt;            ORDER BY Weight DESC),2, &lt;br /&gt;            (SELECT COUNT(*) FROM ContestResults as C WHERE C.Category = CC.Category) &lt;br /&gt;        ) AS Ntile&lt;br /&gt;   FROM ContestResults AS CC&lt;br /&gt;&lt;/pre&gt;This time NOFROWS parameter is a little more complicated because we have to provide the number of record in one partition - not the number of records in the whole table.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Working code&lt;/span&gt;&lt;br /&gt;The working code is available: &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/ntile_sql/create_ddl.sql"&gt;DDL&lt;/a&gt; and &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/ntile_sql/create_package.sql"&gt;SQL package&lt;/a&gt;.&lt;br /&gt;Important: this code works in &lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.plsql.doc/doc/c0053607.html"&gt;DB2 Oracle compatible mode&lt;/a&gt;. Unfortunately - this mode is not supported in DB2 Express (free edition) although is planned for the future. It is necessary to download and install &lt;a href="http://www.ibm.com/developerworks/downloads/im/udb/"&gt;DB2 trial&lt;/a&gt; (90-day).&lt;br /&gt;After creating a database with PL/SQL support test tables should be created:&lt;br /&gt;&lt;pre&gt;db2 -tvf create_ddl.sql&lt;/pre&gt;and deploy package:&lt;br /&gt;&lt;pre&gt;db2 -td@ -vf create_package.sql&lt;/pre&gt;Then run command in order to see the output:&lt;br /&gt;&lt;pre&gt;db2 set serveroutput on&lt;/pre&gt;and run example:&lt;br /&gt;&lt;pre&gt;db2 call a_ntiletest.run_test1&lt;br /&gt;  db2 call a_ntiletest.run_test2&lt;br /&gt;  db2 call a_ntiletest.run_test3&lt;br /&gt;  db2 call a_ntiletest.run_test4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Because this example is using PL/SQL syntax it is possible also to run it (after changing the value of ORACLE constant in package specification) in Oracle directly and compare the results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-2678297207741153493?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/2678297207741153493/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/06/ntile-and-db2.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2678297207741153493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2678297207741153493'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/06/ntile-and-db2.html' title='NTILE and DB2'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6121572533807241719</id><published>2011-06-09T13:17:00.000-07:00</published><updated>2011-06-09T13:51:06.774-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na koncercie</title><content type='html'>5 czerwca 2011 roku byliśmy na koncercie w Bazylice Świętego Krzyża na koncercie w ramach &lt;a href="http://www.kapitula.org/mfms.html"&gt;XXI Miedzynarodowego Festiwalu Muzyki Sakralnej&lt;/a&gt;, podobało nam się bardzo, chociaż nie wychodziliśmy całkowicie zachwyceni.&lt;br /&gt;Franciszek Liszt jest znany głównie jako autor utworów fortepianowych, brawurowych Rapsodi Węgierskich czy popularnych poematów symfonicznych. Mniej jest znany jako autor subtelnej muzyki religijnej, a właśnie taki repertuar był wykonany na koncercie.&lt;br /&gt;Wykonawcami był chór chłopięcy Mozart Knabenchor Wien, orkiestra i soliści Opery Narodowej z Warszawy, zaś dyrygentem Peter Lang z Wiednia.&lt;br /&gt;Głównym punktem programu była - chyba nigdy nie wykonywana w Warszawie - "Węgierska Msza Koronacyjna" skomponowana w latach 1866-1867, która poprzedziły trzy krótkie chóralne dzieła śpiewane a cappella. "Węgierska Msza Koronacyjna" to bardzo piękna muzyka, wielka szkoda, że tak rzadko wykonywana. W dawnych czasach bardzo popularny był w Warszawie sklep płytowy przy Węgierskim Instytucie Kultury, można było tam kupić płyty wydawane przez Hungaroton i jednym z moich nabytków była właśnie ta muzyka. Sama płyta i sprzęt do odtwarzania takich płyt już dawno mi przepadły, zaś Hungaroton i sklep muzyczny także nie wytrzymały naporu wolnego rynku, ale muzyka utkwiła mi w pamięci.&lt;br /&gt;Dlaczego wychodziliśmy nie do końca usatysfakcjonowani ? Chór chłopięcy (wśród chórzystów byli nawet kilkuletni chłopcy) doskonale brzmiał w krótkich utworach wykonywanych a cappella, trochę przypominających polifoniczne kompozycje Palestriny. Natomiast w Mszy Koronacyjnej głosy chłopców jakoś gubiły się w obszernym kościele, przytłumiane przez orkiestrę. W konsekwencji muzyka nie robiła takiego wrażenia jak powinna i pozostał pewien niedosyt. Mam nadzieję, że będę kiedyś miał okazję ponownego wysłuchania tej muzyki, gdzie orkiestra i chór będą lepiej ze sobą współpracować.&lt;br /&gt;Mieliśmy dodatkową atrakcję jeszcze przed wejściem do kościoła. Otóż uliczny grajek - sądząc z wyglądu zewnętrznego Rom (dawniej Cygan) albo przybysz z jakiegoś bałkańskiego państwa - dał koncert na harmonii. Koncert był niezwykły z dwóch powodów : kunsztu wykonawcy oraz repertuaru. Usłyszeliśmy - i to znakomicie wykonane - uwerturę do "Wesela Figara" Mozarta i jeden z tańców węgierskich Jana Brahmsa. W ten sposób koncert w kościele, gdzie muzykę wielkiego węgierskiego kompozytora wykonywał Mozart Knabenchor Wien znalazł godne siebie uzupełnienie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6121572533807241719?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6121572533807241719/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/06/bylismy-na-koncercie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6121572533807241719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6121572533807241719'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/06/bylismy-na-koncercie.html' title='Byliśmy na koncercie'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6527939096096935995</id><published>2011-06-02T14:52:00.001-07:00</published><updated>2011-06-02T14:52:48.682-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>New version of BoaTester</title><content type='html'>New version of &lt;a href="http://code.google.com/p/boatester/"&gt;BoaTester&lt;/a&gt; was uploaded. Two new features have been added. &lt;a href="http://code.google.com/p/boatester/#New_version"&gt;Details&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6527939096096935995?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6527939096096935995/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/06/new-version-of-boatester.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6527939096096935995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6527939096096935995'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/06/new-version-of-boatester.html' title='New version of BoaTester'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-7144184718937687500</id><published>2011-05-27T14:43:00.000-07:00</published><updated>2011-07-08T05:50:41.417-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Trusted context and auditing</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: large;"&gt;Auditing&lt;/span&gt;&lt;br /&gt;Security is very important matter nowadays. One of the method to make our data more secure is auditing, monitoring and discovering unexpected or forbidden behavior. For instance - &lt;a href="http://hoteljavaopensource.blogspot.com/2011/05/trusted-context-db2-spring.html"&gt;in the previous example&lt;/a&gt; - user 'Mary' tried to update the bonus column in 'Employee' table but was rejected. Let's go further - assume that dishonest user 'Mary' was able to overcome the application security control and tried to perform some forbidden activity directly at the database level. Because our well designed solution is protected at the two levels - application and database - this attack was repulsed. But it can be the matter of time that the malicious user devises the second plan to find a security hole and will be successful. The only way to protect our confidential data is to pin down the&amp;nbsp;suspicious behavior as early as possible and react before a mischief is done.&lt;br /&gt;Good news is that DB2 provides very rich set of tools for &lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.sec.doc/doc/c0005483.html"&gt;auditing&lt;/a&gt; and security monitoring.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Preparation&lt;/span&gt;&lt;br /&gt;Unfortunately the auditing is not enabled by default. &amp;nbsp;So it is necessary to make some preparations.&lt;br /&gt;1. Create (if not created so far) &amp;nbsp;tables necessary to keep audit data - there is a db2audit.dll file provided with every DB2 installation.&lt;br /&gt;db2 -tvf {DB2 home directory} /misc/db2audit.ddl&lt;br /&gt;2. Create AUDIT POLICY database object. There are a lot of options what to monitor and what audit granularity is expected. Here is the simple example for monitoring everything.&lt;br /&gt;CREATE AUDIT POLICY BIGBROTHER&lt;br /&gt;CATEGORIES ALL&lt;br /&gt;STATUS BOTH&lt;br /&gt;ERROR TYPE AUDIT;&lt;br /&gt;3. Enable monitoring for roles or users.&lt;br /&gt;AUDIT ROLE SAMPLEFULLACCESS &amp;nbsp;USING POLICY BIGBROTHER;&lt;br /&gt;AUDIT ROLE SAMPLEREADACCESS &amp;nbsp;USING POLICY BIGBROTHER;&lt;br /&gt;4. From now on all activities are monitored.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Pave the way for Sherlock Holmes&lt;/span&gt;&lt;br /&gt;Several steps are necessary before audit data can be looked through.&lt;br /&gt;1. Make an audit data snapshot.&lt;br /&gt;db2 call "SYSPROC.AUDIT_ARCHIVE(NULL,NULL)"&lt;br /&gt;2. Convert binary data to text CSV file&lt;br /&gt;CALL SYSPROC.AUDIT_DELIM_EXTRACT(NULL, '/home/db2inst1/sqllib/security/auditdata', NULL, null, NULL);&lt;br /&gt;3. Load CSV text files into relational tables created by running db2audit.dll script file&lt;br /&gt;&lt;pre&gt;LOAD FROM /home/db2inst1/sqllib/security/auditdata/checking.del OF DEL MODIFIED BY DELPRIORITYCHAR LOBSINFILE INSERT INTO CHECKING;&lt;br /&gt;&lt;br /&gt;-- To load the OBJMAINT table, issue the following command:&lt;br /&gt;LOAD FROM /home/db2inst1/sqllib/security/auditdata/objmaint.del OF DEL MODIFIED BY DELPRIORITYCHAR LOBSINFILE INSERT INTO OBJMAINT;&lt;br /&gt;&lt;br /&gt;-- To load the SECMAINT table, issue the following command:&lt;br /&gt;   LOAD FROM /home/db2inst1/sqllib/security/auditdata/secmaint.del OF DEL MODIFIED BY DELPRIORITYCHAR LOBSINFILE INSERT INTO SECMAINT;&lt;br /&gt;&lt;br /&gt;-- To load the SYSADMIN table, issue the following command:&lt;br /&gt;   LOAD FROM /home/db2inst1/sqllib/security/auditdata/sysadmin.del OF DEL MODIFIED BY DELPRIORITYCHAR LOBSINFILE INSERT INTO SYSADMIN;&lt;br /&gt;&lt;br /&gt;-- To load the VALIDATE table, issue the following command:&lt;br /&gt;   LOAD FROM /home/db2inst1/sqllib/security/auditdata/validate.del OF DEL MODIFIED BY DELPRIORITYCHAR LOBSINFILE INSERT INTO VALIDATE;&lt;br /&gt;&lt;br /&gt;-- To load the CONTEXT table, issue the following command:&lt;br /&gt;   LOAD FROM /home/db2inst1/sqllib/security/auditdata/context.del OF DEL MODIFIED BY DELPRIORITYCHAR LOBSINFILE INSERT INTO CONTEXT;&lt;br /&gt;&lt;br /&gt;--# To load the EXECUTE table, issue the following command:&lt;br /&gt;   LOAD FROM /home/db2inst1/sqllib/security/auditdata/execute.del OF DEL MODIFIED BY DELPRIORITYCHAR LOBSINFILE INSERT INTO EXECUTE;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.sec.doc/doc/c0005633.html"&gt;Description of all audit objects&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5. Tables are ready and we can query them.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Example&lt;/span&gt;&lt;br /&gt;We want to check if any user belonging to SAMPLEREADACCESS role has tried to update EMPLOYEE table :&lt;br /&gt;This type of event is stored in &lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.sec.doc/doc/r0005640.html"&gt;CHECKING audit table&lt;/a&gt;:&lt;br /&gt;So after running query like:&lt;br /&gt;&lt;pre&gt;db2 "SELECT TIMESTAMP,SUBSTR(USERID,1,20),SUBSTR(APPNAME,1,20),STATUS  FROM CHECKING WHERE ROLEINHERITED = 'SAMPLEREADACCESS' AND OBJTYPE='TABLE' AND OBJNAME='EMPLOYEE' AND ACCESSATT='0x00000040000000000000000000000000'"&lt;br /&gt;&lt;/pre&gt;The horrible truth is revealed:&lt;br /&gt;&lt;pre&gt;TIMESTAMP                  2                    3                    STATUS     &lt;br /&gt;-------------------------- -------------------- -------------------- -----------&lt;br /&gt;2011-05-27-22.47.38.565086 mary                 db2jcc_application          -551&lt;br /&gt;&lt;/pre&gt;Our database is under attack and we have to evaluate the whole situation. It is bad news. Good news that by virtue of applying DB2 trusted context and two layers security control this time the attack was repulsed, by virtue of DB2 auditing feature the security hole is unveiled &amp;nbsp;and we have some time to tighten our security policy before any harm is done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-7144184718937687500?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/7144184718937687500/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/05/trusted-context-and-auditing.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7144184718937687500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7144184718937687500'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/05/trusted-context-and-auditing.html' title='Trusted context and auditing'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-5720320814915144836</id><published>2011-05-25T01:19:00.000-07:00</published><updated>2011-05-25T01:21:19.445-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotations'/><title type='text'>Real secret of success</title><content type='html'>&lt;a href="http://www.gutenberg.org/ebooks/3177"&gt;Mark Twain "Roughing It" (Polish title: "Pod gołym niebem")&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;We never touched our tunnel or our shaft again.  Why?  Because we judged&lt;br /&gt;that we had learned the real secret of success in silver mining--which&lt;br /&gt;was, not to mine the silver ourselves by the sweat of our brows and the&lt;br /&gt;labor of our hands, but to sell the ledges to the dull slaves of toil and&lt;br /&gt;let them do the mining!&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-5720320814915144836?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/5720320814915144836/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/05/real-secret-of-success.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5720320814915144836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5720320814915144836'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/05/real-secret-of-success.html' title='Real secret of success'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6057464460062438432</id><published>2011-05-24T07:33:00.000-07:00</published><updated>2011-05-24T07:35:20.573-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Trusted context, DB2, Spring</title><content type='html'>&lt;span style="font-size: large;"&gt;The problem&lt;/span&gt;&lt;br /&gt;The problem is described &lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.sec.doc/doc/c0050514.html"&gt;here&lt;/a&gt;. Keeping long story short - in three-tiered solutions the user does not interact directly with the database. The middle-tier (application server) on behalf of the user is connected to the database and send there requests. It has advantages and disadvantages. The main disadvantage is that it is very difficult to track and audit the user activities from the point of the database because it is done by the application server and we cannot tell the request from one user from the requests of other user. Also - in case of the users with the different level of privileges - it is very difficult to provide the granularity of privileges as required.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Bad news and good news &lt;/span&gt;&lt;br /&gt;The bad news is that JEE standard does not provide a consistent approach to this problem. The good news is that DB2 provides a solution although this solution is specific to the DB2 only.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Trusted connection&lt;/span&gt;&lt;br /&gt;This good news is &lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=/com.ibm.db2.luw.admin.sec.doc/doc/c0050514.html"&gt;trusted context and trusted connection&lt;/a&gt;. General idea:&lt;br /&gt;Trusted context is the database object which allows setting a special connection (trusted) between database server and specified (by IP address) client (application server).&lt;br /&gt;Application server connects to the database server and establishes the trusted connection.&lt;br /&gt;Then, by virtue of this connection, it is possible to reuse this connection without authentication and change the authentication id (user id). It could be the id of the user who's just logged in to the application server. Also privileges assigned to this&amp;nbsp; authentication id will be changed accordingly (if not inherited implicitly).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;How to accomplish it (more detail)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;1. Create a trusted user&lt;/span&gt;&lt;br /&gt;It is the user who will establish a trusted connection. In default DB2 security implementation system (Linux for instance) authentication is utilized. So it is enough to add a new user to the system e.g U/P trust/trustme. No additional DB2 privileges or authorities are required, this user should be only able to connect to the database which is granted for all system users.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;2. Create roles&lt;/span&gt;&lt;br /&gt;Assume we want to split our users into two groups. Some users (a smaller group) would be able to modify the data (&lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.sec.doc/doc/c0053934.html"&gt;dataaccess authority&lt;/a&gt;), the rest (default) are allowed only to read the data without modifying.&lt;br /&gt;The first role (group) could be created with the command:&lt;br /&gt;&lt;pre&gt;{ connect to SAMPLE database } &lt;br /&gt;  db2 create role SAMPLEFULLACCESS&lt;br /&gt;  db2 grant dataaccess on database&amp;nbsp; to samplefullaccess&lt;/pre&gt;The task of creating the second role (read only) is a bit more complicated because in DB2 there is no general read only authority like "dataaccess". This privilege should be performed on table by table basis.&lt;br /&gt;&lt;pre&gt;db2 create role SAMPLEREADACCESS&lt;/pre&gt;Then run the following command:&lt;br /&gt;&lt;pre&gt;db2 "select 'grant select on table ' || tabname || ' to samplereadaccess;' from syscat.tables where tabschema='DB2INST1'" &amp;gt;grant.sql&lt;/pre&gt;This command prepares a sql script file giving a right to select data from every table. After removing the first and the list line from this script it is enough to run the script:&lt;br /&gt;&lt;pre&gt;db2 -tvf grant.sql&lt;/pre&gt;&lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.sec.doc/doc/c0021804.html"&gt;More information on DB2 security model&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;3. Create trusted context &lt;/span&gt;&lt;br /&gt;&lt;pre&gt;CREATE TRUSTED CONTEXT MYTCX&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BASED UPON CONNECTION USING SYSTEM AUTHID trust&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ATTRIBUTES (ADDRESS&amp;nbsp;&amp;nbsp; '192.168.1.4')&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DEFAULT ROLE samplereadaccess&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WITH USE FOR PUBLIC WITHOUT AUTHENTICATION,&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JOHN ROLE samplefullaccess WITHOUT AUTHENTICATION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ENABLE;&lt;/pre&gt;&lt;br /&gt;The trusted context object named MYTCX is created. What does it mean ? &lt;br /&gt;&lt;ul&gt;&lt;li&gt;The client running on machine 192.166.1.4 can establish trusted connection to database SAMPLE as user trust.&amp;nbsp;&lt;/li&gt;&lt;li&gt;All requests for trusted connection from other machines or request from 192.168.1.4 but as a different user or request from 192.168.1.4 to connect to database other than SAMPLE will be rejected.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Having trusted connection established the client can switch this connection&amp;nbsp; to other user id (without authentication) and this new user is only able to read data from SAMPLE database.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Only the user 'JOHN' is a proud keeper of the special privilege on database SAMPLE - he can also modify data.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;4. Java code&lt;/span&gt;&lt;br /&gt;Java code for creating trusted connection and switching (reusing) this connection to the other (non-authenticated) user looks like.&lt;br /&gt;(it is based on this &lt;a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.java.doc/src/tpc/imjcc_c0023797.html"&gt;code sample&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/#svn%2Ftrunk%2Fexamples%2FTrustedConnection%2Fsrc%2Fcom%2Fdb2%2Ftrusted%253Fstate%253Dclosed"&gt;TrustedConnection.java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package com.db2.trusted;&lt;br /&gt;&lt;br /&gt;import java.io.PrintWriter;&lt;br /&gt;import java.sql.Connection;&lt;br /&gt;import java.sql.SQLException;&lt;br /&gt;import java.util.Properties;&lt;br /&gt;&lt;br /&gt;import javax.sql.DataSource;&lt;br /&gt;&lt;br /&gt;import com.ibm.db2.jcc.DB2ConnectionPoolDataSource;&lt;br /&gt;import com.ibm.db2.jcc.DB2PooledConnection;&lt;br /&gt;&lt;br /&gt;public class TrustedConnection {&lt;br /&gt;&lt;br /&gt;    private final int portNumber;&lt;br /&gt;    private final String databaseName;&lt;br /&gt;    private final String userName;&lt;br /&gt;    private final String password;&lt;br /&gt;    private final String hostName;&lt;br /&gt;    private final String defaultSchema;&lt;br /&gt;    private Object[] objects;&lt;br /&gt;    private final DB2ConnectionPoolDataSource dataSource;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Constructor, provide all details necessary to estalish trusted connecton&lt;br /&gt;     * @param portNumber  port number (most common is 50000)&lt;br /&gt;     * @param databaseName e.g SAMPLE&lt;br /&gt;     * @param userName e.g trust&lt;br /&gt;     * @param password e.g trustme&lt;br /&gt;     * @param hostName IP address or hostname&lt;br /&gt;     * @param defaultSchema e.g DB2INST1 (important: case sensitive !)&lt;br /&gt;     */&lt;br /&gt;            &lt;br /&gt;    public TrustedConnection(int portNumber, String databaseName,&lt;br /&gt;            String userName, String password, String hostName,&lt;br /&gt;            String defaultSchema) {&lt;br /&gt;        this.portNumber = portNumber;&lt;br /&gt;        this.databaseName = databaseName;&lt;br /&gt;        this.userName = userName;&lt;br /&gt;        this.password = password;&lt;br /&gt;        this.hostName = hostName;&lt;br /&gt;        this.defaultSchema = defaultSchema;&lt;br /&gt;        dataSource = new DB2ConnectionPoolDataSource();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Establishes trusted connection, should be called only once&lt;br /&gt;     * @throws SQLException&lt;br /&gt;     */&lt;br /&gt;    public void trustConnect() throws SQLException {&lt;br /&gt;        dataSource.setDatabaseName(databaseName);&lt;br /&gt;        dataSource.setServerName(hostName);&lt;br /&gt;        dataSource.setDriverType(4);&lt;br /&gt;        dataSource.setPortNumber(portNumber);&lt;br /&gt;        dataSource.setCurrentSchema(defaultSchema);&lt;br /&gt;        // Call getDB2TrustedPooledConnection to get the trusted connection&lt;br /&gt;        // instance and the cookie for the connection&lt;br /&gt;        objects = dataSource.getDB2TrustedPooledConnection(userName, password,&lt;br /&gt;                new java.util.Properties());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Switch and reuse trusted connection as different user (without authentication)&lt;br /&gt;     * @param newUser id of the new user&lt;br /&gt;     * @return Connection (java.sqlx)&lt;br /&gt;     * @throws SQLException&lt;br /&gt;     */&lt;br /&gt;    public Connection useConnection(String newUser) throws SQLException {&lt;br /&gt;        DB2PooledConnection pooledCon = (DB2PooledConnection) objects[0];&lt;br /&gt;        Properties properties = new Properties();&lt;br /&gt;        byte[] cookie = (byte[]) (objects[1]);&lt;br /&gt;        String userRegistry = null;&lt;br /&gt;        byte[] userSecTkn = null;&lt;br /&gt;        String originalUser = null;&lt;br /&gt;        Connection con = pooledCon.getDB2Connection(cookie, newUser, null,&lt;br /&gt;                userRegistry, userSecTkn, originalUser, properties);&lt;br /&gt;        return con;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * For the purpose of JdbcTemplate. &lt;br /&gt;     * DataSource with getConnection method override&lt;br /&gt;     * New user id as constructor parameter&lt;br /&gt;     * @author sbartkowski&lt;br /&gt;     *&lt;br /&gt;     */&lt;br /&gt;    private class TrustedDataSource implements DataSource {&lt;br /&gt;&lt;br /&gt;        private final String newUser;&lt;br /&gt;&lt;br /&gt;        public TrustedDataSource(String newUser) {&lt;br /&gt;            this.newUser = newUser;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public PrintWriter getLogWriter() throws SQLException {&lt;br /&gt;            return dataSource.getLogWriter();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public void setLogWriter(PrintWriter out) throws SQLException {&lt;br /&gt;            dataSource.setLogWriter(out);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public void setLoginTimeout(int seconds) throws SQLException {&lt;br /&gt;            dataSource.setLoginTimeout(seconds);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public int getLoginTimeout() throws SQLException {&lt;br /&gt;            return dataSource.getLoginTimeout();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public &lt;t&gt; T unwrap(Class&lt;t&gt; iface) throws SQLException {&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public boolean isWrapperFor(Class iface) throws SQLException {&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public Connection getConnection() throws SQLException {&lt;br /&gt;            return useConnection(newUser);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override&lt;br /&gt;        public Connection getConnection(String username, String password)&lt;br /&gt;                throws SQLException {&lt;br /&gt;            return getConnection();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public DataSource constructReuseDataSource(String newUser) {&lt;br /&gt;        return new TrustedDataSource(newUser);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Usage example&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;TrustedConnection trust = new TrustedConnection(50000, "SAMPLE", "trust",&lt;br /&gt;                "trustme", "192.168.1.6", "DB2INST1");&lt;br /&gt;        trust.trustConnect(); // should be done once only&lt;br /&gt;        Connection con = trus.useConnection("John");&lt;br /&gt;        // some database activity as user 'John'&lt;br /&gt;        con = trus.useConnection("Jack");&lt;br /&gt;        // some database activity as user 'Jack'&lt;br /&gt;        //etc&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Spring JdbcTemplate&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JdbcTemplate uses DataSource to extract Connection interface. Unfortunately&amp;nbsp; I cannot use DB2ConnectionPoolDataSource directly because JdbcTemplate uses getConnection method (without parameters). In order to overcome this problem I applied Decorator pattern to DB2ConnectionPoolDataSource class just overriding only getConnection method and providing new user id in class constructor.&lt;br /&gt;&lt;br /&gt;The usage example:&lt;br /&gt;&lt;pre class="java" name="code"&gt;TrustedConnection trust;&lt;br /&gt;   ....&lt;br /&gt;    JdbcTemplate jTemplate = new JdbcTemplate(trust.constructReuseDataSource('John'));&lt;br /&gt;    jTemplate.update(...);&lt;br /&gt;    jTemplate // any other method.&amp;nbsp;&lt;/pre&gt;&lt;pre class="java" name="code"&gt;&amp;nbsp;&lt;/pre&gt;&lt;span style="font-size: large;"&gt;Last but not least - is it really works ???&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In order to answer this question I created a simple standalone Java program which uses TrustedContext class (described above), retrieves trusted connection to the SAMPLE database, switches to different user and run some simple SQL statements.&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/TrustedConnection/src/Main.java"&gt;Main.java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;import java.sql.SQLException;&lt;br /&gt;&lt;br /&gt;import org.springframework.jdbc.BadSqlGrammarException;&lt;br /&gt;import org.springframework.jdbc.core.JdbcTemplate;&lt;br /&gt;&lt;br /&gt;import com.db2.trusted.TrustedConnection;&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;&lt;br /&gt;    private static void goTrusted() throws SQLException {&lt;br /&gt;        TrustedConnection trust = new TrustedConnection(50000, "SAMPLE", "trust",&lt;br /&gt;                "trustme", "192.168.1.6", "DB2INST1");&lt;br /&gt;        trust.trustConnect();&lt;br /&gt;        JdbcTemplate jTemplate = new JdbcTemplate(&lt;br /&gt;                trust.constructReuseDataSource("john"));&lt;br /&gt;        int no = jTemplate.queryForInt("SELECT COUNT(*) FROM ACT");&lt;br /&gt;        String sql = "update employee set bonus=30000 where lastname='WONG'";&lt;br /&gt;        jTemplate.update(sql);&lt;br /&gt;        &lt;br /&gt;        jTemplate = new JdbcTemplate(trust.constructReuseDataSource("mary"));&lt;br /&gt;        no = jTemplate.queryForInt("SELECT COUNT(*) FROM EMPLOYEE");&lt;br /&gt;        &lt;br /&gt;        sql = "update employee set bonus=30000 where lastname='WONG'";&lt;br /&gt;        try {&lt;br /&gt;          jTemplate.update(sql);&lt;br /&gt;        } catch (BadSqlGrammarException e) {&lt;br /&gt;            // as expected&lt;br /&gt;            // SQL0551N code&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @param args&lt;br /&gt;     */&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        try {&lt;br /&gt;            goTrusted();&lt;br /&gt;        } catch (Exception e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Firstly we can debug this code and set breakpoint at three places (14, 17 and 29). At the same time connect to SAMPLE database and run &lt;br /&gt;&lt;pre&gt;db2 list applications&lt;/pre&gt;command when Java program breaks.&lt;br /&gt;The first time something like this will be retrieved:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Auth Id  Application    Appl.      Application Id                                                 DB       # of&lt;br /&gt;         Name           Handle                                                                    Name    Agents&lt;br /&gt;-------- -------------- ---------- -------------------------------------------------------------- -------- -----&lt;br /&gt;TRUST    db2jcc_applica 144        C0A80103.88C9.110524112902                                     SAMPLE   1    &lt;br /&gt;DB2INST1 db2bp          63         *LOCAL.db2inst1.110524104758                                   SAMPLE   1    &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;the second:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Auth Id  Application    Appl.      Application Id                                                 DB       # of&lt;br /&gt;         Name           Handle                                                                    Name    Agents&lt;br /&gt;-------- -------------- ---------- -------------------------------------------------------------- -------- -----&lt;br /&gt;JOHN     db2jcc_applica 144        C0A80103.88C9.110524113623                                     SAMPLE   1    &lt;br /&gt;DB2INST1 db2bp          63         *LOCAL.db2inst1.110524104758                                   SAMPLE   1  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and third:&lt;br /&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;Auth Id  Application    Appl.      Application Id                                                 DB       # of&lt;br /&gt;         Name           Handle                                                                    Name    Agents&lt;br /&gt;-------- -------------- ---------- -------------------------------------------------------------- -------- -----&lt;br /&gt;MARY     db2jcc_applica 144        C0A80103.88C9.110524113623                                     SAMPLE   1    &lt;br /&gt;DB2INST1 db2bp          63         *LOCAL.db2inst1.110524104758                                   SAMPLE   1&amp;nbsp; &lt;/pre&gt;&lt;br /&gt;Pay attention that every time application handle (Appl. Handle) which is set at the moment when application connects to the database server is the same but Authentication Id is different - it is changing according to the current Connection user id. It means that different users shares the same connection one after one.&lt;br /&gt;&lt;br /&gt;Secondly we can check if our sophisticated security policy is in force. As we see&amp;nbsp; - user John is able to update the table but when user Mary is trying to modify the bonus of her college - she is rejected.&lt;br /&gt;&lt;br /&gt;Next step is to verify if we are able to track the user activities for auditing purspose.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6057464460062438432?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6057464460062438432/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/05/trusted-context-db2-spring.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6057464460062438432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6057464460062438432'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/05/trusted-context-db2-spring.html' title='Trusted context, DB2, Spring'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-5485942554399365361</id><published>2011-05-15T03:56:00.000-07:00</published><updated>2011-05-15T03:58:22.688-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>GWT 2.3 and NetBeans 7.0</title><content type='html'>I downloaded the latest (2.3) version of &lt;a href="http://code.google.com/intl/pl/webtoolkit/gettingstarted.html"&gt;GWT&lt;/a&gt; but could not compile my GWT application. The error message is something like that:&lt;br /&gt;&lt;blockquote&gt;[java] [ERROR] Errors in 'jar:file:/../gwt-user-2.3.0.jar!/com/google/&lt;br /&gt;gwt/editor/client/EditorDriver.java'&lt;br /&gt;[java] [ERROR] Line 97: No source code is available for type&lt;br /&gt;javax.validation.ConstraintViolation&lt;t&gt;; did you forget to inherit a&lt;br /&gt;required module?&amp;nbsp; &lt;/t&gt;&lt;/blockquote&gt;It looks that some dependencies which had been attached to gwt-user.jar so far&amp;nbsp; have been "outsourced" to the external library. &lt;br /&gt;What is more important - &lt;a href="http://java.net/projects/gwt4nb/pages/Home"&gt;Gwt4nb&lt;/a&gt; plugin (used by me) seems not be enabled not only for GWT 2.3 but also for the NetBeans 7.0 at all.&lt;br /&gt;Manual workaround is as follows:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;File (accessible from Files tab) {project name}/nbproject/private/private.properties. Replace auxiliary.org-netbeans-modules-gwt4nb.GWTDir property with directory name of the GWT 2.3 SDK&lt;/li&gt;&lt;li&gt;Manually add the following jars to compile-time libraries (not deployable): validation-api-1.0.0.GA-sources.jar and gwt-servlet-deps.jar.&lt;/li&gt;&lt;/ol&gt;&amp;nbsp;After that it is working for me as expected.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-5485942554399365361?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/5485942554399365361/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/05/gwt-23-and-netbeans-70.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5485942554399365361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5485942554399365361'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/05/gwt-23-and-netbeans-70.html' title='GWT 2.3 and NetBeans 7.0'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-5847697810498879103</id><published>2011-05-02T13:10:00.000-07:00</published><updated>2011-05-02T13:12:43.964-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>GWT + DB2 + BIRT</title><content type='html'>Database application without reporting is like a sea without fish. Looks like a sea but something important is missing.&lt;br /&gt;So I decided to add some reporting feature to my GwtSample application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Refactoring&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But firstly I realized&amp;nbsp; that it is necessary to release tight coupling with database schema (here Employee table) and to get rid of direct references to Employee class attributes (Employee.getEmpno(), Employee.getMidinit() etc).&lt;br /&gt;So, in the share package, additional class (&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/src/com/ibm/sampledb/shared/GetField.java"&gt;GetField.java&lt;/a&gt;) was created providing some general description of the table schema instead of direct column names and types.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public interface IRecord {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Employee imlements IRecord,Serializable {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class GetField {&lt;br /&gt;&lt;br /&gt;    public enum FieldType {&lt;br /&gt;        INTEGER, DATE, STRING, NUMBER&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Field, column value (C union structure would be the best)&lt;br /&gt;     * Only one attribute should be set&lt;br /&gt;     * @author sbartkowski&lt;br /&gt;     * &lt;br /&gt;     */&lt;br /&gt;    public static class FieldValue {&lt;br /&gt;        /** Timestamp. date column. */&lt;br /&gt;        private final Timestamp dField;&lt;br /&gt;        /** char, carchar2 column. */&lt;br /&gt;        private final String sField;&lt;br /&gt;        /** integer column. */&lt;br /&gt;        private final int iField;&lt;br /&gt;        /** decimal column. */&lt;br /&gt;        private final BigDecimal nField;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Description of one column in IRecord object&lt;br /&gt;     * @author sbartkowski&lt;br /&gt;     *&lt;br /&gt;     */&lt;br /&gt;    public static class FieldInfo {&lt;br /&gt;        /** Column identifier. */&lt;br /&gt;        private final String fId;&lt;br /&gt;        /** Column type. */&lt;br /&gt;        private final FieldType fType;&lt;br /&gt;        /** Column description, title. */&lt;br /&gt;        private final String fDescr;&lt;br /&gt;        /** Column size to display (in pixels). */&lt;br /&gt;        private final int cSize;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**  &lt;br /&gt;     * Get list of all columns&lt;br /&gt;     * @return List of columns (FieldInfo)&lt;br /&gt;     */&lt;br /&gt;    public static List&amp;lt;fieldinfo&amp;gt; getfList() {&lt;br /&gt;        return fList;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;     /**&lt;br /&gt;     * Get column value from the record&lt;br /&gt;     * @param field Column identifier (fId attribute in FieldInfo)&lt;br /&gt;     * @param i IRecord, record, row&lt;br /&gt;     * @return FieldValue class with proper attribut set according to column type&lt;br /&gt;     */&lt;br /&gt;&lt;br /&gt;    public static FieldValue getValue(String field, IRecord i) {&lt;br /&gt;    }&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;This set of classes and functions is enough to strip off from client (gwt) code any direct reference to Employee class. So it could be easily extended to the general purpose display client read for any sql statement.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Printing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As a reporting engine I decided to use &lt;a href="http://www.eclipse.org/birt/phoenix/"&gt;BIRT&lt;/a&gt;. There is an easy path to utilize BIRT : via defining JDBC data source and run and display simply SQL statement (SELECT * FROM EMPLOYEE) and launch report by calling proper URL.&lt;br /&gt;But I don't like this solution. Firstly for security reason : we have to provide the credentials for accessing database also to the BIRT engine just creating the next security access point. Also we have to duplicate some logic in the BIRT -&amp;nbsp; run the same SQL statement like in our main application.&amp;nbsp; It could be also complicated to implement all features : order by and the direction for the ordering.&lt;br /&gt;So I chose the hard way : via XML data source. The general idea is as follows:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The user clicks the Print button.&lt;/li&gt;&lt;li&gt;Client sends back to the server all rows displayed on the screen in current order and direction.&lt;/li&gt;&lt;li&gt;Server creates temporary XML file on the server containing all data and returns to the client the file name.&lt;/li&gt;&lt;li&gt;Client launches BIRT report via URL providing in the URL the file name.&lt;/li&gt;&lt;li&gt;BIRT run the report using the file name taken from URL as a XML data source.&lt;/li&gt;&lt;/ol&gt;Simple class for creating XML file (general purpose) -&amp;nbsp;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/src/com/ibm/sampledb/server/CreateXML.java"&gt;CreateXML.java&lt;/a&gt; &lt;br /&gt;URL (host and port) used to launch BIRT report is defined as a resource variable in server.xml file, also the report design file name.&lt;br /&gt;&lt;br /&gt;The advantage of this solution:&lt;br /&gt;&lt;ol&gt;&lt;li&gt; More safe, the data access credentials used only at one point (application server).&lt;/li&gt;&lt;li&gt;The table in the report is sorted in exactly the same way as visible on the screen. No additional logic is required in the BIRT engine.&lt;/li&gt;&lt;/ol&gt;The disadvantage:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;More complicated, more coding, more network traffic.&lt;/li&gt;&lt;li&gt;Temporary files are left on the server, cleaning possible only after stopping the application server or machine restart.&lt;/li&gt;&lt;li&gt;Application server and BIRT engine (resource thirsty) should be installed on the same machine.&lt;/li&gt;&lt;/ol&gt;But finally - it is working.&lt;br /&gt;The source code for the application and BIRT project:&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/#svn%2Ftrunk%2Fexamples%2FSampleGwt"&gt;SampleGWT&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/#svn%2Ftrunk%2Fexamples%2FSampleReports"&gt;SampleReports&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-5847697810498879103?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/5847697810498879103/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/05/gwt-db2-birt.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5847697810498879103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5847697810498879103'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/05/gwt-db2-birt.html' title='GWT + DB2 + BIRT'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-7014696136769566939</id><published>2011-04-26T14:18:00.000-07:00</published><updated>2011-06-09T13:51:46.418-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na koncercie</title><content type='html'>W dniu 19 kwietnia byliśmy na przedstawieniu &amp;nbsp;&lt;a href="http://pl.wikipedia.org/wiki/Pasja_wed%C5%82ug_%C5%9Bw._Mateusza_%28BWV_244%29"&gt;Pasji według świętego Mateusza Jana Sebastiana Bacha&lt;/a&gt;&amp;nbsp;w ramach&amp;nbsp;&lt;a href="http://www.beethoven.org.pl/pl/aktualnosci/747"&gt;XV Wielkanocnego Festiwalu Ludwiga Van Beethovena&lt;/a&gt;. Podobało nam się bardzo, chociaż nie był to spektakl specjalnie zapadający w pamięć.&lt;br /&gt;Pasja była po raz pierwszy wystawiona w Lipsku w Wielki Piątek 11 kwietnia 1727 roku, zaś za życia kompozytora jeszcze dwukrotnie, z pewnymi zmianami, w roku 1736 i 1742. Ponowne wykonanie to dopiero rok 1829, kiedy to po latach zapomnienia zaczął się renesans twórczości Bacha. Współcześnie "Pasja według świętego Mateusza" Bacha to jeden z kanonów muzyki, a także całej światowej kultury.&lt;br /&gt;W przestawieniu na którym byliśmy główną rolę Ewangelisty a także wykonawcy partii tenorowych wziął na siebie brytyjski tenor Nicholas Mulroy i był to najsilniejszy punkt przedstawienia. Początkowo można było odnieść wrażenie, że współpraca między solistą a chórem nie układa się najlepiej, ale w miarę upływu czasu było coraz lepiej.&amp;nbsp; Ułatwiał to sam solista, który momentami odwracał się do chóru w oczekiwaniu na odpowiedź, dzięki czemu przedstawienie nabierało dynamiki. Bardzo słabo słyszalna była sopranistka, Agata Zubel, na przykład w arii "&lt;i&gt;Ich will dir mein Herze schenken" &lt;/i&gt;słyszeliśmy wyraźnie oboje, zaś sopran gdzieś się zagubił. Zaś z kolei pochodzący z Szwecji baryton  Håkan Vramsm, wyposażony w silny i donośny głos, miał odwrotny problem, np. w dynamicznej arii "&lt;i&gt;Gebt mir meinen Jesum wieder!&lt;/i&gt;" prawie w ogóle nie było słychać skrzypiec, zdominowane zostały przez głos solisty. Na szczęście nie zdarzyło się tak w słynnej arii "&lt;i&gt;Erbarme dich ", &lt;/i&gt;i skrzypce, i solistka współbrzmiały bardzo dobrze.&lt;br /&gt;"Pasja według świętego Mateusza" Bacha w Warszawie to rzadka okazja, o czym świadczył tłum słuchaczy szczelnie wypełniający salę koncertową Filharmonii Narodowej i długa kolejka chętnych na wejściówkę przed rozpoczęciem przedstawienia. Na pewno nie musieli tego żałować, chociaż z pewnością część z nich zna to dzieło z bardziej udanych wykonań.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-7014696136769566939?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/7014696136769566939/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/04/bylismy-na-koncercie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7014696136769566939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7014696136769566939'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/04/bylismy-na-koncercie.html' title='Byliśmy na koncercie'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-3425344685757062980</id><published>2011-04-06T01:24:00.000-07:00</published><updated>2011-06-09T13:52:24.914-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy w teatrze</title><content type='html'>30 marca byliśmy na przedstawieniu &lt;a href="http://www.narodowy.pl/spektakl_szczegoly/?s=6362"&gt;Mewy&lt;/a&gt; Antoniego Czechowa w Teatrze Narodowym, podobało nam się bardzo, chociaż nie wszystkim byliśmy zachwyceni.&lt;br /&gt;&lt;br /&gt;Pierwsze przedstawienie "Mewy" w 1896 roku zakończyło się klapą, ale kolejne,&amp;nbsp; w 1898 było już pełnym sukcesem i zapoczątkowało trwałą obecność "Mewy", jak i pozostałych dzieł scenicznych Czechowa, na scenach teatralnych.&lt;br /&gt;&lt;br /&gt;"Mewa" to dzieło pozornie łatwe, ale ta zwodnicza łatwość jest zarazem ogromną trudnością. Z pozoru to scenka rodzajowa z życia rosyjskiej prowincji końca XIX wieku. Do majątku Piotra Sorina, emerytowanego urzędnika przyjeżdża na letnisko jego siostra Irina Arkadina, wzięta i sławna aktorka wraz ze swoim aktualnym partnerem życiowym Borisem Trigorinem, poczytnym autorem realistycznych opowiadań i wspólnie z mieszkańcami, wśród których jest syn Iriny Konstantin oraz &amp;nbsp;okolicznymi znajomymi starają się jak najlepiej spędzić ten czas.&lt;br /&gt;&lt;br /&gt;Ale pod pozorem tej banalności toczony jest dyskurs na podstawowe dla wszystkich tematy - czym jest szczęście w życiu, spełnienie, jak osiągnąć szczęście, gdzie je szukać. Bohaterowie to różni ludzie, sławni i nikomu nieznani, bogaci i biedni, starzy i młodzi, chorzy i zdrowi, dzielą ich nawet klasy społeczne. Ale łączy ich jedno - marzą o szczęściu, które jest zawsze gdzie indziej, marzą o miłości, która jest dla nich nieosiągalna.&lt;br /&gt;&lt;br /&gt;U Czechowa pułapką jest zbyt dosłowne odczytywanie słów, literalnej treści. Można interpretować "Mewę" jako konflikt między Iriną, która wyobraża istniejącą konwencją teatralną i Konstantinem, próbującym wprowadzać nowe środki wyrazu. Ale ten konflikt wyrażony w "Mewie" jest przecież zupełnie banalny, odkąd istnieje sztuka teatralna toczony jest nieustający dyskurs między starym i nowym. "Nowa forma" Konstantina jest przecież, według słów Iriny, "dekadenckim bełkotem", więc czymś świetnie znanym, zaś my nawet byśmy dodali, że klasycznym grafomaństwem. Dla Niny, marzącej o karierze aktorki, celem jest osiągnięcie teatralnego Olimpu i jest jej całkowicie obojętne, czy na tym Olimpie królują stare czy nowe formy.&lt;br /&gt;&lt;br /&gt;"Mewa" łamie teatralne konwencje, to nie jest sztuka z zawiązaniem akcji na początku i ciągiem wydarzeń prowadzących do finału, konkluzji. To raczej tak, jakby na moment życie bohaterów oświetlił reflektor, możemy przez pewien czas ich obserwować, po czym reflektor gaśnie i życie bohaterów toczy się dalej.&lt;br /&gt;Czechow nie opowiada nam bajek, tutaj próżno szukać Kopciuszka czy Brzydkiego Kaczątka. Nina podejmuje wyzwanie, rozpoczyna karierę aktorki. Wiemy, że na początku spotkało ją niepowodzenie, pomimo tego nie zawraca z tej drogi. Ale od Czechowa nie dowiemy się, czy faktycznie ma talent aktorski, czy spędzi resztę życia tułając się po prowincjonalnych scenach w drugorzędnych przedstawieniach, czy jednak osiągnie sukces. To na pewno nie jest scenariusz do holywoodzkiego melodramatu.&lt;br /&gt;&lt;br /&gt;Czechow nie oszczędza swoich bohaterów, to nie jest lukrowany świat dobrych i szlachetnych. Nina jest postacią wzbudzającą sympatię, ale nietrudno zauważyć wyrachowania w jej wyborach. Początkowo wiąże się z Konstantinem mając nadzieję, że jako syn słynnej aktorki pozwoli jej się trochę zbliżyć do tego wyśnionego świata. Gdy pojawia się Boris Trigorin, bez skrupułów czyni jego obiektem swoich uczuć, gdyż związek ze znanym pisarzem na pewno bardziej ułatwi jej karierę.&lt;br /&gt;&lt;br /&gt;"Mewa" Czechowa wymaga bardzo dobrego aktorstwa, tutaj jest ważny nie tylko dobrze wypowiedziany &amp;nbsp;tekst, trzeba także przekazać niewypowiedziane uczucia i pragnienia bohaterów. &amp;nbsp;W przeciwnym razie łatwo zamienić spektakl w banalną historyjkę. W przedstawieniu Agnieszki Glińskiej na szczęście dobrego aktorstwa nie brakowało.&lt;br /&gt;&lt;br /&gt;Najbardziej podobali &amp;nbsp;nam się Włodzimierz Press jako Piotr Sorin oraz Paweł Wawrzecki jako doktor Dorn. "Mewa" to przecież, według słów Czechowa, "komedia w czterech aktach", chociaż komedia raczej nietypowa, gdyż główny bohater strzela sobie w głowę na końcu. Dzięki subtelnej, ale nie przerysowanej grze tych aktorów całe przedstawienia ma nadane lekko ironiczno - żartobliwy charakter.&lt;br /&gt;&lt;br /&gt;Modest Ruciński bardzo dobrze wypadł jako melancholijny Konstantin Triepliew, zaś Dominika Kluźniak jako entuzjastyczna i trochę egzaltowana Nina Zarieczna. Ale nie bardzo udała się końcowa scena spotkania Niny i Konstantina, tutaj przecież ostatecznie rozstrzygają się losy bohaterów. Czechow porzuca ironiczny ton, przez bohaterów przemawiają prawdziwe pasje i uczucia. Konstantin widzi ruinę swoich pisarskich planów, zrozumiał, że aby zbudować coś nowego nie wystarczy zburzyć lub zanegować stare. Gdy Nina odrzuca jego miłość, wszystkie światła w jego życiu gasną. Nina także ma za sobą pierwsze niepowodzenia, a nawet tragedię. Rozumie, że nie wystarczy wyrwać się z domu i u boku wielkiego pisarza znaleźć się w Moskwie aby droga na szczyt stanęła otworem. Ale decyduję się dalej kroczyć tą drogą, odrzuca miłość Konstantyna i tym wszystkie nici łączące ją z przeszłością zostają zerwane, mewa została zastrzelona i już nigdy nie będzie fruwać nad jeziorem. A przecież tak nie musiało się stać, bohaterowie szukają szczęścia i w tej scenie szczęście było w zasięgu ręki. Ale zamiast happy-endu mamy tragedię. W przedstawieniu tego nie było jednak słychać i ani widać, bohaterowie nadal toczą melancholijny, egzaltowany dyskurs, jakby młodym aktorom zabrakło środków artystycznego wyrazu.&lt;br /&gt;&lt;br /&gt;Główną rolę Iriny Arkadiny grała Joanna Szczepkowska, jakby urodzona do tej roli. Ale wydaje się, że ten fakt jakby zwalniał znakomitą aktorkę ze wszelkich starań. Irina to znakomitość który musi być podziwiana i hołubiona na scenie i poza sceną. Jest to wielka aktorka na scenie i na wiejskim letnisku, tam pławi się w uwielbieniu Niny, która marzy o tym, że być taką jak ona. Sławny pisarz to także taki kolejny kosz kwiatów od losu. Nigdy nie wiemy, kiedy gra, a kiedy mówi z serca. Ale wydaje się, że jej czułość dla syna czy zniedołężniałego brata jest szczera, chociaż ta czułość jest przetykana z brutalnością. Ale w przedstawieniu Irina jest cały czas zimna, skąpa i wyrachowana, to postać jednowymiarowa od początku do końca.&lt;br /&gt;&lt;br /&gt;Krzysztof Stelmaszyk bardzo dobrze wczuł się w rolę Borisa Trigorina. Boris jest punktem odniesienia dla wszystkich postaci w sztuce, jest cały czas obecny, ale tylko w jednej scenie odgrywa bardziej aktywną rolę, gdy zastanawia się, co to znaczy sława i popularność i nieoczekiwanie nastręcza mu to ogromną trudność.&lt;br /&gt;&lt;br /&gt;Scenografia w przedstawieniach Czechowa zawsze musi znaleźć jakieś miejsce pomiędzy dokładnym odbiciem rosyjskiej rzeczywistości z XIX wieku, co jednak gubi uniwersalne przesłanie sztuki, a całkowitym oderwaniem od tego tła, co z kolei pociąga za sobą rozziew między treścią sztuki a wyglądem sceny. W przedstawieniu jednak ten złoty środek został dobrze odnaleziony, jesteśmy w w wiejskiej posiadłości na jeziorem, ale nie jest to przytłaczające, czyni treść dobrze umocowaną w kontekście, ale nie narzuca dosłownego rozumienia.&lt;br /&gt;&lt;br /&gt;Dla potrzeb przedstawienie powstał nowy przekład Agnieszki Lubomiry Piotrowskiej. W programie, który można kupić podczas spektaklu, tłumaczka objaśnia dlaczego powstał nowy przekład, zamiast posłużyć się którymś z istniejących. Niektóre fragmenty mogą brzmieć trochę zbyt nowocześnie.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ilibrary.ru/text/971/p.2/index.html"&gt;Oryginał:&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #222222;"&gt;&lt;span class="person" style="letter-spacing: 0.2em; word-spacing: 0.2em;"&gt;Аркадина&lt;/span&gt;. &amp;nbsp;(.....)&amp;nbsp;&lt;span class="remark_inline" style="font-style: italic; letter-spacing: 0px;"&gt;(Подбоченясь, прохаживается по площадке.)&lt;/span&gt;&amp;nbsp;Вот вам — как цыпочка. Хоть пятнадцатилетнюю девочку играть.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Przekład:&lt;br /&gt;Arkadina: (...) Proszę, lalunia. Mogę zagrać nawet piętnastkę.&lt;br /&gt;&lt;br /&gt;W przedstawieniu jakoś mi się to nie podobało, ale chyba trudno to przełożyć inaczej.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #222222;"&gt;цыпочка - to raczej "laska" (w rozumieniu: "atrakcyjna kobieta"), ale w języku polskim ten wyraz brzmi wulgarnie, kobieta tak o sobie nie powie. "Lalunia" znacznie lepiej, chociaż bardzo sztucznie. Język rosyjski jest dużo bogatszy od polskiego, przekonuję się, że praca tłumacza to ciężki kawałek chleba, chociaż z pozoru prosta.&amp;nbsp;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-3425344685757062980?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/3425344685757062980/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/04/bylismy-w-teatrze.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/3425344685757062980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/3425344685757062980'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/04/bylismy-w-teatrze.html' title='Byliśmy w teatrze'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-3762967497519344949</id><published>2011-04-03T12:34:00.000-07:00</published><updated>2011-04-03T12:40:40.992-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>GWT  + CSS + JSON</title><content type='html'>I'm not very happy with my previous solution - I mean that I call one, named JavaScript function for modifying style for the row.&lt;br /&gt;In this example it does not matter but assume that we have a lot of views and every view requires different row modifier. Calling one JavaScript function for all view is not a good idea.&lt;br /&gt;So I decided to introduce "dynamic" JavaScript function - the name of JavaScript function is taken from resource &amp;nbsp;and can vary.&lt;br /&gt;So instead of:&lt;br /&gt;&lt;pre class="prettyprint" style="background-color: #fafafa; border-bottom-color: rgb(187, 187, 187); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(187, 187, 187); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 187); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(187, 187, 187); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 1em; overflow-x: visible; overflow-y: visible; padding-bottom: 0.99em; padding-left: 0.99em; padding-right: 0.99em; padding-top: 0.99em; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px;"&gt;&lt;table id="src_table_0" style="border-collapse: collapse; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tbody style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;tr id="sl_svn354_122" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;private&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;class&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;AddStyle&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;implements&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;RowStyles&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;EmployeeRecord&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_123" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_124" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;@Override&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_125" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;public&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;String&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; getStyleNames&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;EmployeeRecord&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; row&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;int&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; rowIndex&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_126" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_145" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top;"&gt;&lt;div style="font-size: 12px; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;            ....&lt;/span&gt;&lt;/div&gt;&lt;span class="pln" style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; white-space: pre-wrap;"&gt;            String jsString = js.createJsonString();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-size: 12px; white-space: pre-wrap;"&gt;&lt;span class="kwd" style="color: #000088;"&gt;            return&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; jsAddStyle&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;parseJson&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;jsString&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;));&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_146" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;}&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_148" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;table id="src_table_0" style="border-collapse: collapse; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tbody style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;tr id="sl_svn354_118" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;public&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;static&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;native&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;String&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; jsAddStyle&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;JavaScriptObject&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; o&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="com" style="color: #880000;"&gt;/*-{&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_119" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="com" style="color: #880000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return $wnd.jsAddStyle(o);&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_120" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="com" style="color: #880000;"&gt;&amp;nbsp; &amp;nbsp; }-*/&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;The following code was introduced (&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/src/com/ibm/sampledb/client/DockMain.java"&gt;code&lt;/a&gt;).&lt;br /&gt;&lt;pre class="prettyprint" style="background-color: #fafafa; border-bottom-color: rgb(187, 187, 187); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(187, 187, 187); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 187); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(187, 187, 187); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 1em; overflow-x: visible; overflow-y: visible; padding-bottom: 0.99em; padding-left: 0.99em; padding-right: 0.99em; padding-top: 0.99em; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px;"&gt;&lt;table id="src_table_0" style="border-collapse: collapse; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tbody style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;tr id="sl_svn354_122" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;private&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;class&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;AddStyle&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;implements&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;RowStyles&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;EmployeeRecord&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_123" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;          private final String jsString;  &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_124" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;@Override&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_125" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;public&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;String&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; getStyleNames&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;EmployeeRecord&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; row&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;int&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; rowIndex&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_126" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_145" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_146" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;table id="src_table_0" style="border-collapse: collapse; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tbody style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;tr id="sl_svn355_137" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;            &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;String&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; jsString &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; js&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;createJsonString&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;();&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn355_138" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn355_139" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;return&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; callJsStringFun&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;jsFun&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; jsString&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;);&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;}&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_147" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_148" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;} ....  &lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;table id="src_table_0" style="border-collapse: collapse; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tbody style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;tr id="sl_svn355_106" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;public&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;static&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;native&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;String&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; callJsStringFun&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;String&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; jsonFun&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;String&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; paramS&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="com" style="color: #880000;"&gt;/*-{&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn355_107" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="com" style="color: #880000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return $wnd.eval(jsonFun + '(\'' + paramS + '\')');&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn355_108" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="com" style="color: #880000;"&gt;&amp;nbsp; &amp;nbsp; }-*/&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;   &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;JavaScript function should follow the &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/src/com/ibm/sampledb/server/resource/custom.js"&gt;pattern&lt;/a&gt;. Of course - in this example jsString (as above) should be equal to 'jsAddStyle'.&lt;br /&gt;&lt;pre class="prettyprint" style="background-color: #fafafa; border-bottom-color: rgb(187, 187, 187); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(187, 187, 187); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 187); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(187, 187, 187); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 1em; overflow-x: visible; overflow-y: visible; padding-bottom: 0.99em; padding-left: 0.99em; padding-right: 0.99em; padding-top: 0.99em; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span"&gt;&lt;table id="src_table_0" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tbody style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;tr id="sl_svn354_122" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_148" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;table id="src_table_0" style="border-collapse: collapse; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tbody style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;tr id="sl_svn355_1" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="kwd" style="color: #000088;"&gt;function&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; jsAddStyle&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;s&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn355_2" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;var&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; o &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;eval&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;'('&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;+&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; s &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;+&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;')'&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;);&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn355_3" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;var&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; job &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; o&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;Employee&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;job&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn355_4" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;if&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;job &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;==&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;'MANAGER'&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;return&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;'addRow'&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;}&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn355_5" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;return&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;null&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn355_6" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;br /&gt;So this way every view could have its own customized function identified by name.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-3762967497519344949?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/3762967497519344949/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/04/gwt-css-json.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/3762967497519344949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/3762967497519344949'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/04/gwt-css-json.html' title='GWT  + CSS + JSON'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-2966518713297813009</id><published>2011-04-02T14:42:00.000-07:00</published><updated>2011-04-02T14:43:11.835-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>Gwt and Firefox 64 bit</title><content type='html'>And finally it comes ! GWT Developer Plugin for Firefox is supporting 64 bit Firefox 3.6 (and I hope that Firefox 4.0 also) on 64 bit Linux. Farewell Firefox 3.5 ! Rest in peace ....&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-2966518713297813009?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/2966518713297813009/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/04/gwt-and-firefox.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2966518713297813009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2966518713297813009'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/04/gwt-and-firefox.html' title='Gwt and Firefox 64 bit'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-5993041649356807916</id><published>2011-03-26T04:01:00.000-07:00</published><updated>2011-03-26T04:01:40.488-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Windows and 64 bit</title><content type='html'>Next problem while migrating 32-bit application to 64 bit world.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Before migration (32 bit code)&lt;/div&gt;&lt;blockquote&gt;SetWindowLongPtr( hwnd, GWLP_USERDATA, (long )this );&lt;/blockquote&gt;It is very common usage of GWLP_USERDATA property - keeping a pointer to struct of class containing more detailed information related to the window hwnd.&lt;br /&gt;&lt;br /&gt;Later it can referenced:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;static LRESULT CALLBACK WndProc (HWND hwnd, UINT _komunikaty, UINT wParam,LONG lParam) {&lt;br /&gt;my_class *pointer;&lt;br /&gt;pointer = (my_class *)GetWindowLongPtr(hwnd,GWLP_USERDATA);&lt;br /&gt;// some logic related to window and my_class&lt;br /&gt;....&lt;br /&gt;}&lt;/blockquote&gt;Of course - it does not work after compiling as 64 bit application because 'long' data type is still 32 bit (different than in Linux where 'long' is 64 bit) but pointer is 64 bit.&lt;br /&gt;&lt;br /&gt;In order to have this code working in 32 and 64 bit world it was necessary to modify this line:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;SetWindowLongPtr( hwnd, GWLP_USERDATA, ( LONG_PTR )this );&lt;/blockquote&gt;&lt;br /&gt;Also it was necessary to modify a simple function detecting if application is 32 or 64 bit - in MSVC I was unable to find any simple method (for instance : no compiler predefined constant).&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#ifdef LINUX&lt;br /&gt;inline bool is64Version() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;if (sizeof(long) == 8) { return true; }&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;else { return false; }&lt;br /&gt;}&lt;br /&gt;#else&lt;br /&gt;inline bool is64Version() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;if (sizeof(void *) == 8) { return true; }&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;else { return false; }&lt;br /&gt;}&lt;br /&gt;#endif&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-5993041649356807916?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/5993041649356807916/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/03/windows-and-64-bit.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5993041649356807916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5993041649356807916'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/03/windows-and-64-bit.html' title='Windows and 64 bit'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-5379866256047397905</id><published>2011-03-15T14:58:00.000-07:00</published><updated>2011-03-15T15:04:37.033-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>GWT + CSS + JSON</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: large;"&gt;Introduction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'd like to extend simple database application described in the previous post. Assume that it is a successful database application but some customers need customization. For instance one customer wants to have highlighted all employees earning more that 100000 euros and the next wants the same but for the employees earning less that 50000 euros. How to meet these expectation and avoid splitting out code into different branches.&lt;br /&gt;So we want to achieve the following goals:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Customization, make some improvement specific for the customer.&lt;/li&gt;&lt;li&gt;Avoid splitting the business code into different branches, easy upgrade of the software without loosing the customization.&lt;/li&gt;&lt;li&gt;Safe, do not open gate for the malicious code.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Purpose&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Assume that our purpose is to provide a customization for&amp;nbsp;&lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/user/cellview/client/CellTable.html#setRowStyles(com.google.gwt.user.cllview.client.RowStyles)"&gt;setRowStyles&lt;/a&gt;&amp;nbsp;method. It gives the opportunity for highlighting some rows in the employee view.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Logic&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first question is how to provide logic for highlighting some rows without touching the main java code. The answer is simple - Java Script.&amp;nbsp;&lt;/div&gt;&lt;div&gt;So if we want for provide customization for modifying the rows style the following code could be created.&lt;/div&gt;&lt;div&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/src/com/ibm/sampledb/client/DockMain.java"&gt;DockMain&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint" style="background-color: #fafafa; border-bottom-color: rgb(187, 187, 187); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(187, 187, 187); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 187); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(187, 187, 187); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 1em; overflow-x: visible; overflow-y: visible; padding-bottom: 0.99em; padding-left: 0.99em; padding-right: 0.99em; padding-top: 0.99em; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="color: #880000;"&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px;"&gt;&lt;table id="src_table_0" style="border-collapse: collapse; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tbody style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;tr id="sl_svn354_122" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;private&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;class&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;AddStyle&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;implements&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;RowStyles&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;EmployeeRecord&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_123" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_124" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;@Override&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_125" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;public&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;String&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; getStyleNames&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;EmployeeRecord&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; row&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;,&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;int&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; rowIndex&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;{&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_126" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_145" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;            .... &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;return&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; jsAddStyle&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;parseJson&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;jsString&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;));&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_146" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;}&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_147" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_148" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;} ....  &lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;table id="src_table_0" style="border-collapse: collapse; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tbody style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;tr id="sl_svn354_118" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;public&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;static&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;native&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;String&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; jsAddStyle&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;JavaScriptObject&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; o&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="com" style="color: #880000;"&gt;/*-{&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_119" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="com" style="color: #880000;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return $wnd.jsAddStyle(o);&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr id="sl_svn354_120" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="com" style="color: #880000;"&gt;&amp;nbsp; &amp;nbsp; }-*/&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We use GWT JSNI (Java Script Native Interface). Java Script function 'jsAddStyle' is invoked and should return NULL - no customization - or string with the css style which should be appended to the row.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Communication&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The second question to answer is how to provide communication between employee view and Java Script function. The answer is simple : Java Script object containing necessary data and JSON as a mean to create such an object.&lt;br /&gt;So I created auxiliary class which creates JSON script - &amp;nbsp;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/src/com/ibm/sampledb/client/CreateJson.java"&gt;CreateJson.java&lt;/a&gt;. The next step is to create Java Script object using this function: &amp;nbsp;(&lt;a href="http://code.google.com/intl/pl-PL/webtoolkit/doc/latest/DevGuideCodingBasicsJSON.html"&gt;GWT + JSON&lt;/a&gt;) :&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="prettyprint" style="background-color: #fafafa; border-bottom-color: rgb(187, 187, 187); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(187, 187, 187); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 187); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(187, 187, 187); border-top-style: solid; border-top-width: 1px; color: #007000; font-family: monospace; font-size: 9pt; line-height: 15px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 1em; overflow-x: visible; overflow-y: visible; padding-bottom: 0.99em; padding-left: 0.99em; padding-right: 0.99em; padding-top: 0.99em; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="com" style="color: #880000;"&gt;/*&lt;br /&gt;&amp;nbsp;* Takes in a trusted JSON String and evals it.&lt;br /&gt;&amp;nbsp;* @param JSON String that you trust&lt;br /&gt;&amp;nbsp;* @return JavaScriptObject that you can cast to an Overlay Type&lt;br /&gt;&amp;nbsp;*/&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;public&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;static&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;native&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;JavaScriptObject&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; parseJson&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="typ" style="color: #660066;"&gt;String&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; jsonStr&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="com" style="color: #880000;"&gt;/*-{&lt;br /&gt;&amp;nbsp; return eval(jsonStr);&lt;br /&gt;}-*/&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;And then Java Script object containing data for one row (employee) can be passed as a parameter to the JS function.&lt;br /&gt;So our JS function can look like that:&lt;br /&gt;&lt;pre class="prettyprint" style="background-color: #fafafa; border-bottom-color: rgb(187, 187, 187); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(187, 187, 187); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 187); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(187, 187, 187); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 1em; overflow-x: visible; overflow-y: visible; padding-bottom: 0.99em; padding-left: 0.99em; padding-right: 0.99em; padding-top: 0.99em; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="color: #880000;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 15px; white-space: pre-wrap;"&gt;function jsAddStyle(o) {&lt;br /&gt;  var job = o.Employee.job;&lt;br /&gt;  if (job == 'MANAGER') { return 'addRow'; }&lt;br /&gt;     return null; &lt;br /&gt;};&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 9pt; line-height: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #880000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Easy to guess that our customer want to have all managers in employee view to be highlighted in some way. No problem to provide other logic - for instance to highlight all female customers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Custom JS code and CSS sheet&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next step is obviously a safe way to transport our custom JS code (like function above) and CSS file to the web page.&lt;/div&gt;&lt;div&gt;In this example this data is transported via RPC from the server and applied to the web page via JS functions:&lt;/div&gt;&lt;div&gt;&lt;pre class="prettyprint" style="background-color: #fafafa; border-bottom-color: rgb(187, 187, 187); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(187, 187, 187); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(187, 187, 187); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(187, 187, 187); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 1em; overflow-x: visible; overflow-y: visible; padding-bottom: 0.99em; padding-left: 0.99em; padding-right: 0.99em; padding-top: 0.99em; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="color: #880000;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 15px; white-space: pre-wrap;"&gt;function addScript(s) {&lt;br /&gt;  var headID = document.getElementsByTagName("head")[0];         &lt;br /&gt;  var newScript = document.createElement('script');&lt;br /&gt;  newScript.type = 'text/javascript';&lt;br /&gt;  newScript.text = s;&lt;br /&gt;  headID.appendChild(newScript);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function addStyle(s) {&lt;br /&gt;   var headID = document.getElementsByTagName("head")[0];         &lt;br /&gt;   var newScript = document.createElement('style');&lt;br /&gt;   newScript.type = 'text/css';&lt;br /&gt;   newScript.textContent = s;&lt;br /&gt;   headID.appendChild(newScript);&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;The files are defined in the Tomcat server.xml configuration file.&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: #f3f3f3;"&gt;&amp;lt;Environment name="jsFile" type="java.lang.String" value="/home/sbartkowski/workspace/SampleGwt/src/com/ibm/sampledb/server/resource/custom.js"/&amp;lt;&lt;br /&gt;&amp;lt;Environment name="cssFile" type="java.lang.String" value="/home/sbartkowski/workspace/SampleGwt/src/com/ibm/sampledb/server/resource/custom.css"/&amp;lt;&lt;br /&gt;&amp;lt;Environment name="customRow" type="java.lang.Boolean" value="true"/&amp;amp;l&lt;/span&gt;t;&lt;/blockquote&gt;This way to customization is separated from the Java code and can be changed at the customer basis. Upgrade of the main application can be achieved without loosing our customization.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This way we can customize our database application achieving goals set at the beginning. Of course - it is very simple application and simple customization. Customization in this example is based on one row. Cannot customized using - for instance - the following logic: highlight two employees having the highest salary. To achieve this goal it is not enough to pass only one row to JS function but also the all rows.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/SampleGwt/"&gt;The source code for the whole application&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-LyEl1nYaC1o/TX_iP_bwYbI/AAAAAAAADAY/riXN5fKCsWc/s1600/zrzut_ekranu-Web+Application+Starter+Project+-+Mozilla+Firefox.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="481" src="https://lh3.googleusercontent.com/-LyEl1nYaC1o/TX_iP_bwYbI/AAAAAAAADAY/riXN5fKCsWc/s640/zrzut_ekranu-Web+Application+Starter+Project+-+Mozilla+Firefox.png" width="640" /&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/2399759103741849897-5379866256047397905?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/5379866256047397905/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/03/gwt-css-json.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5379866256047397905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5379866256047397905'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/03/gwt-css-json.html' title='GWT + CSS + JSON'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-LyEl1nYaC1o/TX_iP_bwYbI/AAAAAAAADAY/riXN5fKCsWc/s72-c/zrzut_ekranu-Web+Application+Starter+Project+-+Mozilla+Firefox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-5792513927153574623</id><published>2011-02-27T15:38:00.000-08:00</published><updated>2011-02-27T15:38:23.922-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>DB2, Spring and GWT</title><content type='html'>I created simple GWT (2.2) &amp;nbsp;application trying to put together several different technologies :&lt;br /&gt;DB2 (SAMPLE database), Spring JDBC as a layer between user interface and database (persistence) and GWT 2.2 as a user interface.&lt;br /&gt;How to setup environment - read details from&amp;nbsp;&lt;a href="http://code.google.com/p/javahotel/wiki/SampleGwt"&gt;SampleGWT&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://code.google.com/p/javahotel/source/browse/#svn%2Ftrunk%2Fexamples%2FSampleGwt"&gt;source code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I ended up with the following application:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-Wj9zgeviNgA/TWrZCOANrJI/AAAAAAAADAE/-IE6XUkYYFE/s1600/zrzut_ekranu-Web+Application+Starter+Project+-+Mozilla+Firefox.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="481" src="https://lh4.googleusercontent.com/-Wj9zgeviNgA/TWrZCOANrJI/AAAAAAAADAE/-IE6XUkYYFE/s640/zrzut_ekranu-Web+Application+Starter+Project+-+Mozilla+Firefox.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Application displays one table (EMPLOYEE) from SAMPLE database. List box at the upper left of the screen allows data sorting - it is done by adding ORDER BY clause to SELECT * FROM EMPLOYEE statement. 'Incremental' check box does nothing with the statement&amp;nbsp;- data are read incrementally by default. 'Decremental' check box adds 'DESC' clause to ORDER BY.&lt;br /&gt;Of course - sorting can be done also by 'Column Sorting' - new feature added in GWT 2.2 to CellTable presentation widget.&lt;br /&gt;It could be very interesting challenge which sorting method is more efficient. I dare say that more data are used than data sorting by database engine will be getting the upper hand.&lt;br /&gt;&lt;br /&gt;I used Spring JDBC for data access layer. Of course - for such a small project (one statement) it is like&amp;nbsp;to take a sledgehammer to crack a nut.&lt;br /&gt;But I found it very useful - it is much more elegant to have in the main business stream something like:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;List&lt;employeerecord&gt; mList = jdbc.query(query, new EmployeeRecordMapper());&lt;/employeerecord&gt;&lt;/blockquote&gt;and keep somewhere else :&lt;br /&gt;&lt;blockquote&gt;private class EmployeeRecordMapper implements RowMapper&lt;employeerecord&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public EmployeeRecord mapRow(ResultSet res, int arg1)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throws SQLException {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String empno = res.getString(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String firstname = res.getString(2);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String midinit = res.getString(3);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String lastname = res.getString(4);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String workdept = res.getString(5);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String phoneno = res.getString(6);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Timestamp hiredate = res.getTimestamp(7);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String job = res.getString(8);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int edlevel = res.getInt(9);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String sex = res.getString(10);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Timestamp birthdate = res.getTimestamp(11);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BigDecimal salary = res.getBigDecimal(12);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BigDecimal bonus = res.getBigDecimal(13);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BigDecimal comm = res.getBigDecimal(14);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;EmployeeRecord el = new EmployeeRecord();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setEmpno(empno);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setFirstname(firstname);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setMidinit(midinit);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setLastname(lastname);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setWorkdept(workdept);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setPhoneno(phoneno);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setHiredate(hiredate);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setJob(job);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setEdlevel(edlevel);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setSex(sex);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setBirthdate(birthdate);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setSalary(salary);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setBonus(bonus);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;el.setComm(comm);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return el;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/employeerecord&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&amp;nbsp;&lt;/blockquote&gt;&lt;br /&gt;&amp;nbsp;then this terrible JDBC code :&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;ResultSet res = ....&lt;br /&gt;&amp;nbsp;while (res.next()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;}&lt;/blockquote&gt;What is more important &amp;nbsp;&amp;nbsp;EmployeeRecordMapper class is reusable component - can be utilized everywhere statement on EMPLOYEE table is performed.&lt;br /&gt;&lt;br /&gt;Of course - every JDBC developer sooner or later creates his (her) own JDBC framework - during my professional life I created dozen of them. But for what purpose create next framework if Spring JDBC is already created and ready to use for free ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-5792513927153574623?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/5792513927153574623/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/02/db2-spring-and-gwt.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5792513927153574623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5792513927153574623'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/02/db2-spring-and-gwt.html' title='DB2, Spring and GWT'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/-Wj9zgeviNgA/TWrZCOANrJI/AAAAAAAADAE/-IE6XUkYYFE/s72-c/zrzut_ekranu-Web+Application+Starter+Project+-+Mozilla+Firefox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-5171825146257935215</id><published>2011-02-15T14:20:00.000-08:00</published><updated>2011-02-15T14:21:51.358-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><title type='text'>GWT 2.2</title><content type='html'>Finally I upgraded to GWT 2.2. But not without adventures.&lt;br /&gt;Firstly, I had to download new version of GIN (snapshot), the current is not liked by GWT 2.2 compiler.&lt;br /&gt;Secondly, this new version of GIN works only with the new version of GUICE (3.0) and some additional jars are necessary.&lt;br /&gt;Thirdly, this way I was forced also to upgrade the server code to GUICE 3.0.&lt;br /&gt;Fourthly, GUICE 3.0 lost from its internals @Nullable annotation. I spent several hours trying to guess what was going on. Finally I ended up with mysterious&amp;nbsp;&lt;a href="http://code.google.com/p/guava-libraries/"&gt;Guava&lt;/a&gt;&amp;nbsp;project and jsr305.jar. I was told that is was my mistake to reference Nullable annotation from GUICE internal. Hm..., ok.&lt;br /&gt;But finnaly I'm the happy consumer of GWT 2.2. GWT2.1 to GWT 2.2, one small step for a humble man like me, but giant leap for mankind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-5171825146257935215?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/5171825146257935215/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/02/gwt-22.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5171825146257935215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5171825146257935215'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/02/gwt-22.html' title='GWT 2.2'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-3460332387905360377</id><published>2011-01-30T00:00:00.000-08:00</published><updated>2011-01-30T00:00:38.611-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>C/Python interface and 64 bit</title><content type='html'>I found very nasty bug in the application related to C/Python connection in 64 bit environment.&lt;br /&gt;&lt;br /&gt;The code snippet is as follows:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://docs.python.org/c-api/arg.html?highlight=pyarg_vaparse#PyArg_ParseTuple"&gt;PyArg_VaParse&lt;/a&gt;&amp;nbsp;function.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;unsigned long l;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;char s[...];&lt;br /&gt;....&lt;br /&gt;PyArg_VaParse( (PyObject p, "si", &amp;amp;s, &amp;amp;l );&lt;br /&gt;.....&lt;br /&gt;if (l == 0) { do something if 0 }&lt;br /&gt;else { do something if not 0 }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;PyArg_VaParse (which is quite similar to C scanf function) replaces "i" position parameter with&lt;b&gt; integer &lt;/b&gt;variable. In 32 bit environment it does not make any harm because both &lt;b&gt;long&lt;/b&gt; and &lt;b&gt;int&lt;/b&gt; are 32 bit variables. But in 64 bit environment &lt;b&gt;long&lt;/b&gt; is 64 bit and&lt;b&gt; int&lt;/b&gt; is 32 bit. Because 32 bit value is stored in 64 bit it did not raise any run-time errors.&lt;br /&gt;It works if compiled as 32 bit application. But it was very nasty after compiling as 64 bit application. In most cases it worked also as expected but sometimes it behaves badly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-3460332387905360377?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/3460332387905360377/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/01/cpython-interface-and-64-bit.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/3460332387905360377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/3460332387905360377'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/01/cpython-interface-and-64-bit.html' title='C/Python interface and 64 bit'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-5125406979581589482</id><published>2011-01-29T12:00:00.000-08:00</published><updated>2011-01-29T12:00:30.398-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>GWT and java.util.ConcurrentModificationException:</title><content type='html'>Finally I was able to get rid of very annoying message:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;20:34:57.598 [ERROR] [com.mygwt.test] Uncaught exception escaped&lt;br /&gt;java.util.ConcurrentModificationException: null&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:64)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;at com.gwtmodel.table.slotmodel.SlotListContainer$GeneralListener.signal(SlotListContainer.java:89)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;at com.gwtmodel.table.slotmodel.SlotListContainer.publish(SlotListContainer.java:126)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;at com.gwtmodel.table.slotmodel.SlotListContainer.publish(SlotListContainer.java:355)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;at com.gwtmodel.table.slotmodel.AbstractSlotContainer.publish(AbstractSlotContainer.java:122)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;at com.mygwt.client.MailOp.access$0(MailOp.java:1)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;What more interesting -this message does not seem to make any harm.&lt;br /&gt;&lt;br /&gt;It is caused by running through the collection and modifying it from RPC at the same time. The solution was very simple - just walk through the clone of the list, no the list itself.&lt;br /&gt;&lt;br /&gt;Instead of:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;.........&lt;br /&gt;private final List&lt;slotsubscribertype&gt; listOfSubscribers;&lt;/slotsubscribertype&gt;&lt;br /&gt;........&lt;br /&gt;for (SlotSubscriberType so : llistOfSubscribers) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;just use:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;List&lt;slotsubscribertype&gt; li = (List&lt;slotsubscribertype&gt;) ((ArrayList)listOfSubscribers).clone();&lt;/slotsubscribertype&gt;&lt;/slotsubscribertype&gt;&lt;br /&gt;for (SlotSubscriberType so : li) {&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-5125406979581589482?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/5125406979581589482/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/01/gwt-and-javautilconcurrentmodificatione.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5125406979581589482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5125406979581589482'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/01/gwt-and-javautilconcurrentmodificatione.html' title='GWT and java.util.ConcurrentModificationException:'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6353871620178271912</id><published>2011-01-29T11:13:00.000-08:00</published><updated>2011-01-29T11:13:26.012-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='GoogleAppEngine'/><title type='text'>GWT, mail and RichText editor</title><content type='html'>I added mailing to my open source application (&amp;nbsp;&lt;a href="http://javahoteltest.appspot.com/"&gt;Test demo&lt;/a&gt;&amp;nbsp;). The test is created inside Google App Engine environment.&lt;br /&gt;For mailing I'm using standard JavaMail API. &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/gwtmodelutil/src/com/gwtmodel/util/SendMail.java"&gt;Look at the code&lt;/a&gt;. Because the Google App Engine provides Mail service there is a branch in the code:&lt;br /&gt;&lt;code&gt; &lt;/code&gt;&lt;br /&gt;&lt;table id="src_table_0" style="border-collapse: collapse; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tbody style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tr id="sl_svn328_117" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 11px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr id="sl_svn328_123" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: separate;"&gt;String protocol = props.getProperty(PROTOCOL); &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: separate;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (protocol.equalsIgnoreCase(GAEMAIL)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Transport.send(msg);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Transport transport = session.getTransport(props&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.getProperty(PROTOCOL)); .... }&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;If&amp;nbsp;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; color: #008800; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 11px; white-space: pre-wrap;"&gt;mail.transport.protocol &lt;/span&gt;property value is equal to "gae" then message is send directly. This way it is possible to keep consistent API for GAE and non-GAE mailing.&lt;br /&gt;&lt;br /&gt;I also incorporated GWT RichTextArea widget - here for displaying and modifying mail content. As a RichText Toolbar (GWT does not provide it as a standard) I simply sucked in a toolbar from GWT samples. It required some modifications and needed also localization. Firstly I tried to use&amp;nbsp;&lt;a href="http://code.google.com/p/richtexttoolbar/"&gt;http://code.google.com/p/richtexttoolbar/&lt;/a&gt;&amp;nbsp;but I wasn't happy with it's look and feel.&lt;br /&gt;&lt;br /&gt;For the time being attachment are not handled - may be I will add it in the future.&lt;br /&gt;&lt;br /&gt;It is possible to have more than one mail account. For the test purpose mail account properties are looked for in &lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/#trunk%2Fexamples%2FTestApp%2Fsrc%2Fjava%2Fcom%2Fmygwt%2Fserver%2Fresources"&gt;resource&lt;/a&gt; directory. To my astonishment resource directory search works in the Google App Engine environment.&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/gwtmodelutil/src/com/gwtmodel/util/FileUtil.java"&gt;This code &lt;/a&gt;return path to the directory:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public static File getResourceDir(Class cl) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String me = cl.getName().replace(".", "/") + ".class";&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;URL u = cl.getClassLoader().getResource(me);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String p = u.getFile();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;File f = new File(p);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String s = f.getParent();&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new File(s + File.separatorChar + "resources");&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And regular&amp;nbsp;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/TestApp/src/java/com/mygwt/server/MyRemoteServiceImpl.java"&gt;java code&lt;/a&gt; is looking for .properties file in this directory.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;File f = FileUtil.getResourceDir(this.getClass());&lt;br /&gt;FileFilter filter = new FileFilter() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;public boolean accept(File pathname) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; if (pathname.isDirectory()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; return false;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return pathname.getName().endsWith(".properties");&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;};&lt;br /&gt;File[] dir = f.listFiles(filter);&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;div&gt;&lt;code&gt;..............&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6353871620178271912?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6353871620178271912/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/01/gwt-mail-and-richtext-editor.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6353871620178271912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6353871620178271912'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/01/gwt-mail-and-richtext-editor.html' title='GWT, mail and RichText editor'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-394402967579053240</id><published>2011-01-01T04:29:00.000-08:00</published><updated>2011-01-01T04:42:43.029-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>BoaTester - new action to Selenium Helper</title><content type='html'>I've added new action to my Selenium extension&amp;nbsp;&lt;a href="http://code.google.com/p/boatester/"&gt;BoaTester framework.&lt;/a&gt;&amp;nbsp;It was very simple - just add new class handling that action and activating trigger.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/boatester/source/browse/trunk/BoaHarness/src/testharness/SeleniumHelper.py?r=79"&gt;SeleniumHelper.py&lt;/a&gt;&lt;br /&gt;Activation:&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 11px; white-space: pre-wrap;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: #fce5cd;"&gt;self.registerAction('selectCombo',selectCombo(), 2)&lt;/span&gt;&lt;/blockquote&gt;Action class:&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: #fce5cd;"&gt;class selectCombo(seleniumTypeContext) :&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: #fce5cd;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;""" Action class for 'selectCombo' action&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: #fce5cd;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;First parameter: element selector for 'select' tag&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: #fce5cd;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Second parameter: Value to be selected&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: #fce5cd;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;"""&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: #fce5cd;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def do(self):&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: #fce5cd;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;locator = self.cparam[0]&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: #fce5cd;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;label = self.cparam[1]&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: #fce5cd;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;self.se.select(locator, 'value=' + label)&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;br /&gt;&lt;table id="src_table_0" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 11px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre;"&gt;&lt;tbody style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tr id="sl_svn78_319" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="source" style="font-size: 11px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 4px; padding-right: 0px; padding-top: 0px; vertical-align: top; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: separate; font-family: 'Times New Roman'; font-size: small; white-space: normal;"&gt;It covers GWT widget ListBox which renders as "select" HTML tag.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-394402967579053240?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/394402967579053240/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/01/boatester-new-action-to-selenium-helper.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/394402967579053240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/394402967579053240'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2011/01/boatester-new-action-to-selenium-helper.html' title='BoaTester - new action to Selenium Helper'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-1745869876469207184</id><published>2010-12-29T12:21:00.000-08:00</published><updated>2010-12-29T12:28:55.950-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Tooltip and GWT</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;I'd like to add a tooltip to my GWT application to achieve the effect as below, additional information while hovering over an element.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_UkEZnl1hoXg/TRuZZZqMPxI/AAAAAAAAC_w/S7fQzhh5Nn8/s1600/tip.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_UkEZnl1hoXg/TRuZZZqMPxI/AAAAAAAAC_w/S7fQzhh5Nn8/s1600/tip.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;Unfortunately, GWT does not support tooltip as a standard. But no problem to implement it - just add action on onMouseOver event to display tooltip window and action on onMouseOut action to remove it.&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/gwtmodel/src/com/gwtmodel/table/view/util/PopupTip.java?r=310"&gt;PopupTip&lt;/a&gt;&lt;br /&gt;So now it is enough to create a label like:&lt;br /&gt;&lt;blockquote&gt;private class LabTip extends PopupTip {&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;LabTip() {&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Label l = new Label("Label")&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;initWidget(l);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;setMessage("Help test - look how it looks like !");&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;}&lt;/blockquote&gt;&lt;blockquote&gt;}&amp;nbsp;&lt;/blockquote&gt;and it works as expected.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;But it is enough for labels (simple widgets) only. What about Button - more complex widget. What's more important - I'd like to have some buttons with tooltip enabled and some buttons without that feature.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;So I'd like to achieve to following goals:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;One common reusable tooltip component to have the same look and feel.&lt;/li&gt;&lt;li&gt;Button widget with tooltip enabled and without tooltip at all and the code which uses that button is unaware of that (encapsulation).&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Java does not allow multiply inheritance so we cannot simply create "tooltiped" button like that:&lt;/div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: #f3f3f3;"&gt;class ToolTipButton extends Button, PopupTip&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;More complicated approach is required. There is also another problem that widget being tooltiped should be &amp;nbsp;derived from PopupTip, this class cannot be a class component.&lt;br /&gt;For the buttons I'm using the following API methods only: addClickHandler, setEnabled and isEnabled.Unfortunately, Composite class (the base class for PopupTip) does not inherit these methods, Composite class is based on the Widget class.&amp;nbsp;These methods are available starting from FocusWidget class&lt;br /&gt;&lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/2.1/index.html?overview-summary.html"&gt;http://google-web-toolkit.googlecode.com/svn/javadoc/2.1/index.html?overview-summary.html&lt;/a&gt;&lt;br /&gt;So the only solution is to create additional interface &amp;nbsp;IGFocusWidget and Decorator pattern. IGFocusWidget interface is a Decorator and Button class as is a component. Interface exposes necessary method and in the class body redirects all methods to the appropriate Button methods. To make the whole solution more universal instead of Button class a more general FocusWidget can be used. In case of Button (FocusWidget) not "tooltiped" a concrete Decorator is not derived from PopupTip class to avoid overloading with unused functionality.&lt;br /&gt;&lt;br /&gt;So the final class structure is as follows.&lt;br /&gt;For "tooltiped" component&lt;br /&gt;IGFocusWidget (Decorator interface)- FocusToolTipedWidget &amp;nbsp;(Decorator concrete class)- PopupTip (tooltip functionality). FocusWidget/Button (Decorator component)&lt;br /&gt;For non-tooltiped component - as above but without PopupTip base class.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_UkEZnl1hoXg/TRuVHdGlaeI/AAAAAAAAC_s/N1D7bg-h2e4/s1600/Toolttip.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://2.bp.blogspot.com/_UkEZnl1hoXg/TRuVHdGlaeI/AAAAAAAAC_s/N1D7bg-h2e4/s640/Toolttip.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Implementation:&lt;br /&gt;I'm using factory for producing Buttons and IGFocuseWidget to hide implementation details. Image buttons are created as "tooltiped" and text buttons are not tooltiped.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/gwtmodel/src/com/gwtmodel/table/view/button/ImgButtonFactory.java?r=311"&gt;ButtonFactory&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/gwtmodel/src/com/gwtmodel/table/GFocusWidgetFactory.java?r=311"&gt;GFocusWidgetFactory&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Usage example - after creation of button the user is unaware of the tooltip functionality. They share the same interface.&lt;br /&gt;&lt;a href="http://code.google.com/p/javahotel/source/browse/trunk/examples/TestApp/src/java/com/mygwt/client/testEntryPoint.java?r=311"&gt;TestApp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Running example (installed on Google App Engine)&lt;br /&gt;&lt;a href="http://javahoteltest.appspot.com/"&gt;http://javahoteltest.appspot.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-1745869876469207184?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/1745869876469207184/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/12/tooltip-and-gwt.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1745869876469207184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1745869876469207184'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/12/tooltip-and-gwt.html' title='Tooltip and GWT'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_UkEZnl1hoXg/TRuZZZqMPxI/AAAAAAAAC_w/S7fQzhh5Nn8/s72-c/tip.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6371542415628933035</id><published>2010-12-27T03:24:00.000-08:00</published><updated>2011-06-09T13:52:48.660-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na koncercie</title><content type='html'>W dniu 26 grudnia 2010 byliśmy na koncercie inaugurującym&amp;nbsp;&lt;a href="http://www.fit.waw.pl/"&gt;IV Festiwal Bożonarodzeniowy Incarnatus Est&lt;/a&gt;&amp;nbsp;organizowany przez Filharmonię im R. Traugutta. Ale koncert nam się nie podobał, wyszliśmy rozczarowani.&lt;br /&gt;Organizatorzy chcieli w sposób efektowny rozpocząć festiwal, więc na inaugurację wybrali bardzo znane dzieło, "Mesjasza" Jerzego Fryderyka Handla. Na miejscu okazało się, że to tylko wybór z całego dzieła, same "najlepsze partie solowe" z bardzo ograniczoną orkiestrą. Ale "Mesjasz" to przecież historia opowiedziana muzycznymi środkami, od zapowiedzi "Drogę dla Pana przygotujcie na pustyni" do finału "&amp;nbsp;Zasiadającemu na tronie i Barankowi błogosławieństwo i cześć, i chwała, i moc, na wieki wieków!". Jest wątpliwe, czy wybór na zasadzie "the best of" ma w tym wypadku wiele sensu. Jeśli stały za tym ograniczenia budżetowe, to przecież można było dobrać inny repertuar na miarę posiadanych środków.&lt;br /&gt;Dobrym pomysłem było uzupełnienie niewykonywanych fragmentów lektorem odczytującym tekst pomijanych partii. Ale tej informacji zabrakło dla słuchaczy, zaś na wydrukowanym programie widać tylko angielskie tytuły &amp;nbsp;wykonywanych arii i pod spodem tekst po polsku - zapewne słuchacze sądzili, że to polskie tłumaczenie tego, co jest śpiewane. Gdyby informacja była przekazana w sposób bardziej kompletny może słuchacze byliby w stanie uchwycić ciągłość całej historii.&lt;br /&gt;Innym problem był wybór miejsca koncertu - kościół Św Anny na Krakowskim Przedmieściu. Niestety, ale w czasie koncertu drzwi do kościoła były otwarte i muzyka musiała się przebijać przez szmer powodowany przez sznur &amp;nbsp;nieustająco przechodzących boczną nawą kościoła osób nawiedzających bożonarodzeniową szopkę. Wyraźnie przeszkadzało to także wykonawcom, na przykład w efektownej arii "The trumpet shall sound" solista, orkiestra i trąbka bardziej przeszkadzali sobie wzajemnie niż współpracowali.&lt;br /&gt;W efekcie na końcu wykonawcy zebrali bardzo wątłe oklaski. Ale raczej powinno to być adresowane do organizatorów, niż do samych wykonawców, którymi byli przecież znani soliści z Warszawskiej Opery Kameralnej oraz zespół Concerto Avenna, których pamiętamy z innych doskonałych wykonań muzyki barokowej.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6371542415628933035?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6371542415628933035/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/12/bylismy-na-koncercie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6371542415628933035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6371542415628933035'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/12/bylismy-na-koncercie.html' title='Byliśmy na koncercie'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-7253164679596789160</id><published>2010-12-19T10:25:00.000-08:00</published><updated>2010-12-19T10:27:00.019-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Disabling test case</title><content type='html'>I added very simple feature to&amp;nbsp;&lt;a href="http://code.google.com/p/boatester/"&gt;BoaTester framework&lt;/a&gt;. After creating &lt;b&gt;disabled&lt;/b&gt;&amp;nbsp;file in test case directory this test is ignored during test execution. The content of this file is not important, it can contain explanation while this test case is temporarily switched off.&lt;br /&gt;&lt;br /&gt;Just like:&lt;br /&gt;&lt;br /&gt;testcase {directory}&lt;br /&gt;&amp;nbsp;&amp;nbsp;test1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {test case content}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;b&gt;disabled&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It is very convenient because it is possible to run test suite and one test case does not block the execution. The test case still exist and is visible so we can anytime come back to this test and resolve the issue related to this test.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-7253164679596789160?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/7253164679596789160/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/12/disabling-test-case.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7253164679596789160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7253164679596789160'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/12/disabling-test-case.html' title='Disabling test case'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-8304307769080286377</id><published>2010-11-07T12:18:00.000-08:00</published><updated>2010-11-10T03:33:42.602-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>&lt;span class="text_exposed_show" style="display: inline;"&gt;W "Cesarzu" Kapuściński powołuje się na znakomitego angielskiego pisarza Evelina Waugha. Jest to zresztą jedyna literatura odnosząca się do Etiopii przywołana w "Cesarzu". Fragment pochodzi z wydanej w 1931 roku książki "Remote People", w USA wydanej pod nazwą "They were Still Dancing". Książkę można zobaczyć na Google Books. Jest tam także inne zdanie warte zacytowania:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;"He would deal out dramatic deaths in the Royal Family, derail trains, embroil the country in civil war and devise savage and insoluble murders. All these things would be profoundly exciting to the reader so long as he thought they were true. If they were offered to him as fiction they would be utterly insignificant.".&lt;/blockquote&gt;&lt;blockquote&gt;"Te wszystkie opowieści są fascynujące dla czytelnika jeśli jest przekonany, że są prawdziwe. Jeśli by wiedział, że są zmyślone, to przecież nie zwrócił by na nie najmniejszej uwagi."&lt;/blockquote&gt;&lt;br /&gt;Waugh pisze to w kontekście, na jakie pokusy jest narażony dziennikarz piszący o odległych i egzotycznych dla czytelnika krajach. Nic dodać, nic ująć.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-8304307769080286377?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/8304307769080286377/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/11/cesarz.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/8304307769080286377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/8304307769080286377'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/11/cesarz.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-5061760262018658258</id><published>2010-10-23T15:03:00.000-07:00</published><updated>2011-06-09T13:53:10.294-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na koncercie</title><content type='html'>17 października 2010 roku byliśmy na w Teatrze Wielkim na &lt;a href="http://www.teatrwielki.pl/pl/repertuar/opera/kalendarium/elektra.html?year=2010&amp;amp;month=10&amp;amp;kid=388"&gt;przedstawieniu&lt;/a&gt; "Elektry" Ryszarda Straussa, podobało nam się bardzo.&lt;br /&gt;"Elektra" Ryszarda Straussa to znakomita muzyka i przejmująca fabuła, dzieło chętnie wystawiane pomimo tego, że ze względu na rozbudowaną orkiestrę stawia duże wymagania organizatorom.&lt;br /&gt;Główną partię śpiewała Caroline Whisnant, była to na pewno znakomita rola, przykuwająca uwagę od początku do końca. Także znakomicie śpiewała&amp;nbsp;Therese Waldner jako&amp;nbsp;Chryzotemis, siostra Elektry. Na plakatach jako główna gwiazda była prezentowana Ewa Podleś w roli okrutnej&amp;nbsp;&amp;nbsp;Klitemnestry, ale bym dyskutował z tymi zapowiedziami. Była to na pewno doskonała aktorsko rola. Scena, w której Elektra z sadystyczną przyjemnością prowadzi &amp;nbsp;nękaną koszmarami Klitemnestrę do zrozumienia, kim ma być krwawa ofiara mająca przywrócić jej spokój, zapadała w pamięć.&lt;br /&gt;Upiorna scenografia, niczym z mrocznego &amp;nbsp;snu, doskonale oddawała ponurą atmosferę przedstawienia. Elektra to sztuka, gdzie nie ma pięknych scen, postaci czy szlachetnych motywów działań bohaterów. Tutaj wszystko jest brzydkie, ponure, budzące zgrozę. &amp;nbsp;Sama Elektra nie wywołuje u widzów sympatii. Z jednej strony jako ofiara budzi współczucie, ale z drugiej strony jej fascynacja śmiercią i rozlewem krwi, żądza zemsty dla której nie zna żadnej bariery czy ograniczenia powoduje, że trudno odczuwać empatię dla jej nieszczęścia.&lt;br /&gt;Doskonale grała orkiestra kierowana przez Tadeusza Kozłowskiego. Zaś muzyka Ryszarda Straussa w Elektrze stawia duże wymagania dyrygentowi, orkiestra musi być niezwykle rozbudowana, naprzeciwko nas widzieliśmy cztery harfy, zaś po drugiej stronie sceny niemałą sekcję perkusyjną. Okazało się jednak, że Opera Narodowa znakomicie może poradzić nawet z bardzo trudną partyturą własnymi siłami i nie są wcale potrzebne dyrygenckie znakomitości z importu, czasami sprowadzane z wątpliwymi efektami, jak np. wystawienie &lt;a href="http://hoteljavaopensource.blogspot.com/2010/04/bylismy-na-koncercie.html"&gt;Requiem Berlioza&lt;/a&gt;.&lt;br /&gt;Było to na pewno doskonałe przedstawienie, trzeba mieć nadzieję, że ambitne i wymagające dzieła będą częściej gościć na scenie Teatru Wielkiego.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-5061760262018658258?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/5061760262018658258/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/10/bylismy-na-koncercie_23.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5061760262018658258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5061760262018658258'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/10/bylismy-na-koncercie_23.html' title='Byliśmy na koncercie'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-8602135458869604063</id><published>2010-10-22T02:07:00.000-07:00</published><updated>2011-06-09T13:53:30.466-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na koncercie</title><content type='html'>31 lipca 2010 byliśmy na koncercie w ramach&amp;nbsp;&lt;a href="http://www.zw.com.pl/artykul/488950.html"&gt;Praskiego Festiwalu Muzyki Kameralnej i Organowej&lt;/a&gt;, bardzo nam się podobało.&lt;br /&gt;&lt;br /&gt;Toccata i Fuga F-dur, jedno z najbardziej znanych dzieł organowych Bacha, zwłaszcza majestatyczny motyw zaczynający się od środka. Fuga - dwa tematy jednocześnie. Potężna i efektowna muzyka, musi być grana głośno i nie nazbyt szybko.&lt;br /&gt;&lt;br /&gt;Rozdzielone, trzema preludiami chorałowymi ze zbioru OrgelBuchlein. OrgelBuchlein to organowe opracowania utworów pochodzących z protestanckiego kanonu muzyki religijnej. u m&lt;a href="http://en.wikipedia.org/wiki/Orgelb%C3%BCchlein"&gt;http://en.wikipedia.org/wiki/Orgelb%C3%BCchlein. &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pl.wikipedia.org/wiki/Louis-Nicolas_Cl%C3%A9rambault"&gt;Louis-Nicolas Clérambault&lt;/a&gt; to francuski kompozytor współczesny Bachowi, ale muzyka, którą usłyszeliśmy, mimo iż także organowa, była całkowicie odmienna. Bardziej przypominała muzykę instrumentalną Rameau. W dwóch pierwszych, tanecznych utworach słychać było bardzo efektowne wykorzystanie organowego głosu przypominającego głos ludzki. Jest zaskakujące, jak diametralnie różne efekty dwaj współcześni sobie kompozytorzy potrafili wydobyć z tego samego instrumentu.&lt;br /&gt;&lt;br /&gt;Bardzo ładnie brzmiała muzyka organowa&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/C%C3%A9sar_Franck"&gt;Cesarego  Francka&lt;/a&gt;, która była pomostem dla bardziej współczesnej muzyki Jehana Alaina, Louisa Vernie oraz Mauricego Duruffa. Efektownie brzmiała dynamiczna i rytmiczna muzyka tego ostatniego kompozytora będąca adaptacją tematu z muzyki Jehana Alaina, a zwłaszcza potężne, końcowe akordy.&lt;br /&gt;&lt;br /&gt;Wykonawca Jesse E. Eschbach wykonał także efektowny bis, głowny temat melodyczny zapadał w pamięć, szkoda, że zabrakło informacji jaka muzyka była wtedy wykonywana,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-8602135458869604063?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/8602135458869604063/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/10/bylismy-na-koncercie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/8602135458869604063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/8602135458869604063'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/10/bylismy-na-koncercie.html' title='Byliśmy na koncercie'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6092148987261679330</id><published>2010-10-16T14:53:00.000-07:00</published><updated>2010-10-16T14:55:44.358-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>GWT 2.1</title><content type='html'>I've just upgraded to GWT 2.1 M3 without any problems.&lt;br /&gt;&lt;br /&gt;Advantage:&lt;br /&gt;It contains implementation of BigDecimal - this way I can get away with dependency on external&amp;nbsp;&lt;a href="http://code.google.com/p/gwt-math/"&gt;get-math&lt;/a&gt;&amp;nbsp;library.&lt;br /&gt;&lt;br /&gt;Disadvantage:&lt;br /&gt;There is no documentation for announced DataPresentationWidget. I hoped to get away also with&amp;nbsp;&lt;a href="http://code.google.com/p/gwt-google-apis/wiki/Downloads?tm=2"&gt;gwt-visualization&lt;/a&gt;, it is a nice piece of software but it does not make any sense to suck in all that stuff only to have nicer tables. So still waiting for better times.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6092148987261679330?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6092148987261679330/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/10/gwt-21.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6092148987261679330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6092148987261679330'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/10/gwt-21.html' title='GWT 2.1'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-7299821945489049689</id><published>2010-10-10T08:05:00.000-07:00</published><updated>2010-10-10T08:07:38.456-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotations'/><title type='text'>A single tear</title><content type='html'>Lord Byron, &lt;a href="http://www.gutenberg.org/files/18762/18762-h/18762-h.htm"&gt;Don Juan&lt;/a&gt; (digression on siege of Ismail by Russian army, canto VIII)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The drying up a single tear has more&lt;/blockquote&gt;&lt;blockquote&gt;Of honest fame, than shedding seas of gore.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-7299821945489049689?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/7299821945489049689/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/10/single-tear.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7299821945489049689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7299821945489049689'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/10/single-tear.html' title='A single tear'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-1422935532975532254</id><published>2010-10-04T13:41:00.000-07:00</published><updated>2010-10-04T13:49:42.217-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Selenium helper extension to BoaTester</title><content type='html'>I created an extension to&amp;nbsp;&lt;a href="http://code.google.com/p/boatester/"&gt;BoaTester&lt;/a&gt;&amp;nbsp;framework. I found &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt;&amp;nbsp;test framework very useful but was not happy with this series of detailed test steps written in plain Python. On the other Python is very helpful for writing test because of its simplicity and flexibility. So I decided to bound both of them together and created a simple extension which enables to run test steps declaratively (by defining them in external text file) and still use old plain Python for the whole test case logic.&lt;br /&gt;&lt;br /&gt;Details:&amp;nbsp;&lt;a href="http://code.google.com/p/boatester/w/edit/SeleniumHelper"&gt;SeleniumHelper&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I had the following ideas in my mind:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Declare test steps in external text file thus avoiding keeping then in the python code.&lt;/li&gt;&lt;li&gt;Local and global resources. A lot of tests keep very similar login like: logging, run test. Logging sequence can be common for all test cases, only logic for one test case can be local.&lt;/li&gt;&lt;li&gt;Aliases. Avoid using long xpath selectors. Just keep them as alias definition and use alias name instead of.&lt;/li&gt;&lt;li&gt;Keep it simple as much as possible. Give up idea of covering all selenium under some abstraction layer.&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/2399759103741849897-1422935532975532254?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/1422935532975532254/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/10/selenium-helper-to-extension-to.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1422935532975532254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1422935532975532254'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/10/selenium-helper-to-extension-to.html' title='Selenium helper extension to BoaTester'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-4647010304713575837</id><published>2010-07-11T03:48:00.000-07:00</published><updated>2011-06-09T13:54:08.025-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na koncercie</title><content type='html'>Byliśmy na koncercie 10 lipca 2010 roku w ramach &lt;a href="http://www.zw.com.pl/artykul/488950.html"&gt;3 Praskiego Festiwalu Muzyki Kameralnej i Organowej&lt;/a&gt;, podobało nam się bardzo.&lt;br /&gt;Bach dokonał dziewięciu transkrypcji koncertów Vivaldiego, z czego trzy na organy. Niektóre transkrypcje zyskały sobie nawet większą popularność niż ich oryginały, zazwyczaj w opracowaniu Bacha mają ciekawsze muzyczne brzmienie. Teraz, w wykonaniu Jana Bokszczanina, wysłuchaliśmy koncertu d-moll (BWV 596) dla którego pierwowzorem był "Concerto grosso op.3 nr 11" Vivaldiego. Tutaj&amp;nbsp; i opracowanie Bacha jest bardzo staranne i także pierwowzór bardzo wartościowy.&lt;br /&gt;W dalszej części bardzo efektownie zabrzmiała piękna aria "Ombra soi fu" z opery Handla Xerxes, jako solista wystąpił Rafał Siwek oraz "Where you walk" z opery Semele, gdzie zaśpiewała Magdalena Andreew.&lt;br /&gt;Mendelssohn pisał bardzo różnorodną muzykę, teraz słuchaliśmy jednej z sonat organowych. Mendelssohn odkrył ponownie muzykę Bacha, ale nie sposób się oprzeć wrażeniu, że w twórczości organowej nie mógł się wydobyć spod wpływu swojego poprzednika, pomimo tego, że w jego czasach obowiązywały całkowicie odmienne gusta muzyczne. Tylko w środkowej części "Alegretto" zaznaczył się indywidualny wpływ Mendelssohna, szkoda, że cała sonata nie została stworzona w tym stylu.&lt;br /&gt;Bardzo pięknie zabrzmiały trzy krótkie utwory &lt;a href="http://pl.wikipedia.org/wiki/Marian_Sawa"&gt;Mariana Sawy&lt;/a&gt;, choćby z tego powodu warto było wysłuchać tego koncertu. W ramach Praskiego Festiwalu bardzo często jest przypominana muzyka tego kompozytora, na pewno jest warta szerszego rozpowszechnienia.&lt;br /&gt;Reklamy nie potrzebuje muzyka Gabriela Faure i Gaetano Donizettego,&amp;nbsp; jaką wysłuchaliśmy na koniec. Ale wykonane utwory były niestety zbyt krótkie, zanim dobrze zabrzmiały już się zakończyły. Może zamiast trzech drobnych utworów warto było wykonać jeden dłuższy ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-4647010304713575837?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/4647010304713575837/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/bach-trankrypcja-koncerty-haendel.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4647010304713575837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4647010304713575837'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/bach-trankrypcja-koncerty-haendel.html' title='Byliśmy na koncercie'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-7133912157009467435</id><published>2010-07-11T03:42:00.000-07:00</published><updated>2011-06-09T13:54:33.313-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na koncercie</title><content type='html'>Byliśmy na koncercie 3 lipca 2010 roku w ramach &lt;a href="http://www.zw.com.pl/artykul/488950.html"&gt;3 Praskiego Festiwalu Muzyki Kameralnej i Organowej&lt;/a&gt;, podobało nam się bardzo. &lt;br /&gt;&lt;br /&gt;Suity wiolonczelowe Bacha przez długi czas uważane były za dziwactwo, w książce Alberta Schweitzera (wydanej w 1908 roku) niewiele o nich znajdziemy. Ale w książce Ernesta Zavarskiego (1971) zajmują poczesne miejsce. &lt;br /&gt;Jest to muzyka bardzo wymagająca, i dla wykonawcy, i dla słuchacza. Wymaga dużego skupienia, w przeciwnym czasie łatwo zgubić wątek i melodia rozbija się na pozornie chaotycznie ciągi dźwięków. Andrzej Bauer jest cenionym wiolonczelistą i miałem okazję pierwszy raz na żywo wysłuchać Suity nr 5 w znakomitym wykonaniu.&lt;br /&gt;Drugą część koncertu wypełniły utwory organowe bardziej współczesnych kompozytorów wykonywane przez Bartosza Jakubczaka. Jest to muzyka o zupełnie odmiennej estetyce niż muzyka Bacha. Potężne dźwięki improwizacji &lt;a href="http://en.wikipedia.org/wiki/Charles_Tournemire"&gt;Charles Tournemire&lt;/a&gt; całkowicie wypełniły ogromne wnętrze katedry warszawsko-praskiej. Dwa utwory &lt;a href="http://pl.wikipedia.org/wiki/Marian_Sawa"&gt;Marian Sawy&lt;/a&gt; były bardziej wyciszone, ale słuchało się także z przyjemnością.&lt;br /&gt;&lt;br /&gt;Byliśmy także na następnym koncercie 4 lipca 2010 w ramach tego samego festiwalu, ale wyszliśmy z mieszanymi uczuciami.&lt;br /&gt;&lt;br /&gt;Z kilku koncertów na trąbkę Telemanna zachował się jeden, tutaj wysłuchaliśmy tego utworu w wykonaniu trębacza Dmitry Makarevicha i kwartetu Con Forza. Zbiegiem okoliczności ten sam koncert Telemanna kilka dni wcześniej mogłem wysłuchać na &lt;a href="http://www.bbc.co.uk/programmes/b00sv83z#synopsis"&gt;BBC 3&lt;/a&gt; i na pewno melodyjna pierwsza część i bardzo dynamiczna druga utrwaliła mi się w pamięci. Telemann był bardzo płodnym kompozytorem, część jego twórczości jest wykonywana chętniej, część popadła w zapomnienie, ale koncert na trąbkę na pewno należy do tej pierwszej części.&lt;br /&gt;Następnie wysłuchaliśmy fragmentów Stabat Mater Boccheriniego, solową partię wykonywała Justyna Stępień. Jest zadziwiające, że chociaż Boccherini był prawie współczesny Mozartowi, to przecież jest to muzyka w całkowicie odmiennym stylu. Można sobie w ten sposób uświadomić jak Mozart był głęboko związany z tradycją środowiska, z którego się wywodził.&lt;br /&gt;Na koniec miało miejsce wykonanie Kantaty nr 51 Bacha i tutaj doznaliśmy rozczarowania.&amp;nbsp; Według Alberta Schweitzera jest to "wspaniały utwór koloraturowy na sopran i trąbkę, pełen porywającego życia", ale niczego takiego nie dało się usłyszeć.&amp;nbsp; Na dodatek siedzieliśmy po tej stronie, gdzie grał trębacz i gdy włączała się trąbka, to zupełnie nie słyszeliśmy solistki. Kwartet Con Forza bardzo dobrze się odnajdywał w subtelnej i delikatnej muzyce Boccheriniego, ale kantata Bacha wymaga bardziej dynamicznego i energicznego grania. Końcowe, radosne "Alleluja" powinno słuchaczy wręcz podrywać na nogi. Czegoś tutaj zabrakło, może za mało prób, lepszego przemyślenia koncepcji wykonawczej czy po prostu muzycy porwali się na repertuar, w którym się nie czują najlepiej. A wielka szkoda, gdyż to rzadka okazja wysłuchać na żywo kantatę Bacha w Warszawie, może następnym razem będzie lepiej.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-7133912157009467435?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/7133912157009467435/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/bylismy-na-koncercie_11.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7133912157009467435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7133912157009467435'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/bylismy-na-koncercie_11.html' title='Byliśmy na koncercie'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-2759854163047878902</id><published>2010-07-05T15:22:00.000-07:00</published><updated>2010-07-11T00:00:11.937-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fce5cd;"&gt;W czasie tej imprezy musiałem poszukać spokojnego miejsca, a nie wiedziałem, gdzie ono jest. Wyszedłem z Wielkiej Sali bocznymi drzwiami na dwór. była ciemna noc, siąpił drobny deszcz, majowy, ale chłodny. Od tych drzwi zaczynał się łagodny stok, a kilkadziesiąt metrów niżej stał źle oświetlony barak, bez ścian. Od bocznych drzwi, którymi wyszedłem, aż do baraku stali rzędem kelnerzy i podawali sobie półmiski z odpadkami z biesiadnego stołu. Na tych półmiskach płynął w stronę baraku strumień kości, ogryzków, roztaplanych sałatek, rybich łbów i mięsnych ochłapów. Poszedłem w stronę baraku&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fce5cd;"&gt;ślizgając się w błocie i w resztkach porozrzucanego jedzenia. Przy samym baraku zauważyłem, że ciemność, która jest za nim, porusza się, że coś w tej ciemności przesuwa się, mruczy i chlupoce, wzdycha i mlaszcze. Zaszedłem na tył baraku. W gęstwinie nocy, w błocie i w deszczu stał zbity tłum bosonogich żebraków. Pracujący w baraku pomywacze rzucali im resztki z półmisków. Patrzyłem na tłum, który jadł ogryzki, kości i rybie łby pracowicie i ze skupieniem. W biesiadowaniu tym byŁa uważna, skrupulatna koncentracja, nieco gwałtowna i zapominająca się biologia, głód zaspokajany w napięciu,&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fce5cd;"&gt;w natężeniu, w ekstazie.&lt;/span&gt;&lt;/blockquote&gt;Niezwykle plastyczna scena, jedyny problem, że całkowicie zmyślona. Tak jak w Polsce półmiski z jedzeniem po przyjęciu u prezydenta w Pałacu Namiestnikowskim na Krakowskim Przedmieściu (kiedyś miałem okazję być) nie są wylewane na głowy żebraków i nędzarzy skłębionych&amp;nbsp; w kącie ogrodu pałacowego, tak samo w Etiopii cesarz nie kazał rzucać resztek jedzenia ze stołów na swoich wygłodzonych poddanych. Jak się wyzbyć pychy białego człowieka wobec Murzynów z Afryki, to staje się to oczywiste.&lt;br /&gt;&lt;br /&gt;Wcześniej przywoływany jest autorytet Evelina Waugha, znakomitego angielskiego pisarza.&lt;br /&gt;&lt;blockquote style="background-color: #fce5cd;"&gt;Niestety, budowy wlokły się w nieskończoność i kiedy oglądałem stojące w różnych punktach miasta rusztowania i pracujących tam ludzi, przypomniała mi się scena, którą opisał Evelyn Waugh, kiedy w roku 1930 przyjechał do Addis Abeby obejrzeć koronację&amp;nbsp; cesarza: "Wydawało się, że dopiero teraz przystąpiono do budowy miasta. Na każdym rogu stały na pół ukończone budynki. Niektóre już porzucono, przy innych pracowały gromady oberwanych tubylców. Pewnego popołudnia widziałem dwudziestu lub trzydziestu takich ludzi, którzy pod kierunkiem majstra Ormianina usuwali stosy gruzu i kamieni zalegające dziedziniec przed główmym wjazdem do pałacu. Praca polegała na tym, że musieli oni napełnić gruzem drewniane nosidła i następnie opróżnić je na usypisku znajdującym się pięćdziesiąt jardów dalej. Majster krążył między ludźmi trzymając w rękach długi kij. Jeżeli musiał na chwilę odejść, wszystko natychmiast ustawało. Nie oznaczało to, że ludzie zaczynali siadać, rozmawiać, rozkładać się na ziemi, nie, oni po prostu zamierali w tym miejscu, w którym znajdowali się, nieruchomieli jak krowy na pastwisku, czasem zapadali w letarg trzymając w rękach jedną cegłę. Wreszcie zjawiał się majster i wówczas znowu zaczynali poruszać się, ale bardzo ospale, jak postacie na zwolnionym filmie. Kiedy tłukł ich kijem, nie wzywali pomocy, nie protestowali, tylko nieco&amp;nbsp; przyspieszali swoje ruchy. Ciosy ustawały i wtedy wracali do powolnego tempa, a gdy majster ponownie odchodził, natychmiast nieruchomieli i zamierali".&lt;/blockquote&gt;To zdanie pochodzi z wydanej w 1931 książki "Remote People", w Ameryce znanej pod tytułem "'They were Still Dancing". Tyle tylko, że Waugh jest znany raczej jako tzw. "storyteller"&amp;nbsp; i&amp;nbsp; jest nonsensem traktowanie tego pisarza jako autorytatywnego źródła informacji o Etiopii. Na bazie doświadczeń z podróży do Etiopii na koronację Haile Selassie powstała satyra &lt;a href="http://en.wikipedia.org/wiki/Black_Mischief"&gt;Black Mischief&lt;/a&gt;, którą według współczesnych kryteriów politycznej poprawności można zakwalifikować jako rasistowską.&lt;br /&gt;Ale nasz "reporter stulecia" nie przekazał swoim czytelnikom tych informacji. Czytelnik się tylko dowiaduje, że w Etiopii panowały bardzo dziwaczne obyczaje i mentalność w 1930 roku, co potwierdza autorytet "zachodniego" pisarza, i równie dziwaczne obyczaje zaobserwował Kapuściński w 1963 roku.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-2759854163047878902?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/2759854163047878902/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/cesarz_05.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2759854163047878902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2759854163047878902'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/cesarz_05.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-987948255876005065</id><published>2010-07-05T14:41:00.000-07:00</published><updated>2010-07-06T03:49:31.539-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Selenium</title><content type='html'>It is high time to start creating regression testing suite for my GWT application. The choice is &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt;, well known framework for testing web application. I decided also to use Python and PythonUnit together with my &lt;a href="http://code.google.com/p/boatester/"&gt;BoaTester&lt;/a&gt; as RC testing framework. For some mysterious reason NetBeans plugin for Python does not work with PythonUnit in debugging mode, cannot set breakpoint inside unittest classes. But a little ancient IDLE framework for Python behaves nicely, it is enough for a such small development. &lt;br /&gt;As for every GUI application the main challenge is to locate GUI objects on the screen - a nightmare for every test automation engineer. Instead of fighting with constant changing object description on the screen I decided simply to tune my application that every "selectable" object should have it's distinct name or id.&lt;br /&gt;It can be accomplished by setting proper value for every object. For instance: for buttons following command should be applied:&lt;br /&gt;&lt;blockquote&gt;Button but;&lt;br /&gt;....&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;but.getElement().setId(bId);&lt;/blockquote&gt;Another challenge is of course to synchronize test with RPC. For the time being this synchronization is accomplished by time.sleep(5) command (wait 5 seconds), but obviously more sophisticated method should be devised in near future.&lt;br /&gt;Another challenge was the selecting rows in a table - I'm using&amp;nbsp;&lt;a href="http://code.google.com/intl/pl/apis/visualization/documentation/gallery/table.html"&gt;Google Visualization Table&lt;/a&gt;. For some reason clicking on the row is not captured by Selenium IDE so I could not use it as an advice. But finally Selenium command :&lt;br /&gt;&lt;blockquote&gt;s = "xpath=//table[@class='google-visualization-table-table']/tbody/tr[" + str(no) + "]/td"&lt;br /&gt;sel.mouse_over(s)&lt;/blockquote&gt;resolved that issue.&lt;br /&gt;I also found that preparing test case is very time consuming effort and can be accomplished mostly by method "try and fix". Preparing a test containing 10-15 steps and 3-4 verification points takes 2-3 hours and I don't have any idea how to make this task simpler.&lt;br /&gt;May be the solution is to create a solution that will replace Python sequence like:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sel.click(self.TESTOWYREJBUTTON)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; time.sleep(5);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sel.click(self.ADDBUTTON)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sel.type(self.TEXT1, "aa")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sel.type(self.TEXT2, "aa")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sel.type(self.KWOTA, "35")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sel.click(self.ACCEPT);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; time.sleep(5)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sel.mouse_over(self.TEXT1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mess = sel.get_text("xpath=/html/body/div[3]/div/div")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print mess&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.failUnless(mess.find("Obydwa napisy") != -1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sel.type(self.TEXT2, "a")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sel.click(self.ACCEPT);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; time.sleep(5)&lt;/blockquote&gt;with a simple text file which will read all steps and verification points from flat text file thus avoiding this hard code Python programming.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-987948255876005065?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/987948255876005065/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/selenium.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/987948255876005065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/987948255876005065'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/selenium.html' title='Selenium'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-363659741924946811</id><published>2010-07-03T00:36:00.000-07:00</published><updated>2010-07-03T00:50:43.210-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fce5cd;"&gt;Mój przyjacielu, można by spisać bibliotekę donosów, jakie latami spływały do cesarskiego ucha przeciwko najbliższej postawionej mu osobie, ministrowi pióra - Walde Giyorgisowi. Była to najbardziej przewrotna, odpychająca i skorumpowana postać, jaką kiedykolwiek nosiły parkiety naszego pałacu. Samo złożenie donosu na tego człowieka groziło skrajnie ponurymi konsekwencjami. Jakże musiało być już źle, skoro mimo to - donosili. Ale ucho pańskie było zawsze zamknięte. Walde Giyorgis mógł robić, co chciał, a rozpasanie jego nie miało granic. Jednakże zaślepiony w swojej bucie i bezkarności wziął raz udział w zebraniu frakcji spiskowej, o czym wywiad pałacowy powiadomił czcigodnego pana. Pan czekał, aż Walde Giyorgis powie mu o tym postępku sam, ale ten nie wspomniał o sprawie ani słowem, czyli - inaczej mówiąc - złamał zasadę lojalności.&lt;/span&gt;&lt;/blockquote&gt;Cała ta informacja jest mocno dziwaczna. Wolde Guiorguis był wieloletnim, zaufanym współpracownikiem Haile Selassie (towarzyszył mu na wygnaniu w Wielkiej Brytanii), ale nic nie wiadomo o tym, żeby miał być osobistością "przewrotną, odpychającą i skorumpowaną ... zaślepioną w bucie i bezkarności". &amp;nbsp; Jako człowiek z ludu posiadający ogromny wpływ na monarchę na pewno był obiektem niechęci arystokratów. W pewnym momencie jego przemożne wpływy stały się niewygodne dla samego Haile Selassie i wykorzystując ten fakt, bracia Makonnen i Aklilou, także zazdrośni o jego pozycję nakłonili cesarza do zdymisjonowania Wolde Guiorguisa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-363659741924946811?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/363659741924946811/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/cesarz.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/363659741924946811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/363659741924946811'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/cesarz.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-7061660626311088158</id><published>2010-07-01T11:45:00.000-07:00</published><updated>2010-07-01T11:45:13.618-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>ODBC 64 bit and DB2</title><content type='html'>Finally I installed ODBC DB2 64 bit for Linux. Nothing special, all what what is needed to do is to modify /etc/odbcinst.ini file (or use ODBConfig tool) with driver definition like:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[DB2]&lt;br /&gt;Description&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = &lt;br /&gt;Driver&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = /opt/ibm/db2/V9.7/lib32/libdb2.so&lt;br /&gt;Driver64&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = /opt/ibm/db2/V9.7/lib64/libdb2.so&lt;br /&gt;Setup&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = &lt;br /&gt;Setup64&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = &lt;br /&gt;UsageCount&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = 1&lt;br /&gt;CPTimeout&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; = &lt;br /&gt;CPReuse&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;nbsp; &lt;/blockquote&gt;Next step is to define data source. Unfortunately ODBCConfig tool does not work for this purpose (probably because setup driver is not accessible). But it is enough to modify /etc/odbc.ini (or local odbc.ini) file, ODBConfig is nothing more than GUI tool for modifying those files.&lt;br /&gt;&lt;br /&gt;I added section like:&lt;br /&gt;&lt;blockquote&gt;[SAMPLE]&lt;br /&gt;DESCRIPTION = Connection to DB2&lt;br /&gt;DRIVER = DB2&lt;br /&gt;Database = SAMPLE &lt;/blockquote&gt;And from time on ODBC connection to DB2 world is open and ready to use.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: inherit;"&gt;$ isql SAMPLE db2inst1 db2inst1&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;+---------------------------------------+&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;| Connected!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;| sql-statement&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;| help [tablename]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;| quit&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;+---------------------------------------+&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-size: x-small;"&gt;SQL&amp;gt; select * from emp where JOB = 'MANAGER'&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;+-------+-------------+--------+----------------+---------+--------+--------------------+---------+--------+----+--------------------+------------+------------+------------+&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;| EMPNO | FIRSTNME&amp;nbsp;&amp;nbsp;&amp;nbsp; | MIDINIT| LASTNAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | WORKDEPT| PHONENO| HIREDATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | JOB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | EDLEVEL| SEX| BIRTHDATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | SALARY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | BONUS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | COMM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;+-------+-------------+--------+----------------+---------+--------+--------------------+---------+--------+----+--------------------+------------+------------+------------+&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;| 000020| MICHAEL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | L&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | THOMPSON&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | B01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 3476&amp;nbsp;&amp;nbsp; | 2003-10-10 00:00:00| MANAGER | 18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | M&amp;nbsp; | 1978-02-02 00:00:00| 94250,00&amp;nbsp;&amp;nbsp; | 800,00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 3300,00&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;| 000030| SALLY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | KWAN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | C01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 4738&amp;nbsp;&amp;nbsp; | 2005-04-05 00:00:00| MANAGER | 20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | F&amp;nbsp; | 1971-05-11 00:00:00| 98250,00&amp;nbsp;&amp;nbsp; | 800,00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 3060,00&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;| 000050| JOHN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | GEYER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | E01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 6789&amp;nbsp;&amp;nbsp; | 1979-08-17 00:00:00| MANAGER | 16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | M&amp;nbsp; | 1955-09-15 00:00:00| 80175,00&amp;nbsp;&amp;nbsp; | 800,00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 3214,00&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;| 000060| IRVING&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | F&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | STERN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | D11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 6423&amp;nbsp;&amp;nbsp; | 2003-09-14 00:00:00| MANAGER | 16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | M&amp;nbsp; | 1975-07-07 00:00:00| 72250,00&amp;nbsp;&amp;nbsp; | 500,00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 2580,00&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;| 000070| EVA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | PULASKI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | D21&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 7831&amp;nbsp;&amp;nbsp; | 2005-09-30 00:00:00| MANAGER | 16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | F&amp;nbsp; | 2003-05-26 00:00:00| 96170,00&amp;nbsp;&amp;nbsp; | 700,00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 2893,00&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;| 000090| EILEEN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | W&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | HENDERSON&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | E11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 5498&amp;nbsp;&amp;nbsp; | 2000-08-15 00:00:00| MANAGER | 16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | F&amp;nbsp; | 1971-05-15 00:00:00| 89750,00&amp;nbsp;&amp;nbsp; | 600,00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 2380,00&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;| 000100| THEODORE&amp;nbsp;&amp;nbsp;&amp;nbsp; | Q&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | SPENSER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | E21&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 0972&amp;nbsp;&amp;nbsp; | 2000-06-19 00:00:00| MANAGER | 14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | M&amp;nbsp; | 1980-12-18 00:00:00| 86150,00&amp;nbsp;&amp;nbsp; | 500,00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 2092,00&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;+-------+-------------+--------+----------------+---------+--------+--------------------+---------+--------+----+--------------------+------------+------------+------------+&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;SQLRowCount returns -1&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;7 rows fetched&lt;/span&gt;&lt;/blockquote&gt;Next step to 64 bit world taken.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-7061660626311088158?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/7061660626311088158/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/odbc-64-bit-and-db2.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7061660626311088158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/7061660626311088158'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/odbc-64-bit-and-db2.html' title='ODBC 64 bit and DB2'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6899821666586867317</id><published>2010-07-01T02:59:00.000-07:00</published><updated>2011-06-09T13:54:59.805-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na koncercie</title><content type='html'>Byliśmy na &lt;a href="http://www.operakameralna.pl/index.php?2010_kv492"&gt;"Weselu Figara"&lt;/a&gt; 19 czerwca 2010 roku w Warszawskiej Operze Kameralnej wystawionym w ramach tegorocznego Festiwalu Mozartowskiego.&lt;br /&gt;"Wesele Figara" to dzieło powszechnie znane, lubiane, chętnie wystawiane i nagrywane, chociaż była to dla nas pierwsza okazja zobaczenia tej opery na żywo. Na pewno się nie rozczarowaliśmy, było to bardzo udana i dobrze przygotowana realizacja. Wszyscy soliści stanęli na wysokości zadania, chociaż nie da się powiedzieć, żeby któraś z ról specjalnie zapadła w pamięć. Trudno uważać to jednak za wadę przedstawienia, "Wesele Figara" to sztuka o skomplikowanej strukturze rozgrywającej się między postaciami z których każda pełni istotną rolę w całej intrydze. Potrzebna jest równa praca całego zespołu wykonawców, gdy ktoś zawodzi, to cała układanka się rozsypuje i żadne gwiazdorskie popisy nic nie pomogą.&amp;nbsp; &lt;br /&gt;Andrzej Klimczak bardzo dobrze, i wokalnie i aktorsko poradził sobie z tytułową rolą Figara, chociaż słynna aria "Non più andrai" (ta sama która zagwizdał Leporello w Don Giovannim) nie zebrała burzy oklasków.&amp;nbsp; Podobała się Zuzanna w wykonaniu Marty Boberskiej, tak samo Witold Żołądkiewicz jako fałszywy i podstępny hrabia Almaviva. Tatiana Hempel jako szlachetna hrabina Almaviva może trochę wypadła zbyt pompatycznie. Bardzo się także podobała Julita Mirosławska jako Cherubin.&lt;br /&gt;Scenografia, jak na skromną scenę Warszawskiej Opery Kameralnej była bardzo bogata, udanie został ujęty kontrast między skromną izbą Figara w I akcie a przepychem hrabiowskiego pałacu w II i III.&lt;br /&gt;Warto także dodać, że w przedstawieniu pojawiły się często pomijane arie Marceliny i Don Basilia na początku IV aktu.&lt;br /&gt;&lt;br /&gt;W sztuce &lt;a href="http://pl.wikipedia.org/wiki/Wesele_Figara_%28Beaumarchais%29"&gt;Beaumarchais&lt;/a&gt;&lt;span id="goog_28183859"&gt; Figaro w ostatniej scenie gwałtownie mówi:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span id="goog_28183859"&gt;"Ponieważ jesteś (hrabio Almaviva) wielki panem wyobrażasz sobie również, że jesteś geniuszem. Ale w jaki sposób ? Ja się stałeś tak bogatym i możnym, hrabio Almviva ? Tak naprawdę, jedyny wysiłek jaki w to włożyłeś, to wyłącznie, że się urodziłeś !"&lt;/span&gt;&lt;/blockquote&gt;W operze Mozarta, ze względów cenzuralnych, te antyfeudalne wątki zostały zamienione. W ostatnim akcie Figaro również śpiewa z wielką pasją, ale tutaj obiektem krytyki jest ktoś inny:&lt;br /&gt;&lt;blockquote&gt;Otwórzcie oczy, zabiegani i ogłupiali mężczyźni,&lt;br /&gt;I spójrzcie na te kobiety, jakimi są naprawdę,&lt;br /&gt;Owe "boginie", jak podpowiadają oczarowane zmysły,&lt;br /&gt;Którym osłabiony rozum składa hołdy,&lt;br /&gt;Ale to czarownice rzucające zaklęcia ku naszej zgubie,&lt;br /&gt;Syreny, które śpiewają aby nas zwieść,&lt;br /&gt;Sowy, który chcą nas oskubać,&lt;br /&gt;Komety, które zwodzą pozorem światła,&lt;br /&gt;Róże najeżone kolcami,&lt;br /&gt;Lisice, które nas wabią,&lt;br /&gt;Uśmiechają się, ale niczym niedźwiedzice,&lt;br /&gt;Złowrogie gołębice,&lt;br /&gt;Mistrzynie zwodzenia,&lt;br /&gt;Przyjaciółki kłopotów i trosk,&lt;br /&gt;Kłamią i oszukują,&lt;br /&gt;Próżno szukać w nich miłości,&lt;br /&gt;Ani litości,&lt;br /&gt;Myślę, że nie trzeba już mówić nic więcej,&lt;br /&gt;Gdyż wszyscy znają to świetnie.&lt;/blockquote&gt;Mozart na pewno nie był rewolucjonistą, nie marzył o tym, żeby znosić bariery klasowe, ale żeby w ówczesnej strukturze społecznej podnieść się do góry chociaż o jeden szczebel. Trudno powiedzieć, czy mu się udało czy nie, ale na szczęście dzisiaj oceniamy go według zupełnie innej skali.&lt;br /&gt;Czy da się jednak zamiast walki klas wypatrzyć w tej operze tak modną współcześnie walkę płci ? Raczej trudno, z jednej strony jest tutaj wyraźnie skontrastowany świat kobiet i świat mężczyzn, ale na końcu się okazuje, że mimo różnic wszyscy mają ten sam cel, czyli osiągnięcie szczęścia.&lt;br /&gt;Chyba najlepiej nie szukać w tej operze rzeczy, których tam nie ma, i po prostu znaleźć przyjemność w słuchaniu pięknej muzyki doskonale oddającej niebłahą intrygę i razem z bohaterami cieszyć się szczęśliwym zakończeniem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6899821666586867317?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6899821666586867317/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/bylismy-na-koncercie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6899821666586867317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6899821666586867317'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/07/bylismy-na-koncercie.html' title='Byliśmy na koncercie'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-5859513059624603294</id><published>2010-06-25T15:23:00.000-07:00</published><updated>2010-06-26T14:29:54.684-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;br /&gt;Nieudana próba zamachu stanu z 1960 roku.&lt;br /&gt;Wszystkie informacje jakie przekazuje Kapuściński ustami niejakiego A.W to jakaś mieszanina bzdur i nonsensów.&lt;br /&gt;&lt;div style="background-color: #fff2cc;"&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt;szeptano, że cesarz ma wątpliwości, czy rzeczywiście jest to jego syn. Coś tam nie zgadzało mu się w datach między jego podróżami a terminem uszczęśliwienia cesarzowej pierwszym potomkiem.&lt;/span&gt;&lt;/blockquote&gt;To zmyślenie Kapuścińskiego, nigdy nie istniały tego typu pogłoski i podejrzenia.&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Gwardia była oświecona i dobrze płatna,&amp;nbsp; a wojsko ciemne i biedne. Teraz generałowie wykorzystują ten antagonizm, żeby rzucić armię przeciwko gwardii. Mówią żołnierzom - gwardziści chcą władzy, żeby móc was wyzyskiwać. To, co mówią, jest cyniczne, ale trafia wojsku do przekonania. Żołnierze wołają - chcemy zginąć za cesarza! &lt;/blockquote&gt;To zmyślenie Kapuścińskiego. Zołnierze wykonywali rozkazy swoich dowódców, którzy pozostali lojalni wobec cesarza i nie było do tego celu potrzebne wykorzystywanie jakichś "antagonizmów". Takie zmyślanie jest efektem pewnego szczególnego sposobu postrzegania świata, gdzie po stronie światłości są oświecone i rewolucyjne masy, a po stronie ciemności warstwa rządząca i otumaniona przez nich ciemna tłuszcza.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fce5cd;"&gt;.Bo kiedy owi pobici na głowę przeniewiercy rzucili pałac i zaczęli pierzchać w stronę pobliskiego lasu, zagrzane przez naszego patriarchę pospólstwo ruszyło za nimi w pościg. Żadne tam czołgi i armaty, przyjacielu, co kto miał pod ręką, bral i szedł w pogoń. Kije, kamienie, dzidy i sztylety, wszystko poszło w ruch. Ludzie ulicy, których dobrotliwy pan tak hojną obdarzał jałmużną, z zaciekłością i nienawiścią wzięli się do rozbijania pomylonych głów tych potwarców i rebeliantów, którzy chcieli zabrać im Boga i zgotować nie wiadomo jakie życie.&lt;/span&gt;&lt;/blockquote&gt;To zmyślenie Kapuścińskiego jest wyjątkowo obrzydliwe. Widać tutaj wyzierającą z całego "Cesarza" pychę białego człowieka wobec czarnuchów i Murzynów z Afryki. Z niedobitkami spiskowców rozprawiało się wojsko, a nie podburzona przez patriarchę czarna tłuszcza wyposażona w dzidy i sztylety. Jedyna różnica między gwardią cesarską a regularnym wojskiem polegała tylko na tym, że gwardia nie była wyposażona w ciężki sprzęt bojowy, jak czołgi, samoloty i armaty. Ale nawet bez ciężkiego sprzęty bojowego raczej niepodobna, żeby mogli paść ofiarą "dzid, kamieni i sztyletów". &lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fce5cd;"&gt;Trzy, a może pięć tysięcy tych ludzi trafiło do więzienia, a drugie tyle zginęło ku radości hien i szakali, które nawet z dalekich stron ściągały na żer do podmiejskich lasów. A długo jeszcze, całymi nocami, te lasy wyły i chichotały.&lt;/span&gt; &lt;/blockquote&gt;W puczu zginęło 174 członków Gwardii, 400 zostało rannych. Zabitych na pewno pochowano, a nie porzucono w lesie na żer hienom. Tak jak w Europie zabitych się nie zostawia w lesie na pożarcie wilkom, tak samo w Afryce się nie zostawia na pożarcie hienom. Jak się wyzbyć pychy białego człowieka wobec Murzynów z Afryki, to ta prosta prawda staje się zrozumiała.&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Ale po tygodniu, kiedy siedzieli ukryci w krzakach, od kilku dni już bez jadła i omdlewający z pragnienia, gdyż bali się pojawić w jakiejś wiosce, żeby zdobyć pożywienie i wodę, zostali otoczeni przez chłopów, którzy szli nagonką i chcieli ich pojmać.&lt;/blockquote&gt;Zostali pojmani przez ścigające ich wojsko, a nie chłopów idących z nagonką.&lt;br /&gt;&lt;blockquote style="background-color: #fce5cd;"&gt;Pośpiechem zawieźli ich do stolicy i wzięli Mengistu do szpitala. O wszystkim doniesiono naszemu panu, co wysłuchawszy powiedział, że chce zobaczyć ciało Germame. Zgodnie z tym poleceniem zwłoki zostały przywiezione do pałacu i rzucone na schody przed wejściem głównym. Wtedy dobrotliwy pan wyszedł z pałacu, stanął i długi czas przyglądał się leżącemu ciału. Milczał wpatrzony bez słowa, ludzie przy nim stojący nie słyszeli, żeby coś powiedział. Potem drgnął i cofnął się z powrotem w głąb budynku, polecając lokajom zamknąć główne drzwi. Widziałem później ciało Germame powieszone na drzewie przed katedrą Świętego Jerzego. Stał tam tłum ludzi, którzy szydzili ze zdrajców. klaskali i wznosili rubaszne okrzyki.&lt;/blockquote&gt;To jakaś konfabulacja Kapuścińskiego. Ani nikt nie rzucał ciała Germama na schody pałacu aby "dobrotliwy pan" mógł sobie na nie popatrzeć, ani nikt nie wywieszał zwłok na drzewie koło katedry ku uciesze tłuszczy. Amharska obyczajowość (podobnie jak żydowska) nakazuje pochowanie zmarłego w ciągu nie dłużej niż 24 godzin od śmierci.&lt;br /&gt;&lt;blockquote style="background-color: #fce5cd;"&gt;Powiesili go trzydziestego marca, o świcie, na głównym rynku miasta. Razem z nim powiesili sześciu innych oficerów z gwardii.&lt;/blockquote&gt;Na śmierć skazano tylko Mengistu, dwóch oskarżonych z nim oficerów skazano na długoletnie więzienie.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt;Dalej opowiadają, że nastąpiły tygodnie budzących panikę aresztowań, męczących dochodzeń, brutalnych przesłuchań. panowała niepewność, lęk, ludzie szeptali, plotkowali, wspominali szczegóły zamachu dodając do nich, co kto mógł, na miarę swojej fantazji i odwagi, zresztą dodając pokątnie, gdyż wszelkie dyskutowanie ostatnich wydarzeń było oficjalnie potępione, a policja - z którą nigdy nie należy żartować, nawet jeśli ona sama do tego zachęca, co i tak w tym wypadku nie miało miejsca - pragnąc oczyścić się z zarzutu&amp;nbsp; spiskowania, stała się bardziej niebezpieczna i wydajna niż zwykle, a nie brakło też chętnych, którzy dodatkowo napędzali komisariatom struchlałej klienteli.&lt;/span&gt;&lt;/blockquote&gt;12 stycznia 1961 roku Haile Selassie ogłosił amnestię dla szeregowych i podoficerów Gwardii Cesarskiej, którzy uczestniczyli w spisku, nakazał jednak osądzenie oficerów. 12 marca sąd skazał na śmierć przez powieszenie generała Mangistu, zaś dwóch oficerów skazał na wieloletnie więzienie. Uczestnikami spisku byli tylko członkowie Gwardii Cesarskiej i nie było potrzeby przeprowadzania i wyszukiwania żadnych dodatkowych "przesłuchań i aresztowań".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-5859513059624603294?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/5859513059624603294/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/06/cesarz_25.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5859513059624603294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5859513059624603294'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/06/cesarz_25.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-707530512966340014</id><published>2010-06-25T06:14:00.000-07:00</published><updated>2010-07-03T01:00:51.861-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt;G.O-E.: ..nawet nie wiedzieli o spiskach, bo skąd, skoro dostojny pan zakazał pisania historii Etiopii? Zbyt młodzi i na dalekiej prowincji wychowani, nie mogli wiedzieć, że sam pan nasz doszedł do władzy dzięki spiskowi, kiedy w roku tysiąc dziewięćset szesnastym z pomocą ambasad zachodnich dokonał zamachu stanu i usunął legalnego następcę tronu lydża Ijasu. &lt;/span&gt;&lt;/blockquote&gt;Jest zmyśleniem Kapuścińskiego, że Haile Selassie miałby zakazywać "pisania historii Etiopii".&lt;br /&gt;Przyczyny i okoliczności odsunięcia od władzy wskazanego przez Menelika II następcy tronu Lija Iyasu&amp;nbsp; można znaleźć pod hasłami w Wikipedii: &lt;a href="http://en.wikipedia.org/wiki/Haile_Selassie_I"&gt;Haile_Selassie_I&lt;/a&gt; oraz &lt;a href="http://en.wikipedia.org/wiki/Iyasu_V_of_Ethiopia"&gt;Iyasu V of Ethiopia&lt;/a&gt;. Opisane jest to także w "Historii Etiopii" (strona 342, rozdział "Zamach stanu"). Nietrudno zauważyć, że to co przekazuje Kapuściński ustami anonimowego "człowieka dworu" raczej ma niewielki związek z tym, co jest opisane w podanych źródłach. Zadne z tych źródeł nie wskazuje na aktywny udział przyszłego cesarza w tych wydarzeniach. Jest to co najwyżej relacja stronnicza i skrajnie niechętna Haile Selassiemu. Podkreślenie "z pomocą ambasad zachodnich" raczej jednoznacznie wskazuje jakie jest pochodzenie tej relacji. Osoby, które wychowały się pod rządami komunistycznymi doskonale pamiętają tę obsesję na punkcie "ambasad zachodnich" czy "mocarstw zachodnich". &lt;br /&gt;Jest to niepodobne, aby "człowiek dworu" przekazywał Kapuścińskiemu informacje całkowicie nieprawdziwe albo przedstawiające jednostronną i skrajnie niechętną cesarzowi wersję wydarzeń z 1916 roku.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-707530512966340014?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/707530512966340014/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/06/cesarz.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/707530512966340014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/707530512966340014'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/06/cesarz.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-4543612610861228970</id><published>2010-06-19T01:44:00.000-07:00</published><updated>2011-06-09T13:55:23.552-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recenzje'/><title type='text'>Byliśmy na koncerce</title><content type='html'>29 maja 2010 byliśmy na koncercie z cyklu &lt;a href="http://www.kapitula.org/mfmskal.html"&gt;Międzynarodowy Festiwal Muzyki Sakralnej&lt;/a&gt;&amp;nbsp; "Flet i organy w dawnej Europie" (Kościół św. Antoniego, ul. Senatorska 31). Podobało nam się bardzo.&lt;br /&gt;Flet i organy to bardzo interesujące zestawienie, zarówno gdy grają solo, jak i w duecie, a szczególnie gdy wykonawcami są doskonali muzycy. Barokowy wystrój kościoła wcale nie narzucał muzyki w jednej tylko estetyce. Słuchaliśmy muzyki z różnych okresów - baroku, romantyzmu oraz impresjonizmu (Debussy), kompozytorów sławnych jak Vivaldi (w transkrypcji Bacha, bardziej znanej od oryginału), Handla oraz Debussiego, a także mniej w Polsce znanych (&lt;a href="http://www.kapitula.org/pdf/2010/20100529.pdf"&gt;program&lt;/a&gt;). &lt;br /&gt;Na bis muzycy wykonali między innymi znany motyw muzyczny z filmu "Misja".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-4543612610861228970?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/4543612610861228970/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/06/bylismy-na-koncerce.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4543612610861228970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4543612610861228970'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/06/bylismy-na-koncerce.html' title='Byliśmy na koncerce'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-2444391924250990560</id><published>2010-05-29T15:17:00.000-07:00</published><updated>2010-05-29T15:17:42.712-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotations'/><title type='text'>Defect</title><content type='html'>Developer to tester.&lt;br /&gt;&lt;blockquote&gt;Mad let us grant him, then: and now remains  &lt;br /&gt;&lt;code&gt;&lt;a href="" name="101"&gt;&lt;/a&gt;&lt;/code&gt;That we find out the cause of this effect,  &lt;br /&gt;&lt;code&gt;&lt;a href="" name="102"&gt;&lt;/a&gt; &lt;/code&gt;Or rather say, the cause of this defect,  &lt;br /&gt;&lt;code&gt;&lt;a href="javascript:poptastic('HamletNotes22.html#103');" name="103"&gt;&lt;/a&gt; &lt;/code&gt;For this effect defective comes by cause:  &lt;br /&gt;&lt;code&gt;&lt;a href="javascript:poptastic('HamletNotes22.html#104');" name="104"&gt;&lt;/a&gt; &lt;/code&gt;Thus it remains, and the remainder thus.&amp;nbsp;  &lt;/blockquote&gt;&lt;a href="http://www.clicknotes.com/hamlet/H22.html"&gt;http://www.clicknotes.com/hamlet/H22.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-2444391924250990560?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/2444391924250990560/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/defect.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2444391924250990560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2444391924250990560'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/defect.html' title='Defect'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6157288379445522743</id><published>2010-05-27T13:55:00.000-07:00</published><updated>2010-06-13T02:18:03.722-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div style="background-color: #fff2cc;"&gt;Hajle Sellasje nadał wierzy, że jest cesarzem Etiopii.&lt;/div&gt;&lt;div style="background-color: #fff2cc;"&gt;Addis Abeba 7 lutego 1975 (Agence France Presse).&amp;nbsp;&lt;/div&gt;&lt;div style="background-color: #fff2cc;"&gt;Osadzony w pomieszczeniach starego, położonego na wzgórzach Addis Abeby pałacu Menelika Hajle Sellasje spędza ostatnie miesiące życia w otoczeniu swoich żołnierzy. Według relacji naocznych świadków, żołnierze ci - jak za najlepszych czasów cesarstwa - nadal oddają pokłony królowi królów.&lt;br /&gt;Dzięki tym gestom, jak stwierdził to ostatnio przedstawiciel międzynarodowej organizacji pomocy, który złożył mu wizytę i odwiedził innych więźniów znajdujących się w pałacu, Hajle Sellasje w dalszym ciągu wierzy, że jest cesarzem Etiopii. Negus cieszy się dobrym zdrowiem, zaczął dużo czytać - a mimo swoich lat czyta bez okularów - i od czasu do czasu udziela rad żołnierzom, którzy pełnią przy nim straż. Warto dodać, że żołnierzy tych zmienia się co tydzień, ponieważ sędziwy monarcha zachował swój talent przekonywania. Tak jak za dawnych czasów, każdy dzień byłego cesarza ujęty jest w ramy nienaruszalnego programu i przebiega zgodnie z protokołem. Król królów wstaje o świcie, następnie uczestniczy w porannej mszy, a później pogrąża się w lekturze. Niekiedy prosi o wiadomości na temat przebiegu rewolucji. Dawny wszechwładca jeszcze teraz powtarza to, co oświadczył w dniu swojej detronizacji: "Jeżeli rewolucja jest dobra dla ludu, jestem za rewolucją. &lt;/div&gt;&lt;/blockquote&gt;Za pomocą tej sielankowej wizji ostatniego okresu życia Haile Selassie ujętej w formie zmyślonej depeszy zawierającej relację bliżej nieznanego przedstawiciela nieokreślonej "międzynarodowej organizacji pomocy" Kapuściński okłamuje swoich czytelników co do dalszego losu sędziwego monarchy, który najprawdopodobniej został zamordowany z rozkazu nowego reżimu. &lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt;Po drugiej stronie starego pałacu, w pobliżu&amp;nbsp; budynku zajętego przez Hajle Sellasje, stoją inne pomieszczenia dawnego dworu, gdzie uwięzieni w piwnicach dostojnicy, dygnitarze i notable oczekują dalszego losu.&lt;/span&gt;&lt;/blockquote&gt;Za pomocą tego eufemizmu nasz "reporter stulecia"&amp;nbsp; daje nam do zrozumienia, że owi "dygnitarze" oczekują dalszego losu, który będzie rozstrzygnięty już na Sądzie Ostatecznym. Zostali rozstrzelani&amp;nbsp; 23 listopada 1974 roku.&lt;br /&gt;&lt;br /&gt;Reżim Mengistu, który zastąpił rządy cesarza Haile Selassie to jedna z najbardziej brutalnych i zbrodniczych dyktatur XX wieku.&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6157288379445522743?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6157288379445522743/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_5202.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6157288379445522743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6157288379445522743'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_5202.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-5246830918119933790</id><published>2010-05-27T13:00:00.000-07:00</published><updated>2010-05-27T13:02:21.752-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>&amp;nbsp;"Cesarz"&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt;Wszyscy słuchali wtedy radia, a ci nieliczni, których stać było na kupno telewizora (jest on nadal w tym kraju symbolem najwyższego luksusu), ogLądali telewizję. W tym czasie więc, na przełomie sierpnia i września, każdy dzień przynosił sowitą porcję rewelacji o życiu pałacu i cesarza,. Sypały się cyfry i nazwiska, numery kont bankowych, nazwy majątków i firm prywatnych. Pokazywano domy notabli, nagromadzone tam bogactwo, zawartość tajnych skrytek, stosy biżuterii. Często odzywał się głos ministra najwyższych przywilejów - Admassu Retty, który odpowiadając przed komisją do badania korupcji mówił, który z dygnitarzy co i kiedy otrzymał, gdzie i na jaką wartość. Trudność jednak polegała na tym, że nie sposób było ustalić wyraźniej granicy między budżetem państwa a prywatnym skarbem cesarza, wszystko tu było zamazane, rozmydlone,&amp;nbsp; dwuznaczne. Za rządowe pieniądze dygnitarze budowali sobie pałace, kupowali majątki, jeździli za granicę. Największe bogactwa nagromadził cesarz.&lt;/span&gt;&lt;/blockquote&gt;To jest głos samego Kapuścińskiego, a nie żadnego z jego anonimowych rozmówców.  Tyle tylko, że Kapuściński po prostu powtarza dosłownie antycesarską propagandę sterowaną przez Derg w ostatnich tygodniach poprzedzających detronizację cesarza. Kapuściński jednak nie ogranicza się tylko do roli propagandowej tuby. Uzupełnia to jeszcze własnymi zmyśleniami. Blatta Admassu Retta był rzeczywiście zaufanym współpracownikiem Haile Selassie, ale rewelacje jakie miał ogłaszać przez "komisją do spraw korupcji" to już zmyślenie Kapuścińskiego. Jest to wydarzenie, które nie miało miejsca. Sam Blatta Admassu Retta (był ciężko chory, ale został ściągnięty ze szpitalnego łóżka) został rozstrzelany przez nowy reżim wraz z innymi dostojnikami 23 listopada 1974 roku, jakoś nowemu reżimowi w niczym nie przeszkadzało, że zabrał te swoje "tajemnice" do grobu. &lt;span id="main" style="visibility: visible;"&gt;&lt;span id="search" style="visibility: visible;"&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span id="main" style="visibility: visible;"&gt;&lt;span id="search" style="visibility: visible;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-5246830918119933790?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/5246830918119933790/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_1192.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5246830918119933790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5246830918119933790'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_1192.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-4954052765598531083</id><published>2010-05-27T10:26:00.000-07:00</published><updated>2010-05-27T10:26:08.447-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt;I zaraz z foteli wstają i dywan wielki, perski z podłogi podnoszą, a tam pod&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; dywanem całym zwitki dolarów gęsto poutykane, aż zieloną podłoga się zdawała. One to dolary zaraz w obecności czcigodnego pana sierżantom zliczyć i spisać kazali i do nacjonalizacji zabrali. Wnet się jednak wynieśli, a wtedy dostojny pan nasz wziął mnie do gabinetu i pieniądze w biurku trzymane między książkami chować nakazał. A powiem, że pan nasz, jako zwący się potomkiem króla Salomona, miał wielki zbiór Pisma Świętego, na wszelkie języki świata przełożonego, i tamżeśmy one pieniądze poutykali. Wszelako panowie oficerowie, ooo! to były zmyślne łupiskóry! Następnego dnia przychodzą, proklamację odczytują, zwrotu pieniędzy żądają, bo jak powiadają, trzeba mąki dla głodujących kupić. Aliści pan nasz za biurkiem siedząc słowa nie mówi, puste szuflady pokazuje. Na to oficerowie z foteli się zrywają, szafy z książkami otwierają, z wszelkich Biblii dolary wytrząsają, zaś sierżanci liczą, spisują,&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;do nacjonalizacji przekazują.&lt;/span&gt;&lt;/blockquote&gt;Cała ta historia jest zmyślona przez Kapuścińskiego. Tutaj widać po prostu pychę białego człowieka wobec Murzynów z Afryki i murzyńskiego króla. Tyle, że w miejsce paciorków, korali i whiskey mamy Biblię i dolary.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-4954052765598531083?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/4954052765598531083/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_27.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4954052765598531083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4954052765598531083'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_27.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-33180759926731510</id><published>2010-05-26T12:09:00.000-07:00</published><updated>2010-05-27T02:28:59.748-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt;Powróciwszy do pałacu, czcigodny pan przyjął donos o &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;ministra handlu - Ketemy Yfru, który oskarżył ministra finansów,&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; że ten, nakładając wysokie cła, spowodował wstrzy&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;manie pomocy dla głodujących. Jednakże nasz wszechwładca&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; ani słowem nie skarcił pana Yelmę Deresę, a wręcz widziało&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; się zadowolenie na twarzy monarszej, ponieważ pan nasz zawsze&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; z niechęcią traktował ową pomoc, gdyż wszelki rozgłos,&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; jaki jej towarzyszył, całe to wzdychanie, głową kiwanie z powodu&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; chudzieków głodem przymierających psuło dorodny i&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; imponujący obraz cesarstwa, które przecież szło drogą niczym&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; nie zakłóconego rozwoju i doganiało, a nawet prześcigało. Odtąd&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; żadne wspomaganie, datkowanie nie było więcej potrzebne,&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; a owym głodomorom musiało wystarczyć to, że dobrotliwy&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; pan nasz osobiście przywiązał do ich losu najwyższą wagę,&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; co było już szczególnym rodzajem przywiązania, nawet&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; wyższego niż najwyższe, a dającego podwładnym kojącą i krzepiącą&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; nadzieję, że ilekroć pojawi się w ich życiu jakaś gnębiąca&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; ich molestia, jakieś skargi budzące utrapienie, jaśnie osobliwy&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; pan doda im tak potrzebnego ducha, a mianowicie w ten&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; sposób, że przywiąże do onej molestii czy utrapienia najwyższą&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; wagę.&lt;/span&gt;&lt;/blockquote&gt;To kłamstwo Kapuścińskiego jest wyjątkowo obrzydliwe. Klęska głodu w Etiopii była gwoździem do trumny Haile Selassiego, ale zmyślać, że cesarz z zadowoleniem przyjął informację o wstrzymaniu pomocy zagranicznej dla głodujących (na szczęście to "wstrzymanie pomocy" to także zmyślenie Kapuścińskiego, w rzeczywistości emisja filmu uruchomiła falę pomocy międzynarodowej dla Etiopii), bo ważniejsze były dla niego jakieś zewnętrzne pozory niż tragedia umierających ludzi, to już dla mnie niepojęte.&lt;br /&gt;&lt;br /&gt;Oczywiście, że klęska głodu przyspieszyła erozję reżymu, zadała cios międzynarodowej reputacji cesarza. Ala odpowiedzialność Haile Selassiego była w tamtym czasie już mocno problematyczna, w latach 60-ych i 70-ych ośrodki decyzyjne władzy stopniowo przesuwały się już w kierunku rządu, parlamentu, biurokracji. Był to skutek reform w aparacie władzy zapoczątkowanych przez Haile Selassiego, ale w efekcie obróciło się to przeciwko niemu. Gdy zaczął narastać bunt, to cesarz tak naprawdę nie miał już w swoim ręku instrumentów władzy. Jedyne co miał, to tylko swój osobisty autorytet, ale i ten w końcu padł.&lt;br /&gt;&lt;br /&gt;Jaka była reakcja Haile Selassiego na głód, można wysłuchać pod adresem:&lt;br /&gt;&lt;a href="http://www.bbc.co.uk/radio4/factual/beyondhunger.shtml"&gt;http://www.bbc.co.uk/radio4/factual/beyondhunger.shtml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Jonathan Dimbleby wraca tutaj do tragicznych wydarzeń z czasów klęski głodu. Zamieszczony jest link do nagrania w formacie mp3 (trzeba kliknąć na zakładkę: Listen again to this programme) i przewinąć do około 21 minuty. W kilka tygodni po emisji programu "The unknown famine" (18 października 1973 roku), Haile Selassie, już stary i bezsilny, usiłował naprawić sytuację udając się z "imperial pilgrimage" (cesarską pielgrzymką - takiego określenia używa autor audycji) do Dessie, stolicy prowincji Wollo, gdzie głód czynił największe spustoszenie. Rozmówca Dimblebego był świadkiem tego wydarzenia. Jak opowiada, cesarz odwiedzał schroniska dla uciekinierów z terenów dotkniętych głodem i był zdruzgotany oraz wstrząśnięty tym co zobaczył. W odróżnieniu od anonimowych rozmówców Kapuścińskiego wypowiadających się dziwacznym i sztucznym językiem, tutaj mamy człowieka przestawiającego się prawdziwym imieniem i nazwiskiem. I ta relacja jest dużo bardziej wstrząsająca i prawdziwa niż zmyślenia Kapuścińskiego.&lt;br /&gt;&lt;br /&gt;Cały ten materiał jest wart wysłuchania i obejrzenia. To zupełnie inny styl niż uprawiany przez Kapuścińskiego. Nie polegający na siedzeniu w klimatyzowanym hotelu w stolicy, oglądaniu telewizji i przekazywaniu rządowej propagandy uzupełnianej o własne zmyślenia i przeinaczenia. Reporter z kamerą i mikrofonem jedzie bezpośrednio do ludzi i przekazuje to co widział i usłyszał, a nie to co chciał zobaczyć i usłyszeć.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-33180759926731510?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/33180759926731510/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_1512.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/33180759926731510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/33180759926731510'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_1512.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-8908126541488265949</id><published>2010-05-26T11:15:00.000-07:00</published><updated>2010-05-26T11:15:28.241-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote&gt; &lt;span style="background-color: #fff2cc;"&gt;A ponieważ koszty lojalności rosły i rosły, wypa&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;dła pilna potrzeba zwiększenia dochodów i wtedy właśnie mi&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;nisterstwo finansów nakazało chłopom płacić nowe podatki. &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;' Dzisiaj wolno mi już powiedzieć, że była to decyzja osobli&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;wego pana, ale że cesarz, jako łaskawy dobroczyńca, nie mógł &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;' wydawać postanowień przykrych i nieszczęsnych, wszelki de&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;kret, który nakładał nowy ciężar na ramiona ludu, dawany&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; był pod firmą jakiegoś ministerstwa.&lt;/span&gt;&lt;/blockquote&gt;"Historia Etiopii"&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt; "W efekcie 1968 roku ogłoszono kompromisowy tekst, odbiegający od początkowych założeń i nie rozwiązujący zasadniczo całej sprawy (reformy rolnictwa). Postanowiono, że konieczne jest przeprowadzenie rejestracji gruntów w Etiopii oraz nałożenie podatków od faktycznej produkcji danego gospodarstwa. Ustalony stosunek wysokości podatku do wielkości produkcji zgodnie uważano za zmniejszający obciążenia rolników w stosunku do stanu obecnego"&lt;/span&gt;&lt;/blockquote&gt;"Cesarz"&lt;br /&gt;&lt;blockquote&gt; &lt;span style="background-color: #fff2cc;"&gt;I tak idąc wedle &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;wskazań monarchy, po czasie, gdy już krew wsiąkła, a dymy &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;wiatr rozegnał, znów jęli urzędnicy podatków dokładać, ale &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;już dawkując, mieszkując, łagodnie, ostrożnie, a chłopi wszy&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;stko znieśli i nie czuli obrazy.&lt;/span&gt;&lt;/blockquote&gt;"Historia Etiopii"&lt;br /&gt;&lt;blockquote&gt; &lt;span style="background-color: #fff2cc;"&gt;Ale w grudniu 1968 (wobec buntu chłopów w Godżamie tłumionym za pomocą wojska) cesarz wycofał się z próby rejestracji ziem w Godżamie, uzyskując zgodę chłopską na częściową zmianę zasad opodatkowania ziemi.&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt;Rząd szwedzki - wiążąc nadzieję na zmianę istniejącego stanu rzeczy z ustawą o dzierżawcach - dawał Etiopii do zrozumienia, że wycofa pomoc, jeśli do 1972 roku parlament nie zaopiniuje reformy.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Jak widać, Kapuściński całkowicie sfałszował i przeinaczył całą sprawę,&amp;nbsp; żeby przedstawić cesarza w negatywnym świetle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-8908126541488265949?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/8908126541488265949/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_26.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/8908126541488265949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/8908126541488265949'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_26.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-1011908544297887847</id><published>2010-05-25T12:20:00.000-07:00</published><updated>2010-05-26T00:53:09.718-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt;Zdarzeniem, które przyspieszyło konfrontację z pałacem,&lt;/span&gt; &lt;span style="background-color: #fff2cc;"&gt;była tragedia głodowa w północnych prowincjach kraju. &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;Zwykle mówi się, że przyczyną masowych śmierci z głodu są &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;występujące okresowe susze - sprawczynie nieurodzaju. Pogląd &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;ten głoszą elity krajów głodujących. Jest on jednak fałszywy. &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;Źródłem głodu jest najczęściej niesprawiedliwy lub błędny &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;rozdział zasobów, majątku narodowego. W Etiopii było dużo &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;ziarna, ale zostało ono ukryte przez bogaczy, a potem rzucone &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;na rynek po zdwojonych cenach, niedostępnych dla chłopstwa i miejskiej biedoty.&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt; &lt;/span&gt;To są poglądy, które wypowiada z pełnym przekonaniem sam Kapuściński, to nie są poglądy wypowiadane ustami jego anonimowych rozmówców.&lt;br /&gt;&lt;br /&gt;"Historia Etiopii"&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt;Groźna susza, panująca od kilku lat w pobliskich rejonach Afryki, na początku lat siedemdziesiątych zaczęła docierać do Etiopii. W 1972 roku w kilku etiopskich prowincjach nie spadł deszcz. Klęska suszy dotknęła Uello i Tigraj. W czasie obchodów 80 rocznicy urodzin cesarza w obu tych prowincjach ludzie umierali z głodu. Etiopskie władze i prasa otaczały milczeniem sprawę śmierci głodowej tysięcy ludzi w kraju.&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;Przyczyną głodu jest susza, i to nie jest pogląd wypowiadany przez&amp;nbsp; "elity krajów głodujących". Korupcja, spekulacja, nieudolność władz (zapewne codzienność Etiopii za czasów rządów Haile Selassie) potęgują skutki głodu, ale jest nonsensem stwierdzenie, że przyczyną głodu jest spekulacja. Takie to dziwaczne poglądu głosi człowiek, który uważa siebie za specjalistę od problemów Afryki i Azji. Wiele społeczeństw (także społeczeństwo etiopskie) zapłaciło bardzo wysoką cenę za złudzenie, że wystarczy zmienić ustrój i zniknie głód i wszelkie inne problemy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-1011908544297887847?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/1011908544297887847/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_5131.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1011908544297887847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1011908544297887847'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_5131.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6729591395892228664</id><published>2010-05-25T12:11:00.000-07:00</published><updated>2010-05-25T12:57:10.164-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Największe bogactwa nagromadził cesarz. W miarę jak przybywało mu lat, rosła jego pazerność, jego starcza, żałosna zachłanność. Można by o tym mówić ze smutkiem i pobłażliwością, gdyby nie fakt, że H.S. zabierał z kasy państwowej miliony dokonując - on i jego ludzie - tych drapieżnych zabiegów pośród cmentarzy umarłych z głodu ludzi, cmentarzy widocznych z okien pałacu. W końcu sierpnia wojskowi ogłaszają dekret o nacjonalizacji wszystkich pałaców cesarza. Było ich piętnaście. Ten sam los spotyka prywatne przedsiębiorstwa H.S., w tym - browar im. świętego Jerzego, miejskie zakłady autobusowe w Addis Abebie, wytwórnię wód mineralnych w Ambo. W dalszym ciągu oficerowie składają cesarzowi wizyty odbywają z nim długie rozmowy nalegając, aby wycofał z banków zagranicznych swoje pieniądze i przekazał je do skarbu państwa. Prawdopodobnie nigdy nie będzie wiadome, jaką dokładnie sumę posiadał cesarz na swoich kontach. W wystąpieniach propagandowych mówiono o czterech miliardach dolarów, ale można to uznać za grubą przesadę. Raczej chodziło o kilkaset milionów. Nalegania wojskowych zakończyły się niepowodzeniem: cesarz tych pieniędzy rządowi nie dał, pozostają one do dziś w obcych bankach. &lt;/blockquote&gt;&amp;nbsp;To są poglądy przekazywane przez samego Kapuścińskiego, a nie przez jego anonimowych rozmówców. Stanowią jakby zwieńczenie wszystkiego, postawienie kropki na końcu zdania.&lt;br /&gt;&lt;br /&gt;Informacje o kontach, bogactwie, pałacach, prywatnych przedsiębiorstwach i chciwości cesarza były intensywnie nadawane przez etiopską telewizję i radio przed i po obaleniu cesarza. Nowy rząd często donosił o wysiłkach mających na celu odzyskanie zagrabionych pieniędzy,&amp;nbsp; do aresztowanego cesarza regularnie udawały się kolejne delegacje usiłujące nakłonić go do przekazaniach danych dających dostęp do kont w zagranicznych bankach. Podobno negocjowano, że w zamian za spełnienie tych oczekiwań Haile Selassie zostanie uwolniony i będzie mógł wyjechać zagranicę. Co jakiś czas informowano, że rząd szwajcarski przyznał, że Haile Selassie ma zdeponowaną jakąś ogromną sumę w tym kraju, że znaleziono w biurku cesarza pismo z banku szwajcarskiego informujące, że zabrakło miejsca w pomieszczeniu gdzie gromadzono sztabki złota należące do cesarza, że w pierścieniu, który cesarz miał na ręku odkryto jakiś schowek zawierający tajny klucz i szyfry do zagranicznych kont.&lt;br /&gt;&lt;br /&gt;Zdrowy rozsądek jednak podpowiada, że krytyka jaką nowy reżim adresuje do właśnie obalonego reżimu powinna być przyjmowana z ogromną ostrożnością. Wielka szkoda, że właśnie tej ostrożności zabrakło u Kapuścińskiego, który te informacje przekazuje jako coś całkowicie pewnego i nie podlegającego dyskusji.&lt;br /&gt;&lt;br /&gt;Jeśli czytelnik "Cesarza" za pośrednictwem Kapuścińskiego otrzymuje propagandę serwowaną przez reżim Mengistu, może warto dla równowagi przekazać informacje trochę innego rodzaju.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ethiopolitics.com/articles/Haile_Selassie.htm"&gt;http://www.ethiopolitics.com/articles/Haile_Selassie.htm&lt;/a&gt;&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Kiedy jeden z oficerów zwrócił się do cesarza "Przecież Wasza Wysokość z pewnością coś musiał odłożyć na ciężkie czasy, na swoją emeryturę". Cesarz odpowiedział: "Emerytura ? Cesarz nie żyje na emeryturze. Jedyną emeryturą jest śmierć. Nigdy nie było potrzeby zbierania na emeryturę". Innym razem, gdy słyszał oskarżenia, że zdefraudował 20 miliardów dolarów, odpowiedział, że takie przekonanie świadczy o klęsce nauczania matematyki w szkołach. Trudno odłożyć 20 miliardów dolarów w kraju, którego roczny przychód nie przekraczał 2 miliardów. Jedyne do czego miał się przyznać, to wysyłanie za granicę pewnych kwot pieniędzy na pokrycie kosztów leczenia jego najstarszego syna.&lt;/blockquote&gt;Haile Selassie pochodził z rodu arystokratycznego i był dziedzicem fortuny. Natomiast nic nie wiadomo, żeby będąc cesarzem kumulował bogactwa czy pozwalał na to członkom swojej rodziny. Czy miał konto w Szwajcarii ? Trudno powiedzieć, może miał, a może nie miał. Jak wiadomo, współcześnie Szwajcaria ma trochę inne podejście do tajności kont i różni kacykowie okradający własne kraje nie mogą już uważać, że posiadanie konta w tym kraju jest dla nich całkowicie bezpieczne. Pomimo tego, konto Haile Selassiego w Szwajcarii jakoś po dziś dzień nie wypłynęło. Członkowie jego rodziny żyją rozproszeni po całym świecie, niektórzy mają nawet kłopoty materialne, nic nie wiadomo, aby odcinali kupony od jakichś kont.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6729591395892228664?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6729591395892228664/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_25.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6729591395892228664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6729591395892228664'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_25.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-388527264771206527</id><published>2010-05-24T12:17:00.000-07:00</published><updated>2010-05-25T05:26:43.126-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;wrócił przejęty i roztrzęsiony i zaraz wyjechał do Anglii. Nie minął miesiąc, a z naszej ambasady przychodzi doniesienie, że pan Dimbleby pokazał w telewizji londyńskiej swój film pod tytułem "Ukryty głód", w którym ten pozbawiony zasad oszczerca dopuścił się demagogicznej sztuczki ukazując tysiące ludzi umierających z głodu, a obok czcigodnego pana, jak biesiaduje z dostojnikami, następnie pokazał drogi, na których leżą dziesiątki szkieletów zagłodzonych biedaków, a zaraz potem nasze samoloty przywożące z Europy szampany i kawior, tu - pola całe konających chudzieków, tam nasz&amp;nbsp; monarcha ze srebrnej patery mięso swoim psom podający, i tak na przemian: przepych - nędza, bogactwo - rozpacz, korupcja - śmierć. W dodatku pan Dimbleby oświadcza, że klęska głodu spowodowała już śmierć stu, a może dwustu tysięcy ludzi i że drugie tyle może w najbliższych dniach podzielić ich los. Doniesienie ambasady mówi, że po filmie wybuchł w Londynie wielki skandal, są apelacje do parlamentu, gazety biją na alarm, dostojnego pana potępiają.&lt;/blockquote&gt;&lt;br /&gt;&amp;nbsp;&lt;a href="http://www.guardian.co.uk/world/2002/jul/28/famine.ethiopia"&gt;http://www.guardian.co.uk/world/2002/jul/28/famine.ethiopia&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Jonathan Dimbleby&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt;A few months later, The Unknown Famine, as we called our report, became a catalyst for the overthrow of the quasi-feudal regime of Haile Selassie. Crudely recut to include scenes of high life at the imperial palace and retitled The Hidden Hunger, our footage was used to devastating effect on Ethiopian television to soften up the Emperor's subjects for the military coup which brought Comrade - later President - Mengistu to power.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc;"&gt; Kilka miesięcy póżniej, "Nieznany głód" - jak nazwaliśmy nasz film, stał się katalizatorem, który przyczynił się do obalenia pół-feudalnych rządów Haile Selassie. Został topornie poprzecinany scenami z życia wyższych sfer pałacu cesarskiego oraz zmieniono mu nazwę na "Ukryty głód". Nasz materiał został wykorzystany przez etiopską telewizję w celu uzyskania niszczącego efektu i miało przygotować poddanych cesarza do wojskowego zamachu, który przywiódł do władzy Mengistu, późniejszego prezydenta.&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;Kapuściński całkowicie przeinaczył całe wydarzenie. Jonathan Dimbleby nakręcił i pokazał w brytyjskiej telewizji klęskę głodu w Etiopii. Natomiast potem, w przeddzień obalenia cesarza, etiopska telewizja przeplotła materiał nakręcony przez Dimblebego scenami pałacowymi aby zadać ostateczny cios reputacji cesarza.&lt;br /&gt;&lt;br /&gt;Warto zwrócić uwagę na słowa "crudely recut" (topornie poprzecinany). Jakoś nie mogę uwierzyć, że Kapuściński, jak sam o sobie pisze, wytrawny i rasowy reporter, który każde kłamstwo niczym promieniowanie rentgenowskie prześwietla do gołej kości, nie poznał się na nieudolnej podróbce.&lt;br /&gt;&lt;br /&gt;Raczej jestem skłonny założyć, że Kapuściński celowo okłamał swoich czytelników, aby im wmówić, że także dziennikarz z "kraju kapitalistycznego" podziela jego hiperkrytyczną opinię o Haile Selassie.&lt;br /&gt;&lt;br /&gt;Jestem stałym słuchaczem reportaży nadawanych na &lt;a href="http://news.bbc.co.uk/2/hi/programmes/from_our_own_correspondent/default.stm"&gt;BBC4&lt;/a&gt; i&amp;nbsp; nawet moja pobieżna znajomość zasad dziennikarstwa obowiązujących w BBC podpowiada mi, że jest niemożnością, aby Dimbleby zrobił taki reportaż. Dziennikarze w BBC nie wykorzystują materiałów pochodzących z zewnątrz (w tym wypadku scen z życia pałacu), wykorzystują tylko to, co sami zebrali w trakcie pracy nad reportażem. Nie atakują również władz czy rządu krajów, którego dotyczy reportaż. Widz czy słuchacz oczywiście może wynieść negatywne wrażenie, ale to powinna być jego refleksja z treści, a nie pogląd narzucony przez dziennikarza za pomocą tendencyjnego montażu.&lt;br /&gt;&lt;br /&gt;Intencją Dimblebego było poruszenie sumień tragedią dziejącą się w Etiopii, zaś dla każdego jest oczywiste, że efektywna pomoc głodującym ludziom w Etiopii może mieć miejsce tylko we współpracy z władzami tego kraju. Przypuszczając bezpośredni atak na cesarza osiągnie się efekt odwrotny do zamierzonego. Neutralność w sprawach politycznych jest żelazna regułą działania Międzynarodowego Czerwonego Krzyża i wszystkich organizacji niosących pomoc.&lt;br /&gt;&lt;br /&gt;Najwyraźniej Kapuściński własne wypaczone i fałszywe poglądy na temat dziennikarstwa jako sztuki zmyślania i manipulowania przenosi na innych.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-388527264771206527?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/388527264771206527/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_6662.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/388527264771206527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/388527264771206527'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_6662.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6607158369594849681</id><published>2010-05-24T11:48:00.000-07:00</published><updated>2010-05-25T05:28:20.563-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;by mógł czynić zła. A właśnie post osłabia, głodówka pozbawia sił. Taka jest nasza amharska filozofia i o tym pouczają nasi ojcowie. A wszystko to sprawdzone jest w doświadczeniu. Człowiek głodzony przez całe życie nigdy nie będzie się buntować.&lt;br /&gt;..&lt;br /&gt;Tę atmosferę ogólnego zagrożenia wzmagała jeszcze chorobliwa podejrzliwość, jaką żywi każdy Amhara wobec drugiego człowieka (również wobec drugiego Amhary), któremu nigdy nie wolno ufać, wierzyć na słowo, liczyć na niego, bo intencje ludzi są złe i przewrotne, ludzie to spiskowcy. Filozofia Amharów jest&amp;nbsp; pesymistyczna, smutna, dlatego ich spojrzenia są smutne, a przy tym czujne i wypatrujące, twarze mają poważne, rysy napięte, rzadko zdobywają się na uśmiech.&lt;/blockquote&gt;Jest to kompletna bzdura. Nie ma żadnej "amharskiej filozofii" o takiej treści. Tyle w tym sensu co w opowiadaniu, że w Warszawie po ulicach chodzą niedźwiedzie. Filozofia amharska, jak każda inna, podlegała różnym wpływom i tradycjom,&amp;nbsp; jest mieszaniną różnych treści i wpływów, podlegała zmianom na przestrzeni czasów.&lt;br /&gt;&lt;br /&gt;Przykładem XVII wiecznej amharskiej filozofii jest:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Zera_Yacob"&gt;http://en.wikipedia.org/wiki/Zera_Yacob&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wbrew wyobrażeniom Kapuścińskiego nawet Murzyni z Afryki potrafią czytać, pisać, układać dzieła filozoficzne, pisać i czytać poezję, tworzyć sztukę, kulturę, muzykę itp itd. a nie tylko przystrojeni w kolorowe spódniczki biegać wokół bambusa potrząsając dzidami.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6607158369594849681?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6607158369594849681/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_24.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6607158369594849681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6607158369594849681'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_24.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-2111533314918907691</id><published>2010-05-23T15:23:00.000-07:00</published><updated>2010-05-23T15:26:02.655-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt;Czekanie, co jutro się stanie, aż ci nagle pan nasz pozywa doradców,&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc;"&gt; karci ich, że rozwój zaniedbują, i łajankę taką uczyniwszy ogłasza, że będziemy tamy na Nilu stawiać. Jakże tamy stawiać, mruczą wewnątrzbrzusznie skonfundowani doradcy, kiedy prowincje głodują, naród wzburzony, stołowi&lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt; szeptają, żeby cesarstwo poprawić, oficerowie spiskują, notabli aresztują. A zaraz po korytarzach słychać niepokorne szemrania. że lepiej by naszych głodomorów wesprzeć, a owych tam poniechać. Na to pan minister finansów tłumaczy, że jeśli postawi się pomienione tamy, będzie można wodę na pola odpuścić. a taki z tego powstanie urodzaj, że i głodomorów więcej &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;nie będzie. No tak, szemrają ci, co szemrali, ale ile to lat trzeba, żeby tamy postawić, a tymczasem naród z głodu pomrze.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #fff2cc;"&gt; A zaraz pan minister informacji ogłosił postanowienie czcigodnego pana jako nowy sukces i pamiętam nawet, że w okamgnieniu było rozwieszone &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;w stolicy takie hasło - niech no tylko staną tamy, a wszystkim wszystkiego damy, zaś potwarca niech knuje, szczuje rozwoju tam nie zatamuje! Aliści tak ta sprawa rozjuszyła spiskujących oficerów, że radę cesarską, powołaną przez jaśnie najvyższego pana do nadzoru owych tam, w kilka dni później w areszcie osadzili głosząc, że z tego tylko większa korupcja mogłaby wyniknąć i jeszcze gorsze narodu głodzenie.&lt;/span&gt;&lt;/blockquote&gt;W roku 1957 roku Haile Selassie zawarł porozumienie z amerykańskim Bureau Of Reclamation (urzędem do spraw melioracji) (&lt;a href="http://www.usbr.gov/" rel="nofollow"&gt;www.usbr.gov/&lt;/a&gt;) w celu przeprowadzenia badań dotyczących wykorzystania wód Nilu Błękitnego. Badania zakończono w 1964 roku i sporządzonym raporcie wskazano około 20 projektów irygacyjnych (tamy, projekty nawadniające, elektrownie wodne), które przyniosłyby korzyść dla gospodarki Etiopii. Ta współpraca trwała do końca panowania Haile Selassie i oczywiście została przerwana po objęciu władzy przez rząd Mengistu. Szyderstwa i drwiny Kapuściskiego stają się zrozumiałe, gdy sobie uświadomić, że te projekty z oczywistych względów nie podobały się Egiptowi, który w tamtym czasie był sojusznikiem Związku Radzieckiego i przymierzał się do budowy własnej tamy na Nilu w Assuanie, finansowanej w znacznej mierze przez ZSRR.&lt;br /&gt;&lt;br /&gt;Co do owego "gorszego narodu głodzenia" to warto wiedzieć, że właśnie tama na Assuanie uratowała Egipt przed skutkami suszy w latach 1980-ych. Jakie były skutki tej suszy dla Etiopii i Sudanu nie trzeba chyba przypominać. Właśnie od tamtej pory na stałe przylgnął do Etiopii wizerunek kraju ludzi umierających z głodu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-2111533314918907691?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/2111533314918907691/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_4294.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2111533314918907691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2111533314918907691'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_4294.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-1951741386813531034</id><published>2010-05-23T15:18:00.000-07:00</published><updated>2010-07-04T01:33:13.008-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fce5cd;"&gt;Przyjechałem do Addis Abeby w połowie maja 1963 (...) Wiadomość i zaproszenia przywiózł nam do Africa Hall, gdzie spędzaliśmy  dnie i noce w beznadziejnym i szarpiącym nerwy oczekiwaniu na łączność z  naszymi stolicami, miejscowy opiekun, naczelnik z ministerstwa  informacji - właśnie Teferra Gebrewold, wysoki, postawny Amhara, zwykle  milczący i zamknięty.&lt;/span&gt; &lt;/blockquote&gt;&amp;nbsp;Ministerstwo Informacji powstało w Etiopii w 1964 roku (informacja ze strony rządowej).&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Od czasu do czasu zastanowić się nad swoim postępowaniem. I właśnie taki moment nastąpił teraz, kiedy po słowach Svarzżniego zauważyliśmy, że Teferra zbladł, pochylił się i zaczął nerwowo i nieskładnie coś mówić, z czego - w końcu - dało się zrozumieć, że jeżeli złożymy donos, cesarz każe mu ściąć głowę. Powtarzał to i powtarzał. W naszej grupie nastąpił podział. Agitowałem za tym, żeby dać spokój i nie brać człowieka na swoje sumienie. Większość była tego samego zdania i ostatecznie postanowiliśmy, że w rozmowie z cesarzem ominiemy ten temat.&lt;/blockquote&gt;To jakaś kompletna bzdura. Haile Selassie nie wydawał rozkazów "obcięcia głowy" komukolwiek. Kapuściński może przeniósł na czasy Haile Selassiego realia późniejszego okresu, gdy rzeczywiście można było być skazanym na długoletnie więzienie lub karę śmierci nawet za zupełnie błahe przewinienia, jeśli tylko zostały zakwalifikowane jako "kontrrewolucyjne".&lt;br /&gt;&lt;br /&gt;W "Cesarzu" często pojawia się ten motyw "obcinania głowy". Ale to takie typowe zabobony białego człowieka, dla którego w Afryce mieszkają Murzyni, Murzynami rządzi kacyk z maczetą, a jak się zezłości, to obcina tą maczetą głowy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-1951741386813531034?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/1951741386813531034/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_9135.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1951741386813531034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1951741386813531034'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_9135.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-8096884648965760786</id><published>2010-05-23T15:10:00.000-07:00</published><updated>2010-05-25T07:18:48.900-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;div style="background-color: #fff2cc;"&gt;&lt;/div&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Pan nasz zasiadał na tronie i kiedy już usiadł, podsuwałem mu poduszkę pod nogi. Ta czynność musiała być wykonana błyskawicznie, aby nie powstał moment, w którym nogi dostojnego monarchy zawisłyby w powietrzu. Wszyscy wiemy, że pan nasz był niskiej postury, a jednocześnie sprawowane stanowisko wymagało, aby zachował wobec podwładnych wyższość również w sensie ściśle fizycznym,&lt;br /&gt;&lt;br /&gt;e - powiem to z dumą - pan nasz nie mógł się nigdzie ruszyć beze mnie, gdyż jego godność wymagała, aby stale zasiadał na tronie, a na tronie nie mógł zasiadać bez poduszki, a poduszkowym byłem ja. Miałem opanowany w tym względzie specjalny protokół, a nawet posiadałem niesłychanie pożyteczną wiedzę na temat wysokości poszczególnych egzemplarzy tronu, która pozwala, mi szybko i trafnie dobierać poduszki odpowiedniego rozmiaru, tak aby nie doszło do gorszącego niedopasowania: między poduszką a butami cesarza jest jednak szpara!&lt;/blockquote&gt;Haile Selassie był rzeczywiście drobnej budowy i niskiego wzrostu (160 cm), ale cała ta historia to zmyślenie Kapuścińskiego.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://video.google.com/videoplay?docid=-1845622330460884817#"&gt;http://video.google.com/videoplay?docid=-1845622330460884817#&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pod tym adresem można obejrzeć film z wizyty Haile Selassiego na Jamajce w 1966 roku. Widać tam siedzącego cesarza, nie ma żadnej poduszki ani "poduszkowego" i nie widać żadnego powodu, dla którego taki dziwoląg miałby istnieć.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-8096884648965760786?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/8096884648965760786/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_4005.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/8096884648965760786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/8096884648965760786'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_4005.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-5458984287132024372</id><published>2010-05-23T15:03:00.000-07:00</published><updated>2010-05-23T15:03:17.446-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz" &lt;br /&gt;&lt;blockquote&gt; &lt;span style="background-color: #fff2cc;"&gt;F. To był mały piesek rasy japońskiej. Nazywał się Lulu. Miał prawo spać w łożu cesarskim. W czasie różnych ceremonii uciekał cesarzowi z kolan i siusiał dygnitarzom na buty. Panom dygnitarzom nie wolno było drgnąć ani zrobić &lt;/span&gt;&lt;span style="background-color: #fff2cc;"&gt;żadnego gestu, kiedy poczuli, że mają mokro w bucie. Moją funkcją było chodzić między stojącymi dygnitarzami i ocierać im mocz z butów. Do tego służyła ściereczka z atłasu. To było moim zajęciem przez dziesięć lat.&lt;/span&gt;&lt;/blockquote&gt;To zmyślenie Kapuścińskiego. Może i Haile Selassie lubił pieski, ale na pewno nawet najbardziej ulubiony piesek cesarza sikał tam, gdzie pieski powinny sikać.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-5458984287132024372?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/5458984287132024372/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_2520.html#comment-form' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5458984287132024372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/5458984287132024372'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_2520.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-8354873792427087768</id><published>2010-05-23T15:00:00.000-07:00</published><updated>2010-05-23T15:00:39.575-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Widzę go teraz, jak idzie, przystaje, podnosi do góry twarz, jakby pogrążył się w modlitwie. O Boże, wybaw mnie od tych, co czołgając się na kolanach skrywają nóż, który chcieliby wbić w moje plecy. Ale co Pan Bóg może pomóc? &lt;/blockquote&gt;Jest to jakaś bzdura. Modlitwa Haile Selassiego na pewno tak nie wyglądała. Wystarczy porównać.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://people.zeelandnet.nl/adamr/Interview%20with%20Dr%20Oswald%20Hoffman,dec%2025,1968.htm"&gt;http://people.zeelandnet.nl/adamr/Interview%20with%20Dr%20Oswald%20Hoffman,dec%2025,1968.htm&lt;/a&gt;&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Cesarz rozpoczynał dzień od słuchania donosów.&lt;/blockquote&gt;To zmyślenie Kapuścińskiego. Haile Selassie zawsze demonstrował głęboką religijność. Dzień zaczynał od modlitwy i lektury Biblii.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-8354873792427087768?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/8354873792427087768/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_5492.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/8354873792427087768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/8354873792427087768'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_5492.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-2655319123514202773</id><published>2010-05-23T00:50:00.000-07:00</published><updated>2010-07-11T00:01:19.334-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz" &lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;"przezacny pan" &lt;br /&gt;"dobrotliwy monarcha"&lt;br /&gt;"dostojnego pana"&lt;br /&gt;"jaśnie wielmożnego pana"&lt;br /&gt;"najjaśniejszego pana"&lt;br /&gt;"jaśnie oświeconego pana"&lt;br /&gt;"pana mojego wszystkowładnego"&lt;br /&gt;"najosobliwszego pana."&lt;br /&gt;"prześwietnego pana"&lt;br /&gt;"wnikliwego pana"&lt;br /&gt;"nasz wszechwładca"&lt;br /&gt;"dostojny wszechwładca"&lt;br /&gt;"Najosobliwszy nasz władca"&lt;/blockquote&gt;Takimi tytułami obdarzają anonimowi rozmówcy Kapuścińskiego swojego władcę.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.richardwebster.net/johnryle.html"&gt;http://www.richardwebster.net/johnryle.html&lt;/a&gt;&lt;br /&gt;Według informacji tam zawartej w języku amharskim nie istnieją żadne odpowiedniki tego typu tytułów. Na dworze sposób zwracania się czy odnoszenia się do monarchy był ściśle sformalizowany i jest niepodobne, aby rozmówcy Kapuścińskiego, oddani ludzie dworu i cesarza, nawet w nieformalnej rozmowie wymyślali sobie jakąś prywatną tytułologię, czy żeby takie zwroty pojawiły się nawet w najbardziej dowolnym tłumaczeniu.&lt;br /&gt;&lt;br /&gt;Oficjalne tytuły należne cesarzowi można znaleźć&amp;nbsp; w&amp;nbsp;&lt;a href="http://books.google.pl/books?id=ep7__RWqq4IC&amp;amp;pg=PA299&amp;amp;lpg=PA299&amp;amp;dq=Negash+Bezabeh&amp;amp;source=bl&amp;amp;ots=JAGQUJvYE3&amp;amp;sig=9VIea8LrTBQlSvsXFrD0hKdg4Cw&amp;amp;hl=pl&amp;amp;ei=oU34S56KB5ySOO2JrZUM&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=4&amp;amp;ved=0CCoQ6AEwAw#v=onepage&amp;amp;q=imperial%20titles&amp;amp;f=false"&gt;Google Book.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"negus nagast" - Król Królów&lt;br /&gt;"atse" - cesarz&lt;br /&gt;"Zwycięski Lew Plemienia Judy"&lt;br /&gt;"Wybraniec Boga".&lt;br /&gt;&lt;br /&gt;W języku polskim odpowiednią formą będzie "Jego Wysokość" czy "Jego Cesarska Wysokość". Jak widać, ma to niewielki związek ze zmyśleniami Kapuścińskiego.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Profesor John Ryle pisze dalej:&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;an imaginary archaic language, with touches of comic opera, one that bespeaks homage while conveying subversion. (wymyślony, archaiczny język, jakby trochę z opery komicznej, który jednocześnie jest złożeniem hołdu i poddaństwa).&lt;/blockquote&gt;Ale my oczywiście doskonale rozpoznajemy ten "archaic language". To po prostu kwiecisty, barokowy język siedemnastowiecznej polskiej szlachty, charakterystyczne dla polskiej mentalności połączenie uniżoności z czułością i przywiązaniem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-2655319123514202773?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/2655319123514202773/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_640.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2655319123514202773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2655319123514202773'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_640.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-8558211225553950439</id><published>2010-05-23T00:34:00.000-07:00</published><updated>2010-05-23T00:34:56.528-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;ściąć go należy. Ale i generał szukał, a - widać - nie znalazł. A błahe zdarzenie na tym polegało, że amerykański korpus pokoju zrobił na uniwersytecie pokaz najnowszej mody, choć wszelkie zebrania, spotkania były zakazane. Ale Amerykanom dostojny pan nie mógł przecież pokazu odmówić i oto tę pogodną i jakże beztroską imprezę studenci wykorzystali, żeby zebrać się w olbrzymi tłum i ruszyć na pałac. A od tej chwili już nie dali zapędzić się do domów, już wiecowali, zajadle i porywczo szturmowali, już więcej nie ustępowali.&lt;/blockquote&gt;"Historia Etiopii"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;(W roku 1967) Rzeczywistą przyczyną była sprawa dekretu o reformie rolnej. Wielu studentów pochodzących ze wsi uważali, że ten dekret nie rozwiązuje rzeczywistych problemów wsi. Nauczeni jednak doświadczeniem, przywódcy studenccy szukali takiego pretekstu do demonstracji, którego rząd nie mógłby poczytać za polityczny i który przyciągnąłby mało aktywnych w sprawach publicznych kolegów. Uznali mianowicie za obrażający dla etiopskiej kultury i tradycji pokaz mody mini zorganizowany na terenie uniwersytetu przez młodą wykładowczynię z USA. Władze uczelni - zgodnie ze studenckimi przewidywaniami - nie chciały zakazać pokazu z przytaczanych przez studentów motywów. Studenci natychmiast zorganizowali bojkot zajęć. Wkrótce nastroje rozgrzały się i tłumy studentów ruszyły ulicami Addis Adeby.&amp;nbsp;&lt;/blockquote&gt;Jest faktem, że pokaz mody był przyczyną studenckich zamieszek, ale cała reszta jest jak w słynnym pytaniu do Radia Erewań.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-8558211225553950439?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/8558211225553950439/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_2312.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/8558211225553950439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/8558211225553950439'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_2312.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-9103259982920146825</id><published>2010-05-23T00:27:00.000-07:00</published><updated>2010-05-23T00:28:02.956-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;arystokratów, biurokratów i tak zwanych ludzi osobistych. Frakcja arystokratów, skrajnie konserwatywna i składająca się z wielkich posiadaczy ziemskich, grupowała się głównie w Radzie koronnej, a jej przywódcą był rozstrzelany już książę Kassa. Dostojny pan, zwolennik silnego państwa i władzy centralnej, musiał toczyć przebiegłą i zręczną walkę z koterią arystokratów, która chciała rządzić prowincjami i mieć słabego, powolnego cesarza.&lt;/blockquote&gt;"Historia Etiopii" strona 456&lt;br /&gt;&lt;blockquote&gt;&lt;div style="background-color: #fff2cc;"&gt;Zdaje się, że tylko ras Asrate Kassa, potomek dynastii szeuańskiej i wpływowy polityk miał perspektywistyczną wizję działań rządu. W rozmowie, jaka odbyła się 28 lutego, ras Asrate Kassa twierdził, że sytuacja wewnętrzna Etiopii jest zbyt poważna, aby można ją było rozwiązać kolejnymi zmianami personalnymi, odbywającymi się na dodatek w obrębie tej samej grupy osób. Jego zdaniem cesarz powinien zawiesić konstytucję, rozwiązać parlament, objąć stanowisko premiera i rozpocząć pracę nad nową konstytucją, który by odzwierciedlała idee, jakie niosą nowe czasy. Trudno zrozumieć, dlaczego cesarz nie wziął pod uwagę sugestii rasa Asrata Kassy i zajął się powoływaniem nowego gabinetu.&lt;/div&gt;&lt;/blockquote&gt;Jak widać, intencje księcia Kassy były całkowicie przeciwstawne do tego, co podaje Kapuściński.&lt;br /&gt;&lt;br /&gt;Kapuściński sfałszował i przekręcił całe tło tego konfliktu, aby narzucić czytelnikowi wizję cesarza, który w obliczu klęski głodu i narastającego niezadowolenia jest jedynie zainteresowany utrzymaniem swojej władzy.&lt;br /&gt;&lt;br /&gt;Dodatkowo w negatywnym świetle przedstawiony jest tutaj ras Kassa. W książce Kapuścińskiego cesarz i jego otoczenie to ludzie głupi, bezmyślni, tchórzliwi, podstępni, zainteresowani jedynie napychaniem kieszeni.&lt;br /&gt;&lt;br /&gt;"Historia Etiopii"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Warto wiedzieć, że kilka godzin wcześniej ras Asrate Kassa został ostrzeżony o mającym nastąpić aresztowaniu, ale mimo nalegań rodziny, aby się schronił na prowincji, ras nie wyraził na to zgody. Duma nie pozwoliła mu na ucieczkę. &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-9103259982920146825?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/9103259982920146825/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_856.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/9103259982920146825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/9103259982920146825'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_856.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-6800321620836374980</id><published>2010-05-23T00:13:00.000-07:00</published><updated>2010-05-23T00:15:16.378-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Że w obliczu inwazji włoskiej publicznie poprzysiągł przelewać krew za Etiopię, po czym, kiedy tamci wtargnęli, udał się statkiem do Anglii i spędził wojnę w spokojnym miasteczku Bath. A taki , później wytworzył się w nim kompleks wobec wodzów partyzanckich, którzy zostawszy w kraju walczyli z Włochami, że kiedy wrócił na tron, stopniowo likwidował ich lub odsuwał, zarazem dając fawory kolaborantom.&lt;/blockquote&gt;"Historia Etiopii"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Tworząc aparat władzy centralnej i regionalnej cesarz balansował pomiędzy przedstawicielami różnych ugrupowań. Niektórym&amp;nbsp; przywódcom ruchu oporu nadał wysokie tytuły i stanowiska w państwie. Jednocześnie łagodnie traktował dygnitarzy współpracujących z Włochami w czasie okupacji.&lt;/blockquote&gt;&amp;nbsp;Skutkiem włoskiej okupacji były głębokie podziały w etiopskim społeczeństwie i cesarz po wypędzeniu okupantów i odzyskaniu władzy dążył do zniwelowania tych podziałów. Oczywiście - czy wszystkie decyzje jakie podejmował były słuszne - to kwestia dyskusyjna, ale widać wyraźnie, że informacja przekazana przez Kapuścińskiego jest fałszywa.&lt;br /&gt;&lt;br /&gt;Jest całkowitym zmyśleniem i kłamstwem Kapuścińskiego, że cesarz "przysiągł przelewać krew za Etiopię" i potem spokojnie wyjechał do wód.&lt;br /&gt;&lt;br /&gt;"Historia Etiopii" strona 386&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Kiedy Hajle Selassie przybył do Addis Abeby (po klęsce armii etiopskiej pod Majczeu 2 IV 1936 roku), powstały tutaj dwie koncepcje co do sposobów dalszego prowadzenie walki. Jedna koncepcja, reprezentowana m.in przez (...) przewidywała przeniesienie całego rządu do Gorie i kontynuowanie wojny przy użyciu metod walki partyzanckiej. (...) Cesarz początkowo skłaniał się ku temu rozwiązaniu. Później przeważyło jednak zdanie reprezentowane przez (...), którzy uważali,&amp;nbsp; że Haile Selassie wraz z częścią swojego rządku powinien się udać do Europy, aby tam na forum międzynarodowym bronić sprawy etiopskiej. (...) W czasie głosowania w radzie ministrów 21 osób opowiedziało się za wyjazdem cesarza do Europy, 3 głosowały przeciwko.&lt;/blockquote&gt;Czy Haile Selassie podjął prawidłową decyzję o wyjeździe do Europy to sprawa, co do której można mieć różne opinie.&lt;br /&gt;&lt;br /&gt;Ale jest oczywiste, że Kapuściński całkowicie przeinaczył i sfałszował całe tło tego dylematu, aby czytelnikowi narzucić wizerunek cesarza jako człowieka fałszywego, tchórzliwego i podstępnego.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-6800321620836374980?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/6800321620836374980/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_23.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6800321620836374980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/6800321620836374980'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_23.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-577238484841065198</id><published>2010-05-22T23:53:00.000-07:00</published><updated>2010-05-22T23:54:11.921-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Był jednak w pałacu i taki wypadek: jeden z najbardziej szlachetnych&lt;br /&gt;naszych patriotów, wielki wódz partyzancki w latach wojny z Mussolinim - Tekele Wolda Hawariat, niechętny cesarzowi, odmawiał przyjmowania najmiłościwszych darowizn, odrzucał przywileje i nigdy nie wykazywał skłonności do korupcji. Tego miłościwy pan nasz kazał latami więzić, a potem ściąć.&lt;/blockquote&gt;"Historia Etiopii" strona 518&lt;br /&gt;&lt;blockquote&gt;&lt;span style="background-color: #fff2cc;"&gt;Takele Uelde Hauarjat (zm. 27 XI 1969) dyplomata i polityk etiopski, wybitny uczestnik ruchu oporu 1936-1941, wieloletni przyjaciel cesarza Hajle Selassie, często z nim w niezgodzie, posądzony o zorganizowanie spisku antycesarskiego popełnił samobójstwo w Sebatto nie dając się ująć policji.&lt;/span&gt;&lt;/blockquote&gt;Bardziej szczegółową informację można znaleźć w&amp;nbsp;&lt;a href="http://books.google.pl/books?id=ySgCTIplVQ8C&amp;amp;pg=PA239&amp;amp;lpg=PA239&amp;amp;dq=Takele+Wolde&amp;amp;source=bl&amp;amp;ots=Vo2bLMXxIW&amp;amp;sig=UA_e1B_sZbSwN-tBQIBgFbJOEyc&amp;amp;hl=pl&amp;amp;ei=6c74S_uGIcuTOOLqhJUM&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=4&amp;amp;ved=0CCQQ6AEwAw#v=onepage&amp;amp;q=Takele%20Wolde&amp;amp;f=false"&gt;Google Books&lt;/a&gt;.&amp;nbsp; Takele Wolde Hawariat nigdy nie wybaczył cesarzowi wyjazdu do Europy w 1936 roku ("Historia Etiopii" strona 386, był jedną z trzech osób - na 21 - które głosowały przeciwko wyjazdowi cesarza z kraju), po wojnie był kilkakrotnie sądzony i ułaskawiany przez cesarza za spiskowanie. W listopadzie 1969 roku zaminował most w Sebatto, który cesarz zwykł przekraczać udając się na weekendy. Spisek się nie powiódł i Takele Wolde zginał otoczony przez policję.&lt;br /&gt;&lt;br /&gt;Jak widać, Kapuściński całkowicie przeinaczył tę historię, aby narzucić czytelnikowi swoją opinię o cesarzu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-577238484841065198?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/577238484841065198/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_3334.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/577238484841065198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/577238484841065198'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_3334.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-761267553641605984</id><published>2010-05-22T15:01:00.000-07:00</published><updated>2010-05-22T15:01:18.020-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;I że między innymi w ten sposób zgładził wielkiego wodza Betwodeda Negasza, który w latach pięćdziesiątych wystąpił przeciw cesarzowi i chciało &lt;span id="goog_937620931"&gt;&lt;/span&gt;&lt;span id="goog_937620932"&gt;&lt;/span&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;głosić republikę.&lt;/blockquote&gt;&lt;a href="http://books.google.pl/books?id=ep7__RWqq4IC&amp;amp;pg=PA299&amp;amp;lpg=PA299&amp;amp;dq=Negash+Bezabeh&amp;amp;source=bl&amp;amp;ots=JAGQUJvYE3&amp;amp;sig=9VIea8LrTBQlSvsXFrD0hKdg4Cw&amp;amp;hl=pl&amp;amp;ei=oU34S56KB5ySOO2JrZUM&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=4&amp;amp;ved=0CCoQ6AEwAw#v=onepage&amp;amp;q=Negash%20Bezabeh&amp;amp;f=false"&gt;Link do Google Books&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;W wyniku nieudanego spisku Betewoded Negash Bezabeh został skazany na śmierć, ale cesarz go ułaskawił. Zmarł na wygnaniu w Jemenie w 1964 roku.&lt;br /&gt;&lt;br /&gt;Kapuściński całkowicie przeinaczył ten fakt, aby zbudować wizerunek cesarza, który chcąc zamazać własne nieczyste sumienie prześladował bohaterów wojny przeciwko Włochom.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-761267553641605984?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/761267553641605984/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_5592.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/761267553641605984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/761267553641605984'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_5592.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-2063421558162717426</id><published>2010-05-22T15:00:00.001-07:00</published><updated>2010-05-22T15:00:37.453-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Pan nasz nie miał szkół, jego jedynym nau czycielem - i to tylko w dzieciństwie - był francuski jezuita monsignore Jerome, późniejszy biskup Hararu i przyjaciel poety Arthura Rimbauda. Duchowny ten nie zdążył wpoić cesarzowi nawyku czytania, co zresztą było tym trudniejsze, że Hajle Sellasje już od lat chłopięcych zajmował&amp;nbsp; odpowiednie stanowiska kierownicze i nie miał czasu ma systematyczne lektury. Ale wydaje mi się, że chodziło nie tylko o brak czasu i nawyku. (...) Podobnie było z pisaniem, bo monarcha nasz nie tylko nie korzystał z umiejętności czytania, ale także nic nie pisał i niczego własnoręcznie nie podpisywał. Choć rządził przez pół wieku, nawet najbliżsi nie wiedzą, jak wyglądał jego podpis.&lt;/blockquote&gt;&amp;nbsp;Jest to całkowita bzdura i zmyślenie. Haile Selassie oprócz ojczystego amharskiego znał także język gyyz, biegle władał francuskim, znał także angielski.&amp;nbsp; Miał dużą prywatną bibliotekę, gdzie spędzał dużo czasu, na marginesach książek które czytał nanosił notatki. Ostatnie znane zdjęcie cesarza (już uwięzionego) pokazuje go pochylonego nad książką. Wyobrażenie, że otoczenie nie wiedziało jak wyglądał jego podpis jest kompletnym nonsensem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-2063421558162717426?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/2063421558162717426/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_7822.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2063421558162717426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/2063421558162717426'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_7822.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-4755151768259341722</id><published>2010-05-22T15:00:00.000-07:00</published><updated>2010-05-22T15:22:14.915-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Dlatego też, jeżeli zręczny i rozumny minister chciał na swoim podwórku dokonać bodaj najmniejszej reformy, musiał tak pokierować sprawą, tak ją przedstawić cesarzowi, tak oświetlić i formułować, aby wynikało w sposób niezbity, uznany i oczywisty, że łaskawym i troskliwym inicjatorem, twórcą i orędownikiem reformy jest osobiście jego cesarska mość, choćby w rzeczywistości pan nasz niezupełnie orientował się, o co w całej sprawie dokładnie chodzi. Ale przecież nie wszyscy ministrowie mieli rozum! Zdarzali się ludzie młodzi, nie obyci z tradycją pałacu i ci, kierując się własną ambicją, a także pragnąc zdobyć uznanie ludu - jak gdyby uznanie cesarskie nie było jedynym wartym zabiegów! - samowolnie próbowali ten czy inny drobiazg zreformować. Jakby nie wiedzieli, że łamią w ten sposób zasadę lojalności i grzebią nie tylko siebie, ale także samą reformę, która nie mając cesarskiego autorstwa nigdy nie miała szansy ujrzeć światła dziennego. Powiem otwarcie, że dobrotliwy pan wolał złych ministrów. A wolał dlatego, że pan nasz lubił korzystnie kontrastować. A jakżeby mógł korzystnie kontrastować, gdyby był otoczony przez dobrych ministrów? Lud straciłby orientację, u kogo szukać pomocy, na czyją dobroć i mądrość liczyć. Wszyscy byliby dobrzy i mądrzy. Jakiż bałagan zacząłby się wówczas w cesarstwie! Zamiast jednego słońca, świeciłoby pięćdziesiąt i każdy oddawałby hołd prywatnie wybranej planecie.&lt;/blockquote&gt;"Historia Etiopii" strona 445.&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;W latach sześćdziesiątych obserwujemy więc proces usamodzielnienia się administracji państwowej od codziennej kontroli i wpływów cesarza. On sam zresztą zaczął nawoływać do tego, upatrując w ciągłym szukaniu przez ministrów jego akceptacji dla dokonywania drobny nawet posunięć przyczyn niesprawności funkcjonowania ministerstw. W 1966 cesarz prawnie usankcjonował oderwania decyzji w sprawach pracy ministerstw od swojej osoby. &lt;/blockquote&gt;"Historia Etiopii" strona 446&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;"W parlamencie w latach sześcdziesiątych wpływ cesarza na bieg wydarzeń zmalał równie poważnie. (...) Podobnie jak rząd, parlament lat sześćdziesiątych przestał być przedłużeniem władzy i woli cesarza.&lt;/blockquote&gt;&lt;br /&gt;Jak widać, Kapuściński całkowicie zafałszował charakter udziału cesarza we władzy przypisując mu intencje sprzeczne z faktami. Poprzez przeinaczenie rzeczywistości zbudował wizerunek monarchy, dla którego jakaś gra pozorów była ważniejsza niż los i dobrobyt własnych poddanych.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-4755151768259341722?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/4755151768259341722/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_2547.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4755151768259341722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4755151768259341722'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_2547.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-4744254250545732400</id><published>2010-05-22T14:56:00.000-07:00</published><updated>2010-05-22T14:58:15.605-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>"Cesarz"&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;A weźmy taką postać jak książę Imru. Była to może najwybitniejsza indywidualność w elicie, człowiek godzien najwyższych zaszczytów i stanowisk.&lt;br /&gt;Cóż z tego, kiedy - jak wspomniałem - łaskawy pan nigdy nie kierował się zasadą zdolności, tylko zawsze i wyłącznie zasadą lojalności. Otóż nie wiadomo skąd i dlaczego książę Imru zaczął nagle pachnieć reformą i nie pytając cesarza o zgodę rozdał chłopom część swojej ziemi. A więc - zmilczając coś przed cesarzem i działając na własną rękę - w sposób drażniący i wręcz wyzywający złamał zasadę lojalności. I oto dobrotliwy pan, który gotował dla księcia wysoce zaszczytny urząd, musiał wyrzucić go z kraju i trzymał go na obczyźnie przez dwadzieścia lat. Tu zaznaczę, że pan nasz nie był przeciwko reformom, odwrotnie - zawsze odnosił się z sympatią do postępu i poprawy, ale nie mógł ścierpieć, żeby ktoś brał się do reform na własną rękę, bo to po pierwsze stwarzało groźbę dowolności i anarchią, a po drugie - mogło wywołać wrażenie, że w cesarstwie istnieją jacyś inni dobrotliwcy poza dostojnym panem.&lt;/blockquote&gt;&lt;a href="http://en.wikipedia.org/wiki/Mikael_Imru"&gt;http://en.wikipedia.org/wiki/Mikael_Imru&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mikael Imru uwłaszczył swoich chłopów (nie ma tego w notce w Wikipedii, ale ta informacja jest także zawarta w "Historii Etiopii" strona 458). Ale życiorys zawarty w Wikipedii żadną miarą nie jest życiorysem człowieka będącego w niełasce cesarza. Był spokrewniony z cesarzem i należał do wąskiego kręgu przyjaciół Haile Sellasie. Kapuściński pominął fakt, że 25 lipca 1974 Haile Selassie - pod naciskiem Dergu - mianował Mikaela Ymru premierem.&lt;br /&gt;&lt;br /&gt;Kapuściński całkowicie przeinaczył rodzaj relacji łączącej Mikaela Ymru z cesarzem, aby zbudować wizerunek monarchy mającego bardzo osobliwe pojmowanie słów "postęp" i "reformy".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-4744254250545732400?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/4744254250545732400/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_22.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4744254250545732400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/4744254250545732400'/><link rel='alternate' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz_22.html' title='Cesarz'/><author><name>Stanisław</name><uri>http://www.blogger.com/profile/09580030186766542992</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2399759103741849897.post-1462830956356920321</id><published>2010-05-22T14:54:00.000-07:00</published><updated>2010-05-25T05:21:36.257-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cesarz'/><title type='text'>Cesarz</title><content type='html'>&lt;span id="goog_238955893"&gt;&lt;/span&gt;&lt;span id="goog_238955894"&gt;&lt;/span&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;"Cesarz" Kapuścińskiego był zawsze jedną z moich ulubionych lektur. Uważałem tę książkę za arcydzieło. Było dla mnie także oczywiste, że nie należy tej książki traktować jako podręcznika do historii Etiopii czy źródła wiedzy na temat panowania cesarza Haile Selassie. Jednak zawsze sądziłem, że w warstwie faktograficznej książka jest prawdziwa, Kapuściński dotarł do rozmówców należących do dworu obalonego monarchy i wiernie przekazał ich relacje. Zaś dzięki swojemu talentowi literackiemu i zmysłowi obserwacyjnemu stworzył unikalne dzieło. Z jednej strony książka pokazuje mało chwalebny wizerunek monarchy, zaś z drugiej strony jest uniwersalną opowieścią o tym,&amp;nbsp; jak tyrania i władza absolutna deprawuje, deformuje i wyniszcza wszystko, co znajduje się w jej kręgu.&lt;br /&gt;&lt;br /&gt;Jak wiadomo, od pewnego czasu pojawiają wątpliwości dotyczące rzetelności czy ścisłości Kapuścińskiego jako reportera. Ma to związek z publikacją książki Artura Domosławskiego "Kapuściński non-fiction". Sledziłem dyskusje wywołane tą książką, ale samej książki nie czytałem i nie zamierzam tego robić. Zaznaczam także, że kompletnie mnie nie interesują fakty dotyczące prywatnego życia zmarłego pisarza, czy informacje o jego kontaktach z tajnymi służbami za czasów PRL. Ci co są sami bez grzechu niech piorunują czy płoną świętym oburzeniem.&lt;br /&gt;&lt;br /&gt;Z uwagą przeczytałem wywiad z wnukiem cesarza&amp;nbsp;&lt;a href="http://www.rp.pl/artykul/456305__Cesarz__nie_jest__o_moim_dziadku.html"&gt;„Cesarz” nie jest o moim dziadku&lt;/a&gt; księciem Ermiasem Sahle Selassje zamieszczony w "Rzeczpospolitej"&amp;nbsp; dnia 2 kwietnia 2010. Oczywiście, do tego co mówi książę należy także się odnosić ostrożnie. Nie jest dobrym pomysłem bezkrytyczne zamienianie czarnej legendy Haile Selassie jaką znajdziemy w książce Kapuścińskiego na propagandę sukcesu roztaczaną przez księcia.&lt;br /&gt;&lt;br /&gt;Natomiast lektura tego wywiadu zwróciła moją uwagę na fakt, który do tej pory mi umykał. Przecież akcja "Cesarza" nie dzieje się w próżni, ani na bezludnej wyspie, ani w jakiejś fikcyjnej rzeczywistości. Dzieje się w rzeczywistym kraju, określonym czasie i głównym bohaterem jest postać autentyczna. Jeśli informacje Kapuścińskiego nie są ścisłe, to w ten sposób jest wyrządzana krzywda pamięci tego monarchy.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Zacząłem więc weryfikować informacje zawarte w książce i wynik prawdziwie mną wstrząsnął. Nie chodzi mi wcale o jakieś pomyłki czy nieścisłości. Wszyscy się mylimy i popełniamy błędy. Mam także tolerancję do zabiegu literackiego, jeśli autor coś nawet doda czy uzupełni aby efekt uczynić bardziej przekonywującym. Coś jak stoimy przed obrazem i gdzieś dodamy brakującą kreskę czy dopełnimy kontur. Nie o to tutaj chodzi.&lt;br /&gt;&lt;br /&gt;Kapuściński tę cienką linię dzielącą lekkie dopełnianie rzeczywistości, a tworzenie zupełnie nowej przekroczył, i to całe lata świetlne. Co gorsza, nie chodzi tutaj nawet o budowanie fikcji. To nie jest fikcja, a celowe fałszowanie i przeinaczanie.&lt;br /&gt;&lt;br /&gt;Często się podkreśla, że "Cesarz" powinien być odbierany jako krytyka czasów Gomułki lub Gierka czy mechanizmów dyktatury w bardziej uniwersalnym znaczeniu. Ja jednak nie rozumiem, dlaczego w celu krytyki władzy totalitarnej trzeba fałszować i przeinaczać wizerunek cesarza Etiopii. To, że jest to czarnoskóry władca egzotycznego kraju wcale nie oznacza, że możemy go traktować jak bożonarodzeniową choinkę, którą sobie dowolnie przystrajamy czy dekorujemy według naszych prywatnych upodobań lub gustów.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wyborcza.pl/kapuscinski/1,104867,7500812,Cesarz.html"&gt;http://wyborcza.pl/kapuscinski/1,104867,7500812,Cesarz.html&lt;/a&gt; . Tutaj znajdujemy wypowiedź Kapuścińskiego na temat "Cesarza".&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Miałem mnóstwo relacji. Cały problem był w selekcji, strukturze.&lt;/blockquote&gt;&lt;div id="TixyyLink" style="background-color: transparent; border: medium none; color: black; overflow: hidden; text-align: left; text-decoration: none;"&gt;Autor tutaj wyraźnie podkreśla, że wszystko jest oparte na autentycznych relacjach, że wręcz to co się znalazło w książce to wybór z większej całości. Nie ma nawet cienia aluzji, że trzeba ostrożnie podchodzić do warstwy faktograficznej. Nie jest mi znana także żadna wypowiedź Kapuścińskiego, który by to sugerowała.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kapuscinski.info/wywiady/86,antyciala.html"&gt;Antyciała Autor: Andrzej Skworz&lt;/a&gt;&lt;br /&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Mówi Pan czasem, że reporter samym sobą zaświadcza o prawdziwości tekstu. A co wtedy, gdy zdarzy mu się pomylić bądź przeinaczyć fakty?&lt;br /&gt;&lt;br /&gt;Kapuściński: Nie stwarzam fikcji. Gdybym umiał pisać fikcję, nie musiałbym uprawiać ciężkiego zawodu reportera.&amp;nbsp; &lt;/blockquote&gt;&lt;blockquote style="background-color: #fff2cc;"&gt;Częściej poprawiają Pana tłumacze niż redaktorzy?&lt;br /&gt;&lt;br /&gt;Kapuściński: Dużo częściej, bo uważniej czytają. Redaktorzy jakoś specjalnie nie ingerują. Zresztą nie mam z błędami wielkich problemów, bo nigdy nie odnoszą się do meritum sprawy. Zwykle dotyczą jakiegoś drobiazgu, detalu. &lt;/blockquote&gt;&lt;/div&gt;&lt;div id="TixyyLink" style="background-color: transparent; border: medium none; color: black; overflow: hidden; text-align: left; text-decoration: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="TixyyLink" style="background-color: transparent; border: medium none; color: black; overflow: hidden; text-align: left; text-decoration: none;"&gt;Jednym z moich źródeł jest książka: Andrzej Bartnicki, Joanna Mantel-Niećko "Historia Etiopii". Wydawca: Zakład Narodowy im. Ossolińskich, Wrocław 1987.&lt;/div&gt;&lt;div id="TixyyLink" style="background-color: transparent; border: medium none; color: black; overflow: hidden; text-align: left; text-decoration: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="TixyyLink" style="background-color: transparent; border: medium none; color: black; overflow: hidden; text-align: left; text-decoration: none;"&gt;W języku polskim jest niestety wielkie ubóstwo publikacji o tej tematyce. "Historia Etiopii" ma charakter popularno-naukowy, kończy się na roku 1974. Jeśli jednak ktoś jest zainteresowany pogłębieniem swojej wiedzy na temat Etiopii jest to z całą pewnością lektura, od której warto zacząć.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2399759103741849897-1462830956356920321?l=hoteljavaopensource.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hoteljavaopensource.blogspot.com/feeds/1462830956356920321/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://hoteljavaopensource.blogspot.com/2010/05/cesarz.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1462830956356920321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2399759103741849897/posts/default/1462830956356920321'/><link rel='alternate' type='text/html' href='http://hoteljav
