/** * This file is part of Waarp Project. * * Copyright 2009, Frederic Bregier, and individual contributors by the @author tags. See the * COPYRIGHT.txt in the distribution for a full listing of individual contributors. * * All Waarp Project is free software: you can redistribute it and/or modify it under the terms of * the GNU General Public License as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * Waarp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * * You should have received a copy of the GNU General Public License along with Waarp . If not, see * <http://www.gnu.org/licenses/>. */ package org.waarp.openr66.context.task; import org.waarp.common.logging.WaarpLogger; import org.waarp.common.logging.WaarpLoggerFactory; import org.waarp.openr66.context.ErrorCode; import org.waarp.openr66.context.R66Result; import org.waarp.openr66.context.R66Session; import org.waarp.openr66.context.task.exception.OpenR66RunnerException; import org.waarp.openr66.database.data.DbTaskRunner; /** * This task checks some properties relative to the File according to the following argument:<br> * - SIZE LT/GT/LTE/GTE/EQ number : to check the file size according to a limit (less than, greater than, less than or equal, * greater than or equal, equal)<br> * - DFCHECK : to check if the future received file size is compatible with the space left on both working and received * directories (from general configuration or rule configuration)<br> * <br> * For instance "SIZE LT 10000000 SIZE GT 1000 DFCHECK" will test that the current file size is less than 10 MB (base 10), * and greater than 1000 bytes, and that the working and received directories have enough space to receive the file. * * @author Frederic Bregier * */ public class FileCheckTask extends AbstractTask { /** * Internal Logger */ private static final WaarpLogger logger = WaarpLoggerFactory .getLogger(FileCheckTask.class); private static enum FC_COMMAND { SIZE, DFCHECK }; private static enum FC_ARGSSIZE { LT, GT, LTE, GTE, EQ }; /** * @param argRule * @param delay * @param argTransfer * @param session */ public FileCheckTask(String argRule, int delay, String argTransfer, R66Session session) { super(TaskType.CHKFILE, delay, argRule, argTransfer, session); } @Override public void run() { DbTaskRunner runner = session.getRunner(); if (runner == null) { // no information so in error logger.error("No Runner task so cannot check file: " + session.toString()); futureCompletion.setFailure(new OpenR66RunnerException("No Runner task so cannot check File")); return; } long supposelength = runner.getOriginalSize(); if (supposelength <= 0) { // no information but could be not an error so ignore logger.warn("No file size known: " + session.toString()); futureCompletion.setSuccess(); return; } String[] commands = argRule.split(" "); int current = 0; while (current < commands.length) { if (commands[current].equalsIgnoreCase(FC_COMMAND.SIZE.name())) { current++; FC_ARGSSIZE arg = null; try { arg = FC_ARGSSIZE.valueOf(commands[current]); } catch (IllegalArgumentException e) { arg = null; } if (arg != null) { current++; try { long tocompare = Long.parseLong(commands[current]); current++; boolean result = true; switch (arg) { case EQ: result = supposelength == tocompare; break; case GT: result = supposelength > tocompare; break; case GTE: result = supposelength >= tocompare; break; case LT: result = supposelength < tocompare; break; case LTE: result = supposelength <= tocompare; break; default: result = true; // ?? break; } logger.debug("DEBUG: " + supposelength + " " + arg.name() + " " + tocompare); if (result == false) { // error so stop logger.error("File length is incompatible with specified SIZE comparizon: " + supposelength + " NOT " + arg.name() + " " + tocompare); futureCompletion.setResult(new R66Result(session, false, ErrorCode.SizeNotAllowed, runner)); futureCompletion.setFailure(new OpenR66RunnerException("File size incompatible")); return; } } catch (NumberFormatException e) { // ignore and continue } } } else if (commands[current].equalsIgnoreCase(FC_COMMAND.DFCHECK.name())) { current++; long freesize = runner.freespace(session, true); if (freesize > 0 && supposelength > freesize) { // error so stop logger.error("File length is incompatible with available space in Working directory: " + supposelength + " > " + freesize); futureCompletion.setResult(new R66Result(session, false, ErrorCode.SizeNotAllowed, runner)); futureCompletion.setFailure(new OpenR66RunnerException( "File size incompatible with Working directory")); return; } logger.debug("DEBUG: " + supposelength + " < " + freesize); freesize = runner.freespace(session, false); if (freesize > 0 && supposelength > freesize) { // error so stop logger.error("File length is incompatible with available space in Recv directory: " + supposelength + " > " + freesize); futureCompletion.setResult(new R66Result(session, false, ErrorCode.SizeNotAllowed, runner)); futureCompletion .setFailure(new OpenR66RunnerException("File size incompatible with Recv directory")); return; } logger.debug("DEBUG: " + supposelength + " < " + freesize); } else { // ignore and continue current++; } } logger.debug("DEBUG: End of check " + supposelength); futureCompletion.setSuccess(); return; } }