package basics.filesystem.serializer;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public abstract class SerializerBase implements Serializer
{
/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#openForWriting(java.io.File)
 */
public abstract boolean openForWriting(File file);

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#openForReading(java.io.File)
 */
public abstract boolean openForReading(File file);

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#close()
 */
public abstract void close();

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#canRead()
 */
public abstract boolean canRead();

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#canWrite()
 */
public abstract boolean canWrite();

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#write(int)
 */
public abstract void write(int value) throws IOException;

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#readInt()
 */
public abstract int readInt() throws IOException;

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#write(long)
 */
public abstract void write(long value) throws IOException;

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#readLong()
 */
public abstract long readLong() throws IOException;

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#write(double)
 */
public abstract void write(double value) throws IOException;

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#readDouble()
 */
public abstract double readDouble() throws IOException;

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#write(java.lang.String)
 */
public abstract void write(String value) throws IOException;

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#readString()
 */
public abstract String readString() throws IOException;

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#skipLine()
 */
public abstract void skipLine() throws IOException;

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#readStringRaw()
 */
public String readStringRaw() throws IOException {
	// dummy implementation
	return readString();
}

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#writeRaw(java.lang.String)
 */
public void writeRaw(String value) throws IOException {
	// dummy implementation
	write(value);
}

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#write(double[])
 */
public void write(double [] array) throws IOException
{
   write(array.length);
   for(int i = 0; i < array.length; i++)
      write(array[i]);
}

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#readDoubleArray()
 */
public double [] readDoubleArray() throws IOException
{
   int size = readInt();
   double [] array = new double [size];
   for(int i = 0; i < size; i++)
      array[i] = readDouble();
   return array;
}

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#write(int[])
 */
public void write(int [] array) throws IOException
{
   write(array.length);
   for(int i = 0; i < array.length; i++)
      write(array[i]);
}

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#readIntArray()
 */
public int [] readIntArray() throws IOException
{
   int size = readInt();
   int [] array = new int [size];
   for(int i = 0; i < size; i++)
      array[i] = readInt();
   return array;
}

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#write(long[])
 */
public void write(long [] array) throws IOException
{
   write(array.length);
   for(int i = 0; i < array.length; i++)
      write(array[i]);
}

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#readLongArray()
 */
public long [] readLongArray() throws IOException
{
   int size = readInt();
   long [] array = new long [size];
   for(int i = 0; i < size; i++)
      array[i] = readLong();
   return array;
}

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#write(java.util.List)
 */
public void write(List<String> list) throws IOException {
    int size = list.size();
    write(size);
    for (int i = 0; i < size; i++) {
       write(list.get(i));
    }
}

/* TODO do we need this form?
 * @see basics.filesystem.serializer.Serializer#writeListOfStrings(java.util.List)
 */
public void writeListOfStrings(List<String> list) throws IOException
{
   int size = list.size();
   write(size);
   for(int i = 0; i < size; i++)
      write(list.get(i));
}

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#readStringList()
 */
public List<String> readStringList() throws IOException
{
   int size = readInt();
   List<String> list = new ArrayList<String>();
   for(int i = 0; i < size; i++)
      list.add(readString());
   return list;
}

/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#write(java.util.Map)
 */
public void write(Map<String, String> map) throws IOException {
    int size = map.size();
    write(size);
    for (String key: map.keySet()) {
        write(key);
        write(map.get(key));
    }
    
}
/* (non-Javadoc)
 * @see basics.filesystem.serializer.Serializer#readStringMap()
 */
public Map<String, String> readStringMap() throws IOException {
    int size = readInt();
    Map<String,String> map = new HashMap<String,String>();
    for(int i = 0; i < size; i++) {
        map.put(readString(),readString());
    }
    return map;
}

}
