Package org.geotools.validation

Source Code of org.geotools.validation.BatchValidatorProcessor

/*
*    GeoTools - The Open Source Java GIS Toolkit
*    http://geotools.org
*
*    (C) 2004-2008, Open Source Geospatial Foundation (OSGeo)
*
*    This library is free software; you can redistribute it and/or
*    modify it under the terms of the GNU Lesser General Public
*    License as published by the Free Software Foundation;
*    version 2.1 of the License.
*
*    This library 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
*    Lesser General Public License for more details.
*/
package org.geotools.validation;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.DataUtilities;
import org.geotools.data.DefaultRepository;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.validation.dto.ArgumentDTO;
import org.geotools.validation.dto.PlugInDTO;
import org.geotools.validation.dto.TestDTO;
import org.geotools.validation.dto.TestSuiteDTO;
import org.geotools.validation.xml.ValidationException;
import org.geotools.validation.xml.XMLReader;
import org.opengis.feature.simple.SimpleFeature;

import com.vividsolutions.jts.geom.Envelope;

/**
* Validator purpose.
*
* <p>
* Description of Validator ...
* </p>
*
* @author dzwiers, Refractions Research, Inc.
* @author $Author: dmzwiers $ (last modification)
* @author bowens
*
*
* @source $URL$
*         http://svn.geotools.org/trunk/modules/extension/validation/src/test/java/org/geotools
*         /validation/BatchValidator.java $
* @version $Id$
*/
public class BatchValidator {
    private static Properties dataStoreProp;

    private static Properties transProp;

    private static Validator validator;

    private static DefaultRepository dataRepository;

    public static void main(String[] args) {
        loadProperties(args);

        Map ds = loadDataStores();
        ValidationProcessor v = loadTests();
        dataRepository = new DefaultRepository();

        runTransactions(ds, v);
    }

    private static void runTransactions(Map dsm, ValidationProcessor v) {
        if ((dsm == null) || (dsm.size() == 0)) {
            System.out.println("No Datastores were defined.");

            return;
        }

        if (v == null) {
            System.err.println("An error occured: Cannot run without a ValidationProcessor.");

            return;
        }

        Iterator it = dsm.keySet().iterator();

        /** set up the data repository */
        while (it.hasNext()) {
            String typeRef = it.next().toString();
            DataStore ds = (DataStore) dsm.get(typeRef);
            try {
                dataRepository.register(typeRef, ds);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        validator = new Validator(dataRepository, v);
       
        /** validator is now ready to go */

        /** do the feature type validation dance */
        for( DataStore store : dataRepository.getDataStores()){
            String typeNames[] = null;
            try {
                typeNames = store.getTypeNames();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // HACK: get ALL feature types and smash through their features
            // this is really really slow and will be fixed
            for (int p = 0; p < typeNames.length; p++) {
                try {
                    validator.featureValidation(typeNames[p], store.getFeatureSource(typeNames[p])
                            .getFeatures(), null);
                } catch (IOException e1) {
                    e1.printStackTrace();
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }

        }

        ReferencedEnvelope envelope = makeEnvelope();

        /** do the integrity validation dance */
        try {
            validator.integrityValidation(dsm, envelope, null);
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (Exception e1) {
            e1.printStackTrace();
        }

        if (true) // HACK premature evacuation
            return;

        // --------------------------------------------------
        // start of the old code

        // v.integrityValidation()
        // v.featureValidation( , fs.getSchema(),fs.getFeatures().features(), vr);

        it = dsm.keySet().iterator();
        while (it.hasNext()) {
            Map sources = new HashMap();
            String key = it.next().toString();
            DataStore ds = (DataStore) dsm.get(key);
            String t = transProp.getProperty(key + ".Sources");
            String[] ss = t.split(",");

            for (int j = 0; j < ss.length; j++) {
                ss[j] = ss[j].trim();

                try {
                    SimpleFeatureSource fs = ds.getFeatureSource(ss[j]);
                    sources.put(ss, fs);

                    // BatchValidationResults vr = new BatchValidationResults();

                    // v.runFeatureTests( "" /** fix me */, fs.getSchema(),
                    // fs.getFeatures().features(), vr);
                    // System.out.println("Feature Test Results for " + key + ":"
                    // + ss[j]);
                    // System.out.println(vr.toString());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            Envelope env = null;

            try {
                double minx = Double.parseDouble(transProp.getProperty("Bounds.minX"));
                double miny = Double.parseDouble(transProp.getProperty("Bounds.maxX"));
                double maxx = Double.parseDouble(transProp.getProperty("Bounds.maxX"));
                double maxy = Double.parseDouble(transProp.getProperty("Bounds.maxY"));
                env = new Envelope(minx, miny, maxx, maxy);
            } catch (Exception e) {
                System.err.println("Envelope not specified in Transaction.properties.");
                env = new Envelope();
            }

            if (env == null) {
                env = new Envelope(Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE,
                        Integer.MAX_VALUE);
            }

            try {
                BatchValidationResults vr = new BatchValidationResults();

                // v.runIntegrityTests( null /* fix me */, sources, env, vr);
                System.out.println("Feature Integrety Test Results");
                System.out.println(vr.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private static ReferencedEnvelope makeEnvelope() {
        ReferencedEnvelope env;
        try {
            double minx = Double.parseDouble(transProp.getProperty("Bounds.minX"));
            double miny = Double.parseDouble(transProp.getProperty("Bounds.maxX"));
            double maxx = Double.parseDouble(transProp.getProperty("Bounds.maxX"));
            double maxy = Double.parseDouble(transProp.getProperty("Bounds.maxY"));
            env = new ReferencedEnvelope(minx, miny, maxx, maxy, null);
        } catch (Exception e) {
            System.err.println("Envelope not specified in Transaction.properties.");
            env = new ReferencedEnvelope();
        }

        if (env == null) {
            env = new ReferencedEnvelope(Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE,
                    Integer.MAX_VALUE, null);
        }

        return env;
    }

    private static void loadProperties(String[] args) {
        File dsProp = null;
        File trProp = null;

        dsProp = DataUtilities.urlToFile(ClassLoader.getSystemResource("org/geotools/demos/DataStore.properties"));
        trProp = DataUtilities.urlToFile(ClassLoader.getSystemResource("org/geotools/demos/Transaction.properties"));

        if (args.length > 0) {
            int i = 0;

            while ((i + 1) < args.length) {
                String param = args[i++];
                String value = args[i++];

                if ("-data".equals(param)) {
                    File tmp = null;
                    tmp = DataUtilities.urlToFile((ClassLoader.getSystemResource(value)));

                    if (tmp != null) {
                        dsProp = tmp;
                    } else {
                        System.err.println("Error: The data property file could not be found.");
                        System.err.println("Data file:" + value);
                        System.exit(1);
                    }
                } else {
                    if ("-trans".equals(param)) {
                        File tmp = null;
                        tmp =  DataUtilities.urlToFile(ClassLoader.getSystemResource(value));

                        if (tmp != null) {
                            trProp = tmp;
                        } else {
                            System.err
                                    .println("Error: The transaction property file could not be found.");
                            System.err.println("Data file:" + value);
                            System.exit(1);
                        }
                    } else {
                        if ("-help".equals(param)) {
                            System.out.println("Batch Validator");
                            System.out.println("Version 0.1");
                            System.out.println("");
                            System.out.println("Usage: java Validator [Options]");
                            System.out.println("Options: -help -data -trans");
                            System.out.println("");
                            System.out.println("-data <filename>");
                            System.out.println("Replaces the default datastore property file");
                            System.out.println("");
                            System.out.println("-trans <filename>");
                            System.out.println("Replaces the default transaction property file");
                            System.out.println("");
                            System.out.println("-help");
                            System.out.println("This screen.");
                            System.exit(0);
                        } else {
                            System.err.println("Usage Error: use -help for usage");
                            System.err.println("Invalid option:" + param);
                            System.exit(1);
                        }
                    }
                }
            }
        }

        // the files should all contain the specified data, time to check for existance ...
        if ((dsProp == null) || (!dsProp.exists() || (!dsProp.isFile() || !dsProp.canRead()))) {
            System.err.println("Error: The data property file had errors.");

            if (dsProp == null) {
                System.err.println("Data file was null");
            } else {
                if (!dsProp.exists()) {
                    System.err.println("Data file was does not exist");
                    System.err.println(dsProp.toString());
                } else {
                    if (!dsProp.isFile()) {
                        System.err.println("Data path specified is not a file.");
                        System.err.println(dsProp.toString());
                    } else {
                        if (!dsProp.canRead()) {
                            System.err.println("Data file cannot be read.");
                            System.err.println(dsProp.toString());
                        } else {
                            System.err.println("Data file had an unknown error.");
                            System.err.println(dsProp.toString());
                        }
                    }
                }
            }

            System.exit(1);
        }

        if ((trProp == null) || (!trProp.exists() || (!trProp.isFile() || !trProp.canRead()))) {
            System.err.println("Error: The test property file had errors.");

            if (trProp == null) {
                System.err.println("Transaction file was null");
            } else {
                if (!trProp.exists()) {
                    System.err.println("Transaction file was does not exist");
                    System.err.println(trProp.toString());
                } else {
                    if (!trProp.isFile()) {
                        System.err.println("Transaction path specified is not a file.");
                        System.err.println(trProp.toString());
                    } else {
                        if (!trProp.canRead()) {
                            System.err.println("Transaction file cannot be read.");
                            System.err.println(trProp.toString());
                        } else {
                            System.err.println("Transaction file had an unknown error.");
                            System.err.println(trProp.toString());
                        }
                    }
                }
            }

            System.exit(1);
        }

        // the files are valid, time to load them
        dataStoreProp = new Properties();
        transProp = new Properties();

        try {
            dataStoreProp.load(new FileInputStream(dsProp));
        } catch (FileNotFoundException e) {
            System.err.println("DataStore file was does not exist");
            System.err.println(dsProp.toString());
            e.printStackTrace();
            System.exit(1);
        } catch (IOException e) {
            System.err.println("DataStore file had errors reading");
            System.err.println(dsProp.toString());
            e.printStackTrace();
            System.exit(1);
        }

        try {
            transProp.load(new FileInputStream(trProp));
        } catch (FileNotFoundException e) {
            System.err.println("Transaction file was does not exist");
            System.err.println(trProp.toString());
            e.printStackTrace();
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Transaction file had errors reading");
            System.err.println(trProp.toString());
            e.printStackTrace();
            System.exit(1);
        }
    }

    private synchronized static Map loadDataStores() {
        String dsIds = dataStoreProp.getProperty("DataStoreIds");
        String[] ids = dsIds.split(",");
        Map result = new HashMap();
        // int rcount = 0;

        // remove whitespace
        for (int i = 0; i < ids.length; i++) {
            ids[i] = ids[i].trim();

            Map m = new HashMap();
            String tmp = dataStoreProp.getProperty(ids[i] + ".Params");
            String[] params = tmp.split(",");

            for (int j = 0; j < params.length; j++) {
                String[] vals = params[j].split("=");

                if (vals.length == 2) {
                    m.put(vals[0].trim(), vals[1].trim());
                } else {
                    System.err.println("DataStore " + ids[i]
                            + " incured an error loading a parameter.");
                    System.err.println("This DataStore may not be loaded correctly.");
                    System.err
                            .println("Parameters should be specified in a comma delimited list key=value");
                    System.err.println("You specified:" + tmp);
                }
            }

            DataStore dataStore = null;

            try {
                dataStore = DataStoreFinder.getDataStore(m);
            } catch (Throwable ex) {
                ex.printStackTrace();
                System.err.println("DataStore " + ids[i]
                        + " incured an error and will not be used.");
            }

            if (dataStore != null) {
                result.put(ids[i], dataStore);
            } else {
                System.err.println("DataStore " + ids[i]
                        + " incured an error and will not be used.");
            }
        }// end for ids

        return result;
    }

    private static ValidationProcessor loadTests() {
        File plugInDir = null;
        plugInDir = new File(transProp.getProperty("PlugInDir"));

        if (plugInDir == null) {
            System.err.println("PlugIn Dir does not exist");
            System.exit(1);
        }

        if (!plugInDir.exists()) {
            System.err.println("PlugIn Dir does not exist");
            System.err.println(plugInDir.toString());
            System.exit(1);
        }

        if (!plugInDir.isDirectory()) {
            System.err.println("PlugIn Dir is not a directory");
            System.err.println(plugInDir.toString());
            System.exit(1);
        }

        if (!plugInDir.canRead()) {
            System.err.println("PlugIn Dir cannot be read");
            System.err.println(plugInDir.toString());
            System.exit(1);
        }

        Map plugIns = null;

        try {
            plugIns = XMLReader.loadPlugIns(plugInDir);
        } catch (ValidationException e) {
            System.err.println("PlugIn load had errors.");
            System.err.println(plugInDir.toString());
            e.printStackTrace();
            System.exit(1);
        }

        if (plugIns == null) {
            System.err.println("PlugIn load had errors.");
            System.err.println("No plugins were loaded");
            System.err.println(plugInDir.toString());
            System.exit(1);
        }

        if (plugIns.size() == 0) {
            System.err.println("PlugIn load had errors.");
            System.err.println("No plugins were found");
            System.err.println(plugInDir.toString());
            System.exit(1);
        }

        int numSuites = 0;
        try {
            numSuites = Integer.parseInt(transProp.getProperty("NumberTestSuites"));
        } catch (Exception e) {
        }

        Map ts = new HashMap(numSuites);
        for (int i = 0; i < numSuites; i++) {
            String path = transProp.getProperty("TestSuiteFile." + (i + 1));
            loadTestSuite(ts, plugIns, path);
        }

        // We need to make our own validator for batch
        // processing
        // (for starters it should use a custom FeatureResults
        // that logs fail/warning information)
        BatchValidatorProcessor gv = new BatchValidatorProcessor(ts, plugIns);

        return gv;
    }

    private static void loadTestSuite(Map ts, Map plugIns, String tsPath) {
        File testSuite = null;
        try {
            testSuite = new File(tsPath);
        } catch (Exception e) {
            System.err.println(tsPath);
            e.printStackTrace();
            return;
        }

        if (testSuite == null) {
            System.err.println("TestSuite file does not exist");
            System.exit(1);
        }

        if (!testSuite.exists()) {
            System.err.println("TestSuite file does not exist");
            System.err.println(testSuite.toString());
            System.exit(1);
        }

        if (!testSuite.isFile()) {
            System.err.println("TestSuite file is not a file");
            System.err.println(testSuite.toString());
            System.exit(1);
        }

        if (!testSuite.canRead()) {
            System.err.println("TestSuite file cannot be read");
            System.err.println(testSuite.toString());
            System.exit(1);
        }

        TestSuiteDTO dto = null;

        try {
            dto = XMLReader.readTestSuite(testSuite.getName(), new FileReader(testSuite), plugIns);
        } catch (FileNotFoundException e) {
            System.err.println("TestSuite file was not found.");
            System.err.println(testSuite.toString());
            e.printStackTrace();
            System.exit(1);
        } catch (ValidationException e) {
            System.err.println("TestSuite load had errors.");
            System.err.println(testSuite.toString());
            e.printStackTrace();
            System.exit(1);
        }

        ts.put(dto.getName(), dto);
    }

    static class BatchValidationResults implements ValidationResults {
        Map errors = new HashMap();

        Validation v;

        public void error(SimpleFeature feature, String message) {
            errors.put(feature, message);
        }

        public void warning(SimpleFeature feature, String message) {
            errors.put(feature, message);
        }

        public void setValidation(Validation validation) {
            v = validation;
        }

        public Map getErrors() {
            return errors;
        }

        public String toString() {
            String r = "";
            Iterator i = errors.keySet().iterator();
            if (i.hasNext()) {
                while (i.hasNext()) {
                    SimpleFeature f = (SimpleFeature) i.next();
                    String msg = (String) errors.get(f);
                    r += (f.getID() + " " + msg + "\n");
                }
            } else {
                r = "PASSED";
            }

            return r + "\n";
        }
    }
}

/*
* Created on Feb 9, 2004
*
* To change the template for this generated file go to Window - Preferences - Java - Code
* Generation - Code and Comments
*/
class BatchValidatorProcessor extends ValidationProcessor {
    /**
     * BatchValidator constructor.
     *
     * <p>
     * super();
     * </p>
     */
    public BatchValidatorProcessor() {
        super();
    }

    /**
     * ValidationProcessor constructor.
     *
     * <p>
     * Builds a ValidationProcessor with the DTO provided.
     * </p>
     *
     * @param testSuites
     *            Map a map of names -> TestSuiteDTO objects
     * @param plugIns
     *            Map a map of names -> PlugInDTO objects
     *
     * @see load(Map,Map)
     */
    public BatchValidatorProcessor(Map testSuites, Map plugIns) {
        super();
        load(testSuites, plugIns);
    }

    /**
     * load purpose.
     *
     * <p>
     * loads this instance data into this instance.
     * </p>
     *
     * @param testSuites
     * @param plugIns
     */
    public void load(Map testSuites, Map plugIns) {
        // step 1 make a list required plug-ins
        Set plugInNames = new HashSet();
        Iterator i = testSuites.keySet().iterator();

        // go through each test suite
        while (i.hasNext()) {
            TestSuiteDTO dto = (TestSuiteDTO) testSuites.get(i.next());
            Iterator j = dto.getTests().keySet().iterator();
            // go through each test plugIn
            while (j.hasNext()) {
                TestDTO tdto = (TestDTO) dto.getTests().get(j.next());
                plugInNames.add(tdto.getPlugIn().getName());
            }
        }

        i = plugIns.values().iterator();
        Map errors = new HashMap();

        // go through each plugIn and add it to errors
        while (i.hasNext())
            errors.put(i.next(), Boolean.FALSE);

        // step 2 configure plug-ins with defaults
        Map defaultPlugIns = new HashMap(plugInNames.size());
        i = plugInNames.iterator();

        // go through each plugIn
        while (i.hasNext()) {
            String plugInName = (String) i.next();
            PlugInDTO dto = (PlugInDTO) plugIns.get(plugInName);
            Class plugInClass = null;

            try {
                plugInClass = Class.forName(dto.getClassName());
            } catch (ClassNotFoundException e) {
                // Error, using default.
                errors.put(dto, e);
                e.printStackTrace();
            }

            if (plugInClass == null) {
                plugInClass = Validation.class;
            }

            Map plugInArgs = dto.getArgs();

            if (plugInArgs == null) {
                plugInArgs = new HashMap();
            }

            try {
                PlugIn plugIn = new org.geotools.validation.PlugIn(plugInName, plugInClass, dto
                        .getDescription(), plugInArgs);
                defaultPlugIns.put(plugInName, plugIn);
            } catch (ValidationException e) {
                e.printStackTrace();
                errors.put(dto, e);

                // error should log here
                continue;
            }

            errors.put(dto, Boolean.TRUE); // store the plugIn
        }

        // step 3 configure plug-ins with tests + add to processor
        i = testSuites.keySet().iterator();

        // for each TEST SUITE
        while (i.hasNext()) {
            TestSuiteDTO tdto = (TestSuiteDTO) testSuites.get(i.next());
            Iterator j = tdto.getTests().keySet().iterator();

            // for each TEST in the test suite
            while (j.hasNext()) {
                TestDTO dto = (TestDTO) tdto.getTests().get(j.next());

                // deal with test
                Map testArgs = dto.getArgs();

                if (testArgs == null) {
                    testArgs = new HashMap();
                } else {
                    Map m = new HashMap();
                    Iterator k = testArgs.keySet().iterator();

                    while (k.hasNext()) {
                        ArgumentDTO adto = (ArgumentDTO) testArgs.get(k.next());
                        m.put(adto.getName(), adto.getValue());
                    }

                    testArgs = m;
                }

                try {
                    PlugIn plugIn = (org.geotools.validation.PlugIn) defaultPlugIns.get(dto
                            .getPlugIn().getName());
                    Validation validation = plugIn.createValidation(dto.getName(), dto
                            .getDescription(), testArgs);

                    if (validation instanceof FeatureValidation) {
                        addValidation((FeatureValidation) validation);
                    }

                    if (validation instanceof IntegrityValidation) {
                        addValidation((IntegrityValidation) validation);
                    }
                } catch (ValidationException e) {
                    e.printStackTrace();
                    errors.put(dto, e);

                    // error should log here
                    continue;
                }

                errors.put(dto, Boolean.TRUE);
            }

            errors.put(tdto, Boolean.TRUE);
        } // end while each test suite
    }// end load method

}
TOP

Related Classes of org.geotools.validation.BatchValidatorProcessor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.