Wednesday, April 10, 2013

Alfrescoでユーザごとの使用容量を制限したい! -クオータの自動設定とか-

こんにちは。

 4月から娘が転園する関係で慣らし保育だったりとか自身が風邪引いたりとか(会社でも流行ってます)でてんやわんやのおおたにです。
 弊社は幸い業務内容によっては自宅やコワーキングスペースでの作業が認められているため、それらを駆使しつつ何とか仕事をこなしています。まあ慣らし保育だと通常よりも早い時間に迎えに行かなくてはならないのでそこは有休をうまく使ったりして乗り切っています。

 さて、今回はAlfrescoのクオータ設定についてのお話しです。Alfrescoではユーザごとにクオータを設定することができます(現時点での最新版Alfresco 4.2.cにて確認)。ただし、デフォルトのクオータサイズを指定してユーザ作成時に自動設定するようなことはできず、ユーザごとに手動で設定する必要があります(もしくは一括でクオータを設定するようなスクリプトを流すなど)。




 そこで今回は、クオータを自動設定するための方法を紹介したいと思います。前提条件としては、Alfrescoの開発環境が整っていることです。詳しくはここあたりを参照してみてください。

 開発内容自体は大したことは無くて、以下のクラス1個と定義ファイル1個を作るだけです。UserQuotaPolicyクラスはビルド後jarファイル等にしてクラスパス(<alf_dir>/tomcat/webapps/alfresco/WEB-INF/lib/)にコピーします。

jp.aegif.sample.UserQuotaPolicy
public class UserQuotaPolicy implements NodeServicePolicies.OnCreateNodePolicy
{
    private PolicyComponent policyComponent;
    private NodeService nodeService;
    private ContentUsageService contentUsageService;

    public void setPolicyComponent(PolicyComponent policyComponent) {
        this.policyComponent = policyComponent;
    }
    public void setNodeService(NodeService nodeService) {
        this.nodeService = nodeService;
    }
    public void setContentUsageService(ContentUsageService contentUsageService) {
        this.contentUsageService = contentUsageService;
    }

    public void init() {
        policyComponent.bindClassBehaviour(
            NodeServicePolicies.OnCreateNodePolicy.QNAME, ContentModel.TYPE_PERSON,
            new JavaBehaviour(this, "onCreateNode", Behaviour.NotificationFrequency.TRANSACTION_COMMIT));
    }

    @Override
    public void onCreateNode(ChildAssociationRef childAssociationRef) {
        String userName = (String)nodeService.getProperty(childAssociationRef.getChildRef(), ContentModel.PROP_USERNAME);
        long currentUserQuota = contentUsageService.getUserQuota(userName);
        if (currentUserQuota < 0) {
            contentUsageService.setUserQuota(userName, 524288000L);
        }
    }
}

<alf_dir>/tomcat/shared/classes/alfresco/extension/user-quota-context.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
    <bean id="defaultUserQuota" class="jp.aegif.sample.UserQuotaPolicy" init-method="init">
        <property name="policyComponent">
            <ref bean="policyComponent" />
        </property>
        <property name="nodeService">
            <ref bean="nodeService" />
        </property>
        <property name="contentUsageService">
            <ref bean="contentUsageImpl" />
        </property>
    </bean>
</beans>

 UserQuotaPolicyクラスではPolicyという仕組を利用しており、ノード作成時にそのノードタイプがcm:personノード(ユーザの情報を保持するノードタイプ)であった場合に、クオータを設定する処理を自動実行します。Policyは今回利用したOnCreateNodePolicy以外にもたくさん定義されているので、何らかの処理の際に独自の処理を挿入するようなカスタマイズを行う時にはよくお世話になります。とても重宝する拡張ポイントですので、是非覚えておいてください。

 あとは、定義ファイルを指定のディレクトリにコピーし、Alfrescoを再起動するだけです。早速ユーザを追加し、クオータが自動設定されていることを確認してみてください。今回の例ではクオータを決め打ちで500MBとしていますが、この値を定義ファイルから指定できるようにするとより便利になるので、そちらも是非チャレンジしてみてください。

No comments: