tim@101: /**
tim@101:  *
tim@101:  */
tim@101: package de.intevation.gnv.utils;
tim@101: 
tim@116: import org.apache.commons.validator.GenericValidator;
tim@101: import org.apache.log4j.Logger;
tim@101: 
tim@173: import com.vividsolutions.jts.geom.Coordinate;
tim@173: import com.vividsolutions.jts.geom.GeometryFactory;
tim@173: import com.vividsolutions.jts.geom.Point;
tim@173: 
tim@101: import de.intevation.gnv.geobackend.util.DateUtils;
tim@173: import de.intevation.gnv.utils.exception.ValidationException;
tim@101: 
tim@101: /**
tim@101:  * @author Tim Englich <tim.englich@intevation.de>
tim@171:  * 
tim@101:  */
tim@101: public class InputValidator {
tim@101:     /**
tim@101:      * the logger, used to log exceptions and additonaly information
tim@101:      */
tim@101:     private static Logger log = Logger.getLogger(InputValidator.class);
tim@101: 
tim@101:     /**
tim@101:      * Constructor
tim@101:      */
tim@101:     public InputValidator() {
tim@101:         super();
tim@101:     }
tim@171: 
tim@171:     public boolean isInputValid(String input, String type) {
tim@171:         log.debug("InputValidator.isInputValid " + input + " " + type);
tim@101:         boolean returnValue = false;
tim@101:         String[] values = input.split(",");
tim@171:         for (int i = 0; i < values.length; i++) {
tim@101:             boolean valid;
tim@171:             if ("Integer".equalsIgnoreCase(type)) {
sascha@115:                 valid = GenericValidator.isInt(values[i].trim());
tim@171:             } else if ("Double".equalsIgnoreCase(type)) {
tim@171:                 valid = GenericValidator.isDouble(values[i].trim());
tim@171:             } else if ("String".equalsIgnoreCase(type)) {
tim@171:                 valid = GenericValidator.matchRegexp(values[i], "[a-zA-Z0-9]"); // TODO:
tim@171:                                                                                 // FIXME:
tim@171:                                                                                 // VALIDATE
tim@171:                                                                                 // REGEXP
tim@171:             } else if ("Date".equalsIgnoreCase(type)) {
tim@171:                 valid = GenericValidator.isDate(values[i].trim(),
tim@171:                         DateUtils.DATE_PATTERN, true);
tim@171:             } else if ("Point".equalsIgnoreCase(type)) {
tim@171:                 valid = GenericValidator.matchRegexp(values[i], "[0-9]"); // TODO:
tim@171:                                                                           // FIXME:
tim@171:                                                                           // VALIDATE
tim@171:                                                                           // REGEXP
tim@171:             } else if ("AttributeName".equalsIgnoreCase(type)) {
tim@171:                 valid = org.apache.commons.validator.GenericValidator
tim@171:                         .matchRegexp(values[i], "[a-zA-Z0-9]"); // TODO: FIXME:
tim@171:                                                                 // VALIDATE
tim@171:                                                                 // REGEXP
tim@173:             } else if ("Coordinate".equalsIgnoreCase(type)) {
tim@173:                     try {
tim@173:                         valid = this.getPointValue(values[i]) != null;
tim@173:                     } catch (ValidationException e) {
tim@173:                         log.debug(e.getMessage());
tim@173:                         valid = false;
tim@173:                     }
tim@171:             } else {
tim@101:                 valid = false;
tim@101:             }
tim@171:             if (!valid) {
tim@171:                 returnValue = false;
tim@101:                 break;
tim@171:             } else {
tim@101:                 returnValue = true;
tim@101:             }
tim@101:         }
tim@171:         log.debug("Is valid? " + returnValue);
tim@101:         return returnValue;
tim@101:     }
tim@173:     
tim@173:     
tim@173:     public Point getPointValue(String value) throws ValidationException{
tim@173:         log.debug("InputValidator.getPointValue " + value);
tim@173:         String[] s, p;
tim@173:         
tim@173:         double x=0,y=0;
tim@173:         log.info("Position :"+value);
tim@173:         s = value.split(" ");
tim@173:         if (s.length != 2) {
tim@173:               throw new ValidationException("Kein Blank separiert Breite und L�nge");
tim@173:         }
tim@173:         p = s[0].split("[nNsS]");
tim@173:         try {
tim@173:             if (p.length == 1)
tim@173:                 y = new Double(p[0]);
tim@173:             else
tim@173:                 y = new Double(p[0]) +   new Double(p[1]) / new Double(60.);
tim@173:             if (s[0].toLowerCase().contains("s"))
tim@173:                 y = -y;
tim@173:         }
tim@173:         catch (Exception e) {
tim@173:             throw new ValidationException("Kein N|S oder nicht im ersten Substring, zB 56n42");
tim@173:         
tim@173:         } 
tim@173:         p = s[1].split("[eEwW]");
tim@173:         try {
tim@173:             if (p.length ==1)
tim@173:                 x = new Double(p[0]);
tim@173:             else
tim@173:                 x = new Double(p[0]) +  new Double(p[1]) / new Double(60.) ;
tim@173:             if (s[1].toLowerCase().contains("w"))
tim@173:                 x = -x;
tim@173:         }
tim@173:         catch (Exception e) {
tim@173:             throw new ValidationException("Kein E|W oder nicht im zweiten Substring");
tim@173:         } 
tim@173:         return new GeometryFactory().createPoint(new Coordinate(x,y));
tim@173:     }
tim@101: 
tim@101: }