public boolean rollover()

in src/main/java/org/apache/log4j/rolling/RollingFileAppender.java [218:338]


  public boolean rollover() {
    //
    //   can't roll without a policy
    //
    if (rollingPolicy != null) {
      Exception exception = null;

      synchronized (this) {
        //
        //   if a previous async task is still running
        //}
        if (lastRolloverAsyncAction != null) {
          //
          //  block until complete
          //
          lastRolloverAsyncAction.close();

          //
          //    or don't block and return to rollover later
          //
          //if (!lastRolloverAsyncAction.isComplete()) return false;
        }

        try {
          RolloverDescription rollover = rollingPolicy.rollover(getFile());

          if (rollover != null) {
            if (rollover.getActiveFileName().equals(getFile())) {
              closeWriter();

              boolean success = true;

              if (rollover.getSynchronous() != null) {
                success = false;

                try {
                  success = rollover.getSynchronous().execute();
                } catch (Exception ex) {
                  exception = ex;
                }
              }

              if (success) {
                if (rollover.getAppend()) {
                  fileLength = new File(rollover.getActiveFileName()).length();
                } else {
                  fileLength = 0;
                }

                if (rollover.getAsynchronous() != null) {
                  lastRolloverAsyncAction = rollover.getAsynchronous();
                  new Thread(lastRolloverAsyncAction).start();
                }

                setFile(
                  rollover.getActiveFileName(), rollover.getAppend(),
                  bufferedIO, bufferSize);
              } else {
                setFile(
                  rollover.getActiveFileName(), true, bufferedIO, bufferSize);

                if (exception == null) {
                  LogLog.warn("Failure in post-close rollover action");
                } else {
                  LogLog.warn(
                    "Exception in post-close rollover action", exception);
                }
              }
            } else {
              Writer newWriter =
                createWriter(
                    createFileOutputStream(
                        rollover.getActiveFileName(), rollover.getAppend()));

              closeWriter();
              setFile(rollover.getActiveFileName());
              this.qw = createQuietWriter(newWriter);

              boolean success = true;

              if (rollover.getSynchronous() != null) {
                success = false;

                try {
                  success = rollover.getSynchronous().execute();
                } catch (Exception ex) {
                  exception = ex;
                }
              }

              if (success) {
                if (rollover.getAppend()) {
                  fileLength = new File(rollover.getActiveFileName()).length();
                } else {
                  fileLength = 0;
                }

                if (rollover.getAsynchronous() != null) {
                  lastRolloverAsyncAction = rollover.getAsynchronous();
                  new Thread(lastRolloverAsyncAction).start();
                }
              }

              writeHeader();
            }

            return true;
          }
        } catch (Exception ex) {
          exception = ex;
        }
      }

      if (exception != null) {
        LogLog.warn(
          "Exception during rollover, rollover deferred.", exception);
      }
    }

    return false;
  }