2017-04-05 15 views
0

WSO2 ESBを使用してシナリオを実装する必要があります。クライアント側に応答しながらバイナリペイロードをストリーム処理しながら暗号化します(Application/Octet-ストリーム)、以下は私の思考によるいくつかの詳細です:WSO2経由でペイロードファイルをストリーミングで暗号化する方法

  1. ビジネス機能を提供する "http://myhost/backend/"のようなエンドポイント。
  2. エンドポイント経由でメッセージを渡すプロキシ。
  3. Content-TypeをチェックするためにOutSequenceを書き込もうとしました.Content-TypeがApplication/Octet-Streamと一致する場合は、カスタマイズされたクラスメディエータを呼び出してStreamStreamと応答を暗号化します。

私はクラスメディエーターをどのように実装するのか分かりません。どのようにしてメッセージからファイルストリームを取得/読み取ることができますか?また、仲介メソッドでmc.getEnvelope().getBody()しか見ることができないうちに、outputStreamを応答に戻す方法はありますか?私の現在のメディエーターは動作しません。

public boolean mediate(MessageContext mc) { 
    org.apache.axis2.context.MessageContext amc = ((Axis2MessageContext) mc).getAxis2MessageContext(); 
     try { 
      String contentID = amc.getAttachmentMap().getAllContentIDs()[0]; 
      DataHandler dh = amc.getAttachment(contentID); 
      dh.getDataSource().getName(); 
      InputStream is = null; 
      try { 
       is = dh.getInputStream(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
       String line = null; 
       while ((line = br.readLine()) != null) { 
        System.out.println("client read:" + line); 
       } 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return true; 
} 

経験豊かな人が親切に助けてくれたら幸いです。

+0

あなたの質問は最も可能性の高いSOで非常にunspecificand回答されていない、あなたはまだ試してみました何... – Andreas

+0

は@Andreasありがとうといくつかのコードを提供してください!この問題を回避しながらコードを貼り付けるつもりです。 –

答えて

0

同様の問題に直面している他の人のために、私の現在の解決策を貼り付けました。 メディエーターでは、応答ストリームからOMText.InputStream経由でファイルの内容を読み込み、net.lingala.zip4jパッケージを使用して、暗号化されていないファイルのzipファイル(メモリ内)を書き込みます。最後に、zipファイルの内容をByteArrayとしてSOAPメッセージのOMElementに書き戻します。

public boolean mediate(MessageContext mc) { 
    System.out.println("========================Mediator log start================================"); 
    org.apache.axis2.context.MessageContext amc = ((Axis2MessageContext) mc).getAxis2MessageContext(); 
    try { 
     @SuppressWarnings("unchecked") 
     Map<String, String> responseHeaders = (Map<String, String>) amc.getProperty("TRANSPORT_HEADERS"); 
     String rawFileName = ""; 
     String[] contentDisps = responseHeaders.get("Content-Disposition").split(";"); 
     for (String item : contentDisps) { 
      System.out.println("item::" + item); 
      if (item.trim().startsWith(CONTENT_DISPOSITION_FILENAME)) { 
       rawFileName = item.substring(item.indexOf("\"") + 1, item.length() - 1); 
       break; 
      } 
     } 
     responseHeaders.put(
      "Content-Disposition", 
      responseHeaders.get("Content-Disposition").replace(rawFileName, 
       rawFileName.substring(0, rawFileName.lastIndexOf(".")) + ".myzip")); 
     OMElement binaryPayload = 
      amc.getEnvelope().getBody() 
       .getFirstChildWithName(new QName("http://ws.apache.org/commons/ns/payload", "binary")); 
     OMText binaryNode = (OMText) binaryPayload.getFirstOMChild(); 
     DataHandler dataHandler = (DataHandler) binaryNode.getDataHandler(); 
     InputStream is = dataHandler.getInputStream(); 
     ByteArrayOutputStream responseOutputStream = new ByteArrayOutputStream(); 
     ZipOutputStream zipOutputStream = getZipOutputStreamInstance(responseOutputStream, rawFileName); 
     // write to zipOutputStream 
     byte data[] = new byte[BUFFER_SIZE]; 
     int count; 
     while ((count = is.read(data, 0, BUFFER_SIZE)) != -1) { 
      zipOutputStream.write(data, 0, count); 
      zipOutputStream.flush(); 
     } 
     zipOutputStream.closeEntry(); 
     zipOutputStream.finish(); 
     InputStream in = new ByteArrayInputStream(responseOutputStream.toByteArray()); 
     DataHandler zipDataHandler = new DataHandler(new StreamingOnRequestDataSource(in)); 
     OMFactory factory = OMAbstractFactory.getOMFactory(); 
     OMText zipData = factory.createOMText(zipDataHandler, true); 
     zipData.setBinary(true); 
     binaryPayload.getFirstOMChild().detach(); 
     binaryPayload.addChild(zipData); 
     amc.setProperty("TRANSPORT_HEADERS", responseHeaders); 
     System.out.println("========================Mediator end=================================="); 
    } catch (Exception ex) { 
     System.out.println("exception found here:"); 
     ex.printStackTrace(); 
    } 
    return true; 
} 
+0

私はそれがどこかで私はzipファイルのバイトをメッセージに書き戻して最適化できるかどうかはわかりません。今、InputStreamオブジェクトは、私のOutputStreamからすべてのバイトを一度読み込んだようです。誰かがコメントをつけることができればと感謝します。 –

関連する問題