/******************************************************************************* * 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)); } } }