Creating rules programaticaly
25. Led
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:
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:
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:
And of course third node type – action. With or without parameters. In both cases with properties like definitionName, executeAsynchronously, etc. see following image:
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).
Controller for views in root
6. Pro
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.
Proc delam svou praci spatne?
2. Pro
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
.
Pisou judiste jako prasata?
18. Lis
Problemy s chromiem na Ubuntu LucidLynx
2. Lis
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.
- 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?




Nejnovější komentáře