演習 2.6:パーミッションチェックの実装
推定所要時間
特定の状況下でのみジョブの実行を許可する
説明:
5 分
演習:
15 分
説明
ジョブ設定ファイルでパーミッションチェックを指定して、特定の状況下でのみジョブの実行を許可することができます。パーミッションチェックは、インターフェイス IPermissionCheck を実装する必要があります。
checkJobExecutionAllowed(WMElement wmElement) throws WMException: このメソッドを呼び出して、指定した wmElement に対するジョブの実行が許可されているかどうかをチェックします。
使用可能なパーミッションチェックの実装
DefaultPermissionCheck: 要素のステータスに応じてジョブの実行を制限します。ジョブの実行を許可するステータスは、XML タグ AllowedInState によって設定します。
演習
この演習では、Simple Model Geometry Check をアセンブリではなくモデルに対して許可するためのパーミッションチェックを追加します。
前提条件
演習 2.5 の SimpleModelGeometryCheckJob.xml ファイルと SimpleModelGeometryCheckTemplate.lsp ファイルが必要です。
カスタムパーミッションチェックの実装
モデルパーツに対してのみモデル図形チェックを作成できるようにするため、特殊なパーミッションチェック SimpleModelGeometryCheckPermissionCheck を実装します(ここをクリックして表示されるファイルからコードをコピーアンドペーストできます)。
package com.acme;
import com.osm.automation.IJobPermissionCheck;
import com.osm.biz.WMElement;
import com.osm.datamgmt.biz.Model;
import com.osm.exception.WMException;
public class SimpleModelGeometryCheckJobPermissionCheck implements IJobPermissionCheck {
public void checkJobExecutionAllowed(WMElement wmElement)
throws WMException {
final boolean ok = (wmElement instanceof Model) && ((Model) wmElement).isModelPart();
if (!ok) {
throw new WMException("Permission denied");
}
}
}
ジョブの xml 設定ファイルの更新
パーミッションチェックを XML ジョブ設定ファイル内に設定する必要があります。
<?xml version="1.0" encoding="UTF-8"?>
<Job type="modeling.simplegeometrycheck" has_result_data="true">
<DisplayName>Simple Model Geometry Check</DisplayName>
<UI>
<ActionMenu wm_java_class="com.osm.datamgmt.biz.Model" include_derived="true">
<Name>Simple Model Geometry Check</Name>
<JobGroup>Model Checks</JobGroup>
<Action java_class="com.osm.automation.action.MultiSelectCreateJobScheduleAction">
<Description>Checks a model's geometry</Description>
</Action>
</ActionMenu>
</UI>
<Exporter java_class="com.acme.SimpleModelGeometryCheckJobExporter">
<StartScriptTemplate>SimpleModelGeometryCheckTemplate.lsp</StartScriptTemplate>
<ModelLoadRule catalog="model" msg_num="728">Highest Revisions</ModelLoadRule>
</Exporter>
<ResultHandler java_class="com.osm.automation.SaveToFileSystemJobResultHandler">
<DisplayName>Save annotated model to server directory</DisplayName>
<TargetDirectory>C:\taskagent</TargetDirectory>
</ResultHandler>
<PermissionCheck java_class="com.acme.SimpleModelGeometryCheckJobPermissionCheck">
</PermissionCheck>
</Job>
オプション: ライブラリパーツの許可
デフォルトでは、ライブラリパーツに対して Simple Model Geometry Check ジョブを許可しません。XML 設定ファイルに <AllowForLibraryParts> オプションを追加して、これを許可できます。
<PermissionCheck java_class="com.acme.SimpleModelGeometryCheckJobPermissionCheck">
<AllowForLibraryParts>true</AllowForLibraryParts>
</PermissionCheck>
これをサポートするには、SimpleModelGeometryCheckPermissionCheckIXmlConfigurable インターフェイスも実装する必要があります(ここをクリックして表示されるファイルからコードをコピーアンドペーストできます)。
package com.acme;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.w3c.dom.Element;
import com.osm.automation.IJobPermissionCheck;
import com.osm.biz.WMElement;
import com.osm.config.IXmlConfigurable;
import com.osm.datamgmt.biz.Library;
import com.osm.datamgmt.biz.Model;
import com.osm.exception.WMException;
import com.osm.util.Strings;
import com.osm.xml.DOMUtilities;
public class SimpleModelGeometryCheckJobPermissionCheck implements IJobPermissionCheck, IXmlConfigurable {
private static final Logger log = Logger.getLogger(SimpleModelGeometryCheckJobPermissionCheck.class.getName());
private static final String XML_TAG_ALLOW_FOR_LIBRARY_PARTS = "AllowForLibraryParts";
private boolean allowForLibraryParts = false;
// Interface IXmlConfigurable
public String getRootTagName() {
return XML_TAG_ALLOW_FOR_LIBRARY_PARTS;
}
public void configure(Element xmlConfigElement) {
try {
final Element element = DOMUtilities.getFirstChild(xmlConfigElement, XML_TAG_ALLOW_FOR_LIBRARY_PARTS);
final String booleanString = DOMUtilities.getText(element);
if (!Strings.isEmpty(booleanString)) {
allowForLibraryParts = Boolean.parseBoolean(booleanString);
}
} catch (Exception e) {
log.log(Level.WARNING, "Reading configuration for '" + XML_TAG_ALLOW_FOR_LIBRARY_PARTS + "' failed", e);
}
}
// Interface IJobPermissionCheck
public void checkJobExecutionAllowed(WMElement wmElement)
throws WMException {
boolean ok = wmElement instanceof Model;
ok &= ((Model) wmElement).isModelPart();
ok &= (allowForLibraryParts || !isLibraryPart(wmElement));
if (!ok) {
throw new WMException("Job execution not allowed for this model part.");
}
}
// helper methods
private boolean isLibraryPart(WMElement wmElement) {
return wmElement instanceof Library;
}
}
これは役に立ちましたか?