Java tutorial
/* * GazetteerList.java * * Copyright (c) 1995-2012, The University of Sheffield. See the file * COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt * * This file is part of GATE (see http://gate.ac.uk/), and is free * software, licenced under the GNU Library General Public License, * Version 2, June 1991 (in the distribution as file licence.html, * and also available at http://gate.ac.uk/gate/licence.html). * * borislav popov 02/2002 * * $Id$ */ package gate.creole.gazetteer; import java.io.*; import java.net.URL; import java.util.*; import java.util.regex.Pattern; import org.apache.commons.io.IOUtils; import gate.creole.ResourceInstantiationException; import gate.util.BomStrippingInputStreamReader; import gate.util.Files; import gate.util.GateRuntimeException; /** * Gazetteer List provides the means for uploading, managing and storing * the data in the gazetteer list files. */ public class GazetteerList extends gate.creole.AbstractLanguageResource implements List<GazetteerNode> { private static final long serialVersionUID = -812795422822719315L; /** indicates list representation of the gazetteer list */ public final static int LIST_MODE = 0; /** indicates representation of the gaz list as a single string */ public final static int STRING_MODE = 1; /** the url of this list */ private URL url; /** the encoding of the list */ private String encoding = "UTF-8"; /** * indicates the current mode of the gazetteer list(e.g. * STRING_MODE,LIST_MODE) */ private int mode = 0; /** * flag indicating whether the list has been modified after * loading/storing */ private boolean isModified = false; /** the entries of this list */ private List<GazetteerNode> entries = new ArrayList<GazetteerNode>(); /** the content of this list */ private String content = null; /** * the separator used to delimit feature name-value pairs in gazetteer * lists */ private String separator; /** create a new gazetteer list */ public GazetteerList() { } /** @return true if the list has been modified after load/store */ @Override public boolean isModified() { return isModified; } /** * Sets the modified status of the current list * * @param modified is modified flag */ public void setModified(boolean modified) { isModified = modified; } /** * Retrieves the current mode of the gaz list * * @return the current mode */ public int getMode() { return mode; } /** * Sets mode of the gazetteer list * * @param m the mode to be set */ public void setMode(int m) { if (m != mode) { switch (m) { case LIST_MODE: { mode = m; updateContent(content); break; } // LIST_MODE case STRING_MODE: { content = this.toString(); mode = m; break; } // STRING_MODE default: { throw new gate.util.GateRuntimeException("Invalid Mode =" + mode + "\nValid modes are:\nLIST_MODE = " + LIST_MODE + "\nSTRING_MODE = " + STRING_MODE); } // default } // switch } // only if different from the current } // setMode(int) /** * Sets the encoding of the list * * @param encod the encoding to be set */ public void setEncoding(String encod) { encoding = encod; } /** * Gets the encoding of the list * * @return the encoding of the list */ public String getEncoding() { return encoding; } /** * Loads a gazetteer list * * @throws ResourceInstantiationException when the resource cannot be * created */ public void load() throws ResourceInstantiationException { load(false); } /** * Loads a gazetteer list * * @param isOrdered true if the feature maps used should be ordered * @throws ResourceInstantiationException when the resource cannot be * created */ @SuppressWarnings("resource") public void load(boolean isOrdered) throws ResourceInstantiationException { BufferedReader listReader = null; try { if (null == url) { throw new ResourceInstantiationException("URL not specified (null)."); } listReader = new BomStrippingInputStreamReader((url).openStream(), encoding); String line; int linenr = 0; Pattern emptyPattern = Pattern.compile("\\s*"); while (null != (line = listReader.readLine())) { linenr++; if (emptyPattern.matcher(line).matches()) { // skip empty line continue; } GazetteerNode node = null; try { node = new GazetteerNode(line, separator, isOrdered); } catch (Exception ex) { throw new GateRuntimeException("Could not read gazetteer entry " + linenr + " from URL " + getURL() + ": " + ex.getMessage(), ex); } entries.add(node); } // while listReader.close(); } catch (Exception x) { throw new ResourceInstantiationException(x.getClass() + ":" + x.getMessage(), x); } finally { IOUtils.closeQuietly(listReader); } isModified = false; } // load () /** * Stores the list to the specified url * * @throws ResourceInstantiationException */ public void store() throws ResourceInstantiationException { try { if (null == url) { throw new ResourceInstantiationException("URL not specified (null)"); } File fileo = Files.fileFromURL(url); fileo.delete(); OutputStreamWriter listWriter = new OutputStreamWriter(new FileOutputStream(fileo), encoding); // BufferedWriter listWriter = new BufferedWriter(new // FileWriter(fileo)); Iterator<GazetteerNode> iter = entries.iterator(); while (iter.hasNext()) { listWriter.write(iter.next().toString()); listWriter.write(13); listWriter.write(10); } listWriter.close(); } catch (Exception x) { throw new ResourceInstantiationException(x.getClass() + ":" + x.getMessage()); } isModified = false; } // store() /** * Sets the URL of the list * * @param theUrl the URL of the List */ public void setURL(URL theUrl) { url = theUrl; isModified = true; } /** * Gets the URL of the list * * @return the URL of the list */ public URL getURL() { return url; } /** * @return the seperator */ public String getSeparator() { return separator; } /** * @param separator the separator to set */ public void setSeparator(String separator) { this.separator = separator; } /*--------------implementation of java.util.List--------------------*/ @Override public int size() { return entries.size(); } @Override public boolean isEmpty() { return (0 == entries.size()); } @Override public boolean contains(Object o) { return entries.contains(o); } // contains() /** * Gets an iterator over the list. It is not dangerous if the iterator * is modified since there are no dependencies of entries to other * members */ @Override public Iterator<GazetteerNode> iterator() { return entries.iterator(); } @Override public Object[] toArray() { return entries.toArray(); } @Override public <T> T[] toArray(T[] a) { return entries.toArray(a); } @Override public boolean add(GazetteerNode o) { boolean result = entries.add(o); isModified |= result; return result; } // add() @Override public boolean remove(Object o) { boolean result = entries.remove(o); isModified |= result; return result; } @Override public boolean containsAll(Collection<?> c) { return entries.containsAll(c); } /** * Adds entire collection * * @param c a collection to be addded * @return true if all the elements where Strings and all are * sucessfully added */ @Override public boolean addAll(Collection<? extends GazetteerNode> c) { Iterator<? extends GazetteerNode> iter = c.iterator(); GazetteerNode o; boolean result = false; while (iter.hasNext()) { o = iter.next(); result |= entries.add(o); } // while isModified |= result; return result; } // addAll(Collection) @Override public boolean addAll(int index, Collection<? extends GazetteerNode> c) { boolean result = entries.addAll(index, c); isModified |= result; return result; } // addAll(int,Collection) @Override public boolean removeAll(Collection<?> c) { boolean result = entries.removeAll(c); isModified |= result; return result; } @Override public boolean retainAll(Collection<?> c) { boolean result = entries.retainAll(c); isModified |= result; return result; } @Override public void clear() { if (0 < entries.size()) isModified = true; entries.clear(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((entries == null) ? 0 : entries.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; GazetteerList other = (GazetteerList) obj; if (entries == null) { if (other.entries != null) return false; } else if (!entries.equals(other.entries)) return false; return true; } @Override public GazetteerNode get(int index) { return entries.get(index); } @Override public GazetteerNode set(int index, GazetteerNode element) { isModified = true; return entries.set(index, element); } @Override public void add(int index, GazetteerNode element) { isModified = true; entries.add(index, element); } @Override public GazetteerNode remove(int index) { int size = entries.size(); GazetteerNode result = entries.remove(index); isModified |= (size != entries.size()); return result; } @Override public int indexOf(Object o) { return entries.indexOf(o); } @Override public int lastIndexOf(Object o) { return entries.lastIndexOf(o); } @Override public ListIterator<GazetteerNode> listIterator() { return entries.listIterator(); } @Override public ListIterator<GazetteerNode> listIterator(int index) { return entries.listIterator(index); } @Override public List<GazetteerNode> subList(int fromIndex, int toIndex) { return entries.subList(fromIndex, toIndex); } /** * Retrieves the string representation of the gaz list according to * its mode. If {@link #LIST_MODE} then all the entries are dumped * sequentially to a string. If {@link #STRING_MODE} then the content * (a string) of the gaz list is retrieved. * * @return the string representation of the gaz list */ @Override public String toString() { String stres = null; switch (mode) { case LIST_MODE: { StringBuffer result = new StringBuffer(); String entry = null; for (int i = 0; i < entries.size(); i++) { GazetteerNode node = entries.get(i); entry = node.getEntry().trim(); if (entry.length() > 0) { result.append(entry); Map<String, Object> featureMap = node.getFeatureMap(); if (featureMap != null && (featureMap.size() > 0)) { result.append(node.featureMapToString(featureMap)); } result.append("\n"); } // if } // for stres = result.toString(); break; } case STRING_MODE: { stres = content; break; } default: { throw new gate.util.GateRuntimeException("Invalid Mode =" + mode + "\nValid modes are:\nLIST_MODE = " + LIST_MODE + "\nSTRING_MODE = " + STRING_MODE); } } // switch return stres; }// toString() /** * Updates the content of the gaz list with the given parameter. * Depends on the mode of the gaz list. In the case of * {@link #LIST_MODE} the new content is parsed and loaded as single * nodes through the {@link java.util.List} interface. In the case of * {@link #STRING_MODE} the new content is stored as a String and is * not parsed. * * @param newContent the new content of the gazetteer list */ public void updateContent(String newContent) { switch (mode) { case STRING_MODE: { content = newContent; break; } case LIST_MODE: { BufferedReader listReader; listReader = new BufferedReader(new StringReader(newContent)); String line; List<GazetteerNode> tempEntries = new ArrayList<GazetteerNode>(); try { while (null != (line = listReader.readLine())) { tempEntries.add(new GazetteerNode(line, separator)); } // while listReader.close(); } catch (IOException x) { /** should never be thrown */ throw new gate.util.LuckyException("IOException :" + x.getMessage()); } isModified = !tempEntries.equals(entries); clear(); entries = tempEntries; break; } // LIST_MODE default: { throw new gate.util.GateRuntimeException("Invalid Mode =" + mode + "\nValid modes are:\nLIST_MODE = " + LIST_MODE + "\nSTRING_MODE = " + STRING_MODE); } // default } // switch mode } // updateContent(String) } // Class GazetteerList