/* (non-Javadoc)
   * @see uk.ac.ucl.excites.sapelli.collector.db.ProjectStore#deserialise(java.io.InputStream)
   */
  @Override
  public Project deserialise(InputStream in) throws IOException {
    // Deserialise valueSet:
    BitInputStream bitsIn = new BitWrapInputStream(in);
    ValueSet<ColumnSet> serialisedProjectVS = new ValueSet<ColumnSet>(PROJECT_SERIALISIATION_CS);
    serialisedProjectVS.readFromBitStream(bitsIn, true);
    bitsIn.close();

    // Retrieve FSI records:
    List<byte[]> fsiRecordBytesList =
        PROJECT_SERIALISIATION_FSI_RECORDS_COLUMN.retrieveValue(serialisedProjectVS);
    final List<Record> fsiRecords = new ArrayList<Record>(fsiRecordBytesList.size());
    for (byte[] fsiRecordBytes : fsiRecordBytesList)
      fsiRecords.add(FSI_SCHEMA.createRecord(fsiRecordBytes, true));

    // Retrieve & parse Project XML:
    return ProjectLoader.ParseProjectXML(
        new ByteArrayInputStream(
            PROJECT_SERIALISIATION_XML_COLUMN.retrieveValue(serialisedProjectVS)),
        new FormSchemaInfoProvider() {
          @Override
          public List<String> getByPassableFieldIDs(Form form) {
            for (Record fsiRecord : fsiRecords)
              if (FSI_FORM_POSITION_COLUMN.retrieveValue(fsiRecord).shortValue()
                  == form.getPosition())
                return ProjectRecordStore.this.getByPassableFieldIDs(fsiRecord);
            return null;
          }
        });
  }