пятница, марта 30, 2012

Файловый интерфейс для Base64 кодирования/декодирования с помощью Apache Camel

Чем мне нравится Apache Camel, так это готовыми компонентами  конечных точек(endpoints) на все случаи жизни. В моей жизни встретилась задача, по Base64 кодированию/декодированию множества файлов.

Схема работы приложения следующая:
В соответствующие папки будут кидаться файлики, результат будет формироваться в папке output:

c://data/encode
c://data/decode

c://data/output

Идеальная задача для Apache Camel!



Как обычно создаем Maven Project на основе уже известного нам camel-archetype-java.
Добавляем в зависимости к проекту сommon-codec, с помощью которого будет проводиться кодирование/декодирование
 
<dependency>
 <groupId>commons-codec</groupId>
 <artifactId>commons-codec</artifactId>
 <version>1.6</version>
</dependency>
Создаем два процессора которые будут кодировать и раскодировать поступающие сообщения.

Декодировщик:
package com.bssys.base64.convert;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.commons.codec.binary.Base64;

public class Base64DecodeProcessor implements Processor {

 @Override
 public void process(Exchange exchange) throws Exception {
  // TODO Auto-generated method stub
  InputStream is = exchange.getIn().getBody(InputStream.class);
  String fileName = (String)exchange.getIn().getHeader(Exchange.FILE_NAME);
  BufferedInputStream bufferedInputStream = new BufferedInputStream(is);
  ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  byte buf[] = new byte[1024];
  int pos=-1;
  while((pos= bufferedInputStream.read(buf))!=-1){
   byteArrayOutputStream.write(buf, 0, pos);
  }
  bufferedInputStream.close();
  byte[] encodeBytes = Base64.decodeBase64(byteArrayOutputStream.toByteArray());
  exchange.getOut().setHeader(Exchange.FILE_NAME, fileName);
  exchange.getOut().setBody(encodeBytes);
 }
}

Кодировщик:
package com.bssys.base64.convert;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.commons.codec.binary.Base64;

public class Base64EncodeProcessor implements Processor {

 @Override
 public void process(Exchange exchange) throws Exception {
  // TODO Auto-generated method stub
  InputStream is = exchange.getIn().getBody(InputStream.class);
  String fileName = (String)exchange.getIn().getHeader(Exchange.FILE_NAME);
  BufferedInputStream bufferedInputStream = new BufferedInputStream(is);
  ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  byte buf[] = new byte[1024];
  int pos = -1;
  while ((pos = bufferedInputStream.read(buf)) != -1) {
   byteArrayOutputStream.write(buf, 0, pos);
  }
  bufferedInputStream.close();
  byte[] encodeBytes = Base64.encodeBase64(byteArrayOutputStream
    .toByteArray());
  exchange.getOut().setHeader(Exchange.FILE_NAME, fileName);
  exchange.getOut().setBody(encodeBytes);

 }
}


Добавляем наши 2 процессора в spring-контекст
<bean id="Base64Encode" class="com.bssys.base64.convert.Base64EncodeProcessor"/>     
<bean id="Base64Decode" class="com.bssys.base64.convert.Base64DecodeProcessor"/>
И модифицируем MyRouteBuilder.java добавив в него 2 роутера:
public void configure() {
    // TODO create Camel routes here.
    from("file:c://data/encode").convertBodyTo(InputStream.class).to("Base64Encode").to("file:c://data/outbox");
    from("file:c://data/decode").convertBodyTo(InputStream.class).to("Base64Decode").to("file:c://data/outbox");
}

Запускаем и наслаждаемся. Apache Camel слушает заданные папки, и при поступлении файликов выполняет за нас всю черную работу.

Комментариев нет: