2017-12-13 8 views
-4

私はアプリケーション開発者とフレームワークプロバイダが人ではない状況があります。フレームワークプロバイダとして、私は開発者に単一のフィルタのように見えますが、実際には標準フィルタのチェーン(認証、呼び出しコンテキスト、メトリック、++の設定など)になります。多くのRestletを1つのRestletにパッケージングする標準的な方法はありますか?

標準ライブラリでこの機能が見つからないようですが、おそらく拡張機能があります。

答えて

0

答えが出るのを待つのではなく、私が自分で実装して共有し、必要があればここで共有しました。

/** 
* Composes an array of Restlet Filters into a single Filter. 
*/ 
public class ComposingFilter extends Filter 
{ 
    private final Filter first; 
    private final Filter last; 

    public ComposingFilter(Filter... composedOf) 
    { 
     Objects.requireNonNull(composedOf); 
     if(composedOf.length == 0) 
     { 
      throw new IllegalArgumentException("Filter chain can't be empty."); 
     } 
     first = composedOf[ 0 ]; 
     Filter prev = first; 
     for(int i = 1; i < composedOf.length; i++) 
     { 
      Filter next = composedOf[ i ]; 
      prev.setNext(next); 
      prev = next; 
     } 
     last = composedOf[ composedOf.length - 1 ]; 
    } 

    @Override 
    protected int doHandle(Request request, Response response) 
    { 
     if(first != null) 
     { 
      first.handle(request, response); 
      Response.setCurrent(response); 
      if(getContext() != null) 
      { 
       Context.setCurrent(getContext()); 
      } 
     } 
     else 
     { 
      response.setStatus(Status.SERVER_ERROR_INTERNAL); 
      getLogger().warning("The filter " + getName() + " was executed without a next Restlet attached to it."); 
     } 
     return CONTINUE; 
    } 

    @Override 
    public synchronized void start() 
     throws Exception 
    { 
     if(isStopped()) 
     { 
      first.start(); 
      super.start(); 
     } 
    } 

    @Override 
    public synchronized void stop() 
     throws Exception 
    { 
     if(isStarted()) 
     { 
      super.stop(); 
      first.stop(); 
     } 
    } 

    @Override 
    public Restlet getNext() 
    { 
     return last.getNext(); 
    } 

    @Override 
    public void setNext(Class<? extends ServerResource> targetClass) 
    { 
     last.setNext(targetClass); 
    } 

    @Override 
    public void setNext(Restlet next) 
    { 
     last.setNext(next); 
    } 
} 

注:まだテストされていません。

+0

これはBSD-3-Clauseライセンスで提供されています。https://opensource.org/licenses/BSD-3-Clauseを参照してください。 –

関連する問題