čtvrtek 23. února 2012

JViewport aneb jak umístit prvek do středu?

Při práci se JScrollPane jsem narazil na menší problém - jak umístit label doprostřed JPanel, který obsahuje zmíněný JScrollPane? Zjistil jsem, že teda JScrollPane v sobě obsahuje instanci JViewport, který označuje ta část, která je vidět (něco jako kukátko u dalekohledu). Pro zjištění polohy středu JViewport tedy stačí zjistit její souřadnici + velikost a vydělit 2. Neboli takto:

Rectangle viewRectangle = _scrollPane.getViewport().getViewRect();
int xCoord = (viewRectangle.width + _labelLoadingPanel.getWidth())/2 + viewRectangle.x;
int yCoord = (viewRectangle.height + _labelLoadingPanel.getHeight())/2 + viewRectangle.y;

Vypadá to docela easy. Ale než jsem na to přišel :D Setkal jsem se totiž s dalšími problémy:
  1. JViewport obsahuje metodu getExtentSize() pro zjištění velikosti zobrazované části. Problém byl v tom, že tato metoda nevracelo velikost jako takové, ale souřadnice dolního pravého rohu (RTFM, RTFM).
  2. Tento problém nijak nesouvisí s JViewport, ale znemožňovalo mi posunovat prvek. Celý problém byl v tom, že NetBeansovský Free Layout z nějakého neznámého důvodu vůbec neposunoval prvek. Stačí zkusit jiný Layout Manager a vše běželo jak drak.
Jdu pokračovat, hola.

neděle 19. února 2012

Dokumentace v Grails

Dnes jsem poprvé zkoušel vytvořit dokumentaci v Grails. Soubor dokumentace má koncovku .gdoc a používá se syntaxe Textile. Bohužel IntelliJ IDE, ve kterém vyvíjím, nepodporuje tuto syntaxi. Nakonec jsem našel JQuery editor MarkItUp, který umožňuje snadné vkládání syntaxí do textu.

sobota 18. února 2012

Rozdělení Config.groovy do více souborů

Ve své Grails aplikaci jsem chtěl nastavit více konfiguračních souborů, aby nebyly všechny konfigurace naplácené v jednom. Problém byl v tom, že jsem nevěděl, kam správně umístit tyto soubory, aby se daly na ně odkazovat.
V oficiální dokumentaci nebylo příliš popsané. Je tam zmínka o externích konfiguracích (kap. 3.4.), avšak nezjistil jsem, kde je cesta k proměnné classpath. V případě "file:${userHome}/.grails/${appName}-config.groovy" bylo správné umístění hned ve složce .grails v domácím adresáři (tj. /home/vaseJmeno/.grails, to se mi také příliš nehodilo, protože potřebuji to mít vše v jednom rar souboru kvůli deploymentu. Nakonec jsem zkusil možnost třetí, tj. grails.config.locations = [com.my.app.MyConfig]. Přečetl jsem nějaká fóra a nakonec jsem zjistil, že musím dát konfigurák do složky src/groovy pro *.groovy konfiguráky. Jakmile tam soubor umístíte, tak IntelliSense v IntelliJ již vám napoví název souboru a vloží vám správně. Můj odkaz konfigurák nakonec vypadal takto: grails.config.locations = [SpringSecurityConfig], s tím, že soubor SpringSecurityConfig.groovy byl umístěný ve src/groovy. Tento způsob poté jsem bez problému nasadil do Cloud Foundry a vše běželo.


Update: dnes jsem zjistil, že se nemusí dávat někam do src/groovy, ale klidně to té samé složky jako Config.groovy.


Zdroj: http://grails.1312388.n4.nabble.com/Understanding-grails-config-locations-td3176046.html

Cloud Foundry a problém se Spring Security v Grails

Při vývoji jedné aplikace využívám framework Grails a pro autentizaci plugin Spring Security. Při deploymentu na Cloud Foundry (CF) jsem se však setkal s nepříjemnou výjimkou java.lang.IllegalStateException a s takřka nic neříkajícím výpisem: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
Dlouho jsem netušil jak na to. Nakonec jsem napsal do fóra na CF a odpověď přišla brzy: je to způsobené použitím anotací. Chyba se dala spravit tím, že místo anotací mám použít zbývající dva způsoby: InterceptUrlMap nebo Requestmap. Nakonec jsem zvolil způsob InterceptUrlMap, který spočíval v tom, že zabezpečené URL se namapují v Config.groovy.

Update: tak hurá už to frčí. Dnes (21.2.2012) mi psal jeden z vývojářů CF, že problém byl v pluginu do Grails a pro opravu stačí přidat compile ":webxml:1.4.1" do části plugins v souboru BuildConfig.groovy

středa 15. února 2012

Grails aplikace na Jelastic.com

Deployment na tento server je vcelku jednoduchý. Existuje totiž oficiální návod přímo od Jelastic. Co v návodu chybí, je konfigurace databáze. Na to však existuje jiný návod, který lze aplikovat pro Grails aplikace. Po rozběhnutí a první navštívení aplikace vypadá vše ok, ale pak ouvej. Když jsem si chtěl vytvořit záznam s českými znaky, do MySQL databáze se místo nich uložily "?".
Moje první podezření padlo na databázi a nastavení Collation. Měl jsem nastavený utf-8-cs, takže to bylo v pořádku. I jednotlivé tabulky a řádky byly stejně nastavené. Takže tím to nebylo.
Po chvíli googlování jsem měl další podezření. Mohlo by to nastat při zasílání požadavku ze stránek, kdy české znaky se kódují jako entity. Vypsal jsem si tedy v controlleru tyto hodnoty, a zjistil jsem, že to také nebylo ono.
Nakonec jsem našel tuto diskusi: http://stackoverflow.com/questions/3064644/character-encoding-problem-spring (big up této diskusi). Stačilo doplnit na konci jdbc url parametr ?useUnicode=yes&characterEncoding=UTF-8