001package org.cpsolver.ifs.util;
002
003import org.cpsolver.ifs.assignment.Assignment;
004import org.cpsolver.ifs.model.Model;
005import org.cpsolver.ifs.model.Value;
006import org.cpsolver.ifs.model.Variable;
007import org.cpsolver.ifs.termination.TerminationCondition;
008
009/**
010 * Abstract problem loader class.
011 * 
012 * @version IFS 1.3 (Iterative Forward Search)<br>
013 *          Copyright (C) 2006 - 2016 Tomáš Müller<br>
014 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
015 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
016 * <br>
017 *          This library is free software; you can redistribute it and/or modify
018 *          it under the terms of the GNU Lesser General Public License as
019 *          published by the Free Software Foundation; either version 3 of the
020 *          License, or (at your option) any later version. <br>
021 * <br>
022 *          This library is distributed in the hope that it will be useful, but
023 *          WITHOUT ANY WARRANTY; without even the implied warranty of
024 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
025 *          Lesser General Public License for more details. <br>
026 * <br>
027 *          You should have received a copy of the GNU Lesser General Public
028 *          License along with this library; if not see
029 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
030 */
031public abstract class ProblemLoader<V extends Variable<V, T>, T extends Value<V, T>, M extends Model<V,T>> implements Runnable {
032    private M iModel = null;
033    private Assignment<V, T> iAssignment = null;
034    private Callback iCallback = null;
035    private TerminationCondition<V, T> iTermination = null;
036
037    /**
038     * Constructor
039     * 
040     * @param model
041     *            an empty instance of timetable model
042     * @param assignment current assignment
043     */
044    public ProblemLoader(M model, Assignment<V, T> assignment) {
045        iModel = model;
046        iAssignment = assignment;
047    }
048
049    /**
050     * Returns provided model.
051     * 
052     * @return provided model
053     */
054    public M getModel() {
055        return iModel;
056    }
057    
058    /**
059     * Returns provided assignment
060     * @return provided assignment
061     */
062    public Assignment<V, T> getAssignment() {
063        return iAssignment;
064    }
065
066    /**
067     * Load the model.
068     * @throws Exception thrown when the load fails
069     */
070    public abstract void load() throws Exception;
071
072    /**
073     * Sets callback class
074     * 
075     * @param callback
076     *            method {@link Callback#execute()} is executed when load is
077     *            done
078     */
079    public void setCallback(Callback callback) {
080        iCallback = callback;
081    }
082    
083    /**
084     * Provide termination condition so that the save process can be stopped if needed (optional).
085     */
086    public void setTerminationCondition(TerminationCondition<V, T> termination) {
087        iTermination = termination;
088    }
089    
090    /**
091     * Return termination condition so that the save process can be stopped if needed.
092     */
093    public TerminationCondition<V, T> getTerminationCondition() {
094        return iTermination;
095    }
096
097    @Override
098    public void run() {
099        try {
100            load();
101        } catch (Exception e) {
102            org.apache.logging.log4j.LogManager.getLogger(this.getClass()).error(e.getMessage(), e);
103        } finally {
104            if (iCallback != null)
105                iCallback.execute();
106        }
107    }
108
109}