public void introduceType(SpaceTypeDescriptor typeDescriptor) {

    DBCollection m = getConnection().getCollection(METADATA_COLLECTION_NAME);

    BasicDBObjectBuilder builder =
        BasicDBObjectBuilder.start().add(Constants.ID_PROPERTY, typeDescriptor.getTypeName());
    try {
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      ObjectOutputStream out = new ObjectOutputStream(bos);
      IOUtils.writeObject(
          out, SpaceTypeDescriptorVersionedSerializationUtils.toSerializableForm(typeDescriptor));

      builder.add(TYPE_DESCRIPTOR_FIELD_NAME, bos.toByteArray());

      WriteResult wr = m.save(builder.get());

      if (logger.isTraceEnabled()) logger.trace(wr);

      indexBuilder.ensureIndexes(typeDescriptor);

    } catch (IOException e) {
      logger.error(e);

      throw new SpaceMongoException(
          "error occurs while serialize and save type descriptor: " + typeDescriptor, e);
    }
  }
 public DBObject asDBObject() {
   final BasicDBObjectBuilder entryBuilder = BasicDBObjectBuilder.start();
   return entryBuilder
       .add(SERIALIZED_PAYLOAD_PROPERTY, serializedPayload)
       .add(PAYLOAD_TYPE_PROPERTY, payloadType)
       .add(PAYLOAD_REVISION_PROPERTY, payloadRevision)
       .add(EVENT_TIMESTAMP_PROPERTY, timestamp)
       .add(EVENT_SEQUENCE_NUMBER_PROPERTY, sequenceNumber)
       .add(META_DATA_PROPERTY, serializedMetaData)
       .add(EVENT_IDENTIFIER_PROPERTY, eventIdentifier)
       .get();
 }
  private static DBObject normalize(DBObject obj) {
    BasicDBObjectBuilder builder = BasicDBObjectBuilder.start();

    Iterator<String> iterator = obj.keySet().iterator();
    builder.push("$set");
    while (iterator.hasNext()) {

      String key = iterator.next();

      if (Constants.ID_PROPERTY.equals(key)) continue;

      Object value = obj.get(key);

      if (value == null) continue;

      builder.add(key, value);
    }

    return builder.get();
  }