<?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:blogger='http://schemas.google.com/blogger/2008' 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-1100449670278139755</id><updated>2024-10-24T16:56:49.467+02:00</updated><category term="Alfresco"/><category term="JSP"/><category term="Lucene"/><category term="Spring"/><category term="JSF"/><category term="JackRabbit"/><category term="Jasper Reports"/><category term="Maven"/><category term="Monitoring"/><category term="Tomcat"/><category term="iReport"/><title type='text'>Public Methods - Notatnik Kodera</title><subtitle type='html'>Pragmatycznie o Javie, J2EE i Open Source</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://publicmethods.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://publicmethods.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jakub Woźniakowski</name><uri>http://www.blogger.com/profile/05239465453605577167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1100449670278139755.post-4401140120657362695</id><published>2010-02-12T18:48:00.004+01:00</published><updated>2010-02-12T18:54:26.604+01:00</updated><title type='text'>The only valid measurement of code quality</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3gzP6rvTg-w_70HFNlV-lLzsn8NfXyCWqqPY2kFEy3feUj-FDNchX3Hu2fQzW6iYFqFZpJi3ZJ_ZTtkNU8CyFrJQ98juaQI7q-MidG8TygF8Dfe4Vt9EweMmku1q3k1eIuhRo9CMsNDY/s1600-h/wtfm.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;
&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3gzP6rvTg-w_70HFNlV-lLzsn8NfXyCWqqPY2kFEy3feUj-FDNchX3Hu2fQzW6iYFqFZpJi3ZJ_ZTtkNU8CyFrJQ98juaQI7q-MidG8TygF8Dfe4Vt9EweMmku1q3k1eIuhRo9CMsNDY/s400/wtfm.jpg&quot; style=&quot;display: block; margin: 0px auto 10px; text-align: center;&quot;  /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.osnews.com/story/19266/WTFs_m&quot;&gt;http://www.osnews.com/story/19266/WTFs_m&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicmethods.blogspot.com/feeds/4401140120657362695/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1100449670278139755/4401140120657362695?isPopup=true' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/4401140120657362695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/4401140120657362695'/><link rel='alternate' type='text/html' href='http://publicmethods.blogspot.com/2010/02/only-valid-measurement-of-code-quality.html' title='The only valid measurement of code quality'/><author><name>Jakub Woźniakowski</name><uri>http://www.blogger.com/profile/05239465453605577167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3gzP6rvTg-w_70HFNlV-lLzsn8NfXyCWqqPY2kFEy3feUj-FDNchX3Hu2fQzW6iYFqFZpJi3ZJ_ZTtkNU8CyFrJQ98juaQI7q-MidG8TygF8Dfe4Vt9EweMmku1q3k1eIuhRo9CMsNDY/s72-c/wtfm.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1100449670278139755.post-7039654802793033458</id><published>2009-11-25T10:13:00.014+01:00</published><updated>2009-11-25T10:34:25.278+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JSF"/><category scheme="http://www.blogger.com/atom/ns#" term="JSP"/><category scheme="http://www.blogger.com/atom/ns#" term="Maven"/><title type='text'>Tag Library Documentation Generator + Maven</title><content type='html'>Kolejne narzędzie ułatwiające pracę, a właściwie dwa. 

&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://taglibrarydoc.dev.java.net/&quot;&gt;Tag Library Documentation Generator&lt;/a&gt; potrafi tworzyć javadoc&#39;a bibliotek tagów JSP na podstawie opisów zawartych w plikach .tld i .tag. Obsługuje tagi JSP 1.2 do 2.1 i JSF.

&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibJb5DSbGNmsq1Do4_85pX2cS7KIuAahVtkNYsT3KVZZ4Vd2t2Kp8vwewtlkZl1YyadoxiCsa8aBXkb1CwK_HLyGyr6gxy19uXqVJO3AjMaTYgssdSHdwOkU8bXHjE7AAf53bwC92CGYU/s1600/tlddoc.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibJb5DSbGNmsq1Do4_85pX2cS7KIuAahVtkNYsT3KVZZ4Vd2t2Kp8vwewtlkZl1YyadoxiCsa8aBXkb1CwK_HLyGyr6gxy19uXqVJO3AjMaTYgssdSHdwOkU8bXHjE7AAf53bwC92CGYU/s320/tlddoc.png&quot; style=&quot;cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
Na dokładkę plugin do Mavena który generuje dokumentację taglibs automatycznie (korzysta z wymienionego wyżej narzędzia) i załącza do strony projektu - &lt;a href=&quot;http://maven-taglib.sourceforge.net/m2/index.html&quot;&gt;maven-taglib-plugin&lt;/a&gt;. Wystarczy wpisać do pom.xml:
&lt;br /&gt;
&lt;blockquote class=&quot;brush: xml;&quot;&gt;
&amp;lt;reporting&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;lt;plugins&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;plugin&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;net.sourceforge.maven-taglib&amp;lt;/groupId&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;maven-taglib-plugin&amp;lt;/artifactId&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/plugin&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/plugins&amp;gt;
&amp;lt;/reporting&amp;gt;
&lt;br /&gt;
&lt;/blockquote&gt;
Plugin udostępnia cele (goals):
&lt;br /&gt;
&lt;ul&gt;
&lt;li class=&quot;none&quot;&gt;               &lt;a href=&quot;http://maven-taglib.sourceforge.net/m2/taglibdoc-mojo.html&quot;&gt;taglib:taglibdoc&lt;/a&gt;         &lt;/li&gt;
&lt;li class=&quot;none&quot;&gt;               &lt;a href=&quot;http://maven-taglib.sourceforge.net/m2/validate-mojo.html&quot;&gt;taglib:validate&lt;/a&gt;         &lt;/li&gt;
&lt;li class=&quot;none&quot;&gt;               &lt;a href=&quot;http://maven-taglib.sourceforge.net/m2/tagreference-mojo.html&quot;&gt;taglib:tagreference&lt;/a&gt;         &lt;/li&gt;
&lt;li class=&quot;none&quot;&gt;               &lt;a href=&quot;http://maven-taglib.sourceforge.net/m2/taglibdocjar-mojo.html&quot;&gt;taglib:taglibdocjar&lt;/a&gt;         &lt;/li&gt;
&lt;li class=&quot;none&quot;&gt;               &lt;a href=&quot;http://maven-taglib.sourceforge.net/m2/tldgenerate-mojo.html&quot;&gt;taglib:tldgenerate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
Uruchamianie powyższych bez prefiksu nazwy grupy i pełnej nazwy pluginu - dopisać do settings.xml:
&lt;br /&gt;
&lt;blockquote class=&quot;brush: xml;&quot;&gt;
&amp;lt;settings&amp;gt;
&amp;nbsp; ...
&amp;nbsp;&amp;lt;pluginGroups&amp;gt;
&amp;nbsp; &amp;lt;pluginGroup&amp;gt;net.sourceforge.maven-taglib&amp;lt;/pluginGroup&amp;gt;
&amp;nbsp;&amp;lt;/pluginGroups&amp;gt;
&amp;nbsp; ...
&amp;lt;/settings&amp;gt;
&lt;br /&gt;
&lt;/blockquote&gt;
Linki:
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://maven-taglib.sourceforge.net/m2/taglibdoc-mojo.html&quot;&gt;http://maven-taglib.sourceforge.net/m2/taglibdoc-mojo.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://taglibrarydoc.dev.java.net/&quot;&gt;https://taglibrarydoc.dev.java.net/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicmethods.blogspot.com/feeds/7039654802793033458/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1100449670278139755/7039654802793033458?isPopup=true' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/7039654802793033458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/7039654802793033458'/><link rel='alternate' type='text/html' href='http://publicmethods.blogspot.com/2009/11/tag-library-documentation-generator.html' title='Tag Library Documentation Generator + Maven'/><author><name>Jakub Woźniakowski</name><uri>http://www.blogger.com/profile/05239465453605577167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibJb5DSbGNmsq1Do4_85pX2cS7KIuAahVtkNYsT3KVZZ4Vd2t2Kp8vwewtlkZl1YyadoxiCsa8aBXkb1CwK_HLyGyr6gxy19uXqVJO3AjMaTYgssdSHdwOkU8bXHjE7AAf53bwC92CGYU/s72-c/tlddoc.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1100449670278139755.post-2367487068561254956</id><published>2009-10-31T15:52:00.013+01:00</published><updated>2009-10-31T23:05:50.425+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Spring"/><title type='text'>Cykliczne zależności komponentów w Spring&#39;u</title><content type='html'>Cykliczna zależność to sytuacja w której komponent A jest zależny od komponentu B i jednocześnie B jest zależny od A. W przypadku kontenera Spring IoC wzajemna zależność jest wykrywana i zgłaszana w postaci wyjątku BeanCreationException podczas startu aplikacji. Aplikacja oczywiście nie wstaje. &lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBQg-FhZB2v5WSg0sCMC_wDR9TbrRXtAUxIg6aWf9I1ti-U16plFQM8MjwGHzSTGoirAhF4DzUzmi-LBHvpu9mBOtOiYNgylveF75s-cpY3Y5fx9FX7YzaHkJ5f9aATmJtV5Y_6rNsiSY/s1600-h/cycle.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 303px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBQg-FhZB2v5WSg0sCMC_wDR9TbrRXtAUxIg6aWf9I1ti-U16plFQM8MjwGHzSTGoirAhF4DzUzmi-LBHvpu9mBOtOiYNgylveF75s-cpY3Y5fx9FX7YzaHkJ5f9aATmJtV5Y_6rNsiSY/s320/cycle.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5398888370911833378&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Przykładowy konfig Spring&#39;a z cykliczną zależnością (/WEB-INF/application-context.xml):&lt;br /&gt;&lt;blockquote class=&quot;brush:xml&quot;&gt;&lt;br /&gt;&amp;lt;bean id=&quot;userService&quot; class=&quot;pl.codeservice.service.UserService&quot; &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&quot;studioService&quot; ref=&quot;studioService&quot; /&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id=&quot;studioService&quot; class=&quot;pl.codeservice.service.StudioService&quot; &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&quot;userService&quot; ref=&quot;userService&quot; /&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Zalecane jest pozbycie się cykliczności jako złej praktyki bo:&lt;br /&gt;-zwiększa stopień skomplikowania konfiguracji (OOP principles: loose coupling)&lt;br /&gt;-powoduje problemy architektoniczne: który komponent ma być zniszczony jako pierwszy, istnienie częsciowo zainicjowanych ziaren, itd.&lt;br /&gt;-powiązane komponenty muszą być dystrybuowane w tym samym module/JARze&lt;br /&gt;-trudniej testować&lt;br /&gt;-itd.&lt;br /&gt;&lt;br /&gt;O ile generalnie zgadzam sie z powyższym, bywają sytuacje awaryjne kiedy nie ma innego wyjścia. Nie ma czasu i pieniędzy na zmianę architektury a kopiowanie kodu nigdy nie jest dobrym pomysłem. &lt;br /&gt;&lt;br /&gt;Rozwiązaniem jest implementacja interfejsu &lt;a href=&quot;http://static.springsource.org/spring/docs/2.5.6/api/org/springframework/beans/factory/config/BeanPostProcessor.html&quot;&gt;BeanPostProcessor&lt;/a&gt; przez jeden z komponentów i przechwycenie referencji do zależnego bean&#39;a w metodzie postProcessAfterInitialization(). Trzeba pamiętać o zwróceniu w obu metodach instancji przekazanego w argumencie ziarna.&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;brush: java;&quot;&gt;&lt;br /&gt;public class StudioService implements BeanPostProcessor {&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; private UserService userService;&lt;br /&gt;&amp;nbsp; //...&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; public Object postProcessAfterInitialization(Object bean, String name) throws BeansException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;  if(&quot;userService&quot;.equals(name)){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   userService = (UserService)bean;&lt;br /&gt;&amp;nbsp;&amp;nbsp;  }&lt;br /&gt;&amp;nbsp;&amp;nbsp;  return bean;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;  return bean;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Jeśli komponent będzie występował jako cross-reference więcej niż raz warto napisać, skonfigurować i używać w jego miejsce proxy - obejście zawsze będzie tylko w jednym miejscu.&lt;br /&gt;&lt;br /&gt;Linki:&lt;br /&gt;-&lt;a href=&quot;http://static.springsource.org/osgi/docs/1.0/reference/html/service-registry.html#service-registry:refs:listener-best-practices:cycles&quot;&gt;Spring Dynamic Modules Reference Guide, 5.3.1. Listener and cyclic dependencies&lt;/a&gt;&lt;br /&gt;-&lt;a href=&quot;http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-extension&quot;&gt;The Spring Framework - Reference Documentation, 3.7. Container extension points&lt;/a&gt;&lt;br /&gt;-&lt;a href=&quot;http://wiki.architecturerules.org/index.php/CyclicDependencies&quot;&gt;architecturerules.org&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicmethods.blogspot.com/feeds/2367487068561254956/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1100449670278139755/2367487068561254956?isPopup=true' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/2367487068561254956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/2367487068561254956'/><link rel='alternate' type='text/html' href='http://publicmethods.blogspot.com/2009/10/cykliczne-zaleznosci-komponentow-w.html' title='Cykliczne zależności komponentów w Spring&#39;u'/><author><name>Jakub Woźniakowski</name><uri>http://www.blogger.com/profile/05239465453605577167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBQg-FhZB2v5WSg0sCMC_wDR9TbrRXtAUxIg6aWf9I1ti-U16plFQM8MjwGHzSTGoirAhF4DzUzmi-LBHvpu9mBOtOiYNgylveF75s-cpY3Y5fx9FX7YzaHkJ5f9aATmJtV5Y_6rNsiSY/s72-c/cycle.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1100449670278139755.post-7680204171611051792</id><published>2009-09-17T10:28:00.007+02:00</published><updated>2009-09-17T12:56:01.698+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Spring"/><title type='text'>Prezentacja: Implementing REST Web Application Architectures</title><content type='html'>Na InfoQ pojawiła się &lt;a href=&quot;http://www.infoq.com/presentations/rest-web-application-architectures&quot;&gt;prezentacja&lt;/a&gt; by Arjen Poutsma zarejestrowana podczas &lt;a href=&quot;http://europe.springone.com/europe-2009/&quot;&gt;springOne&lt;/a&gt; dotycząca obsługi REST w nowym &lt;span style=&quot;font-weight:bold;&quot;&gt;Springu 3.0&lt;/span&gt;. Jeśli ominęło was &lt;a href=&quot;http://springtalkwarsaw-jug.eventbrite.com/&quot;&gt;kwietniowe spotkanie organizowane przez warszawski JUG i SpringSource&lt;/a&gt; warto poświęcić godzinę i obejrzeć materiał (video + slajdy). Tematem przewodnim jest wsparcie dla RESTful URLs w Spring MVC:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ch15s03.html#mvc-ann-requestmapping-uri-templates&quot;&gt;URI templates&lt;/a&gt; - wsparcie dla REFTful URLs typu /owners/{ownerId}/pets/{petId}&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Content_negotiation&quot;&gt;Content negotiation&lt;/a&gt; - &lt;a href=&quot;http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ch15s05.html#mvc-multiple-representations&quot;&gt;ContentNegotiatingViewResolver&lt;/a&gt; -&gt; delegacja obsługi widoków do dedykowanego Resolver&#39;a w zależności od rozszerzenia pliku w URI lub nagłówka Accept: HTML, ATOM, RSS, PDF, XML, etc.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ch16s02.html#rest-method-conversion&quot;&gt;HTTP method conversion&lt;/a&gt; - wsparcie dla GET, PUT, POST, DELETE&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/HTTP_ETag&quot;&gt;ETag&lt;/a&gt; - &lt;a href=&quot;http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ch15s11.html&quot;&gt;obsługa ETag headers&lt;/a&gt; czyli jak graniczyć ruch w sieci za pomocą jednego filtra&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ch19s09.html#rest-resttemplate&quot;&gt;RestTemplate&lt;/a&gt; - wsparcie wywołań usług RESTful po stronie klienta&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;Link do prezentacji: &lt;a href=&quot;http://www.infoq.com/presentations/rest-web-application-architectures&quot;&gt;http://www.infoq.com/presentations/rest-web-application-architectures&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicmethods.blogspot.com/feeds/7680204171611051792/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1100449670278139755/7680204171611051792?isPopup=true' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/7680204171611051792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/7680204171611051792'/><link rel='alternate' type='text/html' href='http://publicmethods.blogspot.com/2009/09/prezentacja-implementing-rest-web.html' title='Prezentacja: Implementing REST Web Application Architectures'/><author><name>Jakub Woźniakowski</name><uri>http://www.blogger.com/profile/05239465453605577167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1100449670278139755.post-6182649649723659614</id><published>2009-08-31T21:11:00.036+02:00</published><updated>2009-10-31T21:26:01.154+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JSP"/><title type='text'>Kontrolka Drzewka w Tagu JSP</title><content type='html'>Począwszy od JSP 2.0 do dyspozycji programistów dostępne są &lt;span style=&quot;font-weight:bold;&quot;&gt;tagi użytkownika&lt;/span&gt;. Tagi posiadają kilka nowych, bardzo ważnych funkcjonalności, których brakowało w starym JSP. Wśród nich są możliwość &lt;span style=&quot;font-weight:bold;&quot;&gt;przekazania referencji obiektów jako atrybuty&lt;/span&gt; (nie przez kontekst) i &lt;span style=&quot;font-weight:bold;&quot;&gt;wykonywanie przekazanych w atrybutach fragmentów (fragments)&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1hV499OmeaSTVODptel-X1QxxoWJtJXYOtOE_jKsRF1JbCtiZBBxPK3UBxnMvms5VcevrkWqp4c6KItOfYgkTOQjgGYiyA1tVwxmcWarxV9010PX3ouppTA6INr0P2_NUvJDc9wDUim8/s1600-h/Screenshot-MRP+-+Mozilla+Firefox.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 287px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1hV499OmeaSTVODptel-X1QxxoWJtJXYOtOE_jKsRF1JbCtiZBBxPK3UBxnMvms5VcevrkWqp4c6KItOfYgkTOQjgGYiyA1tVwxmcWarxV9010PX3ouppTA6INr0P2_NUvJDc9wDUim8/s320/Screenshot-MRP+-+Mozilla+Firefox.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5376255159998737858&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Napisanie rozsądnej kontrolki drzewka w HTML&#39;u w tagu JSP nie jest banalne ze względu na rekurencję - podstawowym założeniem jest brak ograniczenia liczby poziomów. Dla uproszczenia kodu nie będzie możliwości rozwijania i zwijania gałęzi. Po stronie przeglądarki wykorzystam elementy listy &amp;lt;ul&amp;gt; i &amp;lt;li&amp;gt;. Wnętrze elementu listy będzie przekazywane jako fragment, co umożliwi wykonanie dowolnego zdarzenia javascript lub podpięcie linka w zależności od sposobu wykorzystania drzewka. Model to zwykły POJO:&lt;br /&gt;&lt;blockquote class=&quot;brush:java;&quot;&gt;&lt;br /&gt;package pl.publicmethods.model;&lt;br /&gt;&lt;br /&gt;public class Group {&lt;br /&gt;&lt;br /&gt;  private Set&amp;lt;Group&gt; children;&lt;br /&gt;&lt;br /&gt;  public Set&amp;lt;Group&gt; getChildren() {&lt;br /&gt;    return children;&lt;br /&gt;  }&lt;br /&gt;  public void setChildren(Set&amp;lt;Group&gt; children) {&lt;br /&gt;    this.children = children;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Kod tagu &lt;span style=&quot;font-style:italic;&quot;&gt;/WEB-INF/tags/widgets/tree.tag&lt;/span&gt;:&lt;br /&gt;&lt;blockquote class=&quot;brush:xml;&quot;&gt;&lt;br /&gt;&amp;lt;%@ tag display-name=&quot;&quot; description=&quot;&quot; import=&quot;pl.publicmethods.model.*&quot;%&amp;gt;&lt;br /&gt;&amp;lt;%@ attribute name=&quot;groups&quot; required=&quot;true&quot; type=&quot;java.util.Collection&quot; %&amp;gt;&lt;br /&gt;&amp;lt;%@ attribute name=&quot;level&quot; required=&quot;false&quot; type=&quot;java.lang.Integer&quot; %&amp;gt;&lt;br /&gt;&amp;lt;%@ attribute name=&quot;name&quot; required=&quot;true&quot; fragment=&quot;true&quot; %&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix=&quot;fmt&quot; uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; %&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix=&quot;w&quot; tagdir=&quot;/WEB-INF/tags/widgets&quot;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;c:if test=&quot;${empty level}&quot;&amp;gt;&lt;br /&gt;  &amp;lt;c:set value=&quot;0&quot; var=&quot;level&quot; /&amp;gt;&lt;br /&gt;&amp;lt;/c:if&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;c:if test=&quot;${level eq 0}&quot;&amp;gt;&lt;br /&gt;  &amp;lt;c:set value=&quot;class=\&quot;tree\&quot;&quot; var=&quot;ulclass&quot; /&amp;gt;&lt;br /&gt;&amp;lt;/c:if&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;ul ${ulclass}&amp;gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;  for(Object o : groups){&lt;br /&gt;    Group group = (Group)o;&lt;br /&gt;    request.setAttribute(&quot;group&quot;,group);&lt;br /&gt;    %&amp;gt;&lt;br /&gt;      &amp;lt;li&amp;gt;&lt;br /&gt;        &amp;lt;jsp:invoke fragment=&quot;name&quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/li&amp;gt;&lt;br /&gt;      &amp;lt;w:tree groups=&quot;${group.children}&quot; level=&quot;${level+1}&quot; name=&quot;${name}&quot; /&amp;gt;&lt;br /&gt;    &amp;lt;%&lt;br /&gt;  }&lt;br /&gt;%&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Konkretny przypadek użycia na stronie JSP - atrybut &lt;span style=&quot;font-weight:bold;&quot;&gt;name&lt;/span&gt; zawiera fragment który zostanie wykonany i wyświetlony dla każdego elementu w kolekcji &lt;span style=&quot;font-weight:bold;&quot;&gt;${groups}&lt;/span&gt;:&lt;br /&gt;&lt;blockquote class=&quot;brush:xml;&quot;&gt;&lt;br /&gt;&amp;lt;w:tree groups=&quot;${groups}&quot;&amp;gt;&lt;br /&gt;  &amp;lt;jsp:attribute name=&quot;name&quot;&amp;gt;&lt;br /&gt;    &amp;lt;c:url value=&quot;/groupform.do?id=${group.id}&quot; var=&quot;url&quot; /&amp;gt;&lt;br /&gt;    &amp;lt;a href=&quot;${url}&quot;&amp;gt;&lt;br /&gt;      &amp;lt;c:out value=&quot;${group.name}&quot; /&amp;gt;&lt;br /&gt;    &amp;lt;/a&amp;gt;&lt;br /&gt;  &amp;lt;/jsp:attribute&amp;gt;&lt;br /&gt;&amp;lt;/w:tree&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Czy można przekazać fragment JSP rekurencyjnie w postaci atrybutu? Okazuje się że można. Tag zawiera pętlę rekurencyjną w formie Scriptletu. Alternatywnie można ją napisać w JSTL, pamiętając o przekazaniu zmiennej group do zakresu request - musi być widoczna dla fragmentu.&lt;br /&gt;&lt;br /&gt;Atrybut level to nic innego jak piętro drzewka - na zerowym element &amp;lt;ul&amp;gt; dostaje oddzielną klasę stylu. Łatwo można wprowadzić sprawdzanie zapętlonych powiązań - wystarczy wstawić warunek dla level &amp;lt; 1000.&lt;br /&gt;&lt;br /&gt;I jeszcze style CSS:&lt;br /&gt;&lt;blockquote class=&quot;brush:css&quot;&gt;&lt;br /&gt;ul.tree {&lt;br /&gt; margin: 0;&lt;br /&gt; padding: 0;&lt;br /&gt; background-color: #f8f8f8;&lt;br /&gt; border-top: 1px solid #888;&lt;br /&gt; border-bottom: 1px solid #444;&lt;br /&gt;}&lt;br /&gt;ul.tree ul {&lt;br /&gt; padding: 0;&lt;br /&gt; margin: 0;&lt;br /&gt; margin-left: 24px;&lt;br /&gt;}&lt;br /&gt;ul.tree li {&lt;br /&gt; list-style-type: none;&lt;br /&gt; border-bottom: 1px dotted #888;&lt;br /&gt; padding: 4px;&lt;br /&gt;}&lt;br /&gt;ul.tree li:hover {&lt;br /&gt; background-color: #f0f0f0;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicmethods.blogspot.com/feeds/6182649649723659614/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1100449670278139755/6182649649723659614?isPopup=true' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/6182649649723659614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/6182649649723659614'/><link rel='alternate' type='text/html' href='http://publicmethods.blogspot.com/2009/08/kontrolka-drzewka-w-tagu-jsp.html' title='Kontrolka Drzewka w Tagu JSP'/><author><name>Jakub Woźniakowski</name><uri>http://www.blogger.com/profile/05239465453605577167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1hV499OmeaSTVODptel-X1QxxoWJtJXYOtOE_jKsRF1JbCtiZBBxPK3UBxnMvms5VcevrkWqp4c6KItOfYgkTOQjgGYiyA1tVwxmcWarxV9010PX3ouppTA6INr0P2_NUvJDc9wDUim8/s72-c/Screenshot-MRP+-+Mozilla+Firefox.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1100449670278139755.post-3562874867245317652</id><published>2009-08-23T15:48:00.099+02:00</published><updated>2009-10-31T21:23:14.748+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="iReport"/><category scheme="http://www.blogger.com/atom/ns#" term="Jasper Reports"/><title type='text'>Crosstab i Dataset użytkownika w Jasper Reports</title><content type='html'>Natrafiłem na banalny z pozoru problem w iReport: &lt;b&gt;jak w prosty sposób poza głównym zapytaniem odczytać coś z DB i wyświetlić w raporcie, np. w sekcji nagłówka?&lt;/b&gt; Założenie: id rekordu jest stałe albo przekazywane jako parametr zewnętrzny. &lt;br /&gt;&lt;br /&gt;Najłatwiej byłoby oczywiście dodać podzapytanie w głównym query, ale komplikowanie mocno rozbudowanego sql&#39;a to zły pomysł - wydajnościowo i (nie)higienicznie. Raport podrzędny też odpada - armata na komara. Pozostaje użycie dedykowanego Dataset przez wstawienie tabelki krzyżowej. &lt;br /&gt;&lt;br /&gt;Crosstabs to niewdzięczne struktury. Moj iReport (3.5.3) kompletnie sobie z nimi nie radzi - próby wstawienia tabeli krzyżowej z palety kończą się szybkim pożegnaniem z GUI NetBeans bez zapisania zmian i komunikatu o błędzie. Pozostaje edycja źródeł raportu w XML&#39;u, ale po kolei. &lt;br /&gt;&lt;br /&gt;Poniżej załączam przepis na wstawienie do dowolnej sekcji raportu pola odczytanego dedykowanym zapytaniem sql. Ważne jest takie zgrupowanie kolumn i wierszy w Crosstab, żeby została widoczna tylko jedna komórka sekcji Detail, bez nagłówków i sum. Oczywiście podany kod trzeba dopasowac do swoich potrzeb (zapytanie, wielkość elementów, itd).&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Krok 1.&lt;/span&gt; Do raportu dodać nowy Dataset - &quot;Add Dataset&quot; z menu kontekstowego po kliknięciu na nazwę raportu. Dodać parametr. Typ parametru musi być zgodny z id rekordu i parametrem zewnętrznym raportu. &lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpawiMV9KbrqnW0QX0B39QhG8tyiI3EHfEzOJkVM75wv73zKS10FEWygNt2ykLz79nr9km3exUa_DY-GzDff3Wr4jzx6fj9ArXv9ZcA6kQlQZp9Qp46I4bBOxz2_VTF_YHQ2AR2OO29zI/s1600-h/1-add-dataset.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 219px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpawiMV9KbrqnW0QX0B39QhG8tyiI3EHfEzOJkVM75wv73zKS10FEWygNt2ykLz79nr9km3exUa_DY-GzDff3Wr4jzx6fj9ArXv9ZcA6kQlQZp9Qp46I4bBOxz2_VTF_YHQ2AR2OO29zI/s320/1-add-dataset.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5373200863644010610&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Krok 2.&lt;/span&gt; Wpisać sparametryzowane zapytanie do Dataset.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF7Sg2aiuQRLqVrG-iyPA3zLQAp9Ha2neAwxgoojXQSDSY5TWTxPbtoXHq-nBPHdLcHu_ZiDUhFikNdNs3Ge8_fvGXNVjz_F1xDxlhP7OQNS9OiABnzPMx5zqrz_mtFzN_jGBKLQjHoBs/s1600-h/2-edit-dataset-query.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF7Sg2aiuQRLqVrG-iyPA3zLQAp9Ha2neAwxgoojXQSDSY5TWTxPbtoXHq-nBPHdLcHu_ZiDUhFikNdNs3Ge8_fvGXNVjz_F1xDxlhP7OQNS9OiABnzPMx5zqrz_mtFzN_jGBKLQjHoBs/s320/2-edit-dataset-query.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5373200998808243218&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Krok 3.&lt;/span&gt; Wstawić Crosstab do raportu, np. do sekcji nagłówka (z palety). Jeśli iReport nie chce współpracować - przejść do następnego punktu (wkleić XML).&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9l54nkan_cimLpZvDoH2FDqvc4pemGGRqoIi4rxa8-O1QGc_HFwICkaAuC42Qni8ztV6610-m8NoDitjm0Pl556S_0p51rkKXpevZ8A8DScpFetQeUv1XTADCdabPXOFZXsCjTd5MDCw/s1600-h/3-crosstab.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 219px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9l54nkan_cimLpZvDoH2FDqvc4pemGGRqoIi4rxa8-O1QGc_HFwICkaAuC42Qni8ztV6610-m8NoDitjm0Pl556S_0p51rkKXpevZ8A8DScpFetQeUv1XTADCdabPXOFZXsCjTd5MDCw/s320/3-crosstab.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5373201109063224722&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Krok 4.&lt;/span&gt; &lt;span style=&quot;font-weight:bold;&quot;&gt;Wyciąć nagłówki i stopki kolumn i wierszy tabeli. W edytorze tabeli powinna zostać widoczna tylko jedna komórka sekcji Detail typu String (w sekcji Measures pole ma Value Expression=$F{number}).&lt;/span&gt; Jako bucket expression (wyrażenie grupujące) w Row Groups i Column Groups wpisać stały tekst, np. &quot;a&quot;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVL99o6Yk-QHm6YQgxRo-G__ocjL0QJf4qHkxFmbW-afh4iDSVqjCMTaJQwUou9l8ACWkyMQJwZHGnW8b5Ty-gs91TPUMAfgFtgQdhQaLnAyiKQSzuc_e7kIgGmvcJhcpbbyoSDYMc4kM/s1600-h/444.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 195px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVL99o6Yk-QHm6YQgxRo-G__ocjL0QJf4qHkxFmbW-afh4iDSVqjCMTaJQwUou9l8ACWkyMQJwZHGnW8b5Ty-gs91TPUMAfgFtgQdhQaLnAyiKQSzuc_e7kIgGmvcJhcpbbyoSDYMc4kM/s320/444.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5373218306527894274&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Jeśli przy edycji tabeli iReport odmawia współpracy, wkleić gotowy szablon kodu do żródła XML raportu.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;brush:xml&quot;&gt;&amp;lt;crosstab isRepeatColumnHeaders=&quot;false&quot; isRepeatRowHeaders=&quot;false&quot; columnBreakOffset=&quot;0&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;reportElement x=&quot;60&quot; y=&quot;14&quot; width=&quot;200&quot; height=&quot;14&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;crosstabParameter name=&quot;orderId&quot; class=&quot;java.lang.Long&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;rowGroup name=&quot;row&quot; width=&quot;0&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;bucket&amp;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;lt;bucketExpression class=&quot;java.lang.String&quot;&amp;gt;&amp;lt;![CDATA[&quot;a&quot;]]&amp;gt;&amp;lt;/bucketExpression&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/bucket&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;crosstabRowHeader&amp;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;lt;cellContents/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/crosstabRowHeader&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;crosstabTotalRowHeader&amp;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;lt;cellContents/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/crosstabTotalRowHeader&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/rowGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;columnGroup name=&quot;col&quot; height=&quot;0&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;bucket&amp;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;lt;bucketExpression class=&quot;java.lang.String&quot;&amp;gt;&amp;lt;![CDATA[&quot;a&quot;]]&amp;gt;&amp;lt;/bucketExpression&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/bucket&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;crosstabColumnHeader&amp;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;lt;cellContents/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/crosstabColumnHeader&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;crosstabTotalColumnHeader&amp;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;lt;cellContents/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/crosstabTotalColumnHeader&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/columnGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;measure name=&quot;orderNumber&quot; class=&quot;java.lang.Object&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;measureExpression&amp;gt;&amp;lt;![CDATA[$F{number}]]&amp;gt;&amp;lt;/measureExpression&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/measure&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;crosstabCell width=&quot;237&quot; height=&quot;25&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;cellContents&amp;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;lt;textField&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;reportElement style=&quot;Crosstab Data Text&quot; x=&quot;0&quot; y=&quot;0&quot; width=&quot;237&quot; height=&quot;14&quot;/&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;textElement textAlignment=&quot;Left&quot;&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;font isBold=&quot;true&quot;/&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/textElement&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;textFieldExpression class=&quot;java.lang.String&quot;&amp;gt;&amp;lt;![CDATA[&quot;&quot;+$V{orderNumber}]]&amp;gt;&amp;lt;/textFieldExpression&amp;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;lt;/textField&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/cellContents&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/crosstabCell&amp;gt;&lt;br /&gt;&amp;lt;/crosstab&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Krok 5.&lt;/span&gt; Przypisać nazwę Dataset do tabeli. Zrobić mapowanie wartości parametru raportu na Dataset. &lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2OLdfPGovks9_exgTYYHYL7k1zNdRJuFTgNsETm1kn2egjI-CTt0udnbW2ZBTNFdAeODFFvwqof_UJFp4AXTvBpu-CkVhSfaf0166ZIMvaFc1FFkHst9iwvICuqqyiOFLiP4bmtGte68/s1600-h/4-edycja-crosstab.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 303px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2OLdfPGovks9_exgTYYHYL7k1zNdRJuFTgNsETm1kn2egjI-CTt0udnbW2ZBTNFdAeODFFvwqof_UJFp4AXTvBpu-CkVhSfaf0166ZIMvaFc1FFkHst9iwvICuqqyiOFLiP4bmtGte68/s320/4-edycja-crosstab.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5373201451977705538&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Krok 6.&lt;/span&gt; Jeśli nie istnieje, wstawić pole tekstowe do sekcji Detail tabeli i przypisać zmienną typu String (Text Field Expression=$V{orderNumber}).&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy53A1sgxENKS3UXt5LOjkg0a_U1dYZ9FAAg88Az8WOrKmLkeZYOcwtRTmcgN93gBaEH2u32e4p7hWoBXhid5Lrl9UQGuqD-zLqMg2plxn-jeHWQhNOOag4E0PSVgNH6IFrNMVBqzb3ms/s1600-h/4-crosstable.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 218px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy53A1sgxENKS3UXt5LOjkg0a_U1dYZ9FAAg88Az8WOrKmLkeZYOcwtRTmcgN93gBaEH2u32e4p7hWoBXhid5Lrl9UQGuqD-zLqMg2plxn-jeHWQhNOOag4E0PSVgNH6IFrNMVBqzb3ms/s320/4-crosstable.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5373201369621864738&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I to byłoby na tyle. Wszelkie uwagi są mile widziane. :)</content><link rel='replies' type='application/atom+xml' href='http://publicmethods.blogspot.com/feeds/3562874867245317652/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1100449670278139755/3562874867245317652?isPopup=true' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/3562874867245317652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/3562874867245317652'/><link rel='alternate' type='text/html' href='http://publicmethods.blogspot.com/2009/08/crosstab-i-dataset-uzytkownika-w-jasper.html' title='Crosstab i Dataset użytkownika w Jasper Reports'/><author><name>Jakub Woźniakowski</name><uri>http://www.blogger.com/profile/05239465453605577167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpawiMV9KbrqnW0QX0B39QhG8tyiI3EHfEzOJkVM75wv73zKS10FEWygNt2ykLz79nr9km3exUa_DY-GzDff3Wr4jzx6fj9ArXv9ZcA6kQlQZp9Qp46I4bBOxz2_VTF_YHQ2AR2OO29zI/s72-c/1-add-dataset.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1100449670278139755.post-6489393623434058682</id><published>2009-08-21T16:56:00.017+02:00</published><updated>2009-10-31T21:27:19.830+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JSP"/><title type='text'>Bloki deklaracyjne w JSP</title><content type='html'>Bloki deklaracyjne nie należą do często używanych &lt;b&gt;elementów JSP&lt;/b&gt;. Wynika to po pierwsze z wąskiego zakresu zastosowania, po drugie ze znanych zaleceń i tendencji używania tagów/EL a unikania Scriptlets (czytelny kod, łatwe utrzymanie, mniej błędów, itd.). Mimo tego, deweloper JSP powinien mieć przynajmniej świadomość istnienia tego mechanizmu. ;-) &lt;br /&gt;&lt;br /&gt;Kod JSP każdej strony/tagu użytkownika jest w pierwszej fazie tłumaczony na kod źródłowy (servlet) a w następnej kompilowany do bytecode. Deklaracje pozwalają na tworzenie metod i pól będących &lt;b&gt;członkami klasy wynikowej strony JSP (class members)&lt;/b&gt;. W fazie tłumaczenia treść tagów JSP i Scriptlets zostaną wrzucone do jednej metody. Ale nie deklaracje. &lt;br /&gt;&lt;br /&gt;Podstawowym ograniczeniem bloków deklaracyjnych jest &lt;b&gt;dostępność pól i metod tylko w Scriptlets&lt;/b&gt; - nie są widoczne w Expression Language. EL operuje przecież na elementach zawartych w kontekście.&lt;br /&gt;&lt;br /&gt;Przykład deklaracji JSP - tabliczka mnożenia w tabeli HTML. Mnożenie wykonywane w metodzie &lt;code&gt;multiply()&lt;/code&gt;, zdefiniowanej w bloku deklaracyjnym. Metodę można wywoływać wielokrotnie z dowolnego miejsca na stronie.&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;brush:xml&quot;&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot; %&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;Test&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;%!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int multiply(int a, int b){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return a*b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;% for(int x=1; x&amp;lt;=10; x++){%&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;% for(int y=1; y&amp;lt;=10; y++){%&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;&amp;lt;%= multiply(x, y) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;% } %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;% } %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;W taki sam sposób można deklarować pola. Trzeba tylko pamiętać, że przechowywanie w ten sposób stanu w JSP nie jest bezpieczne - dostęp do pól ma wiele wątków jednocześnie i w zasadzie nie ma gwarancji operowania na konkretnej instancji klasy. Z kolei użycie słowa kluczowego &lt;b&gt;synchronized&lt;/b&gt; na pewno zabije wydajność.&lt;br /&gt;&lt;br /&gt;Istnieją dwie &lt;b&gt;metody specjalne&lt;/b&gt;, uwzględnione w cyklu życia strony JSP: &lt;b&gt;jspInit&lt;/b&gt; wywoływana podczas inicjalizacji, &lt;b&gt;jspDestroy&lt;/b&gt; przy niszczeniu servlet&#39;a. Deklaracje oferują możliwość przeciążenia obu metod.&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;brush:xml&quot;&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot; %&amp;gt;&lt;br /&gt;&amp;lt;%! public void jspInit() {  System.out.println(&quot;* witaj!&quot;); } %&amp;gt;&lt;br /&gt;&amp;lt;%! public void jspDestroy() {  System.out.println(&quot;* bye bye!&quot;); } %&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;W blokach deklaracyjnych działają &lt;b&gt;słowa kluczowe i kwalifikatory dostępu&lt;/b&gt;, pola i metody mogą być oznaczone jako &lt;b&gt;static&lt;/b&gt;, &lt;b&gt;final&lt;/b&gt;, &lt;b&gt;synchronized&lt;/b&gt;. Deklaracje pozwalają na tworzenie &lt;b&gt;bloków inicjacyjnych&lt;/b&gt;, w tym statycznych. Więcej - choć specyfikacja o tym milczy, dopuszczone jest &lt;b&gt;deklarowanie klas zagnieżdżonych&lt;/b&gt;, np.&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;brush:xml&quot;&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot; %&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;Test 2&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;%! &lt;br /&gt;&amp;nbsp;&amp;nbsp;public static class InnerClass {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static void testIt(String str){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&quot;testIt:&quot;+str);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;%&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InnerClass.testIt(&quot;ok!&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;%&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Na koniec ciekawostka, a raczej wpis z działu Tips &amp; Tricks. ;-) Na stronie JSP, mimo że Eclipse informuje o błędzie, można napisać działający &lt;b&gt;konstruktor&lt;/b&gt;. :-)&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIha1wI_ThrWxW7qMI14ZIq9RqjJWeGkGCb1iuGfMrt4uOJ8VtzPnzv3DqKirsP0AYLWJTTUsHOveKTI3jeuyJkc-4LcZU2azPAclHs1oM7pJrUuqTwiR_y62vML0uGY2AVsQ-VeZ-Zt4/s1600-h/WebContent-myJsp.jsp+-+Eclipse.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 188px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIha1wI_ThrWxW7qMI14ZIq9RqjJWeGkGCb1iuGfMrt4uOJ8VtzPnzv3DqKirsP0AYLWJTTUsHOveKTI3jeuyJkc-4LcZU2azPAclHs1oM7pJrUuqTwiR_y62vML0uGY2AVsQ-VeZ-Zt4/s320/WebContent-myJsp.jsp+-+Eclipse.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5372499797505361234&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote class=&quot;brush:xml&quot;&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot; %&amp;gt;&lt;br /&gt;&amp;lt;%! public myjsp_jsp() {  System.out.println(&quot;* Dzień Dobry!&quot;); } %&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Linki:&lt;br /&gt;&lt;a href=&quot;http://java.sun.com/javaee/5/docs/tutorial/doc/bnaos.html&quot;&gt;The Java EE 5 Tutorial, JSP Declarations&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://java.sun.com/products/jsp/syntax/2.0/syntaxref204.html#10983&quot;&gt;JavaServer Pages (JSP) v2.0  Syntax Reference&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicmethods.blogspot.com/feeds/6489393623434058682/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1100449670278139755/6489393623434058682?isPopup=true' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/6489393623434058682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/6489393623434058682'/><link rel='alternate' type='text/html' href='http://publicmethods.blogspot.com/2009/08/bloki-deklaracyjne-w-jsp.html' title='Bloki deklaracyjne w JSP'/><author><name>Jakub Woźniakowski</name><uri>http://www.blogger.com/profile/05239465453605577167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIha1wI_ThrWxW7qMI14ZIq9RqjJWeGkGCb1iuGfMrt4uOJ8VtzPnzv3DqKirsP0AYLWJTTUsHOveKTI3jeuyJkc-4LcZU2azPAclHs1oM7pJrUuqTwiR_y62vML0uGY2AVsQ-VeZ-Zt4/s72-c/WebContent-myJsp.jsp+-+Eclipse.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1100449670278139755.post-7748125967632481513</id><published>2009-07-25T12:08:00.003+02:00</published><updated>2009-10-31T21:33:46.733+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Alfresco"/><category scheme="http://www.blogger.com/atom/ns#" term="Lucene"/><title type='text'>Wyszukiwanie węzłów w Alfresco, Część 2</title><content type='html'>&lt;font style=&quot;font-weight: bold;&quot;&gt;Przykłady zapytań - wyszukiwanie dokumentów&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;Znajdź dokumenty utworzone przez &quot;a.głowacki&quot;&lt;br /&gt;&lt;blockquote class=&quot;&quot;&gt;TYPE:&quot;cm:content&quot; AND PATH:&quot;/app:company_home//*&quot; AND @cm\:creator:a.głowacki&lt;/blockquote&gt;Dokumenty utworzone lub modyfikowane 15 lipca 2009&lt;br /&gt;&lt;blockquote class=&quot;&quot;&gt;TYPE:&quot;cm:content&quot; AND PATH:&quot;/app:company_home//*&quot; AND (@cm\:created:2009-07-15* OR @cm\:modified:2009-07-15*)&lt;/blockquote&gt;Wyszukanie wszystkich wersji dokumentu &quot;crystal.txt&quot; (store workspace://version2Store)&lt;br /&gt;&lt;blockquote class=&quot;&quot;&gt;TYPE:&quot;cm:content&quot; AND @cm\:name:crystal.txt&lt;/blockquote&gt;&lt;font style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;Przykłady - kategorie&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Znajdź kategorię &quot;Dokumentacja Techniczna&quot; bez względu na położenie w hierarchii&lt;br /&gt;&lt;blockquote class=&quot;&quot;&gt;@cm\:name:&quot;Dokumentacja Techniczna&quot; AND TYPE:&quot;cm:category&quot;&lt;/blockquote&gt;Ta sama kategoria ale po ścieżce (niebezpieczne - zmiana nazwy nie zmieni QName)&lt;br /&gt;&lt;blockquote class=&quot;&quot;&gt;PATH:&quot;/cm:generalclassifiable//cm:Dokumentacja_x0020_Techniczna&quot;&lt;/blockquote&gt;&lt;font style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;Przykład WebScripts&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Skrypty &lt;a href=&quot;http://wiki.alfresco.com/wiki/Web_Scripts&quot;&gt;WebScripts&lt;/a&gt; to sposób na szybką i bezinwazyjną integrację z Alfresco. Plusy: bogate API, architektura REST, mnóstwo przykładów, transakcyjność&lt;a href=&quot;http://freemarker.sourceforge.net/&quot;&gt;&lt;/a&gt;. Minusy: mix JavaScript + &lt;a href=&quot;http://freemarker.sourceforge.net/&quot;&gt;FreeMarker&lt;/a&gt; = jak to debugować???&lt;br /&gt;&lt;br /&gt;Skrypt znajduje w repozytorium dokument o podanej nazwie (audyt.doc) i przypisuje do niego konkretną kategorię (Raporty). Widok wyświetla renerencję do dokumentu. Url skryptu: http://localhost:8080/alfresco/service/searchexample&lt;br /&gt;&lt;br /&gt;searchexample.get.js:&lt;br /&gt;&lt;blockquote class=&quot;brush:js&quot;&gt;go();&lt;br /&gt;&lt;br /&gt;function go() {&lt;br /&gt;&lt;br /&gt;var fileName = &quot;audyt.doc&quot;;&lt;br /&gt;var categoryName = &quot;Raporty&quot;;&lt;br /&gt;var docNode = findDocument(fileName);&lt;br /&gt;var categoryNode = findCategory(categoryName);&lt;br /&gt;&lt;br /&gt;if (docNode == null)&lt;br /&gt;    return showError(400, &quot;Document not found: &quot;+fileName+&quot;.&quot;);&lt;br /&gt;&lt;br /&gt;if (categoryNode == null)&lt;br /&gt;    return showError(400, &quot;Category not found: &quot;+categoryName+&quot;.&quot;);&lt;br /&gt;&lt;br /&gt;if(!docNode.hasAspect(&quot;cm:generalclassifiable&quot;))  /* pozwol przypisac kategorie */&lt;br /&gt;docNode.addAspect(&quot;cm:generalclassifiable&quot;);&lt;br /&gt;&lt;br /&gt;if(docNode.properties[&quot;cm:categories&quot;] == null)  /* just in case */&lt;br /&gt;docNode.properties[&quot;cm:categories&quot;] = new Array();&lt;br /&gt;&lt;br /&gt;docNode.properties[&quot;cm:categories&quot;].push(categoryNode);&lt;br /&gt;docNode.save();&lt;br /&gt;model.resultset = docNode; /* kontekst widoku */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function findDocument(name){&lt;br /&gt;var result = search.luceneSearch(&quot;TYPE:\&quot;cm:content\&quot; AND PATH:\&quot;/app:company_home//*\&quot; AND @cm\\:name:\&quot;&quot;+name+&quot;\&quot;&quot;);&lt;br /&gt;if(result.length&gt;0)&lt;br /&gt;return result[0];&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function findCategory(name){&lt;br /&gt;var result = search.luceneSearch(&quot;TYPE:\&quot;cm:category\&quot; AND @cm\\:name:\&quot;&quot;+name+&quot;\&quot;&quot;);&lt;br /&gt;if(result.length&gt;0)&lt;br /&gt;return result[0];&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function showError(errorCode, msg){&lt;br /&gt;status.redirect = true;&lt;br /&gt;status.code = errorCode,&lt;br /&gt;status.message = msg;&lt;br /&gt;}&lt;/blockquote&gt;Deskryptor (searchexample.get.desc.xml):&lt;br /&gt;&lt;blockquote class=&quot;brush:xml&quot;&gt;&amp;lt;webscript&amp;gt;&lt;br /&gt;&amp;lt;shortname&amp;gt;Wyszukiwanie Lucene&amp;lt;/shortname&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;&lt;br /&gt;Pulished on publicmethods.blogspot.com&lt;br /&gt;&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;url&amp;gt;/searchexample&amp;lt;/url&amp;gt;&lt;br /&gt;&amp;lt;format default=&quot;text&quot;&amp;gt;argument&amp;lt;/format&amp;gt;&lt;br /&gt;&amp;lt;authentication&amp;gt;user&amp;lt;/authentication&amp;gt;&lt;br /&gt;&amp;lt;transaction&amp;gt;required&amp;lt;/transaction&amp;gt;&lt;br /&gt;&amp;lt;/webscript&amp;gt;&lt;/blockquote&gt;Szablon widoku (searchexample.get.text.ftl):&lt;br /&gt;&lt;blockquote&gt;${resultset.nodeRef.storeRef.protocol}/${resultset.nodeRef.storeRef.identifier}/${resultset.nodeRef.id}/${resultset.name?url}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Linki&lt;br /&gt;&lt;a href=&quot;http://lucene.apache.org/java/2_4_1/queryparsersyntax.html&quot;&gt;http://lucene.apache.org/java/2_4_1/queryparsersyntax.html&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://wiki.alfresco.com/wiki/Search_Documentation&quot;&gt;http://wiki.alfresco.com/wiki/Search_Documentation&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://wiki.alfresco.com/wiki/Full_Text_Search_Query_Syntax&quot;&gt;http://wiki.alfresco.com/wiki/Full_Text_Search_Query_Syntax&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://wiki.alfresco.com/wiki/Alfresco_Namespaces&quot;&gt;http://wiki.alfresco.com/wiki/Alfresco_Namespaces&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://wiki.alfresco.com/wiki/JavaScript_API&quot;&gt;http://wiki.alfresco.com/wiki/JavaScript_API&lt;/a&gt;&lt;a href=&quot;http://lucene.apache.org/java/2_4_1/queryparsersyntax.html&quot;&gt;&lt;br /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicmethods.blogspot.com/feeds/7748125967632481513/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1100449670278139755/7748125967632481513?isPopup=true' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/7748125967632481513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/7748125967632481513'/><link rel='alternate' type='text/html' href='http://publicmethods.blogspot.com/2009/07/wyszukiwanie-wezow-w-alfresco-czesc-2.html' title='Wyszukiwanie węzłów w Alfresco, Część 2'/><author><name>Jakub Woźniakowski</name><uri>http://www.blogger.com/profile/05239465453605577167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1100449670278139755.post-4761590237140632338</id><published>2009-07-20T19:07:00.001+02:00</published><updated>2009-07-20T19:07:00.293+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Alfresco"/><category scheme="http://www.blogger.com/atom/ns#" term="Lucene"/><title type='text'>Wyszukiwanie węzłów w Alfresco, Część 1</title><content type='html'>&lt;a href=&quot;http://www.alfresco.com/&quot;&gt;Alfresco&lt;/a&gt; wspiera wyszukiwanie węzłów (nodes) przez zapytania &lt;a href=&quot;http://www.w3schools.com/XPath/default.asp&quot;&gt;XPath&lt;/a&gt; i &lt;a href=&quot;http://lucene.apache.org/java/docs/index.html&quot;&gt;Lucene&lt;/a&gt;. Implementacja pierwszego jest wymagana przez specyfikację &lt;a href=&quot;http://jcp.org/aboutJava/communityprocess/final/jsr170/index.html&quot;&gt;JSR-170&lt;/a&gt;. Lucene daje za to większe możliwości rozbudowy języka zapytań i jest metodą &lt;a href=&quot;http://wiki.alfresco.com/wiki/Search_Documentation#Lucene_Language&quot;&gt;rekomendowaną&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Query można uruchamiać wprost z GUI - z poziomu Node Browser (link w konsoli administracyjnej). Po uruchomieniu Browser prosi o wybranie workspace (workspace://SpacesStore).&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh39KiyBqYZmvuqQBqgocpidwytaJ-PwmWhtmR8XedGPla-Ddq5smpHR6nLgBPT-P0v_04Cb5CT6TqgehvrnbjCW7ZE3w5DpfNZKOYoLr8HKYDf2C6YuXCbstvSCIPYfJFpiBSqBRgBz6k/s1600-h/nodebrowser.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 169px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh39KiyBqYZmvuqQBqgocpidwytaJ-PwmWhtmR8XedGPla-Ddq5smpHR6nLgBPT-P0v_04Cb5CT6TqgehvrnbjCW7ZE3w5DpfNZKOYoLr8HKYDf2C6YuXCbstvSCIPYfJFpiBSqBRgBz6k/s320/nodebrowser.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5358628823386543634&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Alfresco udostępnia API do wyszukiwania: &lt;a href=&quot;http://dev.alfresco.com/resource/docs/java/repository/org/alfresco/service/cmr/search/SearchService.html&quot;&gt;SearchService&lt;/a&gt; (JAVA) i &lt;a href=&quot;http://wiki.alfresco.com/wiki/3.0_JavaScript_API#Search_API&quot;&gt;Search API&lt;/a&gt; (&lt;a href=&quot;http://wiki.alfresco.com/wiki/Web_Scripts&quot;&gt;WebScripts&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Poniżej zamieszczam przegląd możliwości języka Lucene z przykładami. Wyniki zapytań mogą różnić się w zależności od wersji.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Wyszukiwanie po dowolnych polach: (@&lt;span style=&quot;font-style: italic;&quot;&gt;xx&lt;/span&gt;/:&lt;span style=&quot;font-style: italic;&quot;&gt;nazwa&lt;/span&gt;:)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nazwy pól są w postaci QName (qualified name) - występują w formie pełnej (pełna nazwa &lt;a href=&quot;http://wiki.alfresco.com/wiki/Alfresco_Namespaces&quot;&gt;namespace&lt;/a&gt; z protokołem) lub skróconej.&lt;br /&gt;&lt;blockquote&gt;@cm\:userName:&quot;admin&quot;&lt;br /&gt;@cm\:lastName:&quot;w*&quot;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Wyszukiwanie &lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;pełnotekstowe (TEXT)&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;TEXT:&quot;izotopy węgla&quot;&lt;/blockquote&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Wyszukiwanie po referencji (ID), referencji rodzica&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt; (PARENT , PRIMARYPARENT)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Referencja węzła (NodeRef) = protokół://workspace/UUID obiektu&lt;blockquote&gt;ID:&quot;workspace://SpacesStore/510e0049-7d3f-4f3e-823d-8314b749b4a9&quot;&lt;br /&gt;PARENT:&quot;workspace://SpacesStore/984bffc5-ef6c-4e72-9fc6-7d353d7e5264&quot;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Ścieżka XPath (PATH)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ścieżka nie może zawierać znaków specjalnych - wymagane kodowanie &lt;a href=&quot;http://dev.alfresco.com/resource/docs/java/repository/org/alfresco/util/ISO9075.html&quot;&gt;ISO9075&lt;/a&gt;.&lt;br /&gt;&lt;blockquote&gt;PATH:&quot;/app:company_home&quot;&lt;br /&gt;PATH:&quot;/app:company_home/app:guest_home&quot;&lt;br /&gt;PATH:&quot;/app:company_home/app:user_homes/*&quot;&lt;br /&gt;PATH:&quot;/app:company_home//*&quot;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Według przypisanego &lt;a href=&quot;http://wiki.alfresco.com/wiki/Aspect&quot;&gt;aspektu&lt;/a&gt; (ASPECT, EXACTASPECT)&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;TYPE:&quot;cm:content&quot; AND ASPECT:&quot;cm:versionable&quot;&lt;/blockquote&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Typ węzła (TYPE)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Podstawowe typy węzłów: cm:content, cm:link, cm:category, cm:person, cm:folder.&lt;br /&gt;&lt;blockquote&gt;TYPE:&quot;cm:category&quot;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Nazwa kwalifikowana (QNAME)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;QName pod którym jest widoczny węzeł, bez namespace, kodowanie ISO9075.&lt;br /&gt;&lt;blockquote&gt;QNAME:faktura_x0020_42812.ods&lt;br /&gt;QNAME:f*&lt;br /&gt;QNAME:*.ods&lt;br /&gt;&lt;/blockquote&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Stan pola (ISUNSET, ISNULL, ISNOTNULL)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;blockquote&gt;ISNULL:&quot;cm:title&quot;&lt;/blockquote&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Operatory (+, -, AND, OR, NOT)&lt;/span&gt;, &lt;span style=&quot;font-weight: bold;&quot;&gt;wildcards (*, ?), &lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;grupowanie&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;TYPE:&quot;cm:content&quot; AND TEXT:&quot;L?n*&quot; - ASPECT:&quot;cm:versionable&quot;&lt;br /&gt;(TYPE:&quot;cm:category&quot; AND TEXT:&quot;k*&quot;) OR (TYPE:&quot;cm:folder&quot; AND QNAME:k*)&lt;span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Zakresy wartości: zakmnięty [&lt;/span&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt; TO &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;], otwarty {&lt;/span&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt; TO &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;@cm\:lastName:[c TO e]&lt;br /&gt;@cm\:lastName:{talar TO toczko}&lt;br /&gt;&lt;/blockquote&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Wyszukiwanie podobnych fraz - &lt;/span&gt;&lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://pl.wikipedia.org/wiki/Odleg%C5%82o%C5%9B%C4%87_Levenshteina&quot;&gt;odległość Levenshtein&#39;a&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Parametr określa stopień podobieństwa w zakresie od 0 (małe) do 1 (duże) - domyślnie 0.5.&lt;br /&gt;&lt;blockquote&gt;TEXT:alkan~&lt;br /&gt;TEXT:hiduminium~0.3&lt;/blockquote&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Bliskość położenia frazy (proximity)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Parametr wskazuje maksymalną odległość słów od siebie.&lt;br /&gt;&lt;blockquote&gt;TEXT:&quot;endopeptydaza pepsyna&quot;~7&lt;/blockquote&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Priorytet frazy (boost)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Liczba wskazuje ważność.&lt;br /&gt;&lt;blockquote&gt;TEXT:&quot;Notogea&quot; OR TEXT:&quot;Antarktis&quot;^2&lt;/blockquote&gt;&lt;br /&gt;Więcej na &lt;a href=&quot;http://wiki.alfresco.com/wiki/Full_Text_Search_Query_Syntax&quot;&gt;stronach wiki&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://publicmethods.blogspot.com/feeds/4761590237140632338/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1100449670278139755/4761590237140632338?isPopup=true' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/4761590237140632338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/4761590237140632338'/><link rel='alternate' type='text/html' href='http://publicmethods.blogspot.com/2009/07/wyszukiwanie-wezow-w-alfresco-czesc-1.html' title='Wyszukiwanie węzłów w Alfresco, Część 1'/><author><name>Jakub Woźniakowski</name><uri>http://www.blogger.com/profile/05239465453605577167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh39KiyBqYZmvuqQBqgocpidwytaJ-PwmWhtmR8XedGPla-Ddq5smpHR6nLgBPT-P0v_04Cb5CT6TqgehvrnbjCW7ZE3w5DpfNZKOYoLr8HKYDf2C6YuXCbstvSCIPYfJFpiBSqBRgBz6k/s72-c/nodebrowser.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1100449670278139755.post-787232919344448663</id><published>2009-07-16T11:08:00.000+02:00</published><updated>2009-07-16T11:18:15.419+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Alfresco"/><category scheme="http://www.blogger.com/atom/ns#" term="JackRabbit"/><title type='text'>JackRabbit code review &#39;05</title><content type='html'>Przeglądając wiki Alfresco natrafiłem na archiwalny &lt;a href=&quot;http://wiki.alfresco.com/wiki/JackRabbit&quot;&gt;raport&lt;/a&gt; z audytu kodu &lt;a href=&quot;http://jackrabbit.apache.org/&quot;&gt;Apache JackRabbit&lt;/a&gt;&#39;a. Opis dotyczy wersji 0.16.2 z okolic 2005 roku - wtedy w fazie inkubacji. Panowie zastanawiają się nad użyciem implementacji Apache w architekturze powstającego ECM Alfresco. Poniżej ciekawsze fragmenty.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;&quot; onmouseover=&quot;_tipon(this)&quot; onmouseout=&quot;_tipoff()&quot;&gt;&lt;span class=&quot;headingTwoGrey&quot;&gt;Andy (Hind&lt;/span&gt;&lt;/span&gt; ?):&lt;br /&gt;&lt;ul&gt;&lt;li&gt; No version control  &lt;/li&gt;&lt;li&gt; Persistence is not synchronised and will have threading issues  &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; Not sure if they have workspaces&gt; (There is no system workspace and noy dynamic workspace. I think there is just one * workspace) - Could support this in subversion style &lt;/li&gt;&lt;li&gt; There can be multiple instantiations pointing at the same repository which will cause havoc.  &lt;/li&gt;&lt;li&gt; Does authentication and authorization work – looks very simple …  &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;David (Caruana ?):&lt;br /&gt;&lt;blockquote&gt;In the bug tracking system, the following comment may back this up - &quot;i must admit that i took no care about multihtreading until now. but of course i will do it now.&quot; - a comment from the guy who wrote the versioning piece.&lt;br /&gt;&lt;br /&gt;When you look at the code, you get the Slide v1.0 feeling. There are going to be bugs due to the amount of in-memory data structures that need to be kept just right - in a multi-threaded context. It&#39;s not the sort of thing that&#39;s easily fixed - there will be a Slide 3.0 equivalent when a re-design of the architecture is considered.&lt;br /&gt;&lt;p&gt;Given all this caching, hierarchy related processing performance will still suffer.  There&#39;s no indexing as far as I can see. &lt;/p&gt;&lt;p&gt;As Andy has pointed out, there are numerous holes and inconsistencies - I expect these will get fixed as time goes by.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;What do we do with JackRabbit?&lt;br /&gt;&lt;br /&gt;We could:&lt;br /&gt;1. Use it as our basic Repository capability - build our stuff around it&lt;br /&gt;2. Build our own Repository capability and use JackRabbit where possible to provide a JSR-170 facade&lt;br /&gt;3. Not use it at all&lt;/p&gt;&lt;p&gt;Option 1 might be viable if it&#39;s a stepping stone to building a community quickly with the intention of replacing it. &lt;/p&gt;&lt;p&gt;But, my preference is option 2. We&#39;d probably gut JackRabbit anyway (not very nice!!) to cater for native db implementation and subversion type capability and also to fix reliability issues. However, it would give a head-start to providing a facade to our own stuff e.g. Type Model, Query etc. &lt;/p&gt;&lt;/blockquote&gt;&lt;span style=&quot;&quot; onmouseover=&quot;_tipon(this)&quot; onmouseout=&quot;_tipoff()&quot;&gt;&lt;span class=&quot;headingTwoGrey&quot;&gt;&lt;br /&gt;&lt;a href=&quot;http://wiki.alfresco.com/wiki/JackRabbit&quot;&gt;Pełna wersja raportu.&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicmethods.blogspot.com/feeds/787232919344448663/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1100449670278139755/787232919344448663?isPopup=true' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/787232919344448663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/787232919344448663'/><link rel='alternate' type='text/html' href='http://publicmethods.blogspot.com/2009/07/jackrabbit-code-review-05.html' title='JackRabbit code review &#39;05'/><author><name>Jakub Woźniakowski</name><uri>http://www.blogger.com/profile/05239465453605577167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1100449670278139755.post-7798245325944548337</id><published>2009-07-10T16:53:00.001+02:00</published><updated>2009-10-31T21:38:05.535+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Monitoring"/><category scheme="http://www.blogger.com/atom/ns#" term="Tomcat"/><title type='text'>Monitorowanie Tomcat&#39;a i Lambda Probe</title><content type='html'>Dzisiaj swoją szanse dostała Lambda Probe (wcześniej Tomcat Probe) - aplikacja do administracji i monitorowania serwera Apache Tomcat. Instalacja w formie war&#39;a, licencja GNU GPL, ładne GUI - to atuty znane przed instalacją ze &lt;a href=&quot;http://www.lambdaprobe.org/&quot;&gt;strony produktu&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUukfJWLK7VsDyqWkoDNcND0OAugejLQd6Pn85K02apFwlstJo5YFIaMRk8Vi5aSwnmFIjRWGQf9LC6pmfUJkVmjuDJ_OoMzJ-GAzfTbVwz92Dh2fxwg1NdrCyEUkvLJ445eN4NX-eRG4/s1600-h/Screenshot-Probe+-+OS+information+-+Mozilla+Firefox.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 135px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUukfJWLK7VsDyqWkoDNcND0OAugejLQd6Pn85K02apFwlstJo5YFIaMRk8Vi5aSwnmFIjRWGQf9LC6pmfUJkVmjuDJ_OoMzJ-GAzfTbVwz92Dh2fxwg1NdrCyEUkvLJ445eN4NX-eRG4/s320/Screenshot-Probe+-+OS+information+-+Mozilla+Firefox.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5356579871628305266&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Najważniejsze ficzery&lt;br /&gt;&lt;br /&gt;-działa na Tomcie od 5.0 wzwyż i na jBossie&lt;br /&gt;-na dzień dobry wszystko to co daje Manager&lt;br /&gt;-szczegółowe &lt;span style=&quot;font-weight: bold;&quot;&gt;monitorowanie pamięci&lt;/span&gt; + wykresy&lt;br /&gt;-monitorowanie &lt;span style=&quot;font-weight: bold;&quot;&gt;obciążenia CPU&lt;/span&gt;&lt;br /&gt;-szczegółowe &lt;span style=&quot;font-weight: bold;&quot;&gt;monitorowanie wątków&lt;/span&gt;, możliwość zabicia wątku&lt;br /&gt;-monitoriwanie &lt;span style=&quot;font-weight: bold;&quot;&gt;ruchu i liczby zapytań&lt;/span&gt; w podziale na connectors&lt;br /&gt;-przeglądanie plików JSP, re-kompilacja JSP&lt;br /&gt;-lista i &lt;span style=&quot;font-weight: bold;&quot;&gt;przeglądanie logów&lt;/span&gt; (Tomcat 6 =&gt; tylko LOG4J)&lt;br /&gt;-lista DataSource, test połączenia, wykonanie zapytania SQL&lt;br /&gt;-&lt;span style=&quot;font-weight: bold;&quot;&gt;monitorowanie klastra&lt;/span&gt; + wykresy ruchu&lt;br /&gt;-możliwość &lt;span style=&quot;font-weight: bold;&quot;&gt;restartu JVM&lt;/span&gt; - wymagana istalacja &lt;a href=&quot;http://sourceforge.net/projects/wrapper/&quot;&gt;Java Service Wrapper&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pełna lista możliwości &lt;a href=&quot;http://www.lambdaprobe.org/d/overview.shtml&quot;&gt;tutaj&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhNgj7CkPfd6ZUEYGx2ufETCu057bxYElIBo2ovTLVM_Kmg_8TCXokJqmVdMgujNWj_bIJLm5AbzRbSz6jvvHHACuuelpXA2Yvxg5rXr2wfpYdjKpub_tcepE3nPh0bb9fBVJQDG7hPCU/s1600-h/Screenshot-Probe+-+JVM+memory+usage+-+Mozilla+Firefox.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 147px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhNgj7CkPfd6ZUEYGx2ufETCu057bxYElIBo2ovTLVM_Kmg_8TCXokJqmVdMgujNWj_bIJLm5AbzRbSz6jvvHHACuuelpXA2Yvxg5rXr2wfpYdjKpub_tcepE3nPh0bb9fBVJQDG7hPCU/s320/Screenshot-Probe+-+JVM+memory+usage+-+Mozilla+Firefox.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5356573236008062850&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Instalacja&lt;br /&gt;&lt;br /&gt;Jest &lt;a href=&quot;http://www.lambdaprobe.org/d/installation.shtml&quot;&gt;bardzo prosta&lt;/a&gt;. Z &lt;a href=&quot;http://www.lambdaprobe.org/d/download.htm&quot;&gt;oficjalnej strony&lt;/a&gt; pobieram binarkę. Dla własnego komfortu publikuję wara w formie exploded. W środku JSP, Spring i SiteMesh - żadnych szaleństw i oto chodzi. Na JVM na której pracuje serwer konieczne jest włączenie &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#local&quot;&gt;JMX agent&#39;a&lt;/a&gt; z dostępem lokalnym przez dodanie parametru:&lt;br /&gt;&lt;blockquote&gt;-Dcom.sun.management.jmxremote&lt;br /&gt;&lt;/blockquote&gt;Po restarcie serwera aplikacja wstaje za pierwszym razem. Autentykacja przez kontener, wymagany user posiadający rolę &quot;manager&quot; - tak jak w &lt;a href=&quot;http://tomcat.apache.org/tomcat-6.0-doc/manager-howto.html#Configuring%20Manager%20Application%20Access&quot;&gt;Tomcat Manager&lt;/a&gt; (do wyboru są jeszcze role probeuser, poweruser, poweruserplus). Instalacja poszła gładko.&lt;br /&gt;&lt;br /&gt;Pierwsze wrażenie&lt;br /&gt;&lt;br /&gt;Bardzo ładny, czytelny, funkcjonalny interfejs. Od razu wiadomo gdzie czego szukać. Automatyczne odświeżanie wykresów i tabel w Ajax&#39;ie (prototype + scriptaculous). Jest kilka przydatnych bajerów - każdy wykres jednym kliknięciem można powiększyć na pełny ekran. W porównaniu do Tomcat Manager&#39;a to skok w inną epokę.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTVCaenR6W5onOmVwCf2OYvARsUWGTTQCN52z7bfauVpY3UaBeav84E7xZ-F8Q56jsTI2YM4gFDn3IuTWBG7Vd6kAt4ivoTEWFbFw0a7ibyt5yEGuhUXqj_54icstQy3fGQhrA7gBx3So/s1600-h/connectors.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 177px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTVCaenR6W5onOmVwCf2OYvARsUWGTTQCN52z7bfauVpY3UaBeav84E7xZ-F8Q56jsTI2YM4gFDn3IuTWBG7Vd6kAt4ivoTEWFbFw0a7ibyt5yEGuhUXqj_54icstQy3fGQhrA7gBx3So/s320/connectors.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5356813500868129746&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Drugie wrażenie&lt;br /&gt;&lt;br /&gt;Nie wszystko działa idealnie. Irytuje wyskalowanie wykresów do maksymalnej aktualnie wyświetlanej wartości, zamiast do maksymalnej możliwej. Górną granicą Perm Gen powinien być MaxPermSize! Dobrze że w tabelce jest procentowy progres.&lt;br /&gt;&lt;br /&gt;Brakuje powiadomień. Chciałbym dostać e-maila z informacją jeśli dzieje się coś niedobrego. Nie ma możliwości zachowania pełnych danych historycznych, nie mówiąc o wysłaniu ich w mailu. Domyślnie wykresy przedstawiają tylko ostatnie 2 godziny. Na szczęście można poprosić Spring&#39;a o ustawienie innych niż domyślne triggerów &lt;a href=&quot;http://www.opensymphony.com/quartz/&quot;&gt;Quartz&lt;/a&gt; (30 sekund) i zmienić długość przechowywanych serii   (/WEB-INF/spring-stats.xml). Trzeba uważać żeby nie przesadzić - dane są serializowane przez &lt;a href=&quot;http://xstream.codehaus.org/&quot;&gt;XStream&lt;/a&gt; na bieżąco do pliku (/work/Catalina/localhost/probe/stats.xml) i przy większym rozmiarze serii może wystąpić problem wydajnościowy. Poniżej przykład zmiany długości strumienia do 720 - przy logowaniu co 30sek. daje to 6 godzin (spring-stats.xml).&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;brush:xml&quot;&gt;&amp;lt;bean name=&quot;memoryStatsCollector&quot;&lt;br /&gt;class=&quot;org.jstripe.tomcat.probe.beans.stats.collectors.JvmMemoryStatsCollectorBean&quot;&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;jvmMemoryInfoAccessor&quot; ref=&quot;jvmMemoryInfoAccessor&quot;/&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;statsCollection&quot; ref=&quot;statsCollection&quot;/&amp;gt;&lt;br /&gt;&amp;lt;property name=&quot;maxSeries&quot; value=&quot;720&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Martwi brak aktualizacji projektu przez ostatnie 3 lata - najnowsza wersja 1.7b (beta?) jest z listopada 2006. Pewnie dlatego że jest taka dobra i nie zawiera żadnych błędów. ;)&lt;br /&gt;&lt;br /&gt;Lambda to bardzo dobre narzędzie. Praca z takim GUI to czysta przyjemność. Od dzisiaj pierwszym krokiem po instalacji Tomcata powinno być wyrzucenie Managera i instalacja w to miejsce Lambda Probe. ;)</content><link rel='replies' type='application/atom+xml' href='http://publicmethods.blogspot.com/feeds/7798245325944548337/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1100449670278139755/7798245325944548337?isPopup=true' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/7798245325944548337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/7798245325944548337'/><link rel='alternate' type='text/html' href='http://publicmethods.blogspot.com/2009/07/monitorowanie-tomcata-i-lambda-probe.html' title='Monitorowanie Tomcat&#39;a i Lambda Probe'/><author><name>Jakub Woźniakowski</name><uri>http://www.blogger.com/profile/05239465453605577167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUukfJWLK7VsDyqWkoDNcND0OAugejLQd6Pn85K02apFwlstJo5YFIaMRk8Vi5aSwnmFIjRWGQf9LC6pmfUJkVmjuDJ_OoMzJ-GAzfTbVwz92Dh2fxwg1NdrCyEUkvLJ445eN4NX-eRG4/s72-c/Screenshot-Probe+-+OS+information+-+Mozilla+Firefox.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1100449670278139755.post-6090599702251681048</id><published>2009-07-08T14:23:00.011+02:00</published><updated>2009-10-31T21:38:56.643+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Lucene"/><title type='text'>Indeksowanie pól typu data/czas w Apache Lucene</title><content type='html'>Zadanie: wykonanie wyszukiwania w Lucene artykułów w określonym przedziale czasowym i wyświetlenie daty publikacji bez czytania z bazy danych. Indeksowanie pola typu data.&lt;br /&gt;&lt;br /&gt;Ekipa Lucene zaleca zapisywanie daty jako zwykłe pole tekstowe po konwersji do typu String (klasa dedykowana do czasu DateField jest oznaczona jako przestarzała @Deprecated). Najbardziej wydajne jest indeksowanie minimalnej potrzebnej dokładności czasu - im wieksza precyzja, tym dłuższy String i większe obciążenie wydajnościowe podczas wyszukiwania. Data jest konwertowana do formatu który pozwala na sortowanie leksykalne, np. dla dokładności rzędu pojedynczego dnia: CCYYMMDD (20090503 = 3 maja 2009). Dodatkowym plusem takiego formatu ma być możliwość zapisania daty sprzed 1970 roku.&lt;br /&gt;&lt;br /&gt;Do zamiany czasu na tekst służy klasa org.apache.lucene.document.DateTools której metody statyczne wykonają robotę w obie strony. Do wyboru są metody przyjmujące jako argument typ java.util.Date i long (milisekundy). Statyczna klasa zagnieżdżona DateTools.Resolution pozwala na określenie dokładności konwersji (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, MILLISECOND).&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;brush:java&quot;&gt;static String dateToString(Date date, DateTools.Resolution resolution)&lt;br /&gt;static String timeToString(long time, DateTools.Resolution resolution)&lt;br /&gt;static Date stringToDate(String dateString)&lt;br /&gt;static long stringToTime(String dateString)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Przykład indeksowania daty z dokładnością do dnia:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;brush:java&quot;&gt;Directory directory = getDirectory();&lt;br /&gt;IndexWriter writer = getWriter(directory);&lt;br /&gt;Document doc = new Document();&lt;br /&gt;doc.add(new Field(”body”, text, Field.Store.YES, Field.Index.ANALYZED));&lt;br /&gt;String dateStr = null;&lt;br /&gt;if(content.getDate()!=null)&lt;br /&gt;  dateStr = DateTools.dateToString(content.getDate(), DateTools.Resolution.DAY);&lt;br /&gt;doc.add(new Field(”date”, dateStr, Field.Store.YES, Field.Index.NOT_ANALYZED));&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Przykład kodu wyszukującego po przedziale czasowym i odczytanie daty z indeksu:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;brush:java&quot;&gt;Directory directory = getDirectory();&lt;br /&gt;IndexSearcher searcher = new IndexSearcher(directory);&lt;br /&gt;RangeQuery rquery = new RangeQuery(new Term(&quot;date&quot;, &quot;20090401&quot;), new Term(&quot;date&quot;, &quot;20090601&quot;), true);&lt;br /&gt;TopDocs docs = searcher.search(rquery, 100);&lt;br /&gt;ScoreDoc[] scoreDocs = docs.scoreDocs;&lt;br /&gt;for(int d=0;d&lt;scoredocs.length;d++){&gt;&lt;br /&gt;  ScoreDoc scoreDoc = scoreDocs[d];&lt;br /&gt;  Document doc = searcher.doc(scoreDoc.doc);&lt;br /&gt;&lt;br /&gt;  String body = doc.get(”body”);&lt;br /&gt;  String dateStr = doc.get(”date”);&lt;br /&gt;  Date date = null;&lt;br /&gt;  try {&lt;br /&gt;      date = DateTools.stringToDate(dateStr);&lt;br /&gt;  } catch (Exception e) { }&lt;br /&gt;  System.out.println(”body:”+body);&lt;br /&gt;  System.out.println(”data:”+date);&lt;br /&gt;}&lt;br /&gt;searcher.close();&lt;/scoredocs.length;d++){&gt;&lt;/blockquote&gt;&lt;scoredocs.length;d++){&gt;&lt;br /&gt;&lt;br /&gt;JavaDoc zaleca użycie ConstantScoreRangeQuery w miejsce RangeQuery, bo ponoć jest szybsze i bezpieczniejsze (nie wyrzuca wyjątku BooleanQuery.TooManyClauses przy przektoczeniu 1024 wyników). W miejsce Query można rozważyć zastrosowanie filtra RangeFilter.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Linki:&lt;br /&gt;&lt;a href=&quot;http://wiki.apache.org/lucene-java/DateRangeQueries&quot;&gt;http://wiki.apache.org/lucene-java/DateRangeQueries&lt;/a&gt;&lt;br /&gt;niektóre wpisy w wiki Lucene są nieaktualne&lt;/scoredocs.length;d++){&gt;</content><link rel='replies' type='application/atom+xml' href='http://publicmethods.blogspot.com/feeds/6090599702251681048/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1100449670278139755/6090599702251681048?isPopup=true' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/6090599702251681048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1100449670278139755/posts/default/6090599702251681048'/><link rel='alternate' type='text/html' href='http://publicmethods.blogspot.com/2009/07/indeksowanie-pol-typu-dataczas-w-apache.html' title='Indeksowanie pól typu data/czas w Apache Lucene'/><author><name>Jakub Woźniakowski</name><uri>http://www.blogger.com/profile/05239465453605577167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>