Dokumentový sklad. Dokumentový sklad v.1. Dokumentový sklad v.2. Koncepce skladu v.2. Petr Lampa



Podobné dokumenty
Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Generické programování

MBI - technologická realizace modelu

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

1 Webový server, instalace PHP a MySQL 13

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

rychlý vývoj webových aplikací nezávislých na platformě Jiří Kosek

UJO Framework. revoluční architektura beans. verze

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

1. Webový server, instalace PHP a MySQL 13

Formuláře. Internetové publikování. Formuláře - příklad

Více o konstruktorech a destruktorech

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

AJAX. Dynamické změny obsahu stránek

Objektově orientované programování v PHP 5. Martin Klíma

Základy objektové orientace I. Únor 2010

TÉMATICKÝ OKRUH Softwarové inženýrství

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Teoretické minimum z PJV

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

1. Úvod do Ajaxu 11. Jak Ajax funguje? 13

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Střední průmyslová škola elektrotechnická Praha 10, V Úžlabině 320 M A T U R I T N Í T É M A T A P Ř E D M Ě T U

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13

Unity a Objekty (NMIN102) RNDr. Michal Žemlička, Ph.D.

Komponenty v.net. Obsah přednášky

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Základy HTML, URL, HTTP, druhy skriptování, formuláře

PŘETĚŽOVÁNÍ OPERÁTORŮ

1. Programování proti rozhraní

UŽIVATELSKÁ PŘÍRUČKA K INTERNETOVÉ VERZI REGISTRU SČÍTACÍCH OBVODŮ A BUDOV (irso 4.x) VERZE 1.0

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Zabezpečení proti SQL injection

JavaScript 101. "Trocha života do statických stránek"

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Web Services na SOAP

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Stručný úvod pro programátory. Michal Kuchta

Střední průmyslová škola elektrotechnická Praha 10, V Úžlabině 320

Vstupní požadavky, doporučení a metodické pokyny

typová konverze typová inference

TÉMATICKÝ OKRUH Softwarové inženýrství

Objektové programování

Formuláře. Internetové publikování

Technologie Java Enterprise Edition. Přemek Brada, KIV ZČU

20. Projekt Domácí mediotéka

Quo vadis programování? Automatizace vyhodnocování studentských úloh

Plánování a vývoj základního frameworku

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Současný svět Projekt č. CZ.2.17/3.1.00/32038, podpořený Evropským sociálním fondem v rámci Operačního programu Praha adaptabilita

OptimiDoc dokáže takové dokumenty zpracovat a distribuovat napříč firmou.

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

návrhový vzor Singleton.

Softwarové komponenty a Internet

Java a XML. 10/26/09 1/7 Java a XML

Rezervační systém Tvorba WWW stránek

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Principy fungování WWW serverů a browserů. Internetové publikování

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

Sky Mail2Fax postup převádění dokumentů do podporovaného formátu

První kapitola úvod do problematiky

Ukládání a vyhledávání XML dat

Novinky verze systému Spisové služby (SpS) e-spis LITE

Úvod do Web Services

Západočeská univerzita v Plzni Fakulta aplikovaných věd Katedra informatiky a výpočetní techniky. Dokumentace k programu MMDoc

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Zabezpečení proti SQL injection

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Dokumentace k nevizuálnímu rozhraní aplikace DopisOnline

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod Vítejte v Ruby 15. O autorovi 9 Poděkování 9

Úvod do programovacích jazyků (Java)

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Programátorská příručka

Architektura softwarových systémů

Skriptovací jazyky. Obsah

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Virtuální metody - polymorfizmus

Rozhraní pro práci s XML dokumenty. Roman Malo

Pokročilé schopnosti OOP

IRAE 07/08 Přednáška č. 1

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Úvodem 9. Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10. Než začneme 11

Konstruktory a destruktory

Čipové karty Lekařská informatika

Tisková řešení. EIP přidaná hodnota, kterou přidáte Vy sami. Září Aleš Povolný, Xerox CZ

Přenos souborů pomocí AceFTP (pdf verze pro tisk KB)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Nový Node Monitor. 13. prosince Lukáš Turek Praha12.Net

DATABÁZE MS ACCESS 2010

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

O datových typech a jejich kontrole

Protokol HTTP 4IZ228 tvorba webových stránek a aplikací

Aplikace pro srovna ní cen povinne ho ruc ení

Webové rozhraní pro datové úložiště. Obhajoba bakalářské práce Radek Šipka, jaro 2009

WWW technologie. HTTP protokol

Programování v jazyce C a C++

Transkript:

Dokumentový sklad v.1 Dokumentový sklad Petr Lampa První verze (2002): Ukládání diplomových prací a ročníkových projektů v PDF a PostScriptu Požadavky: Archivace dokumentů Malá četnost prohlížení Žádná indexace Řešení: Fixní systém práv (student pouze uložit/číst svou práci), ostatní všechno číst Pevná struktura pojmenování (/báze/rok/bp/id.pdf) Dokumentový sklad v.2 Druhá verze (2003): Cíle: Strukturovaný dokumentový sklad pro ukládání dokumentů fakulty Organizace ve formě stromu Ukládání metadat k dokumentům Přístupová a majitelství adresářů/souborů Možnost ukládat verze dokumentů Jednoduchá správa Web prohlížečem (použití sekretariáty) Koncepce: Stejné rozhraní by se hodilo pro prohlížení DP a do budoucna také pro odevzdávání projektů v předmětech Koncepce skladu v.2 Co je společné? Uživatelské rozhraní Zpracování úplného jména dokumentu, validace a kontroly Některé operace (download, upload, rm) Co je různé? Systém pojmenování dokumentů/adresářů Co je povoleno (přístupová práva) Vazba na tabulky v informačním systému 1

Koncepce skladu v.2 Řešení: Ukládání do systému souborů (důležitý návrh pojmenování) velké BLOBy v databází silně komplikují archivaci/restore na funkčnosti skladu bezprostředně nezávisí funkčnost IS fulltext v databázi sice funguje, ale: problém stemizace velká zátěž databáze při indexaci problém konverze formátů (PDF) Koncepce skladu v.2 Použít objektově orientovaný návrh Společné vlastnosti implementovat jako bázovou třídu Specifické mutace funkčnosti různých částí skladu implementovat odvozenými třídami Integrace různých typů skladu do jednoho stromu Omezení: typ je dán nejvyšším adresářem Pojmenování /rp/<rok>/<typ>/<id>.pdf (ps) /dr/{<adresář>/<soubor> /ci/<id_předmětu>/<id_termínu>/{<id_varian ty>/<login>/<soubor> /course/<zkr>/<typ>/{<adresář>/<soubor> První komponenta určuje typ skladu, čili třídu generovaného objektu Implementace class doc_file { function doc_create($name, $path) { // factory method $classname = "doc_folder_${name ; if (!class_exists($classname)) { $src = "$docs_handlers/docs_${name.php"; if (file_exists($src)) include_once($src); return new $classname($path); function doc_file($path) { // constructor 2

Metody doc_title(), doc_access($mode), doc_realpath(), doc_path(), doc_remove(), doc_upload() doc_attrs() seznam atributů, které podporuje daný typ skladu: array("type" => array("title"=>"typ", "sort"=>true, "show"=>true, "order"=>"10", "type"=>"icon"), "title" => array("title"=>"název", "sort"=>true, "show"=>true, "order"=>"20", "type"=>"link", "filter"=>32),... ); Metody doc_getdir() vygeneruje pole obsahující obsah adresáře, ke každému souboru všechny atributy doc_oper() zpracování požadavku z uživatelského rozhraní (download, upload, mkdir) Uživatelské rozhraní docs_show($dir, $attrs) Univerzální metoda, nezávislá na typu skladu. Styl zobrazení, zobrazené prvky, povolené operace dány polem parametrů. Zobrazí ovládací prvky (HTML form, vstupní pole), detekuje jejich použití, kontroluje validitu a volá patřičné metody. Podle definovaných atributů generuje patřičné filtry sloupců, odkazy pro řazení, titulky, obsahy sloupců, atd. Hlavní problémy Koncepce jedné třídy reprezentující dokument se ukázala jako příliš omezující: Při zpracování operací je třeba pracovat s komponentami v cestě diskrétně (kontrola práv, nadřazený adresář). Parsování a validaci cesty musela být implementována v každé odvozené třídě znovu. Pro nové typy skladů bylo třeba zavést přechody mezi různými typy skladů (obdoba mount v Unixu). Uživatelské rozhraní musí u některých operací pracovat současně s dvěma soubory. 3

Dokumentový sklad v.3 Cíle: Odstranit omezení rozšiřovatelnosti. Oddělit třídu zabalující uživatelské rozhraní od třídy popisující dokument. Implementovat do bázové třídy dokumentu více funkčnosti tak, aby byl návrh odvozených tříd jednodušší (a bezpečnější). Při implementaci využít principy používané v systémech souborů (místo kompletního parsování jména použít zpracování po komponentách jména). Nová struktura tříd class doc_folder komponenta v cestě class doc_file dokument (obsahuje pole objektů doc_folder) class doc_repos zabalení uživatelského rozhraní a společných dat doc_file function doc_parse($path) { $cur =& new doc_folder(&$this->repos, null, '/'); $this->folders[0] = &$cur; $this->dirs = explode('/', $path); for ($i = 1; $i < count($this->dirs); $i++) { if (!$cur->doc_access(auth_walk)) *ERR if (!$cur->doc_valid_name($this->dirs[$i], false)) *ERR if (!$cur->doc_lookup(&$this->repos, $this->dirs[$i], $i, &$this->folders[$i])) *ERR $cur = &$this->folders[$i]; doc_folder function doc_lookup($name, $level, &$cur) { if ($level!= 1!ctype_alpha($name)) *ERR $classname = "doc_folder_${name"; if (!class_exists($classname)) { $src = "$docs_handlers/docs_${name.php"; if (file_exists($src)) include_once($src); if (!class_exists($classname)) *ERR $cur = new $classname(&$this, $name); ctype_digit() PHP 4.3.x! 4

Výsledek Prodloužení kódu, nicméně logičtější struktura a snadnější zápis. Složitější na pochopení v některých metodách reprezentuje $this aktuální komponentu, jinde nadřazenou komponentu. Ukázalo se jako nezbytné v některých operacích reprezentovat dokument instancí a v jiných reprezentovat instancí nadřazeného adresáře a holým jménem (neregulérní struktura). Výsledek Lze přecházet z jednoho typu skladu do druhého libovolně: /pubs zpracováno bázovou třídou, vznikne instance třídy doc_pub /132 zpracováno doc_pub, vznikne instance třídy doc_dr /adresář /soubor zpracováno doc_dr Aplikovaná třída zajišťuje správnou kontrolu validity jména, testování přístupových práv a také povolený repertoár operací. Implementované typy ci soubory k termínům (jedna úroveň) course soubory k předmětům (seznam předmětů z IS, seznam virtuálních podadresářů, dále dr) dr strukturovaný adresář s právy a metadaty ftp FTP klient product, proj, pub soubory k VaV (báze z IS, dále z dr) rp diplomky Použití Použití částí skladu je zabudováno do různých částí IS FIT, s omezením na podstrom Prohlížeč celého skladu: $docs_params = array( ); $repos = new doc_repos($pathinfo, $self, $path_type, $docs_params); $ok = $repos->doc_oper($vars, &$file); is_header(); if ($ok) $repos->docs_show(&$file, $vars); else $repos->docs_print_error(); is_footer(); 5

Fulltext Prohlížeč skladu generuje regulární HTML dokument s odkazy na soubory/podadresáře. Sklad lze indexovat libovolným nástrojem indexace Web prostoru. Problémy: omezení na část prostoru, aplikace přístupových práv, prohledávání podle typu. Mnogosearch open source engine, index v MySQL jako blob, zvládá vícejazyčné mutace, tvary slov, tagování prostoru podle kritérií. By-product - FTP klient Vznikl jako ověření koncepce v.3 za jedno odpoledne. Kompletně včetně implementace protokolu FTP v PHP. Skutečně se uplatnila nová hierarchie tříd. Jediná komplikace bylo doplnění operace rename, bylo třeba reimplementovat protokol FTP tak, aby byl lokální na úrovni instance, ne na úrovni doc_repos (je třeba otevřít dvě nezávislé spojení pro zpracování zdroje a cíle). Kupodivu se stal nejpoužívanějším typem skladu. Sklad v.3.1 + AJAX Operace copy/rename vyžadují jako parametr cílový adresář nebo jméno. Web je na aplikaci rozhraní typu NC příliš těžkopádný odeslání odpovědi na formulář, vygenerování a přenos celého HTML dokumentu trvá příliš dlouho. Je nutno doplnit jednoduchý průchod adresářovou strukturou pro výběr cílového adresáře. Ideální na aplikaci AJAXu (Asynchronous JavaScript and XML) Složitost modifikace Doplnit XML výstup pro doc_getdir() triviální, bude se hodit i pro jiné aplikace. Dynamicky naplněný HTML <SELECT> podle obsahu poslední komponenty cesty zadané v textovém poli: Dovoluje zadat rychle část nebo celou cestu v textovém poli a pak teprve vygenerovat obsah. Zároveň dovoluje průchod stromem bez zadávání, jen myší. 6

Princip Událost onchange seznamu volá JavaScript funkci xml_getdir(): xmlreq = new XMLHttpRequest(); xmlreq.open('get', URL, true); xmlreq.onreadystatechange = xml_finish; Stránka zůstává v prohlížeči zobrazena, požadavek GET se uloží jako samostatný strom a pak xml_finish(): dir = xmlreq.responsexml.getelementsbytagname("dir"); for (var i = 0; i < dir.length; i++) { el = document.createelement("option"); el.value = dir[i].getattribute("name"); el.appendchild(document.createtextnode( dir[i].getattribute('name'))); idselect.appendchild(el); PHP jako objektový jazyk PHP4 lze použít, ale: PHP nemá ukazatel, vše je implicitně předáváno hodnotou, čili vzniká kopie instance objektu (výjimka je $this). Což nevadí, dokud není třeba něco vracet z metody nebo sdílet jednu instanci pro společná data. Pak je třeba použít referenci - & Katastrofa je třeba bedlivě hlídat, kde referenci napsat a kde ne. Nestačí jen v deklaraci funkce, ale je třeba také při přiřazení a volání. Raději PHP5 Implicitně se předávají a přiřazují objekty referencí (pro kopii clone) Není kompatibilní s PHP4 přebytečné reference hlásí jako chybu Omezení viditelnosti (public, private) Konstruktor, destruktor Statické metody a atributy Abstraktní třídy a interface Deklarace tříd parametrů (typová kontrola) Final note Jak správně zacházet s URL (STD 66): vygenerovat správně <a href="něco"> htmlspecialchars(něco) nestačí! prefixuje pouze <, >, &,, ale URL jen A-Z,0-9,-,_,.,~ rawurlencode() nebo urlencode()? ani jedno určeno pro zakódování pouze částí! <scheme>://[<user>[:<pass>]@]<host><location>?[<name> =<value>]{&<name>=<value>[#<fragment>] urlencode() je na <name>, <value>, nahrazuje za + rawurlencode() je určeno na <location>, nahrazuje za %20, ale taky / za %2F, ~ za %7E (je třeba obnovit) 7

Final note Generované URL je třeba obecně rozparsovat na jednotlivé části, parametry CGI na jednotlivé dvojice (jméno, hodnota) a na každou část aplikovat jiný způsob zakódování. Problém URL oddělovače &: v URL je naprosto legální není legální v HTML! (uvozuje entity) nahrazovat v URL vždy & 8