/*
* This file is part of jHaushalt.
* jHaushalt 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.
* jHaushalt 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 jHaushalt; if not, see <http://www.gnu.org/licenses/>.
* (C)opyright 2002-2010 Dr. Lars H. Hahn
*/
package haushalt.daten.zeitraum;
import haushalt.daten.Datum;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.logging.Logger;
/**
* Basisklasse für alle Zeiträume
*
* @author Dr. Lars H. Hahn
* @version 2.5/2007.10.31
*/
/*
* 2007.10.31 Verlagerung der Berechung der Differenz zwischen zwei Tagen in die
* Klasse Datum
* 2004.08.22 Version 2.0
*/
public abstract class AbstractZeitraum {
private static final boolean DEBUG = false;
private static final Logger LOGGER = Logger.getLogger(AbstractZeitraum.class.getName());
/**
* Liefert den ersten Tag des Zeitraums.
*
* @return erster Tag des Zeitraums
*/
public abstract Datum getStartDatum();
/**
* Liefert den letzten Tag des Zeitraums.
*
* @return letzter Tag des Zeitraums
*/
public abstract Datum getEndDatum();
/**
* Liefert den auf diesen Zeitraum folgenden Zeitraum mit
* gleicher Länge.
*
* @return nächster Zeitraum
*/
public abstract AbstractZeitraum folgeZeitraum();
/**
* Liefert die Anzahl der Tage des Zeitraums.
*
* @return Anzahl der Tage
*/
public final int getAnzahlTage() {
return (int) getEndDatum().sub(getStartDatum());
}
/**
* Liefert eine textuelle Beschreibung des Zeitraums.
*
* @return Textbeschreibung des Zeitraums
*/
@Override
public abstract String toString();
/**
* Liefert den String der zum Speichern des Zeitraums verwendet wird.
* In der Regel entspricht dies 'toString()'.
*
* @return String zum Speichern
* @see AbstractZeitraum#toString()
*/
public String getDatenString() {
return toString();
}
public final boolean equals(final AbstractZeitraum zeitraum) {
if (zeitraum == null) {
return false;
}
if (getStartDatum().compareTo(zeitraum.getStartDatum()) != 0) {
return false;
}
if (getEndDatum().compareTo(zeitraum.getEndDatum()) != 0) {
return false;
}
return true;
}
@Override
public final boolean equals(final Object zeitraum) {
return equals((AbstractZeitraum) zeitraum);
}
@Override
public int hashCode() {
assert false : "hashCode not designed";
return 0;
}
public static AbstractZeitraum erzeugeZeitraum(final String name, final String parameter) {
AbstractZeitraum zeitraum = null;
final Object[] parameters = new String[1];
parameters[0] = parameter;
final Class<?>[] parameterTyp = {String.class};
try {
final Class<?> klasse = Class.forName(name);
final Constructor<?> constructor = klasse.getConstructor(parameterTyp);
zeitraum = (AbstractZeitraum) constructor.newInstance(parameters);
} catch (final ClassNotFoundException e) {
LOGGER.warning(e.getMessage());
} catch (final SecurityException e) {
LOGGER.warning(e.getMessage());
} catch (final NoSuchMethodException e) {
LOGGER.warning(e.getMessage());
} catch (final IllegalArgumentException e) {
LOGGER.warning(e.getMessage());
} catch (final InstantiationException e) {
LOGGER.warning(e.getMessage());
} catch (final IllegalAccessException e) {
LOGGER.warning(e.getMessage());
} catch (final InvocationTargetException e) {
LOGGER.warning(e.getMessage());
}
return zeitraum;
}
// -- E/A-Funktionen -------------------------------------------------------
public static AbstractZeitraum laden(final DataInputStream in) throws IOException {
final String name = in.readUTF();
final String parameter = in.readUTF();
return erzeugeZeitraum(name, parameter);
}
public void speichern(final DataOutputStream out) throws IOException {
out.writeUTF(getClass().getName());
out.writeUTF(getDatenString());
if (DEBUG) {
LOGGER.info(getClass().getName() + "(" + getDatenString() + ")");
}
}
}