001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.camel.component.file.remote; 018 019 import java.util.concurrent.ScheduledExecutorService; 020 021 import org.apache.camel.Exchange; 022 import org.apache.camel.Processor; 023 import org.apache.camel.impl.ScheduledPollConsumer; 024 import org.apache.commons.logging.Log; 025 import org.apache.commons.logging.LogFactory; 026 027 public abstract class RemoteFileConsumer<T extends RemoteFileExchange> extends ScheduledPollConsumer<T> { 028 protected final transient Log log = LogFactory.getLog(getClass()); 029 protected RemoteFileEndpoint<T> endpoint; 030 031 // @deprecated lastPollTime to be removed in Camel 2.0 032 protected long lastPollTime; 033 034 protected boolean recursive; 035 protected String regexPattern; 036 protected boolean setNames = true; 037 protected boolean exclusiveReadLock; 038 protected boolean deleteFile; 039 protected String moveNamePrefix; 040 protected String moveNamePostfix; 041 protected String excludedNamePrefix; 042 protected String excludedNamePostfix; 043 private boolean timestamp; 044 045 public RemoteFileConsumer(RemoteFileEndpoint<T> endpoint, Processor processor) { 046 super(endpoint, processor); 047 this.endpoint = endpoint; 048 } 049 050 public RemoteFileConsumer(RemoteFileEndpoint<T> endpoint, Processor processor, 051 ScheduledExecutorService executor) { 052 super(endpoint, processor, executor); 053 } 054 055 /** 056 * Gets the filename. 057 * 058 * @param file the file object for the given consumer implementation. 059 * @return the filename as String. 060 */ 061 protected abstract String getFileName(Object file); 062 063 /** 064 * Is the given file matched to be consumed. 065 */ 066 protected boolean isMatched(Object file) { 067 String name = getFileName(file); 068 069 // folders/names starting with dot is always skipped (eg. ".", ".camel", ".camelLock") 070 if (name.startsWith(".")) { 071 return false; 072 } 073 074 if (regexPattern != null && regexPattern.length() > 0) { 075 if (!name.matches(regexPattern)) { 076 return false; 077 } 078 } 079 080 if (excludedNamePrefix != null) { 081 if (name.startsWith(excludedNamePrefix)) { 082 return false; 083 } 084 } 085 if (excludedNamePostfix != null) { 086 if (name.endsWith(excludedNamePostfix)) { 087 return false; 088 } 089 } 090 091 return true; 092 } 093 094 /** 095 * Should the file be moved after consuming? 096 */ 097 protected boolean isMoveFile() { 098 return moveNamePostfix != null || moveNamePrefix != null || endpoint.getConfiguration().getExpression() != null; 099 } 100 101 /** 102 * Gets the to filename for moving. 103 * 104 * @param name the original filename 105 * @param exchange the current exchange 106 * @return the move filename 107 */ 108 protected String getMoveFileName(String name, Exchange exchange) { 109 // move according to the expression 110 if (endpoint.getConfiguration().getExpression() != null) { 111 Object result = endpoint.getConfiguration().getExpression() .evaluate(exchange); 112 return exchange.getContext().getTypeConverter().convertTo(String.class, result); 113 } 114 115 // move according to the pre and postfix 116 StringBuffer buffer = new StringBuffer(); 117 if (moveNamePrefix != null) { 118 buffer.append(moveNamePrefix); 119 } 120 buffer.append(name); 121 if (moveNamePostfix != null) { 122 buffer.append(moveNamePostfix); 123 } 124 return buffer.toString(); 125 } 126 127 protected String remoteServer() { 128 return endpoint.getConfiguration().remoteServerInformation(); 129 } 130 131 public boolean isRecursive() { 132 return recursive; 133 } 134 135 public void setRecursive(boolean recursive) { 136 this.recursive = recursive; 137 } 138 139 public long getLastPollTime() { 140 return lastPollTime; 141 } 142 143 public void setLastPollTime(long lastPollTime) { 144 this.lastPollTime = lastPollTime; 145 } 146 147 public String getRegexPattern() { 148 return regexPattern; 149 } 150 151 public void setRegexPattern(String regexPattern) { 152 this.regexPattern = regexPattern; 153 } 154 155 public boolean isSetNames() { 156 return setNames; 157 } 158 159 public void setSetNames(boolean setNames) { 160 this.setNames = setNames; 161 } 162 163 public boolean isExclusiveReadLock() { 164 return exclusiveReadLock; 165 } 166 167 public void setExclusiveReadLock(boolean exclusiveReadLock) { 168 this.exclusiveReadLock = exclusiveReadLock; 169 } 170 171 public boolean isDeleteFile() { 172 return deleteFile; 173 } 174 175 public void setDeleteFile(boolean deleteFile) { 176 this.deleteFile = deleteFile; 177 } 178 179 public String getMoveNamePrefix() { 180 return moveNamePrefix; 181 } 182 183 public void setMoveNamePrefix(String moveNamePrefix) { 184 this.moveNamePrefix = moveNamePrefix; 185 } 186 187 public String getMoveNamePostfix() { 188 return moveNamePostfix; 189 } 190 191 public void setMoveNamePostfix(String moveNamePostfix) { 192 this.moveNamePostfix = moveNamePostfix; 193 } 194 195 public String getExcludedNamePrefix() { 196 return excludedNamePrefix; 197 } 198 199 public void setExcludedNamePrefix(String excludedNamePrefix) { 200 this.excludedNamePrefix = excludedNamePrefix; 201 } 202 203 public String getExcludedNamePostfix() { 204 return excludedNamePostfix; 205 } 206 207 public void setExcludedNamePostfix(String excludedNamePostfix) { 208 this.excludedNamePostfix = excludedNamePostfix; 209 } 210 211 /** 212 * @deprecated the timestamp feature will be removed in Camel 2.0 213 */ 214 public boolean isTimestamp() { 215 return timestamp; 216 } 217 218 /** 219 * Sets wether polling should use last poll timestamp for filtering only new files. 220 * @deprecated the timestamp feature will be removed in Camel 2.0 221 */ 222 public void setTimestamp(boolean timestamp) { 223 this.timestamp = timestamp; 224 } 225 }