Selasa, 26 Oktober 2010

KOMPONEN DIGITAL - MULTI FLATSER

MULTI FLATSER

Masalah dengan Flat File disassembler adalah bahwa tidak memungkinkan beberapa Dokumen Schemas sebagai XML disassembler tidak.

Dalam BizTalk SDK, ada pipa contoh komponen yang memungkinkan fitur ini (lihat proyek dalam \ Microsoft BizTalk Server 2006 \ SDK \ Sampel \ Pipa \ SchemaResolverComponent \ SchemaResolverFlatFileDasm), tetapi komponen ini hanya mengakui dokumen berbeda jika mereka memiliki Identifier Tag dalam dua karakter pertama.

Masalah saya agak berbeda. Perbedaan antara dokumen berada dalam posisi beton:

DATA DOKUMEN PESAN 65 DETIL JENIS DOKUMEN

Info tentang yang merupakan skema flat file adalah di dalam pesan (dalam contoh sebelumnya, adalah 65 identifier).

Saya telah memodifikasi sampel SDK Pipeline Komponen untuk memilih skema yang benar dengan info di dalam pesan yang berbeda.

Pertama-tama, saya menambahkan dua sifat baru: StartPosition dan ReadLength. StartPosition menunjukkan mana identifier mulai karakter. ReadLength adalah panjang identifier tersebut.

swasta int startPosition = 0;
swasta int readLength = 0;

int publik StartPosition
{
mendapatkan
{
kembali startPosition;
}
mengatur
{
startPosition = nilai;
}
}

int publik ReadLength
{
mendapatkan
{
kembali readLength;
}
mengatur
{
readLength = nilai;
}
}

Langkah kedua adalah untuk melaksanakan IPersistPropertyBag, untuk menyimpan dan memuat properti ini:

public void Load (IPropertyBag propertyBag, errorLog int)
{
objek properti = null;

propertyBag.Read ("StartPosition", dari properti, errorLog);
if (properti! = null)
StartPosition = (int) properti;

propertyBag.Read ("ReadLength", dari properti, errorLog);
if (properti! = null)
ReadLength = (int) properti;
}

public void Simpan (IPropertyBag propertyBag, clearDirty bool, bool saveAllProperties)
{
objek ptrVar = StartPosition;
propertyBag.Write ("StartPosition", ptrVar ref);
ptrVar = ReadLength;
propertyBag.Write ("ReadLength", ptrVar ref);
}

Langkah ketiga dan terakhir adalah memodifikasi metode Probe, yang membaca aliran pesan, pada karakter ReadLength posisi StartPosition:

public bool Probe (IPipelineContext pContext, IBaseMessage pInMsg)
{
if (null == pContext)
melemparkan ArgumentNullException baru ("pContext");

if (null == pInMsg)
melemparkan ArgumentNullException baru ("pInMsg");

if (null == pInMsg.BodyPart | | == null pInMsg.BodyPart.GetOriginalDataStream ())
return false;

ReadOnlySeekableStream stream ReadOnlySeekableStream = baru (pInMsg.BodyPart.GetOriginalDataStream ());
Stream sourceStream = pInMsg.BodyPart.GetOriginalDataStream ();

if (! sourceStream.CanSeek)
{
ReadOnlySeekableStream seekableStream ReadOnlySeekableStream = baru (sourceStream);

pInMsg.BodyPart.Data = seekableStream;

sourceStream = pInMsg.BodyPart.Data;
}

posisi panjang = sourceStream.Position;

] [Char identifier = new char [ReadLength];
mencoba
{
StreamReader reader = new StreamReader (sourceStream);
reader.BaseStream.Position = StartPosition;
if (reader.Read (identifier, 0, identifier.Length) return false;

}
akhirnya
{
sourceStream.Position = posisi;
}

messageType = GetMessageType string (string baru (pengenal));

if (null == messageType)
return false;

IDocumentSpec documentSpec = pContext.GetDocumentSpecByType (messageType);

pInMsg.Context.Write (DOCUMENT_SPEC_NAME_PROPERTY_NAME, XML_NORM_NAMESPACE_URI, documentSpec.DocSpecStrongName);

kembali disassembler.Probe (pContext, pInMsg);
}

Akhirnya, metode GetMessageType dalam sampel SDK, hard-kode skema DocumentSpec. Kita dapat memodifikasi metode ini untuk mengambil informasi ini dari file konfigurasi atau SSO sebagai konfigurasi toko.

SUMBER:
www.google.com
elixmondelo.blogspot.com/.../multiple-flat-file-schemas-disassembler.html

Tidak ada komentar:

Posting Komentar