====== Zpracování zpráv datového standardu DASTA ====== ===== Zadání ===== Vytvořte kód pro načtení, validaci a zpracování zpráv ve formátu datového standardu DASTA. ---- Následující části úlohy jsou **povinné!** Následující úkoly začněte vypracovávat na cvičení, dopracujte doma a odevzdejte do příští neděle 22. 5. 2016 (bodována bude až kompletní práce): - Stáhněte si třídy pro část standardu DASTA a potřebná XML schemata. * [[http://bio.felk.cvut.cz/~huptycm/Vyuka/eHealth_Telemedicina/dasta_java_classes.zip|Třídy pro Javu pro postupné zadávání]], [[http://bio.felk.cvut.cz/~huptycm/Vyuka/eHealth_Telemedicina/mzcr.zip|Třídy pro Javu pro unmarshaling]] * [[http://bio.felk.cvut.cz/~huptycm/Vyuka/eHealth_Telemedicina/dasta_CSharp_classes.zip|Třídy pro C#]] * [[http://bio.felk.cvut.cz/~huptycm/Vyuka/eHealth_Telemedicina/dasta_XML_schemes.zip|XML Schemata]] - Stahněte si [[http://bio.felk.cvut.cz/~huptycm/Vyuka/eHealth_Telemedicina/DASTA_zpravy.zip|DASTA zprávy]] a následně je v programu načtěte (mají formát xml souboru). //(0.3 bodu)// - Proveďte validaci jednotlivých zpráv a vypište výsledek. //(0.7 bodu)// - Převeďte informace ze zpráv do dané struktury tříd a vypište a uložte tyto informace. * Převedení zprávy z formátu DASTA (XML) do struktury tříd. //(1.0 bodu)// * Vypište přehledně a strukturovaně jednotlivé informace na obrazovku. //(0.5 bodu)// * Uložení zprávy ze struktury tříd do DASTA zprávy (souboru typu xml). //(0.5 bod)// ===== Poznámky k implementaci ===== - System tříd je vytvořený z XML Schemat automaticky: * U Java pomocí příkazu xjc.exe (příklad cesty k souboru je C:\Program Files (x86)\Java\jdk1.6.0_24\bin) * U C# pomocí příkazu xsd.exe (příklad cesty k souboru je C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin) * Při využívání automaticky vytvořených tříd je nutné si uvědomit, že systém udělá přesně to co je dáno. - Struktura tříd vám přijde nepřehledná a bude mít pocit, že se v ní nedá vyznat. * **Základní návod pro orientaci v jednotlivých blocích je na [[http://ciselniky.dasta.mzcr.cz/CD_DS4/hypertext/DSALV.htm|stránkách popisu struktury bloků DS]].** * Zde platí jedna rada. Kreslit, kreslit, kreslit. Všechny vztahy, všechna propojení, která pochopíte si zakreslete a vytvořte si tak diagram (graf), který vám bude sloužit jako průvodce či návod (to se hodí vždy nejen u DASTA). - Pro práci s vytvořenými třídami se můžete podívat na tyto příklady: * Příklad inicializace a využití tříd pro Javu. public class Main { public static void main(String[] args) throws JAXBException { /* * Vytvoreni factory pro jednotlive balicky */ mzcr.cz.ns.dasta.ds4.ds_dasta.ObjectFactory factoryDasta = new mzcr.cz.ns.dasta.ds4.ds_dasta.ObjectFactory(); mzcr.cz.ns.dasta.ds4.ds_type.ObjectFactory factoryDsType = new mzcr.cz.ns.dasta.ds4.ds_type.ObjectFactory(); mzcr.cz.ns.dasta.ds4.ds_ip.ObjectFactory factoryDsIp = new mzcr.cz.ns.dasta.ds4.ds_ip.ObjectFactory(); /** * Zakladni hlavicka */ Dasta dasta = factoryDasta.createDasta(); dasta.setVerzeDs("04.06.08"); dasta.setIdSoubor("MEDICALC_KK11115_2005-12-12T14:46:25"); dasta.setBinPriloha("T"); dasta.setUr("T"); dasta.setTypOdesm("KK"); /** * Informace o programu, ktery generoval zpravu */ ZdrojIsType zdrojIsType = factoryDasta.createZdrojIsType(); zdrojIsType.setKodFirmy("MEDICALC"); zdrojIsType.setKodProg("WMEXP"); zdrojIsType.setVerzeProg("2.2.3.8"); /** * Poskytovatel dat */ PmType pm = factoryDasta.createPmType(); AsType as1 = factoryDasta.createAsType(); as1.setTyp("I"); as1.setVnitrni("999"); pm.setAs(as1); /** * Informace o garantovi dat */ GarantDatType garantDat = factoryDsType.createGarantDatType(); garantDat.setIdGarant("450124145"); garantDat.setOdbornost("801"); garantDat.setValue("MUDr. Jmeno Prijmeni"); /** * Informace o zdravotnickem zarizeni */ IsType is = factoryDasta.createIsType(); is.setIco("12345678"); is.setIcz("44101000"); is.setIcp("44101882"); AsType as2 = factoryDasta.createAsType(); as2.setVnitrni("801"); is.setAs(as2); /** * Pacientska cast */ Ip ip = factoryDsIp.createIp(); ip.setIdPac("7601019998"); ip.setRodcis("7601019998"); ip.setJmeno("Jmeno"); ip.setPrijmeni("Prijmeni"); DatXxType datDn = new DatXxType(); datDn.setFormat("D"); datDn.setValue("1976-01-01"); ip.setDatDn(datDn); ip.setSex(SexType.M); KuZType kuZType = factoryDsIp.createKuZType(); kuZType.setTypku("AMBUL"); kuZType.setFazespec("ZF"); kuZType.setIdku("MEDICALC.FNPL.1234567890"); DatXxType datProv = new DatXxType(); DatXxType datVydani = new DatXxType(); datProv.setValue("2006-12-03T11:00:00"); datVydani.setValue("2006-11-03T11:00:00"); kuZType.setDatProv(datProv); kuZType.setDatVydani(datVydani); /* * Definice pracoviste, kde probehlo osetreni */ PracovisteType pPracoviste = factoryDsIp.createPracovisteType(); pPracoviste.setIcz("44101000"); pPracoviste.setIcp("44101882"); pPracoviste.setOdb("501"); pPracoviste.setNazev("Chirurgická ambulance"); kuZType.setPPracoviste(pPracoviste); TextType textType = factoryDsIp.createTextType(); Ptext pText = factoryDsIp.createPtext(); pText.setSpace("preserve"); pText.setValue("Při fotbale si podvrkl pravé koleno. O koleno s náplní, " + "čéška nebolestivá, bolestivá flexe kolena koleno špatně " + "vyšetřitelné, zásuvka negativní RTG bez traumatu Dg.Distorsio geni l.dx" + "Th provedena punkce kolenního kloubu.vypunktováno 60 ml krve " + "bez tukových kapének, naložena ortesa Dop klidový režim kontrola zde za 2 dny dop"); textType.setPtext(pText); kuZType.setText(textType); //Definice diagnozy DgzType dgzType = factoryDsIp.createDgzType(); Diag diag = new Diag(); diag.setValue("I158"); diag.setPoradi(1); dgzType.setDiag(diag); dgzType.setTypDg("P"); dgzType.setIndOpravSd("N"); List dgzTypes = kuZType.getDgVys(); dgzTypes.add(dgzType); AuzkuType auzkuType = factoryDsIp.createAuzkuType(); auzkuType.setIndikace("I"); auzkuType.setTyppolVz("V"); auzkuType.setDiag("I158"); DatDuType datDu = factoryDsType.createDatDuType(); datDu.setValue("2006-12-03T11:00:00"); datDu.setTyp(LVTZDCUN.A); auzkuType.setDatDu(datDu); List auzkuTypes = kuZType.getAuzku(); auzkuTypes.add(auzkuType); /** * Nyni je potreba navazat jednotlive bloky na hlavni tag dasta */ dasta.setZdrojIs(zdrojIsType); // pridani zdroje dasta.setPm(pm); // pridani prijmoveho mista dasta.setGarantDat(garantDat); // pridani garanta /** * Blok ku muze obsahovat vetsi pocet klinickych udalosti * (reprezentovnych kuZType), proto je potreba tento blok definovat v * poli (rep. ArrayListu) */ ArrayList isTypes = new ArrayList(); Ip.Ku ipKu = factoryDsIp.createIpKu(); // trida Ku je soucasti tridy Ip List kuZTypes = ipKu.getKuZ(); // Je vyvoren seznam klinickych udalosti, ktery je soucasti Ip.Ku kuZTypes.add(kuZType); // prida se vytvorena klinicka udalost ip.setKu(ipKu); // klinicke udalosti se pridaji jako blok k bloku pacienta is.setIp(ip); // krok pridani bloku pacienta do bloku odesilatele isTypes.add(is); // Pro pripad, ze by zprava obsahovale vice udalosti je halvni blok is zarazen do seznamu dasta.setIs(isTypes); // prirazeni cele zpravy do obalu bloku datsa /** * Vytvori xml z hlavniho objektu dasta */ JAXBContext context = JAXBContext.newInstance(Dasta.class); JAXBElement element = factoryDasta.createExpenseReport(dasta); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); /** * Namapuje elementy jednotlivych namespace na nami pozadovane nazvy */ marshaller.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper", new NamespacePrefixMapper() { @Override public String[] getPreDeclaredNamespaceUris() { return null; //new String[]{WellKnownNamespace.XML_SCHEMA_INSTANCE}; } @Override public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { if (namespaceUri.equals("urn:cz-mzcr:ns:dasta:ds4:ds_dasta")) { return "ds"; } if (namespaceUri.equals("urn:cz-mzcr:ns:dasta:ds4:ds_ip")) { return "dsip"; } return suggestion; } }); /** * Vypis xml zpavy */ marshaller.marshal(element, System.out); } } * Příklad inicializace a využití tříd pro C# (příklad je převzat ze stránek [[http://timtrott.co.uk/using-xsd-tool-to-generate-classes-from-xml/|Tima Trotta]]). **Pozor! Jedná se pouze o příklad.** * Další příklady jsou také na [[http://stackoverflow.com/questions/16943352/how-use-class-generated-by-xsd|StackOverflow]]. ** xsd soubor ** ** C# kód ** usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.IO; usingSystem.Xml.Serialization; namespace ConsoleApplication1 { class Program { staticvoid Main(string[] args) { StreamReader str =new StreamReader("cd_catalog.xml"); XmlSerializer xSerializer =new XmlSerializer(typeof(CATALOG)); CATALOG myCdCatalogue =(CATALOG)xSerializer.Deserialize(str); foreach(CATALOG.CDRow cd in myCdCatalogue.CD) { Console.WriteLine(cd.TITLE); Console.WriteLine(cd.ARTIST); Console.WriteLine(cd.COUNTRY); Console.WriteLine(cd.COMPANY); Console.WriteLine(cd.PRICE); Console.WriteLine(cd.YEAR); Console.WriteLine(); } str.Close(); } } } ===== Hodnocení ===== * **Povinné:** Úloha je hodnocena maximálně 3 body. Hodnoceno bude vypracování úlohy odevzdané do 22. 5. 2016 na UploadSystem. **Důležité:** Před odevzdáním si ověřte, zda práce splňuje jednotlivé body zadání **PŘESNĚ**. Pokud si nejste jisti, co některá část zadání znamená, včas se ptejte. Při nedodržení specifikace neočekávejte ''body z milosti''. Odevzdává se prostřednictvím UploadSystemu.