public String createTempFileName(Exchange exchange, String fileName) { String answer = fileName; String tempName; if (exchange.getIn().getHeader(Exchange.FILE_NAME) == null) { // its a generated filename then add it to header so we can evaluate the expression exchange.getIn().setHeader(Exchange.FILE_NAME, FileUtil.stripPath(fileName)); tempName = endpoint.getTempFileName().evaluate(exchange, String.class); // and remove it again after evaluation exchange.getIn().removeHeader(Exchange.FILE_NAME); } else { tempName = endpoint.getTempFileName().evaluate(exchange, String.class); } // check for both windows and unix separators int pos = Math.max(answer.lastIndexOf("/"), answer.lastIndexOf("\\")); if (pos == -1) { // no path so use temp name as calculated answer = tempName; } else { // path should be prefixed before the temp name StringBuilder sb = new StringBuilder(answer.substring(0, pos + 1)); sb.append(tempName); answer = sb.toString(); } if (endpoint.getConfiguration().needToNormalize()) { // must normalize path to cater for Windows and other OS answer = normalizePath(answer); } return answer; }
public void writeFile(Exchange exchange, String fileName) throws GenericFileOperationFailedException { // build directory if auto create is enabled if (endpoint.isAutoCreate()) { // we must normalize it (to avoid having both \ and / in the name which confuses java.io.File) String name = FileUtil.normalizePath(fileName); // use java.io.File to compute the file path File file = new File(name); String directory = file.getParent(); boolean absolute = FileUtil.isAbsolute(file); if (directory != null) { if (!operations.buildDirectory(directory, absolute)) { log.debug( "Cannot build directory [{}] (could be because of denied permissions)", directory); } } } // upload if (log.isTraceEnabled()) { log.trace( "About to write [{}] to [{}] from exchange [{}]", new Object[] {fileName, getEndpoint(), exchange}); } boolean success = operations.storeFile(fileName, exchange); if (!success) { throw new GenericFileOperationFailedException("Error writing file [" + fileName + "]"); } log.debug("Wrote [{}] to [{}]", fileName, getEndpoint()); }
public String createFileName(Exchange exchange) { String answer; // overrule takes precedence Object value; Object overrule = exchange.getIn().getHeader(Exchange.OVERRULE_FILE_NAME); if (overrule != null) { if (overrule instanceof Expression) { value = overrule; } else { value = exchange.getContext().getTypeConverter().convertTo(String.class, exchange, overrule); } } else { value = exchange.getIn().getHeader(Exchange.FILE_NAME); } // if we have an overrule then override the existing header to use the overrule computed name // from this point forward if (overrule != null) { exchange.getIn().setHeader(Exchange.FILE_NAME, value); } if (value != null && value instanceof String && StringHelper.hasStartToken((String) value, "simple")) { log.warn( "Simple expression: {} detected in header: {} of type String. This feature has been removed (see CAMEL-6748).", value, Exchange.FILE_NAME); } // expression support Expression expression = endpoint.getFileName(); if (value != null && value instanceof Expression) { expression = (Expression) value; } // evaluate the name as a String from the value String name; if (expression != null) { log.trace("Filename evaluated as expression: {}", expression); name = expression.evaluate(exchange, String.class); } else { name = exchange.getContext().getTypeConverter().convertTo(String.class, exchange, value); } // flatten name if (name != null && endpoint.isFlatten()) { // check for both windows and unix separators int pos = Math.max(name.lastIndexOf("/"), name.lastIndexOf("\\")); if (pos != -1) { name = name.substring(pos + 1); } } // compute path by adding endpoint starting directory String endpointPath = endpoint.getConfiguration().getDirectory(); String baseDir = ""; if (endpointPath.length() > 0) { // Its a directory so we should use it as a base path for the filename // If the path isn't empty, we need to add a trailing / if it isn't already there baseDir = endpointPath; boolean trailingSlash = endpointPath.endsWith("/") || endpointPath.endsWith("\\"); if (!trailingSlash) { baseDir += getFileSeparator(); } } if (name != null) { answer = baseDir + name; } else { // use a generated filename if no name provided answer = baseDir + endpoint.getGeneratedFileName(exchange.getIn()); } if (endpoint.getConfiguration().needToNormalize()) { // must normalize path to cater for Windows and other OS answer = normalizePath(answer); } return answer; }
/** * Perform the work to process the fileExchange * * @param exchange fileExchange * @param target the target filename * @throws Exception is thrown if some error */ protected void processExchange(Exchange exchange, String target) throws Exception { log.trace("Processing file: {} for exchange: {}", target, exchange); try { preWriteCheck(); // should we write to a temporary name and then afterwards rename to real target boolean writeAsTempAndRename = ObjectHelper.isNotEmpty(endpoint.getTempFileName()); String tempTarget = null; // remember if target exists to avoid checking twice Boolean targetExists = null; if (writeAsTempAndRename) { // compute temporary name with the temp prefix tempTarget = createTempFileName(exchange, target); log.trace("Writing using tempNameFile: {}", tempTarget); // if we should eager delete target file before deploying temporary file if (endpoint.getFileExist() != GenericFileExist.TryRename && endpoint.isEagerDeleteTargetFile()) { // cater for file exists option on the real target as // the file operations code will work on the temp file // if an existing file already exists what should we do? targetExists = operations.existsFile(target); if (targetExists) { log.trace("EagerDeleteTargetFile, target exists"); if (endpoint.getFileExist() == GenericFileExist.Ignore) { // ignore but indicate that the file was written log.trace( "An existing file already exists: {}. Ignore and do not override it.", target); return; } else if (endpoint.getFileExist() == GenericFileExist.Fail) { throw new GenericFileOperationFailedException( "File already exist: " + target + ". Cannot write new file."); } else if (endpoint.isEagerDeleteTargetFile() && endpoint.getFileExist() == GenericFileExist.Override) { // we override the target so we do this by deleting it so the temp file can be renamed // later // with success as the existing target file have been deleted log.trace("Eagerly deleting existing file: {}", target); if (!operations.deleteFile(target)) { throw new GenericFileOperationFailedException("Cannot delete file: " + target); } } } } // delete any pre existing temp file if (operations.existsFile(tempTarget)) { log.trace("Deleting existing temp file: {}", tempTarget); if (!operations.deleteFile(tempTarget)) { throw new GenericFileOperationFailedException("Cannot delete file: " + tempTarget); } } } // write/upload the file writeFile(exchange, tempTarget != null ? tempTarget : target); // if we did write to a temporary name then rename it to the real // name after we have written the file if (tempTarget != null) { // if we did not eager delete the target file if (endpoint.getFileExist() != GenericFileExist.TryRename && !endpoint.isEagerDeleteTargetFile()) { // if an existing file already exists what should we do? targetExists = operations.existsFile(target); if (targetExists) { log.trace("Not using EagerDeleteTargetFile, target exists"); if (endpoint.getFileExist() == GenericFileExist.Ignore) { // ignore but indicate that the file was written log.trace( "An existing file already exists: {}. Ignore and do not override it.", target); return; } else if (endpoint.getFileExist() == GenericFileExist.Fail) { throw new GenericFileOperationFailedException( "File already exist: " + target + ". Cannot write new file."); } else if (endpoint.getFileExist() == GenericFileExist.Override) { // we override the target so we do this by deleting it so the temp file can be renamed // later // with success as the existing target file have been deleted log.trace("Deleting existing file: {}", target); if (!operations.deleteFile(target)) { throw new GenericFileOperationFailedException("Cannot delete file: " + target); } } } } // now we are ready to rename the temp file to the target file log.trace("Renaming file: [{}] to: [{}]", tempTarget, target); boolean renamed = operations.renameFile(tempTarget, target); if (!renamed) { throw new GenericFileOperationFailedException( "Cannot rename file from: " + tempTarget + " to: " + target); } } // any done file to write? if (endpoint.getDoneFileName() != null) { String doneFileName = endpoint.createDoneFileName(target); ObjectHelper.notEmpty(doneFileName, "doneFileName", endpoint); // create empty exchange with empty body to write as the done file Exchange empty = new DefaultExchange(exchange); empty.getIn().setBody(""); log.trace("Writing done file: [{}]", doneFileName); // delete any existing done file if (operations.existsFile(doneFileName)) { if (!operations.deleteFile(doneFileName)) { throw new GenericFileOperationFailedException( "Cannot delete existing done file: " + doneFileName); } } writeFile(empty, doneFileName); } // let's store the name we really used in the header, so end-users // can retrieve it exchange.getIn().setHeader(Exchange.FILE_NAME_PRODUCED, target); } catch (Exception e) { handleFailedWrite(exchange, e); } postWriteCheck(); }