Václav Balák

Sledujte mě na Twitteru!Zdroje RSS

  • O mně
  • Blog

Creating rules programaticaly

25. Led

Napsal shMoula do Programování

Žádné komentáře

Nowadays I’ve been working on policies and triggering a behavior  based on user action, so I wanted to write about it, but I found more interesting stuff I did with it than triggering itself (which is by the way well described by Jeff Potts). I wanted a routine, which runs on every node created and adds a rule, if that node is a folder.

At first I did some research on rules. How are rules bound to nodes? We’re working on repository, so it should be a node. When you open a node browser and look on node with rule bound, you’ll see ‘ruleFolder’ child of that node of ruleFolder type. Children of this node are rules itself – one child, one rule. Inside each are actions defined with conditions and actions with their parameters, like on following structure:

RuleFolder structure

RuleFolder structure

Conditions may be structured too – if condition is not „no-condition“ – there may be much complicated structure: either condition itself (actioncondition node type) with parameters as children, or composite-condition (compositeactioncondition node type) with conditions nested inside. Each condition has „invert“ boolean variable, which inverts condition meaning. Properties of simpliest condition (no-condition) are on following image:

Condition properties

Condition properties

Parameters are another types of node – actionparameter. Each has two important properties: parameterName and parameterValue and those values depends on action (or condition) on which is this parameter bind to. Example of parameter for copy-to-webproject action is on following image:

Parameter properties

Parameter properties

And of course third node type – action. With or without parameters. In both cases with properties like definitionName, executeAsynchronously, etc. see following image:

Action properties

Action properties

Examples on how to set rule on node are in nodeRef cookbook. I worked with CopyToWebProject action, which can be with parameters defined like this:

[code lang="java"]
Action myAction = actionService.createAction(CopyToWebProjectActionExecuter.NAME);
Map<String, Serializable> actionProps = myAction.getParameterValues();
actionProps.put(CopyToWebProjectActionExecuter.PARAM_DESTINATION_FOLDER, avmRef);
myAction.setParameterValues(actionProps);
[/code]

Note static variables with parameter names (prefix PARAM_). Executers are in org.alfresco.repo.action.executer package, or it’s possible to use own action executer (extending ActionExecuterAbstractBase).

Next step is to add a condition, in my case HasAspectEvaluator like this:

[code lang="java"]
ActionCondition condition = actionService.createActionCondition(HasAspectEvaluator.NAME);
Map<String, Serializable> conditionProps = new HashMap<String, Serializable>();
conditionProps.put(HasAspectEvaluator.PARAM_ASPECT, ContentModel.ASPECT_WORKING_COPY);
condition.setParameterValues(conditionProps);
condition.setInvertCondition(true);
[/code]

Evaluators (package org.alfresco.repo.action.evaluator) also have parameter names defined with prefix PARAM_. Previous code creates condition testing aspect is NOT set on node (note setInvertCondition() method) – this condition is for testing copied content is not working copy.

Created condition and action should be placed in CompositeAction:

[code lang="java"]
CompositeAction compositeAction = actionService.createCompositeAction();
compositeAction.addActionCondition(condition);
compositeAction.addAction(myAction);
[/code]

And the final step is to add this whole composition inside created rule and use ruleService to bind created rule to node – through its nodeRef:

[code lang="java"]
rule.setAction(compositeAction);
ruleService.saveRule(sourceRef, rule);
[/code]

This is enough and it should work. What am I using it for? I need CopyToWebProject rule to foolow tree structure in DM, not just copy everything in subdirs to given folder. So I have my own implementation of OnCreateNodePolicy, which binds this rule to every created folder (under some conditions of course).

Alfresco, howto

Controller for views in root

6. Pro

Napsal shMoula do Programování

Žádné komentáře

Yesterday while developping ukazbobra I realized, that I don’t know how to map controller for my index view in root of Spring MVC project. I searched and experimented a bit and here is a solution. Please note I’m using Spring Roo and annotation driven setup.

First thing is to create controller, for example simple one like this:

[code language="java"]@RequestMapping("/")
@Controller
public class RootController {

@RequestMapping(method = RequestMethod.GET)
public String index(Model model) {
model.addAttribute("foo", "bar");
return "index";
}
. . .
[/code]

Now you have to turn off thing named ParameterizableViewController, which staticaly selects a view for for rendering. So open up webmvc-config.xml and remove line with mapping for index view:

[code language="xml"]<mvc:view-controller path="/" view-name="index"/>[/code]

That is all, nothing more, nothing less – you have working controller for your index page in root and also for other views.

howto, java, roo, spring, tipy

Proc delam svou praci spatne?

2. Pro

Napsal shMoula do Programování

2 komentářů

Jak tak sjizdim videa z letosniho brnenskeho Barcampu, chtel jsem okomentovat zaznam prednasky Jana Martinka (@endlife) – Proc delam svou praci spatne. Na komentar to vsak bylo moc dlouhe, tak to davam sem a trochu rozsiruju.

Zacina casti nazvanou spatny odhad, kde rika neco jako „prihlasovani je jedna trida v modelu, to bude jednoduchy.“ Zminuje, jak se postupne nabaluji dalsi veci – login se meni na email, pridava validaci, jednotne zobrazovani chyb, moznost resetu hesla… Pokud pominu fakt, ze nepouzil nekterou z moznosti existujicich validaci (napr. z frameworku dojo), napada me otazka, proc tohle resit v nejake pomerne ranne fazi projektu? Shodou okolnosti o tom nedavno psal Jirka Knesl (blogpost Minimal Viable Product), dokonale to popsali tez panove z 37signals v knize Restart, volne cituji: “protoze platby za profi program maji probihat az koncem mesice, odlozili jsme implementaci modulu na provadeni plateb a venovali se dulezitejsim vecem.“ S tim se neda nesouhlasit – proc implementovat funkci pro obnoveni hesla? Vzdyt to muze pockat, kolik bude navstevniku, kteri zapomenou heslo chvili po registraci? Dulezite je spustit ASAP – featury se mohou pridavat casem – obrovska vyhoda webovych projektu.

Cast nazvana Matrix – administracni rozhrani (Adminer) pripomina Matrix – cisla, data, znaky… Nepovolany vubec netusi, ktera bije. Nevyhoda KISS pristupu, ale samozrejme – pokud to adminovi vyhovuje, neni to zadny problem, taky mam radsi Midnight commandera, nez okynka :-) . Kdo ne, at zkusi googlit alespon termin Scaffold. V Nette tohle opravdu neni?

Pokryti aplikace testy – uvedl naprosto ukazkovy priklad toho, proc je vhodne testy psat: zakomentoval cast kodu pri ladeni a zapomnel pote komentar odstranit. Jestli tohle cloveka neprinuti o psani testu aspon premyslet, tak uz nevim co :-) . Testovat, testovat, testovat! Dekuji.

Napiste nam – plural, vs. singular? To je jedno, hlavne byt profesional a verit tomu, co delam! Pekne receno, pekne tipy (odpovidat na mejly, profesional zna sve limity, cenu…).

Pointa prednasky je – hledani partaka na projekt. Jan to zjistil po roce, co vyvijel sam. Jak to zjistil? Potreba jineho pohledu na vec – kdyz clovek dela projekt sam, jiny pohled na danou vec ziska az s odstupem casu, partak muze mit jiny pohled na vec hned. Pravdive, velmi prakticke. No a pak i dalsi veci…

Takze pokud nekdo kombinuje do CV veci jako nette, TDD ci Git, muze mu poslat mejl. No a ja mu timto preju hodne stesti v nalezeni partaka i v uspechu projektu ;-) .

Ostatní

Pisou judiste jako prasata?

18. Lis

Napsal shMoula do Programování

Žádné komentáře

Zvykam si delat veci jednoduse. Byvaly doby, kdy jsem psal univerzalni kousky kodu, protoze „co kdyz nahodou nekdy“. Dlouze a zbytecne jsem ladil genericke tridy, metody pro ruzne jine obecne vstupy atd. V posledni dobe si vsimam, ze kdyz pisu rychle a jednoduse (neboli jako prase), vubec to nevadi – proste dany fragment napisu presne na telo dane situaci a kdyz ho nahodou budu potrebovat v budoucnu modifikovat, tak jej udelam univerzalnim az tehdy (v mnoha pripadech to nebude vubec potreba a ja diky tomu usetrim spoustu casu).
Uvedomil jsem si to pri cteni Restartu – stavam se Judistou. V knize je uveden krasny priklad: „Dejme tomu, ze chceme ziskat pohled na zem z ptaci perspektivy. Jednou z moznosti je vylezt na Mount Everest. Druha moznost je vyvezt se vytahem na vyhlidkovou terasu vyskove budovy.“ V knize se to sice tyka neceho trochu jineho a navic jsem to vytrhl z kontextu, ale presne takhle to citim a od ted se tim budu ridit.
Ostatní, tipy

Problemy s chromiem na Ubuntu LucidLynx

2. Lis

Napsal shMoula do Počítače

Žádné komentáře

Po jistem update systemu pred nekolika mesici mi zacalo kolabovat Chromium, ale mira kolapsu byla jeste tolerovatelna – cca 2x za den jsem provadel killall a myslel jsem, ze je to nejakym pluginem ci chybou v konfiguraci. Od vcerejska to zacalo kolabovat nepretrzite a stalo se temer nepouzitelnym, tak jsem se rozhodl s tim zacit neco delat a co s tim delam budu psat prubezne sem, protoze jsem se stale nedobral reseni.

Stale jsem mel za to, ze je chyba v konfiguraci meho pocitace, protoze na jinem mi vsechno fungovalo bez problemu (totozna distribuce, verze…), pak jsem ale udelal update virtualu a stalo se mi to stejne, takze jsem si uvedomil, ze na onom jinem stroji mam novejsi verzi Ubuntu a tento problem tudiz postihuje verzi 10.04, takze jsem mel prvotni keywords pro reseni situace. Jeste predtim jsem pro jistotu odinstaloval flash. Napadu a rad jsem potom postupne vyzkousel nekolik:

  • Smazat ~/.config/chromium a ~/.cache/chromium a po nastartovani nepovolovat synchronizaci s google uctem. Provedl jsem a skoncil s vysledkem, ktery ilustruje nasledujici obrazek (a aspon me to docela rozesmalo). V kazdem pripade mazani techto adresaru jsem provadel v kazdem mezikroku, kdyby nahodou neco… Nejzajimavejsi na tomto celem je, ze i kdyz jsem smazal veskere konfiguracni soubory a nepovoloval synchronizaci, presto obcas se mi stalo, ze byly predvyplneny formulare!!! Tento jev si nedokazu nijak vysvetlit.
Zdechly chrome

Zdechly chrome

  • V dalsim kroku jsem si vzal k ruce seznam prepinacu pro spousteni chromia a pokusil jsem se ho spustit v debug rezimu s vypnutymi vsemi pluginy, javascriptem, javou… a mam z toho dojem, ze za vsechny ty problemy muze javascript. Ale web byl totalne nepouzitelny – nemluvim o tom, ze zmizelo pohodli, ale obrovske mnozstvi sajt bylo naprosto neovladatelnych, takze taky tudy cesta nevede.

[code language="bash"]chromium-browser --log-level=0 --enable-logging=stderr --disable-3d-apis --disable-accelerated-plugins --disable-webgl --disable-java --disable-extensions --disable-plugins --disable-javascript[/code]

  • Jako mezikrok jsem zauvazoval o debugovani, ale proboha – copak mam jako uzivatel mit cas instalovat gdb a vrtat se v tom? Z toho uz jsem vyrostl, kdyz jsem dal do haje Gentoo!
  • Jedeme dal – na ubuntu foru to par lidi resilo, vyzkousel jsem vsechny jejich tipy: purge, alternativni repozitar (ne doporucovany beta, ale daily builds, takze jsem vyzkousel i verzi 17.0.926.0) a nakonec jsem zkusil stahnout i primo chrome od Googlu.
  • Na jinem foru lidi zkouseli dalsi alternativni repozitar pro updaty Xek, takze jsem taky zkusil updatovat Xorg a ovladace, odstranit nepouzivane… A vysledek? Haha!
  • Dalsi mezikrok bylo zkusit to zbuildovat, ale ty prerequisities a predevsim naroky hardwarove (10G na disku, 4G pameti, 8G swapfile) a casove (uz ted s tim zabijim vice nez dost casu) – takze strucne receno: „srsly, wtf?“
  • Ve vyse uvedenem foru byl zminovan i upgrade jadra, na coz me privedla i jina diskuze, takze jsem stahnul nejprve 2.6.35-30 a ono (pro zmenu) nic. Dalsim jadrem na zkousku je 2.6.34…a nic. Mam dojem, ze uz delam zoufale kroky, ktere s tim nemaji nic spolecneho.

Vzhledem k tomu, ze na to nemam nekonecne mnozstvi casu, tak asi udelam upgrade systemu na nejakou vyssi verzi, coz jsem nechtel, protoze 10.04 ma byt LTS. Jak vidno, tak zrejme neni a rozumneho reseni se nemuzu dogooglit. Otazka je – je to ostuda pro me, nebo pro Ubuntu?

howto, linux
12345»102030...Poslední »
  • Štítky

    Alfresco Android Anglie bezpečnost Canada Cestování ejb english Eurotrip filmy flash focení fun gadgets geocaching geohashing google howto Hry internet explorer Itálie java javascript linux mikroformáty mobileweb Ostatní osud php roo spring surf tipy výlety vybavení Web webservices
  • Moje poslední tweety

    Načítám tweety...
    Sledujte mě na Twitteru!
  • Flickr Galerie

  • Nejnovější komentáře

    • shMoula u Proc delam svou praci spatne?
    • Honza Martinek u Proc delam svou praci spatne?
    • shMoula u MVC and Spring surf
    • Mani u MVC and Spring surf
    • Mani u MVC and Spring surf
Design Mystique | Vytvořil digitalnature | Grafika ukradena od patembe z tématu Illustrative | CSS přiohnul shMoula

Zdroje RSS XHTML 1.1 Nahoru