Alfresco 3.0

A héten valódi mérföldkőhöz érkezett el kedvenc dokumentumtároló rendszerem, egy félkésznek is nehezen mondható (3.0a), egy félkész (3.0b) és egy működő (3.0c) verzió után a héten napvilágot látott az Alfresco 3.0 Labs Stable kiadása.

Jutott nekünk az utóbbi egy évben community, enterprise ebből a termékből, csak egy nem nagyon, stabil, naprakész verzió. Lehetett választani a 2.1 Community-t, ami ugye ingyenes, de pont azok hiányoznak belőle ami miatt valakit érdekelt pl. a 2.9, továbbá nem lettek visszavezetve a 2.2 Enterprise-ban javított hibák. Lehetett választani a 2.9b-t ami egy átmenetnek tűnt a 2-es és a 3-as verziók között, abban javítva lettek a 2.1 hibái, viszont az új funkciók miatt számtalan újabbat sikerült beletenni. Ezekkel párhuzamosan jelent meg a 3.0 széria, ami a 3.0c-ig tényleg csak laborhasználatra volt jó – azaz fejlesztésre igen, de üzemi környezetre senki sem javasolta.

Ezek – GPL licensz – mellett volt még egy verzió, a 2.x Enterprise, melyben ugyan a 2.1-es széria hibái ki lettek javítva, de a 2.9-től bevezetett újdonságok hiányoztak belőle… Azaz értékesítésre, vagy szolgáltatásra nem lehetett jó verziót választani, pontosabban a teszteléshez, fejlesztéshez csak a 3.x sorozatot tudtuk magunkénak érezni.

Nos, remélhetőleg ez a korszak lezárult azzal, hogy kiadták a 3.0 Labs (ez volt régebben a Community Edition, GPL) stabil verzióját, mindannyiunk nagy örömére. Félő volt ugyanis, hogy – megismételve a fentiekben leírt 2.x-3.x váltás körüli szerencsétlenkedést – megjelenik egy 4.x és minden kezdődik elölről… Szerencsére nem így történt, tanultak a történtekből.

Az Alfresco 3.0 Labs Stable tényleg stabil kiadás, már a 3.0c is az volt. Ettől a verziótól kezdve a Mac OS X verzió is megjelenik a letölthető csomagok között, saját installer-rel felvértezve, mely tartalmazza az OpenOffice-t is.

A hivatalos bejelentés: Final Version of Alfresco Labs 3.0 Released
John Newton írt egy jó összefoglalót a blog-jában, érdemes átolvasni: Alfresco Labs 3 Special Inaugural Release

Elektronikus közbeszerzés

Bizonyára sok-sok dolog van a világon amit érdemes elektronizálni – és még több olyan amit nem kellene…

Talán az első kategóriába tartoznak azok a rendszerek, amelyekkel az utóbbi években sikerült közelebbi kapcsolatba kerülnöm, mint az elektronikus számlázás (E-Számla), vagy az elektronikus dokumentum-gyár, illetve az erre épülő elektronikus közbeszerzés (eProcurement).

E kettő a nem is olyan távoli jövőben szépen szimbiózisba fog kerülni és együtt fogják majd óvni a fákat… Legyünk kicsit idealisták, tehetik, technológiai értelemben készek a papírmentes folyamatok támogatására, ha ezt a törvényhozók – mint az általunk megbízott ideiglenes ügyvezetők – is így akarják.

tenderworks_eprocurement

Az elektronikus kormányzat az utóbbi 10 évben egész Európában komoly fejlődésen ment át, de csak az utóbbi néhány évben jöttünk rá arra, hogy egységben kell gondolkozni, különben csak újabb megoldandó probléma halmazt építünk ezekkel a méregdrága rendszerekkel. Előtérbe került az új divatszó, az “interoperabilitás” – azaz legalább közösségi szinten legyenek átjárhatók, kooperatívak a kialakítandó rendszerek.

Mivel szeretett földrészünkön nem az amerikaihoz, az oroszhoz vagy a kínaihoz hasonló diktatúra működik, ezért itt ajánlásokkal, támogatásokkal próbálunk egységesíteni. Ez egy lassú és nehézkes folyamat, ahelyett, hogy az EC készíttetne egy saját kommunikációs protokollt és implementáltatna hozzá egy applikációt – amelyet a tagországoknak kötelezően használandónak ír elő -, azt az utat választotta, hogy támogatja a kommunikációs protokoll kialakítását (pl.: PEPPOL projekt) és a piaci szereplőkre bízza a rendszerek kialakítását – több esetben szintén támogatott projektek formájában.

PEPPOL infrastructure overview

Szilveszter előtt egy nappal – vajon mi indokolhatta az uborkaszezonba tenni ezt az MTI hírt – a kormányszóvivő bejelentette, hogy hamarosan megváltoznak a hazai közbeszerzési szabályok, az ígéretek szerint kivételesen nem bonyolultabbak, hanem egyszerűbbek lesznek.

A nyilatkozat talán legérdekesebb részei:

… az egyes eljárások nyomon követhetőségét biztosítja, hogy az ajánlatkérőnek a közbeszerzés minden egyes lépését nyilvánossá kell tennie az interneten. … mind a nagy értékű, mind a kisebb értékű közbeszerzéseket 2010. július 1-jétől kizárólag elektronikusan lehet intézni.

Azaz van még másfél évünk arra, hogy kialakítsunk egy környezetet, mely igazgatásrendészetileg, jogilag és technológiailag is képes lesz fogadni és feldolgozni, illetve a pályázók irányába elérhetővé tenni a hazai közbeszerzési pályázatok jelentős részét. Remélhetőleg ezt olyan formában teszi, hogy a közösségen belüli egységes kommunikációs platformot is támogatni tudja. Szerencsére nem kell elsőnek lennünk ezen a téren, kicsit nyugatra tekintve, a sógorok és a horvátok közösen készítettek és használnak egy ilyen (PEP Online) rendszert…

tenderworks_blockflow

Az a technológiai megoldás, amin van szerencsém az utóbbi években dolgozni egy speciális dokumentum-gyár, ami szorosan kapcsolódhat ezekhez a rendszerekhez, egyfajta backend-ként. A strukturált, konzisztens dokumentumok előállítása talán ezekben a (köz)beszerzési folyamatokban a legfontosabb, hiszen mind a felhívások, mind a pályázatok szakmai és jogi értelemben is komoly felügyelet alatt vannak, nagyon könnyű egyrészről döntőbizottságot, másrészről kizárást ábrázoló érdemrendet kapni a tevékenységünkért – egyik sem túl kifizetődő.

A héten volt az ePractice.eu e-Procurement fórumának találkozója Bécsben, ahol bemutatták az elektronikus közbeszerzési rendszerek már elkészült és hamarosan elkészülő implementációit. Ezek a szoftverek nagy hangsúlyt fektetnek a beszerzési folyamatokra, illetve arra, hogy mind a felhívás elkészítése – ami szinte minden bemutatott esetben egy szerkesztett dokumentum feltöltését jelentette -, mind a pályázók által használható felület gyors és egyszerű legyen. Ezek fontos szempontok, viszont azt gondolom, hogy a dokumentumok előállítása legalább ennyire fontos – itt viszont betöltendő űr tátong jelenleg…

Ezt az űrt igyekszünk betölteni az elkövetkezőkben, mind a kutatási folyamatokban való aktívabb részvétellel, mind a publikációk elindításával – ennek első fecskéje az új projekt oldal: http://www.tenderworks.eu

www.tenderworks.eu

FreeMarker tutorial

I’ve found a very interesting post about an interface to learn FreeMarker templating engine: FreeMarker sketchbook

FreeMarker sketchbook is a Java WebStart application with following features:
– realtime output processing and view
– page and tag view
– variable editor
– help and examples included

FreeMarker is a template engine and language which we are using in the content management system of our new application. For next week I have been preparing training material for web-developers and something I was missing, was a simple way for them to learn and try out FreeMarker. The best way to learn is by playing and experiencing something yourself, so I created a simple java application with an editor and FreeMarker renderer.
At the same time this has been a good exercise for me as well, as this is my first Swing and Java™ Web Start application. After I received some feedback, added a few more features and cleaned-up the code, I will probably release it as open source project. I think this is a handy little application for those who want to create FreeMarker templates. If you want to try it out, just click on the button below. You should have Java 1.5 or higher installed.

You can find another solution on site www.freemarkertool.com which offers similar functionality:

These interfaces are useful to know Alfresco templating, and Web Script interface customization…

Link: FreeMarker Manual: Learning by example

CMIS: Content Management Interoperability Services

2008 őszén – pontosabban szeptember tizedikén – megszületett végre egy draft, ami úgy kellett már a dokumentum kezeléssel foglalkozó fejlesztőknek, mint egy falat kenyér.

Ez a CMIS draft egy ezeréves hiányt pótolva, a dokumentum kezelő rendszerek közötti átjárhatóságot (tudományosabban interoperábilitást) írja le egy XML nyelvű protokoll segítségével. A kezdeményezéshez már csatlakozott az IBM, a Microsoft, az Oracle, az SAP és az EMC is, továbbá a kisebbek közül az Alfresco és az Open Text és várhatóan majd az Adobe is megteszi ezt hamarosan.

A bejelentésben az szerepel, hogy az ECM (Enterprise Content Management) rendszerek készítői a WEB-es alkalmazások számára egy közös kommunikációs platformot dolgoznak ki majd átadják szabványosításra az OASIS-nak (Organization for the Advancement of Structured Information Standards). A munka 2006 végén kezdődött és két év alatt – ismerve ezen nagy cégek mozgási sebességét ez igen rövid időnek mondható – sikerült eljutni egy publikus minta (draft) verzióig.

Ha az ígéretek valóra válnak és 2010-ig ezek a gyártók megvalósítják és piacra dobják saját rendszereikhez a CMIS interfészeket, egy új lehetőség nyílik meg azok számára is, akik eddig ECM backend-ekre épülő alkalmazásokat készítettek.

A CMIS protokollt SOA környezetben használva az általános csatoló felületen keresztül az alkalmazások számára transzparens dokumentum tárolók jöhetnek létre, akárcsak egy file-rendszerben. A server és desktop alkalmazások sem tudnak arról, hogy milyen háttértároló és milyen file-rendszer (HFS+, NTFS, FAT32, XFS, EXTFS) biztosítja számukra az állományokhoz való hozzáférést, egyszerűen az erre hivatott protokollt használva tudnak hozzáférni az adatokhoz.

Úgy tűnik a ECM iparban a nyolcvanas évektől használt SQL nyelv ideje lejárt és a Web 2.0 került felülre, azaz a bináris protokollok helyett a szószátyár (XML) protokollok jönnek. Ha az AJAX rendszerek utóbbi időkben tapasztalható térnyerését vizsgáljuk – ami ebben a szektorban is érezhető a platform függő alkalmazások kárára – logikus lépésnek tűnik az XML kommunikáció bevezetése.

ExtAlf CMIS

Talán a kommunikációnál sokkal érdekesebb kérdés az, hogy a CMIS megadja-e majd annak a lehetőségét is, hogy az authentikációs rendszerek is transzparenssé váljanak az ECM rendszereken belül. Akiket jelenleg is érint ez a kérdés azok tudják mit jelent ez…

Személy szerint azért tartom fontosnak ezt a lépést az ECM gyártók részéről, mert így az “independent software vendors” néven emlegetett, független szoftver gyártók és az ő ügyfeleik szabadon választhatnak dokumentum kezelő rendszert, se a fejlesztésben, se a beszerzésben nem kell egy rendszer mellett kikötniük. Mivel az utóbbi időben komoly tapasztalatokat szereztem az Alfresco-val, kezdem megismerni annak hiányosságait, érzékenyen érint ez a kérdés.

Mi történik akkor, ha egyszer csak rájövünk, hogy mégsem ilyen lovat akartunk, gyenge a support, vacak a kód, instabil, lassú, vagy az egyik ügyfelünk zárkózik el ettől a technológiától?

Mivel a fejlesztőink által készített applikáció nagyon szorosan Alfresco függő, igen költséges lesz a váltás, az új rendszer megismeréséhez szükséges hosszú időről nem is beszélve. Ha lehet, egy “B” terv lehetőségét meghagynám magunknak, azaz ha lehet használjunk olyan protokollt és tervezzük meg úgy az alkalmazásunkat, hogy leválasztható legyen az ECM rendszerről és választhassunk másikat, ha úgy hozza az igény. A CMIS ezt a lehetőséget adja meg nekünk, földi halandóknak – a nagyoknak meg hagyjuk meg az ügyfelekért folytatott harc és a profit jelentős részét…

CMIS specifikáció: ftp://ftp.software.ibm.com/software/data/ECM/content/cmis.zip

EMC: http://www.emc.com/about/news/press/2008/091008-smr-content-management-interoperability-services.htm

IBM: http://www-01.ibm.com/software/data/content-management/cm-interoperablity-services.html

Microsoft: http://go.microsoft.com/fwlink/?LinkId=127855

Alfresco: http://wiki.alfresco.com/wiki/CMIS

BroadBit CMIS: http://broadbit.hu/kompetencia/cmis/

ExtAlf -> ExtCMIS:
ExtAlf / ExtCMIS

Content transform webscript for Alfresco

You can find a simple content transform webscript for Alfresco here.

It’s looks like a working example, but points some shameless Alfresco bugs:

  • – an unhandled DuplicateChildNodeNameException received when a target node name already exists, not just a null return
  • – when a transformation error presents – transformDocument or transformImage returns with null – output node with new name already created, and contains the content of the source node
  • – transformation requires an installed, and configured OpenOffice.org in Alfresco;
    INFO [alfresco.util.OpenOfficeConnectionTester] The OpenOffice connection was re-established.
    but the relaunch of – an exited – OOo is not works, just avoid upcoming transformation processes;
    ERROR [alfresco.util.OpenOfficeConnectionTester] The OpenOffice connection has been lost.

Content transform GUI

Source code for the content transform webscript

transform.get.desc.xml (descriptor):


  Transform and get content as an URL
  Transform and get transformed content as a downloadable URL
  /extalf/transform?{nodeRef=nodeRef}&{mimetype=mimetype}
  argument
  user
  required

transform.get.js (javascript runtime code):

/*
 Content transform and presents it's URL to download
 @author: louise@louise.hu
 
 Parameters:
  - nodeRef: nodeRef of the source content node
  - mimetype: mimetype to transform source content
 */

var node = search.findNode(args.nodeRef);
var outputFolder = node.parent;

if (node == null) {
	model.errorCode = "1";
	model.errorMessage = "The content node could not be found";
}
else {
	// Transform content
	var m = node.mimetype;
	if (m.substr(0, 5) == "image") {
		// transform an image
		var transformed = node.transformImage(args.mimetype, outputFolder);
	} else {
		// transform a document
		var transformed = node.transformDocument(args.mimetype, outputFolder);
	}
	
	if (transformed == null) {
		model.errorCode = "2";
		model.errorMessage = "Unable to transform content";
		
		// TODO: alfresco 3.0 bug exists here, the target node already
		// created, but contains the source node's content :(
	}
	else {
		// return with the transformed node
		model.node = transformed;
	}
}

transform.get.json.ftl (FreeMarker template for output):

<#setting locale="en_US">
[
<#if node?? >
{
"success":"true",
"name":"${node.name?js_string}",
"nodeRef":"${node.nodeRef}",
"qnamePath":"${node.qnamePath}",
"store_type":"${node.nodeRef.storeRef.protocol}",
"store_id":"${node.nodeRef.storeRef.identifier}",
"id":"${node.nodeRef.id}",
"downloadUrl":"${node.downloadUrl}"
}
<#else>
{
"success":"false"
<#if errorCode?? >
, "error":"${errorCode}"

<#if errorMessage?? >
, "message":"${errorMessage?js_string}"

}

]

Alfresco forum: Transform content bugs

ExtAlf – new features

I’ve done with brand new features in ExtAlf (ExtJS wrapper library for Alfresco ECM):

  • New login window with ticket validity timeout, and network error handling:
  • Task list for logged-in user, including attached resources (contents, files), upload/download and preview for contents and task close button:
  • Discussion forum, auto-discovered forum spaces in tree view and expandable threads/posts with quick reply button:
  • Folder tree with document preview, content download an upload buttons:
  • Search in selected folder:
  • Transform content to another document format:ExtAlf - Transform content
  • Alfresco Web Script egyszerűen

    A Web Script-ek, illetve a Web Script-ekkel megvalósított szolgáltatások az Alfresco rendszer erőforrásainak, elemeinek és tartalmainak egyszerű, HTTP protokoll fölötti publikációjára készültek. Ez a lehetőség a 2.1-es verziótól kezdve használható mind az Enterprise, mind a Community kiadásokban.

    Kapcsolódó linkek:

  • Web Script-ek használata
  • Web Script minták
  • FreeMarker az Alfresco-n belül
  • Freemarker template minták
  • Alfresco JavaScript API
  • Alfresco JavaScript API minták
  • Hogyan készítsünk Web Script-et?

    Alapvetően két kötelező elemre lesz szükségünk, az egyik egy XML file, mely leírja és regisztrálhatóvá teszi magát a Web Script-et az Alfresco rendszer számára, míg a másik egy, az outputot előállító FreeMarker (FTL) nyelven leírt űrlap. Összetettebb, programozást is igénylő funkciók esetén használható az Alfresco JavaScript API-ja is, melyet egy harmadik file-ban (JS) lehet elhelyezni.

    Mintánkban egy “mywebscript” lesz a megvalósítandó funkció neve, így az ehhez kapcsolódó, kötelező formátumú elnevezések:

    1. Leíró (XML): mywebscript.get.desc.xml
    2. Output (FTL): mywebscript.get.html.ftl
    3. Program (JS): mywebscript.get.js

    Magyarázatra szorulhat az használt név-konvenció; a szeparátor minden esetben a “.”, az első mező (”mywebscript”) tartalmazza a Web Script nevét, a második a használt HTTP protokollt (”get”, “post”, etc.). Itt érdemes megjegyezni, hogy egy szolgáltatásnak lehet többféle protokollja is, de minden esetben csak azo(ko)n lehet megszólítani, amely(ek)re regisztrálva lett – esetunkben “GET”, az URL-ben átadott paramétereket fogja értelmezni, “POST”-ra hibajelzés fog adni.

    A harmadik Web Script specifikus paraméter (mely csak az XML és az FTL file-oknál szükséges) az XML-nél kötelezően “desc” mint descriptor (leíró). Az FTL file-oknál viszont azt határozza meg, hogy milyen formátumú lesz a válasz. Ezt a formátumot a Web szerver mint content-type fogja közölni a klienssel, azaz “html” esetében más lesz mint “xml”, “atom”, vagy “json” esetében. Ha több válasz típus is létezik az adott szolgáltatáshoz, az XML-ben lehet default értéket adni (a “format” paraméterrel), illetve a kérésben is lehet specifikálni a várt formátumot: “GET /my/mywebscript.json

    Installáció

    A saját készítésű Web Script-eket az Alfresco-n belül a “/Data Dictionary/Web Scripts Extensions/” space alatt kell elhelyezni, célszerűen egy könyvtárba rendezve. Legyen ez esetünkben a “my” könyvtár melyet az Alfresco WEB-es felületén is létrehozhatunk, sőt akár ZIP file-ként ugyanott a teljes csomagot (my/*) importálhatjuk is.

    A Web Script-es fejlesztések egyik legnagyobb előnye, hogy nem igényel deploy-t (eltekintve az első installációtól és regisztrációtól), azaz az FTL vagy a JS file-okat módosítva azonnal érvényre jutnak a változtatások. Ezért érdemes a WebDav, vagy a CIFS felületen keresztül dolgozni, így az editorból közvetlenül szerkeszthető és menthető a kód. Ezáltal az installációt is célszerű így elvégezni, kedvenc Finder-ünk vagy file-kezelő programunk segítségével. A WebDav-os mount-hoz (ezt MacOSX-en a Finder-ben az ALMA+K gombkombináció megnyomása után lehet átadni) a következő URL-t lehet használni: http://localhost:8080/alfresco/webdav

    Installáció után az Alfresco-n belül (repository) a következő struktúrának kell előállnia:

    Könyvtár: /Data Dictionary/Web Scripts Extensions/my/
    File: mywebscript.get.desc.xml
    File: mywebscript.get.html.ftl
    File: mywebscript.get.js

    Hogy az új szolgáltatásunk elérhető is legyen, szükség van még egy Alfresco-n belüli Regisztrációra is.

    Regisztráció

    Ha az Installáción túl vagyunk, az Alfresco rendszer tudtára kell adni, hogy új szolgáltatása lett. Ehhez a beépített Web Script regisztrációt kell használni, mely a következő címen érhető el: http://localhost:8080/alfresco/service/

    A “Refresh List of Web Scripts” gomb által indított folyamat rekurzívan felolvassa a szkriptek tárolására szolgáló helyi és repository-n belüli könyvtárakat, majd az ott található XML-ek alapján frissíti az elérhető Web Script-ek listáját – illetve jelzi, ha valamelyik szkript definíciójával probléma adódott.

    Sikeres regisztráció után a saját szkriptünk is meg fog jelenni a listában, ehhez érdemes a “Browse by Web Script Package” link-en kiválasztani a “my” csomagot. Az itt megjelenő listában összefoglaló látható az adott csomagban található szkriptekről és azok szolgáltatásairól, paramétereiről. Az “Id” sorban megjelenő linkre kattintva megtekinthetők a szkript összetevői és azok forrása is.

    Az elkészített és regisztrált szkriptet a következő címen lehet elérni: http://localhost:8080/alfresco/service/my/mywebscript

    A mywebscript példa forrása

    A fent ismertetett alapismeretekkel a következő szkriptet állítottam össze:

    mywebscript.get.desc.xml

    
    Simple form filling test
    Just a simple form filling test example
    /my/mywebscript
    argument
    user
    required
    
    

    mywebscript.get.html.ftl

    Logged in user: ${person.properties.userName}
    
    Name: Country: ${countryList}

    mywebscript.get.js

    var countryList = '';
    // here is the code to generate country list:
    countryList += '' + '\n';
    countryList += '' + '\n';
    // pass value to FTL
    model.countryList = '";