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

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

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

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

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

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

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

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

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

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

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

getContentAsBlobDomain()は、BlobDomainオブジェクトを返します。BlobDomainは、機能的にはBLOBと似ています。 ただしBlobDomainは、ビジネス・コンポーネントのローカル・モードおよびリモート・モードの両方で動作します。 ユーザー・アプリケーションが両方のビジネス・コンポーネント・モードに対して透過的に実行される場合は、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つのファイルの内容とサイズは同じです。

ここで、コードSnippetの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のコンテンツを読み込むことができます。

 

Copyright © 1997, 2004, Oracle. All rights reserved.