[XBUP]XBUP - Implementace proudového zpracování

Úvod

Tento dokument je součástí dokumentace projektu eXtensible Binary Universal Protocol. Obsahuje popis implementace proudového zpracování.

O úroveň výše

Obsah

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

1. Implementace proudového zpracování

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.

1.1. Přehled rozhraní

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í datPříjem datOdesílání s přerušenímPříjem s přerušenímPodpora serializaceZpracování proudu
Široké rozhraníŘízeno odesílatelemXBProviderXBListener--XBSerializableXBFilter
Řízeno příjemcemXBProducerXBConsumer----
Předávání tokenuŘízeno odesílatelemXBEventProviderXBEventListenerXBEventProducerXBEventConsumerXBEventSerializableXBEventFilter
Řízeno příjemcemXBPullProviderXBPullListenerXBPullProducerXBPullConsumerXBPullSerializableXBPullFilter
Proudové rozhraníŘízeno odesílatelemXBOutputStream---XBStreamableXBStreamFilter
Řízeno příjemcem-XBInputStream--XBStreamableXBStreamFilter

2. Rozhraní proudových tříd

Rozhraní proudových tříd se liší podle šířky rozhraní, způsobu řízení toku a podpory paralelního zpracování.

2.1. Rozhraní pro události

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.

2.2. Rozhraní datových proudů

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.

3. Převodní třídy

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.

3.1. Změna řízení toku

Mezi oběma formami řízení komunikace je možné převádět.

3.2. Parsování

Třídy pro parsování kombinují techniky parsování s převodem na některý z typů proudu.

3.3. Zpracování vzorem

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.

4. Příklady použití

Následuje několik příkladů možných využití implementovaných tříd a rozhraní.

4.1. Serializace objektů

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í:

1.2.1. Příklad využití proudu

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;
    }
}

5. Reference

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