code: /* Copyright (C) 2002 Univ. of Massachusetts Amherst, Computer Science Dept.
     This file is part of "MALLET" (MAchine Learning for LanguagE Toolkit).
     http://www.cs.umass.edu/~mccallum/mallet
     This software is provided under the terms of the Common Public License,
     version 1.0, as published by http://www.opensource.org.  For further
     information, see the file `LICENSE' included with this distribution. */
  
  
  
  
  /** 
     @author Andrew McCallum <a href="mailto:mccallum@cs.umass.edu">mccallum@cs.umass.edu</a>
   */
  
  package cc.mallet.pipe;
  
  import java.io.*;
  import java.net.URI;
  
  import cc.mallet.types.Instance;
  import cc.mallet.util.CharSequenceLexer;
  
  /**
   *  Pipe that can read from various kinds of text sources
   *   (either URI, File, or Reader) into a CharSequence
   *
   *  @version $Id: Input2CharSequence.java,v 1.1 2007/10/22 21:37:39 mccallum Exp $
   */
  public class Input2CharSequence extends Pipe implements Serializable
  {
  	String encoding = null;
  
  	public Input2CharSequence ()
  	{
  	}
  
  	public Input2CharSequence( String encoding ) {
  		this.encoding = encoding;
  	}
  
  	public Instance pipe (Instance carrier)
  	{
  		try {
  			if (carrier.getData() instanceof URI)
  				carrier.setData(pipe ((URI)carrier.getData()));
  			else if (carrier.getData() instanceof File)
  				carrier.setData(pipe ((File)carrier.getData()));
  			else if (carrier.getData() instanceof Reader)
  				carrier.setData(pipe ((Reader)carrier.getData()));
  			else if (carrier.getData() instanceof CharSequence)
  				;																	// No conversion necessary
  			else
  				throw new IllegalArgumentException ("Does not handle class "+carrier.getData().getClass());
  
  		} catch (java.io.IOException e) {
  			throw new IllegalArgumentException ("IOException " + e);
  		}
  
  //		System.out.println(carrier.getData().toString());
  		return carrier;
  	}
  
  	public CharSequence pipe (URI uri)
  		throws java.io.FileNotFoundException, java.io.IOException
  	{
  		if (! uri.getScheme().equals("file"))
  			throw new UnsupportedOperationException ("Only file: scheme implemented.");
  		return pipe (new File (uri.getPath()));
  	}
  	
  	public CharSequence pipe (File file)
  		throws java.io.FileNotFoundException, java.io.IOException
  	{
  		BufferedReader br = null;
  
  		if (encoding == null) {
  			br = new BufferedReader (new FileReader (file));
  		}
  		else {
  			br = new BufferedReader( new InputStreamReader(new FileInputStream(file), encoding) );
  		}
  
  		CharSequence cs = pipe(br);
  		br.close();
  		return cs;
  	}
  
  	public CharSequence pipe (Reader reader)
  		throws java.io.IOException
  	{
  		final int BUFSIZE = 2048;
  		char[] buf = new char[BUFSIZE];
  		int count;
  		StringBuffer sb = new StringBuffer (BUFSIZE);
  		do {
  			count = reader.read (buf, 0, BUFSIZE);
  			if (count == -1)
  				break;
  			//System.out.println ("count="+count);
  			sb.append (buf, 0, count);
  		} while (count == BUFSIZE);
  		return sb;
  	}
  
  	public CharSequence pipe (CharSequence cs)
  	{
  		return cs;
  	}
  
  	// Serialization 
  	
  	private static final long serialVersionUID = 2;
  	private static final int CURRENT_SERIAL_VERSION = 0;
  	
  	private void writeObject (ObjectOutputStream out) throws IOException {
  		out.writeInt (CURRENT_SERIAL_VERSION);
  		if (encoding == null) {
  			out.writeObject("null");
  		}
  		else {
  			out.writeObject(encoding);
  		}
  	}
  	
  	private void readObject (ObjectInputStream in) throws IOException, ClassNotFoundException {
  		int version = in.readInt ();
  		this.encoding = (String) in.readObject();
  		if (encoding.equals("null")) { encoding = null; } 
  	}
  
  }
  