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 * @version IFS 1.3 (Iterative Forward Search)<br>
041 *          Copyright (C) 2006 - 2014 Tomáš Müller<br>
042 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
043 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
044 * <br>
045 *          This library is free software; you can redistribute it and/or modify
046 *          it under the terms of the GNU Lesser General Public License as
047 *          published by the Free Software Foundation; either version 3 of the
048 *          License, or (at your option) any later version. <br>
049 * <br>
050 *          This library is distributed in the hope that it will be useful, but
051 *          WITHOUT ANY WARRANTY; without even the implied warranty of
052 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
053 *          Lesser General Public License for more details. <br>
054 * <br>
055 *          You should have received a copy of the GNU Lesser General Public
056 *          License along with this library; if not see
057 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
058 */
059public class ProgressWriter implements ProgressListener {
060    private PrintStream iTextOut = null;
061    private static int TEXT_LENGTH = 28;
062    private static int DOTS_LENGTH = 48;
063    private int iPrintedDots = -1;
064
065    public ProgressWriter(PrintStream out) {
066        iTextOut = out;
067    }
068
069    @Override
070    public void statusChanged(String status) {
071        // iTextOut.println("Status: "+status);
072    }
073
074    @Override
075    public void phaseChanged(String phase) {
076        if (iPrintedDots > 0) {
077            while (iPrintedDots < DOTS_LENGTH) {
078                iTextOut.print(".");
079                iPrintedDots++;
080            }
081        }
082        iTextOut.println();
083        iTextOut.print(expand(phase, TEXT_LENGTH, ' ', false) + ": ");
084        iPrintedDots = 0;
085        iTextOut.flush();
086    }
087
088    @Override
089    public void progressChanged(long currentProgress, long maxProgress) {
090        int dotsToPrint = (maxProgress == 0 ? 0 : (int) ((DOTS_LENGTH * currentProgress) / maxProgress));
091        while (iPrintedDots < dotsToPrint) {
092            iTextOut.print(".");
093            iPrintedDots++;
094        }
095        iTextOut.flush();
096    }
097
098    @Override
099    public void progressSaved() {
100    }
101
102    @Override
103    public void progressRestored() {
104    }
105
106    @Override
107    public void progressMessagePrinted(Progress.Message msg) {
108    }
109
110    private static String expand(String source, int length, char ch, boolean beg) {
111        StringBuffer sb = new StringBuffer(source == null ? "" : source.length() > length ? (beg ? source
112                .substring(source.length() - length) : source.substring(0, length)) : source);
113        while (sb.length() < length) {
114            if (beg)
115                sb.insert(0, ch);
116            else
117                sb.append(ch);
118        }
119        return sb.toString();
120    }
121}