====== 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.