interMedia BC4Jドメイン・オブジェクト内のマルチメディア・コンテンツへのアクセスについて

interMedia BC4Jドメイン・クラスは、interMediaデータベース型のJavaマッピング・クラスです。Oracle9iデータベースには、次の4種類のinterMediaデータベース型があり、それぞれイメージ、オーディオ、ビデオおよび一般のドキュメント・タイプを表します。

各データベース型に対応する、次の4種類のinterMediaドメイン・クラスがあります。

interMedia型はオブジェクト型です。これらのオブジェクト型のインスタンスは、メタデータとメディア・データを含む属性、およびメソッドで構成されます。メディア・データは、実際のオーディオ、イメージ、ビデオまたはドキュメントです。メタデータは、オブジェクトの長さ、圧縮方法、形式など、データに関する情報です。メソッドは、getContent()setProperties()など、オブジェクトに対して実行可能なプロシージャです。

interMediaデータベース・オブジェクトには、共通のメディア・データ格納モデルが存在します。これらのオブジェクトのメディア・データ・コンポーネントは、データベース内のバイナリ・ラージ・オブジェクト(BLOB)に格納し、トランザクション制御下に置くことができます。またメディア・データは、データベース外部に、トランザクション制御なしで格納することもできます。この場合、ポインタがデータベースに格納され、トランザクション制御下に置かれます。メディア・データ自体は次の場所に格納されます。

interMediaドメイン・クラスには、共通のインタフェースとしてOrdDomainIOInterfaceがあります。このインタフェースを使用して、interMediaデータベース・オブジェクトに格納されているメディア・コンテンツにアクセスできます。

メディアが、interMediaデータベース・オブジェクト内のBLOBに格納されている場合、次のメソッドを使用してそのメディアを取得または更新できます。

取得する場合のメソッドは次のとおりです。

更新する場合のメソッドは次のとおりです。

この他にも、BLOBを使用してコンテンツを取得または更新するメソッドとして、getContent()getContentAsBlobDomain()の2つがあります。

getContent()は、データベースに格納されている実際のメディア・コンテンツを示すBLOBオブジェクトを返します。このBLOBオブジェクトを使用し、BC4Jローカル・モードでメディア・コンテンツを読み書きできます。ただし、BLOBはBC4Jドメイン・クラスではありません。BC4Jリモート・モードでは動作しません。ユーザー・アプリケーションをBC4Jの3層環境で実行する場合には、BLOBは使用しないでください。

getContentAsBlobDomain()は、BlobDomainオブジェクトを返します。BlobDomainは、機能的にはBLOBと似ています。ただしBlobDomainは、BC4Jのローカル・モードとリモート・モードの両方で動作します。ユーザー・アプリケーションが両方のBC4Jモードに対して透過的に実行される場合には、BLOBではなくBlobDomainを使用してください。

BlobDomainとBLOBでは、返されるストリーム・オブジェクトも異なります。BLOBオブジェクトのgetBinaryStream()へのコールでは、コールごとに異なるInputStreamオブジェクトが返されます。これらのInputStreamオブジェクトから同時に読込みを行うと、BLOBに格納されているコンテンツの複数のコピーが返されます。

一方、BlobDomainオブジェクトのgetBinaryStream()へのコールでは、前回返されたInputStreamオブジェクトがクローズされます。このため、読取り用として、getBinaryStream()から返された最新のInputStreamオブジェクトのみがオープンしていることになります。ユーザーは、こうした特性による影響について理解しておく必要があります。

次に例を示します。



  OrdImageDomain image = (OrdImageDomain)row.getAttribute("Image");
  BLOB blob = image.getContent();

  InputStream inpStream1 = blob.getBinaryStream();
  InputStream inpStream2 = blob.getBinaryStream();
boolean b1Done = false;
boolean b2Done = false;
FileOutputStream fos1 = new FileOutputStream("temp1.dat");
FileOutputStream fos2 = new FileOutputStream("temp2.dat");
int len1, len2;
byte[] buf1 = new byte[1024];
byte[] buf2 = new byte[1024];
while(!(b1Done && b2Done))
{
if(! b1Done)
{
len1 = inpStream1.read(buf1);
if(len1 != -1)
{
fos1.write(buf1, 0, len1);
}else
{
b1Done = true;
}
} if(! b2Done)
{
len2 = inpStream2.read(buf2);
if(len2 != -1)
{
fos2.write(buf2, 0, len2);
}else
{
b2Done = true;
}
}
}
inpStream1.close();
inpStream2.close();
fos1.close();
fos2.close();

このコードを実行すると、temp1.datとtemp2.datの2つのファイルが生成されます。2つのファイルの内容とサイズは同じです。

ここで、このコードの2行目を次のように変更し、BlobDomainを使用するようにします。

BlobDomain blob = image.getContentAsBlobDomain();

InputStream inpStream2 = blob.getBinaryStream();により、前回のInputStreamオブジェクトであるinpStream1がクローズされるため、temp1.datファイルには何も書き込まれません。temp2.datにのみ、BLOBロケータから取得されたコンテンツが含まれます。

メディアがBFILEとして保存されている場合、getBFileDomain()を使用してBFileDomainを取得できます。BFileDomainオブジェクトからは、コンテンツの読込みにかぎり行うことができます。BFILEへの書込みアクセスは許可されません。

メディアがOracleデータベース外部のリソースへのポインタとして格納されている場合、getSourceType()、getSourceLocation()およびgetSourceName()を使用して、ソース情報を取得できます。その後、ソースからの読込みを実行できます。たとえば、ソース・タイプがHTTP、ソースの場所がwww.oracle.com、ソース名がlogo.gifの場合、http://www.oracle.com/logo.gifなどのURLを作成して、logo.gifのコンテンツを読み込むことができます。