XBUP - Implementace proudového zpracováníTento dokument je součástí dokumentace projektu eXtensible Binary Universal Protocol. Obsahuje popis implementace proudového zpracování.
1. Implementace proudového zpracování
1.1. Přehled rozhraní
2. Rozhraní proudových tříd
2.1. Rozhraní pro události
2.2. Rozhraní datových proudů
3. Převodní třídy
3.1. Změna řízení toku
3.2. Parsování
3.3. Zpracování vzorem
4. Příklady použití
5. Reference
Implementace proudového zpracování se snaží pro vybrané varianty datových proudů poskytnout potřebnou funkcionalitu ve formě tříd a rozhraní. Implementace by měla být zahrnuta do balíku xblib a povinně dostupná ve všech implementacích. Tam kde je to možné, jsou rozšiřovány existující implementace proudového zpracování jako základ pro konstrukci nadtříd a případně i názvy metod a typy parametrů.
Jako inspirace poslouží obdobný projekt pro XML nazývaný XStream, který však jde ještě dále a využívá pokročilých vlastností jazyka Java.
Implementace řeší jak vlastní předávání dat, tak i řízení toku (komunikaci) a transformace jednotlivých typů dat.
Základní rozhraní jsou následující:
| Typ rozhraní | Typ řízení | Odesílání dat | Příjem dat | Odesílání s přerušením | Příjem s přerušením | Podpora serializace | Zpracování proudu |
|---|---|---|---|---|---|---|---|
| Široké rozhraní | Řízeno odesílatelem | XBProvider | XBListener | - | - | XBSerializable | XBFilter |
| Řízeno příjemcem | XBProducer | XBConsumer | - | - | - | - | |
| Předávání tokenu | Řízeno odesílatelem | XBEventProvider | XBEventListener | XBEventProducer | XBEventConsumer | XBEventSerializable | XBEventFilter |
| Řízeno příjemcem | XBPullProvider | XBPullListener | XBPullProducer | XBPullConsumer | XBPullSerializable | XBPullFilter | |
| Proudové rozhraní | Řízeno odesílatelem | XBOutputStream | - | - | - | XBStreamable | XBStreamFilter |
| Řízeno příjemcem | - | XBInputStream | - | - | XBStreamable | XBStreamFilter |
Rozhraní proudových tříd se liší podle šířky rozhraní, způsobu řízení toku a podpory paralelního zpracování.
Jednou z možností je předávat data skupinou metod, kdy každému typu dat odpovídá právě jedna metoda. Jednotlivé metody odpovídají typům položek tak, jak jsou používány v parserech. Případně je možné data přenášet pomocí položek, které v sobě nesou informaci o typu přenášených položek. Položky jsou pak předávány pomocí jediného parametru jediné metody.
Rozhraní pro datové proudy (streams) poskytuje možnost opačného řízení proudu dat a poskytuje oba dva druhy používá především úzké rozhraní. Promě toho může rozhraní podporovat další metody pro řízení toku dat, jako například pohyb v toku na začátek, o zvolený rozsah vpřed či vzad.
K dispozici jsou dále standardní třídy, které umožňují provádět převody mezi různými typy proudu, případně provádět některé druhy transformací nad proudy.
Mezi oběma formami řízení komunikace je možné převádět.
Třídy pro parsování kombinují techniky parsování s převodem na některý z typů proudu.
Zpracování vzorem definuje příjem proudu definicí příchozích položek tak, jak by měli přicházet. Zároveň jsou těmito funkcemi vráceny přijaté hodnoty.
Následuje několik příkladů možných využití implementovaných tříd a rozhraní.
Proud je možné s výhodou využít například pro serializaci objektů. Pro jednotlivé úrovně protokolu je definováno rozhraní, které zpřístupňuje funkce konverze na datový proud a zpět, které pak umožňuje transformaci vybraných dat protokolu na posloupnost položek tak jak byly definovány v událostech parsování.
Tyto rozhraní jsou následující:
Následující příklad ukazuje možné využití proudu v programovacím jazyce Java pro serializaci textového řetězce. Jde o implementaci v pracovní verzi WR-16:
public class XBString implements XBCL1Streamable {
private String value;
/** Creates a new instance of XBString */
public XBString() {
this.value = "";
}
public XBString(String value) {
this.value = value;
}
public XBL1Declaration getXBL1Declaration() {
throw new UnsupportedOperationException("Not supported yet.");
}
/** Serialize object to XBUP Level 1 Stream */
public void writeXBL1Stream(XBL1OutputStream stream) throws IOException {
try {
XBL1Listener listener = XBL1DefaultEventListener.toXBListener(stream);
listener.beginXBL1(false);
listener.typeXBL1(new XBCPContextBlock(xbBlockPath));
listener.attribXBL1(new UBNat32(1)); // Data block pointer
listener.beginXBL1(false);
listener.dataXBL1(getValue().getBytes());
listener.endXBL1();
listener.endXBL1();
} catch (XBParseException ex) {
Logger.getLogger(XBString.class.getName()).log(Level.SEVERE, null, ex);
}
}
/** Serialize object from XBUP Level 1 Stream */
public void readXBL1Stream(XBL1InputStream stream) throws XBProcessingException {
try {
XBL1StreamChecker checker = new XBL1StreamChecker(stream);
checker.beginXBL1();
checker.typeXBL1(new XBCPContextBlock(xbBlockPath));
checker.attribXBL1(new UBNat32(1)); // Data block pointer
checker.beginXBL1();
setValue(new String(checker.dataXBL1()));
checker.endXBL1();
checker.endXBL1();
} catch (XBParseException ex) {
Logger.getLogger(XBString.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(XBString.class.getName()).log(Level.SEVERE, null, ex);
}
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
Seznam zdrojů, literatury a relevantních odkazů.
XStream - obdobná implementace pro XML [http://xstream.codehaus.org/]
Homepage: http://xbup.sf.net
License: GNU Free Documentation License (FDL)
Latest update: 2009-06-28