    001package org.cpsolver.ifs.util;
    002
    003import java.io.PrintStream;
    004
    005/**
    006 * Prints current progres to {@link PrintStream}. <br>
    007 * <br>
    008 * Example usage:
    009 * <pre>
    010 * <code>
    011 * Progress.getInstance().addProgressListener(new ProgressWriter(System.out));<br>
    012 * </code>
    013 * </pre>
    014 * <br>
    015 * Example output:
    016 * <pre>
    017 * <code>
    018 * Reading course.pl ...       :
    019 * Reading altcourse.pl ...    :
    020 * Reading room.pl ...         :
    021 * Creating rooms ...          : ................................................
    022 * Creating variables ...      : ................................................
    023 * Reading students.pl ...     :
    024 * Reading jenr.pl ...         :
    025 * Creating jenrl constraints .: ................................................
    026 * Reading add.pl ...          :
    027 * Creating group constraints .: ................................................
    028 * Creating initial assignment : ................................................
    029 * Creating dept. spread constr: ................................................
    030 * Input data loaded           : ................................................
    031 * Initializing solver         :
    032 * Searching for initial soluti: ................................................
    033 * Improving found solution ...: ................................................
    034 * Improving found solution ...: ................................................
    035 * Improving found solution ...: ...................................
    036 * </code>
    037 * </pre>
    038 *
    039 *
    040 * @author  Tomáš Müller
    041 * @version IFS 1.3 (Iterative Forward Search)<br>
    042 *          Copyright (C) 2006 - 2014 Tomáš Müller<br>
    043 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
    044 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
    045 * <br>
    046 *          This library is free software; you can redistribute it and/or modify
    047 *          it under the terms of the GNU Lesser General Public License as
    048 *          published by the Free Software Foundation; either version 3 of the
    049 *          License, or (at your option) any later version. <br>
    050 * <br>
    051 *          This library is distributed in the hope that it will be useful, but
    052 *          WITHOUT ANY WARRANTY; without even the implied warranty of
    053 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    054 *          Lesser General Public License for more details. <br>
    055 * <br>
    056 *          You should have received a copy of the GNU Lesser General Public
    057 *          License along with this library; if not see
    058 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
    059 */
    060public class ProgressWriter implements ProgressListener {
    061    private PrintStream iTextOut = null;
    062    private static int TEXT_LENGTH = 28;
    063    private static int DOTS_LENGTH = 48;
    064    private int iPrintedDots = -1;
    065
    066    public ProgressWriter(PrintStream out) {
    067        iTextOut = out;
    068    }
    069
    070    @Override
    071    public void statusChanged(String status) {
    072        // iTextOut.println("Status: "+status);
    073    }
    074
    075    @Override
    076    public void phaseChanged(String phase) {
    077        if (iPrintedDots > 0) {
    078            while (iPrintedDots < DOTS_LENGTH) {
    079                iTextOut.print(".");
    080                iPrintedDots++;
    081            }
    082        }
    083        iTextOut.println();
    084        iTextOut.print(expand(phase, TEXT_LENGTH, ' ', false) + ": ");
    085        iPrintedDots = 0;
    086        iTextOut.flush();
    087    }
    088
    089    @Override
    090    public void progressChanged(long currentProgress, long maxProgress) {
    091        int dotsToPrint = (maxProgress == 0 ? 0 : (int) ((DOTS_LENGTH * currentProgress) / maxProgress));
    092        while (iPrintedDots < dotsToPrint) {
    093            iTextOut.print(".");
    094            iPrintedDots++;
    095        }
    096        iTextOut.flush();
    097    }
    098
    099    @Override
    100    public void progressSaved() {
    101    }
    102
    103    @Override
    104    public void progressRestored() {
    105    }
    106
    107    @Override
    108    public void progressMessagePrinted(Progress.Message msg) {
    109    }
    110
    111    private static String expand(String source, int length, char ch, boolean beg) {
    112        StringBuffer sb = new StringBuffer(source == null ? "" : source.length() > length ? (beg ? source
    113                .substring(source.length() - length) : source.substring(0, length)) : source);
    114        while (sb.length() < length) {
    115            if (beg)
    116                sb.insert(0, ch);
    117            else
    118                sb.append(ch);
    119        }
    120        return sb.toString();
    121    }
    122}