ロック可能オブジェクトの操作
以下のコード・サンプルは、ロック可能なオブジェクトを使用する操作を示しています。 Content Engine のロックとアンロックのメカニズムの概要については、『連携ロック』を参照してください。
連携ロックに関与するアプリケーションは、変更するオブジェクトをロックしてから、オブジェクトを変更し、その後オブジェクトをアンロックする必要があります。「オブジェクトのロックとアンロック」を参照してください。
オブジェクトがロック状態の場合、ロック所有者は必要に応じてロックのタイムアウト期間を延長できます。「ロックの延長」を参照してください。
連携ロックに関与するアプリケーションは、オブジェクトの変更を試みる前に、オブジェクトのロック状況を判別する必要があります。 「ロックの確認」を参照してください。
オブジェクトのロックとアンロック
Document オブジェクトのロック、アンロックのコード例を次に示します。
Java™ の例
...
//ドキュメントがロックされていなければ、プロパティーを更新
try
{
doc.lock(30, null); // ドキュメントを 30 秒間ロック
doc.save(RefreshMode.REFRESH);
}
catch (EngineRuntimeException fnEx)
{
if (fnEx.getExceptionCode().equals(ExceptionCode.E_OBJECT_LOCKED) )
System.out.println("This object is currently locked.");
else System.out.println(fnEx.getMessage() );
return;
}
//ドキュメント・プロパティーの更新
//ロックの期間はプロパティー値が、
//連携アプリケーションにより変更されないことが保障されている
...
//連携アプリケーションにより変更されないことが保障されている
doc.unlock();
doc.save(RefreshMode.REFRESH);
C# の例
...
//ドキュメントがロックされていなければ、プロパティーを更新
try
{
doc.LockObject(30,null); //ドキュメントを 30 秒間ロック
doc.Save(RefreshMode.REFRESH);
}
catch (EngineRuntimeException fnEx)
{
if (fnEx.GetExceptionCode().Equals(ExceptionCode.E_OBJECT_LOCKED))
System.Console.WriteLine("This object is currently locked.");
else System.Console.WriteLine( (fnEx.Message) );
return;
}
//ドキュメント・プロパティーの更新
//ロックの期間はプロパティー値が、
//連携アプリケーションにより変更されないことが保障されている
...
//連携アプリケーションにより変更されないことが保障されている
doc.Unlock();
doc.Save(RefreshMode.REFRESH);
ロックの延長
ロック所有者は、既存のロックのタイムアウト期間を延長できます。延長するには、updateLock メソッドを呼び出します。
Java の例
doc.updateLock(60); //extend the lock by 60 seconds
doc.save(RefreshMode.REFRESH);
C# の例
doc.UpdateLock(60); //extend the lock by 60 seconds
doc.Save(RefreshMode.REFRESH);
updateLock メソッドが正常に呼び出されると、Containable インターフェースの LockTimeout プロパティーの値がリセットされます。
ロックの確認
連携ロックを使用するアプリケーションが変更を加えるオブジェクトのロックを確認する場合の推奨例を示します (これはロック状況の確認で説明した、isLocked メソッドを呼び出す方法とは別のアプローチです)。 このコードでは Document オブジェクトのロックが試行され、このドキュメントが別のアプリケーションによりロックされた場合にスローされる例外に基づいて処理が行われます。オブジェクトがロックされている場合、アプリケーションはロック情報として、ロック所有者、ロックの期間、およびロックのトークン ID を取得します。
Java の例
...
try
{
doc.lock(60, null); //ドキュメントを 30 秒間ロック
doc.save(RefreshMode.REFRESH);
}
catch (EngineRuntimeException fnEx)
{
if (fnEx.getExceptionCode().equals(ExceptionCode.E_OBJECT_LOCKED) )
{
doc.refresh(); //サーバーからドキュメント・プロパティーの現在値を取得
System.out.println( "This document is currently locked by" + doc.get_LockOwner() + "¥n"+
"for " + doc.get_LockTimeout() + "seconds¥n" +
"and identified by token " + doc.get_LockToken().toString() );
}
else System.out.println(fnEx.getMessage() );
return;
}
// ドキュメントがロックされていなければ、ロックし、変更した上でアンロックする
...
C# の例
...
try
{
doc.LockObject(30,null); //ドキュメントを 30 秒間ロック
doc.Save(RefreshMode.REFRESH);
}
catch (EngineRuntimeException fnEx)
{
if (fnEx.GetExceptionCode().Equals(ExceptionCode.E_OBJECT_LOCKED) )
{
doc.Refresh(); //サーバーからドキュメント・プロパティーの現在値を取得
System.Console.WriteLine("This document is currently locked by" + doc.LockOwner + "¥n" +
"for " + doc.LockTimeout + "seconds¥n" +
"and identified by token " + doc.LockToken );
}
else System.Console.WriteLine(fnEx.Message);
return;
}
// ドキュメントがロックされていなければ、ロックし、変更した上でアンロックする
...