com.opendoorlogistics.core.geometry.ShapefileLink.java Source code

Java tutorial

Introduction

Here is the source code for com.opendoorlogistics.core.geometry.ShapefileLink.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com)
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v3
 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt
 ******************************************************************************/
package com.opendoorlogistics.core.geometry;

import java.util.List;

import org.apache.commons.io.FilenameUtils;

import com.opendoorlogistics.core.formulae.StringTokeniser;
import com.opendoorlogistics.core.formulae.StringTokeniser.StringToken;
import com.opendoorlogistics.core.utils.strings.Strings;

/**
 * Represents a link to an object in a shapefile. As the file could be relative or absolute, and may in the future be the name of an entry in some
 * type of data library, it is represented by String not File.
 * 
 * Hashcode and equals for a ShapefileLink use standardised strings (case insensitive with leading/trailing spaces ignored).
 * 
 * @author Phil
 * 
 */
public final class ShapefileLink {
    static final String SHAPEFILELINK_KEYWORD = "shapefilelink";
    private final String filename;
    private final String typename;
    private final String featureId;

    private final String filenameStd;
    private final String typenameStd;
    private final String featureIdStd;

    public ShapefileLink(String filename, String typename, String featureId) {
        this.filename = FilenameUtils.normalize(filename);
        this.typename = typename;
        this.featureId = featureId;

        // Also save standardised version for the hash lookup, including standardising slashes in the filename
        // to stop issues with shapefilelink generated in linux and used in windows (or vice-versa).
        filenameStd = Strings.std(this.filename).replace("/", "\\");
        typenameStd = Strings.std(typename);
        featureIdStd = Strings.std(featureId);
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((featureIdStd == null) ? 0 : featureIdStd.hashCode());
        result = prime * result + ((filenameStd == null) ? 0 : filenameStd.hashCode());
        result = prime * result + ((typenameStd == null) ? 0 : typenameStd.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        ShapefileLink other = (ShapefileLink) obj;
        if (featureIdStd == null) {
            if (other.featureIdStd != null)
                return false;
        } else if (!featureIdStd.equals(other.featureIdStd))
            return false;
        if (filenameStd == null) {
            if (other.filenameStd != null)
                return false;
        } else if (!filenameStd.equals(other.filenameStd))
            return false;
        if (typenameStd == null) {
            if (other.typenameStd != null)
                return false;
        } else if (!typenameStd.equals(other.typenameStd))
            return false;
        return true;
    }

    public String getFile() {
        return filename;
    }

    public String getTypename() {
        return typename;
    }

    public String getFeatureId() {
        return featureId;
    }

    @Override
    public String toString() {
        StringBuilder ret = new StringBuilder();
        ret.append(SHAPEFILELINK_KEYWORD);
        ret.append("(\"");
        ret.append(filename);
        ret.append("\",\"");
        ret.append(typename);
        ret.append("\",\"");
        ret.append(featureId);
        ret.append("\")");
        return ret.toString();
    }

    public static ShapefileLink parse(String s) {
        List<StringToken> tokens = StringTokeniser.tokenise(s);
        // 0 = keyword
        // 1 = (
        // 2 = filename
        // 3 = ,
        // 4 = typename
        // 5 = ,
        // 6 = id
        // 7 = )
        if (tokens.size() != 8) {
            return null;
        }

        // check keyword
        if (!Strings.equalsStd(tokens.get(0).getOriginal(), SHAPEFILELINK_KEYWORD)) {
            return null;
        }

        // check correct ( , )
        if (tokens.get(1).getOriginal().equals("(") == false || tokens.get(3).getOriginal().equals(",") == false
                || tokens.get(5).getOriginal().equals(",") == false
                || tokens.get(7).getOriginal().equals(")") == false) {
            return null;
        }

        String filename = tokens.get(2).getOriginal().replace("\"", "");
        String typename = tokens.get(4).getOriginal().replace("\"", "");
        String id = tokens.get(6).getOriginal().replace("\"", "");
        return new ShapefileLink(filename, typename, id);
    }

    public static void main(String[] args) {
        for (String s : new String[] { "shapefilelink( \"states.shp\" , \"states\", \"23\")" }) {
            System.out.println(s + " ->" + parse(s));
        }
    }
}