001 package market;
002
003 import java.text.SimpleDateFormat;
004
005 /**
006 * A ValueChecker, which checks if a String is in the format dd.MM.yyyy (e.g. 01.01.2000).<br>
007 * Notations like 1.1.2000 are also not allowed.<br>
008 * <br>
009 * As this ValueChecker is only used by {@link market.swing.JTFCheckable checkable text fields},
010 * an identifier is passed via the constructor. This descriptive identifier is used in the error string,
011 * to enable the user to associate an error message with the causative text field.
012 */
013 public class VCDate implements ValueChecker {
014
015 /**
016 * The identifier used by {@link #getErrorString()}.
017 */
018 protected String identifier;
019
020 /**
021 * Defines if an empty String is considered to be an error or not.
022 */
023 protected boolean mayBeEmpty;
024
025 /**
026 * Internal error code. Set by {@link #isValidValue(String)}, queried by {@link #getErrorString()}.
027 */
028 private int error = 0;
029
030 /**
031 * @param identifier the identifier.
032 * @param mayBeEmpty <code>true</code> if an empty should be considered valid, otherwise <code>false</code>.
033 */
034 public VCDate(String identifier, boolean mayBeEmpty) {
035 this.identifier = identifier;
036 this.mayBeEmpty = mayBeEmpty;
037 }
038
039 /**
040 * @param identifier the identifier.
041 */
042 public VCDate(String identifier) {
043 this.identifier = identifier;
044 this.mayBeEmpty = false;
045 }
046
047 /**
048 * Checks String for validity and, if necessary, sets an internal error code according to the
049 * detected error.
050 * @param content the String to be checked.
051 * @return <code>true</code> if the String is in a valid date format, otherwise <code>false</code>.
052 */
053 public boolean isValidValue(String content) {
054 error = 0;
055 if (!mayBeEmpty && content.equals("")) {
056 error = 1;
057 } else {
058 //dd.MM.yyyy: strict check - the days' values are checked regarding the month, including leap years
059 SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
060 sdf.setLenient(false);
061 try {
062 sdf.parse(content);
063 //Parsing also accepts dates without left handed zeros, so this extra check for the
064 //String's length is being done
065 if (content.length() != 10) {
066 error = 2;
067 }
068 }
069 catch (java.text.ParseException e) {
070 error = 2;
071 }
072 }
073 return error == 0;
074 }
075
076 /**
077 * @return an error message depending on the value of {@link #error}.
078 */
079 public String getErrorString() {
080 String returnValue = "";
081 switch (error) {
082 case 1:
083 returnValue = "Fehlerhafte Eingabe im Feld " + identifier +
084 ": Das Feld darf nicht leer sein.";
085 break;
086 case 2:
087 returnValue = "Fehlerhafte Eingabe im Feld " + identifier +
088 ": Das Datum muss in der Form 01.01.2000 angegeben werden.";
089 break;
090 }
091 error = 0;
092 return returnValue;
093 }
094 }