Ignore:
Timestamp:
2008-08-12T23:07:59+02:00 (16 years ago)
Author:
stoecker
Message:

finished TagChecker implementation. Parser working. Matching still untested.

Location:
applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/ErrorTreePanel.java

    r9598 r9755  
    194194        public void setErrors(List<TestError> newerrors)
    195195        {
     196                if(errors == null)
     197                        return;
    196198                errors.clear();
    197199                for(TestError error : newerrors)
  • applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/TagChecker.java

    r9684 r9755  
    1515import java.io.IOException;
    1616import java.io.UnsupportedEncodingException;
     17import java.lang.IllegalStateException;
    1718import java.net.URL;
    1819import java.util.ArrayList;
     
    2324import java.util.Map;
    2425import java.util.Map.Entry;
    25 import java.util.StringTokenizer;
     26import java.util.regex.Matcher;
     27import java.util.regex.Pattern;
     28import java.util.regex.PatternSyntaxException;
    2629
    2730import javax.swing.DefaultListModel;
     
    140143        /**
    141144         * Reads the spellcheck file into a HashMap.
    142          * <p>
    143145         * The data file is a list of words, beginning with +/-. If it starts with +,
    144146         * the word is valid, but if it starts with -, the word should be replaced
     
    167169                }
    168170
    169                 StringTokenizer st = new StringTokenizer(sources, ";");
    170                 StringBuilder errorSources = new StringBuilder();
    171                 while (st.hasMoreTokens())
    172                 {
    173                         String source = st.nextToken();
     171                String errorSources = "";
     172                for(String source: sources.split(";"))
     173                {
    174174                        File sourceFile = Util.mirror(new URL(source), Util.getPluginDir(), -1);
    175175                        if( sourceFile == null || !sourceFile.exists() )
    176176                        {
    177                                 errorSources.append(source).append("\n");
     177                                errorSources += source + "\n";
    178178                                continue;
    179179                        }
     
    203203                                                        checkerData.add(d);
    204204                                                else
    205                                                         System.err.println("Invalid tagchecker line - "+err+":" + line);
     205                                                        System.err.println(tr("Invalid tagchecker line - {0}: {1}", err, line));
    206206                                        }
    207207                                }
     
    216216                                else
    217217                                {
    218                                         System.err.println("Invalid spellcheck line:" + line);
     218                                        System.err.println(tr("Invalid spellcheck line: {0}", line));
    219219                                }
    220220                        }
     
    277277                                {
    278278                                        errors.add( new TestError(this, Severity.WARNING, tr("Illegal tag/value combinations"),
    279                                         tr(d.description()), TAG_CHECK, p) );
     279                                        d.getDescription(), TAG_CHECK, p) );
    280280                                        withErrors.add(p, "TC");
    281281                                        break;
     
    380380        {
    381381                String allAnnotations = Main.pref.get("taggingpreset.sources");
    382                 StringTokenizer st = new StringTokenizer(allAnnotations, ";");
    383                 while (st.hasMoreTokens())
     382                for(String source : allAnnotations.split(";"))
    384383                {
    385384                        InputStream in = null;
    386                         String source = st.nextToken();
    387385                        try
    388386                        {
     
    461459
    462460                String sources = Main.pref.get( PREF_SOURCES );
    463                 StringTokenizer st = new StringTokenizer(sources, ";");
    464                 while (st.hasMoreTokens())
    465                         ((DefaultListModel)Sources.getModel()).addElement(st.nextToken());
     461                for(String source : sources.split(";"))
     462                        ((DefaultListModel)Sources.getModel()).addElement(source);
    466463
    467464                addSrcButton = new JButton(tr("Add"));
     
    598595                if( Sources.getModel().getSize() > 0 )
    599596                {
    600                         StringBuilder sb = new StringBuilder();
     597                        String sb = "";
    601598                        for (int i = 0; i < Sources.getModel().getSize(); ++i)
    602                                 sb.append(";"+Sources.getModel().getElementAt(i));
     599                                sb += ";"+Sources.getModel().getElementAt(i);
    603600                        sources = sb.substring(1);
    604601                }
     
    662659
    663660        private static class CheckerData {
    664                 public String getData(String data)
    665                 {
    666                         return "not implemented yet";
     661                private String description;
     662                private List<CheckerElement> data = new ArrayList<CheckerElement>();
     663                private Integer type = 0;
     664                protected static int NODE = 1;
     665                protected static int WAY = 2;
     666                protected static int ALL = 3;
     667
     668                private class CheckerElement {
     669                        public Object tag;
     670                        public Object value;
     671                        public Boolean noMatch;
     672                        public Boolean tagAll = false;
     673                        public Boolean valueAll = false;
     674                        private Pattern getPattern(String str) throws IllegalStateException, PatternSyntaxException
     675                        {
     676                                if(str.endsWith("/i"))
     677                                        return Pattern.compile(str.substring(1,str.length()-2), Pattern.CASE_INSENSITIVE);
     678                                else if(str.endsWith("/"))
     679                                        return Pattern.compile(str.substring(1,str.length()-1));
     680                                throw new IllegalStateException();
     681                        }
     682                        public CheckerElement(String exp) throws IllegalStateException, PatternSyntaxException
     683                        {
     684                                Matcher m = Pattern.compile("(.+)([!=]=)(.+)").matcher(exp);
     685                                m.matches();
     686
     687                                String n = m.group(1).trim();
     688                                if(n.equals("*"))
     689                                        tagAll = true;
     690                                else
     691                                        tag = n.startsWith("/") ? getPattern(n) : n;
     692                                noMatch = m.group(2).equals("!=");
     693                                n = m.group(3).trim();
     694                                if(n.equals("*"))
     695                                        valueAll = true;
     696                                else
     697                                        value = n.startsWith("/") ? getPattern(n) : n;
     698                        }
     699                        public Boolean match(String key, String val)
     700                        {
     701                                Boolean tagtrue = tagAll || (tag instanceof Pattern ? ((Pattern)tag).matcher(key).matches() : key.equals(tag));
     702                                Boolean valtrue = valueAll || (value instanceof Pattern ? ((Pattern)value).matcher(val).matches() : val.equals(value));
     703                                return tagtrue && (noMatch ? !valtrue : valtrue);
     704                        }
     705                };
     706
     707                public String getData(String str)
     708                {
     709                        Matcher m = Pattern.compile(" *# *([^#]+) *$").matcher(str);
     710                        str = m.replaceFirst("").trim();
     711                        try
     712                        {
     713                                description = m.group(1);
     714                                if(description != null && description.length() == 0)
     715                                        description = null;
     716                        }
     717                        catch (IllegalStateException e)
     718                        {
     719                                description = null;
     720                        }
     721                        String[] n = str.split(" *: *", 2);
     722                        if(n[0].equals("way"))
     723                                type = WAY;
     724                        else if(n[0].equals("node"))
     725                                type = NODE;
     726                        else if(n[0].equals("*"))
     727                                type = ALL;
     728                        if(type == 0 || n.length != 2)
     729                                return tr("Could not find element type");
     730                        for(String exp: n[1].split(" *&& *"))
     731                        {
     732                                try
     733                                {
     734                                        data.add(new CheckerElement(exp));
     735                                }
     736                                catch(IllegalStateException e)
     737                                {
     738                                        return tr("Illegal expression ''{0}''", exp);
     739                                }
     740                                catch(PatternSyntaxException e)
     741                                {
     742                                        return tr("Illegal regular expression ''{0}''", exp);
     743                                }
     744                        }
     745                        return null;
    667746                }
    668747                public Boolean match(OsmPrimitive osm)
    669748                {
    670                         return false;
    671                 }
    672                 public String description()
    673                 {
    674                         return "not implemented yet";
     749                        if(osm.keys == null)
     750                                return false;
     751                        for(CheckerElement ce : data)
     752                        {
     753                                Boolean result = false;
     754                                for(Entry<String, String> prop: osm.keys.entrySet())
     755                                {
     756                                        if(result = ce.match(prop.getKey(), prop.getValue()))
     757                                                break;
     758                                }
     759                                if(!result)
     760                                        return false;
     761                        }
     762                        return true;
     763                }
     764                public String getDescription()
     765                {
     766                        return tr(description);
    675767                }
    676768        }
Note: See TracChangeset for help on using the changeset viewer.