/*
* file: AbstractVarMeta.java
* author: Jon Iles
* copyright: (c) Packwood Software 2002-2005
* date: 05/12/2005
*/
/*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation; either version 2.1 of the License, or (at your
* option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
package net.sf.mpxj.mpp;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import net.sf.mpxj.FieldType;
/**
* This class reads in the data from a VarMeta block. This block contains
* meta data about variable length data items stored in a Var2Data block.
* The meta data allows the size of the Var2Data block to be determined,
* along with the number of data items it contains, identifiers for each item,
* and finally the offset of each item within the block.
*/
abstract class AbstractVarMeta extends MPPComponent implements VarMeta
{
/**
* This method retrieves the number of items in the Var2Data block.
*
* @return number of items
*/
@Override public int getItemCount()
{
return (m_itemCount);
}
/**
* This method retrieves the size of the Var2Data block.
*
* @return data size
*/
@Override public int getDataSize()
{
return (m_dataSize);
}
/**
* This method returns an array containing all of the unique identifiers
* for which data has been stored in the Var2Data block.
*
* @return array of unique identifiers
*/
@Override public Integer[] getUniqueIdentifierArray()
{
Integer[] result = new Integer[m_table.size()];
int index = 0;
for (Integer value : m_table.keySet())
{
result[index] = value;
++index;
}
return (result);
}
/**
* This method returns an set containing all of the unique identifiers
* for which data has been stored in the Var2Data block.
*
* @return set of unique identifiers
*/
@Override public Set<Integer> getUniqueIdentifierSet()
{
return (m_table.keySet());
}
/**
* This method retrieves the offset of a given entry in the Var2Data block.
* Each entry can be uniquely located by the identifier of the object to
* which the data belongs, and the type of the data.
*
* @param id unique identifier of an entity
* @param type data type identifier
* @return offset of requested item
*/
@Override public Integer getOffset(Integer id, Integer type)
{
Integer result = null;
Map<Integer, Integer> map = m_table.get(id);
if (map != null && type != null)
{
result = map.get(type);
}
return (result);
}
/**
* This method retrieves the offset of the data item at
* the position defined by the index parameter.
*
* @param index index of item in the block
* @return offset of the item in the block
*/
@Override public int getOffset(int index)
{
return (m_offsets[index]);
}
/**
* {@inheritDoc}
*/
@Override public Set<Integer> getTypes(Integer id)
{
Set<Integer> result;
Map<Integer, Integer> map = m_table.get(id);
if (map != null)
{
result = map.keySet();
}
else
{
result = new HashSet<Integer>();
}
return (result);
}
/**
* {@inheritDoc}
*/
@Override public boolean containsKey(Integer key)
{
return m_table.containsKey(key);
}
/**
* This method dumps the contents of this VarMeta block as a String.
* Note that this facility is provided as a debugging aid.
*
* @return formatted contents of this block
*/
@Override public String toString()
{
return toString(null);
}
/**
* This method dumps the contents of this VarMeta block as a String.
* Note that this facility is provided as a debugging aid.
*
* @param fieldMap field map used to decode var data keys
* @return formatted contents of this block
*/
@Override public String toString(FieldMap fieldMap)
{
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println("BEGIN: VarMeta");
pw.println(" Item count: " + m_itemCount);
pw.println(" Data size: " + m_dataSize);
for (Integer uniqueID : m_table.keySet())
{
pw.println(" Entries for Unique ID: " + uniqueID);
Map<Integer, Integer> map = m_table.get(uniqueID);
for (Map.Entry<Integer, Integer> entry : map.entrySet())
{
FieldType fieldType = fieldMap == null ? null : fieldMap.getFieldTypeFromVarDataKey(entry.getKey());
pw.println(" Type=" + (fieldType == null ? entry.getKey() : fieldType) + " Offset=" + entry.getValue());
}
}
pw.println("END: VarMeta");
pw.println();
pw.close();
return (sw.toString());
}
//protected int m_unknown1;
protected int m_itemCount;
//protected int m_unknown2;
//protected int m_unknown3;
protected int m_dataSize;
protected int[] m_offsets;
protected Map<Integer, Map<Integer, Integer>> m_table = new TreeMap<Integer, Map<Integer, Integer>>();
}