001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE
004 * file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file
005 * to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the
006 * License. You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
011 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
012 * specific language governing permissions and limitations under the License.
013 */
014 package org.apache.camel.component.file;
015
016 import org.apache.camel.Exchange;
017 import org.apache.camel.Producer;
018 import org.apache.camel.impl.DefaultProducer;
019 import org.apache.commons.logging.Log;
020 import org.apache.commons.logging.LogFactory;
021
022 import java.io.File;
023 import java.io.RandomAccessFile;
024 import java.nio.ByteBuffer;
025 import java.nio.channels.FileChannel;
026
027 /**
028 * A {@link Producer} implementation for File
029 *
030 * @version $Revision: 523016 $
031 */
032 public class FileProducer extends DefaultProducer {
033 private static final transient Log log = LogFactory.getLog(FileProducer.class);
034 private final FileEndpoint endpoint;
035
036 public FileProducer(FileEndpoint endpoint) {
037 super(endpoint);
038 this.endpoint = endpoint;
039 }
040
041 /**
042 * @param exchange
043 * @see org.apache.camel.Processor#process(Exchange)
044 */
045 public void process(Exchange exchange) {
046 process(endpoint.toExchangeType(exchange));
047 }
048
049 public void process(FileExchange exchange){
050 String fileName = exchange.getIn().getMessageId();
051 ByteBuffer payload=exchange.getIn().getBody(ByteBuffer.class);
052 payload.flip();
053 File file = null;
054 if(endpoint.getFile()!=null&&endpoint.getFile().isDirectory()){
055
056 file=new File(endpoint.getFile(),fileName);
057
058 }else{
059 file=new File(fileName);
060 }
061 buildDirectory(file);
062 try{
063 FileChannel fc=new RandomAccessFile(file,"rw").getChannel();
064 fc.position(fc.size());
065 fc.write(payload);
066 fc.close();
067 }catch(Throwable e){
068 log.error("Failed to write to File: "+file,e);
069 }
070 }
071
072 private void buildDirectory(File file) {
073 String dirName = file.getAbsolutePath();
074 int index = dirName.lastIndexOf(File.separatorChar);
075 if (index > 0) {
076 dirName = dirName.substring(0,index);
077 File dir = new File(dirName);
078 dir.mkdirs();
079 }
080 }
081 }