All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.torodb.kvdocument.conversion.mongowp.ToBsonValueTranslator Maven / Gradle / Ivy

The newest version!
/*
 * ToroDB
 * Copyright © 2014 8Kdata Technology (www.8kdata.com)
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see .
 */

package com.torodb.kvdocument.conversion.mongowp;

import static com.torodb.mongowp.bson.utils.DefaultBsonValues.newArray;
import static com.torodb.mongowp.bson.utils.DefaultBsonValues.newBoolean;
import static com.torodb.mongowp.bson.utils.DefaultBsonValues.newDecimal128;
import static com.torodb.mongowp.bson.utils.DefaultBsonValues.newDocument;
import static com.torodb.mongowp.bson.utils.DefaultBsonValues.newDouble;
import static com.torodb.mongowp.bson.utils.DefaultBsonValues.newInt;
import static com.torodb.mongowp.bson.utils.DefaultBsonValues.newLong;
import static com.torodb.mongowp.bson.utils.DefaultBsonValues.newString;

import com.torodb.kvdocument.values.KvArray;
import com.torodb.kvdocument.values.KvBinary;
import com.torodb.kvdocument.values.KvBoolean;
import com.torodb.kvdocument.values.KvDate;
import com.torodb.kvdocument.values.KvDecimal128;
import com.torodb.kvdocument.values.KvDeprecated;
import com.torodb.kvdocument.values.KvDocument;
import com.torodb.kvdocument.values.KvDocument.DocEntry;
import com.torodb.kvdocument.values.KvDouble;
import com.torodb.kvdocument.values.KvInstant;
import com.torodb.kvdocument.values.KvInteger;
import com.torodb.kvdocument.values.KvLong;
import com.torodb.kvdocument.values.KvMaxKey;
import com.torodb.kvdocument.values.KvMinKey;
import com.torodb.kvdocument.values.KvMongoDbPointer;
import com.torodb.kvdocument.values.KvMongoJavascript;
import com.torodb.kvdocument.values.KvMongoJavascriptWithScope;
import com.torodb.kvdocument.values.KvMongoObjectId;
import com.torodb.kvdocument.values.KvMongoRegex;
import com.torodb.kvdocument.values.KvMongoTimestamp;
import com.torodb.kvdocument.values.KvNull;
import com.torodb.kvdocument.values.KvString;
import com.torodb.kvdocument.values.KvTime;
import com.torodb.kvdocument.values.KvUndefined;
import com.torodb.kvdocument.values.KvValue;
import com.torodb.kvdocument.values.KvValueVisitor;
import com.torodb.mongowp.bson.BinarySubtype;
import com.torodb.mongowp.bson.BsonBinary;
import com.torodb.mongowp.bson.BsonDbPointer;
import com.torodb.mongowp.bson.BsonDocument.Entry;
import com.torodb.mongowp.bson.BsonJavaScript;
import com.torodb.mongowp.bson.BsonMax;
import com.torodb.mongowp.bson.BsonMin;
import com.torodb.mongowp.bson.BsonObjectId;
import com.torodb.mongowp.bson.BsonRegex;
import com.torodb.mongowp.bson.BsonTimestamp;
import com.torodb.mongowp.bson.BsonType;
import com.torodb.mongowp.bson.BsonUndefined;
import com.torodb.mongowp.bson.BsonValue;
import com.torodb.mongowp.bson.abst.AbstractBsonDocument.SimpleEntry;
import com.torodb.mongowp.bson.impl.ByteArrayBsonBinary;
import com.torodb.mongowp.bson.impl.ByteArrayBsonObjectId;
import com.torodb.mongowp.bson.impl.DefaultBsonDbPointer;
import com.torodb.mongowp.bson.impl.DefaultBsonJavaScript;
import com.torodb.mongowp.bson.impl.DefaultBsonJavaScriptWithCode;
import com.torodb.mongowp.bson.impl.DefaultBsonRegex;
import com.torodb.mongowp.bson.impl.DefaultBsonTimestamp;
import com.torodb.mongowp.bson.impl.LongBsonDateTime;
import com.torodb.mongowp.bson.impl.SimpleBsonMax;
import com.torodb.mongowp.bson.impl.SimpleBsonMin;
import com.torodb.mongowp.bson.impl.SimpleBsonUndefined;
import com.torodb.mongowp.bson.impl.StringBsonDeprecated;
import com.torodb.mongowp.bson.utils.DefaultBsonValues;

import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

import javax.annotation.Nonnull;

public class ToBsonValueTranslator
    implements KvValueVisitor, Void>, Function, BsonValue> {

  private ToBsonValueTranslator() {}

  @Override
  public BsonValue apply(@Nonnull KvValue kvValue) {
    return kvValue.accept(this, null);
  }

  public static ToBsonValueTranslator getInstance() {
    return ToBsonValueTranslatorHolder.INSTANCE;
  }

  @Override
  public BsonValue visit(KvBoolean value, Void arg) {
    return newBoolean(value.getPrimitiveValue());
  }

  @Override
  public BsonValue visit(KvNull value, Void arg) {
    return DefaultBsonValues.NULL;
  }

  @Override
  public BsonValue visit(KvArray value, Void arg) {
    List> list = new ArrayList<>(value.size());
    for (KvValue kVValue : value) {
      list.add(kVValue.accept(this, arg));
    }
    return newArray(list);
  }

  @Override
  public BsonValue visit(KvInteger value, Void arg) {
    return newInt(value.intValue());
  }

  @Override
  public BsonValue visit(KvLong value, Void arg) {
    return newLong(value.longValue());
  }

  @Override
  public BsonValue visit(KvDouble value, Void arg) {
    return newDouble(value.doubleValue());
  }

  @Override
  public BsonValue visit(KvString value, Void arg) {
    return newString(value.getValue());
  }

  @Override
  public BsonValue visit(KvDocument value, Void arg) {
    List> entryList = new ArrayList<>(value.size());
    for (DocEntry docEntry : value) {
      entryList.add(new SimpleEntry<>(docEntry.getKey(), docEntry.getValue().accept(this, arg)));
    }
    return newDocument(entryList);
  }

  @Override
  public BsonValue visit(KvMongoObjectId value, Void arg) {
    return new ByteArrayBsonObjectId(value.getArrayValue());
  }

  @Override
  public BsonValue visit(KvInstant value, Void arg) {
    return new LongBsonDateTime(value.getMillisFromUnix());
  }

  @Override
  public BsonValue visit(KvDate value, Void arg) {
    List> entryList = new ArrayList<>(2);
    entryList.add(new SimpleEntry<>("type", newString("KVDate")));
    entryList.add(
        new SimpleEntry<>("value", newString(value.getValue().format(DateTimeFormatter.ISO_DATE))));

    return newDocument(entryList);
  }

  @Override
  public BsonValue visit(KvTime value, Void arg) {
    List> entryList = new ArrayList<>(2);
    entryList.add(new SimpleEntry<>("type", newString("KVTime")));
    entryList.add(
        new SimpleEntry<>("value", newString(value.getValue().format(DateTimeFormatter.ISO_TIME))));

    return newDocument(entryList);
  }

  @Override
  public BsonBinary visit(KvBinary value, Void arg) {
    BinarySubtype subtype;
    switch (value.getSubtype()) {
      case MONGO_FUNCTION:
        subtype = BinarySubtype.FUNCTION;
        break;
      case MONGO_GENERIC:
        subtype = BinarySubtype.GENERIC;
        break;
      case MONGO_MD5:
        subtype = BinarySubtype.MD5;
        break;
      case MONGO_OLD_BINARY:
        subtype = BinarySubtype.OLD_BINARY;
        break;
      case MONGO_OLD_UUID:
        subtype = BinarySubtype.OLD_UUID;
        break;
      case MONGO_USER_DEFINED:
        subtype = BinarySubtype.USER_DEFINED;
        break;
      case MONGO_UUID:
        subtype = BinarySubtype.UUID;
        break;
      case UNDEFINED:
        subtype = BinarySubtype.USER_DEFINED;
        break;
      default:
        throw new AssertionError("It is not defined how to translate "
                + "the binary subtype " + value.getSubtype() + " to"
                + "MongoDB binaries subtypes");
    }
    byte byteType = value.getCategory();
    return new ByteArrayBsonBinary(subtype, byteType, value.getByteSource().read());
  }

  @Override
  public BsonTimestamp visit(KvMongoTimestamp value, Void arg) {
    return new DefaultBsonTimestamp(value.getSecondsSinceEpoch(), value.getOrdinal());
  }

  @Override
  public BsonValue visit(KvDecimal128 value, Void arg) {
    return newDecimal128(value.getHigh(), value.getLow());
  }

  @Override
  public BsonJavaScript visit(KvMongoJavascript value, Void arg) {
    return new DefaultBsonJavaScript(value.getValue());
  }

  @Override
  public DefaultBsonJavaScriptWithCode visit(KvMongoJavascriptWithScope value, Void arg) {
    //We don't support this because our string
    throw new UnsupportedBsonTypeException(BsonType.JAVA_SCRIPT_WITH_SCOPE);
  }

  @Override
  public BsonMin visit(KvMinKey value, Void arg) {
    return SimpleBsonMin.getInstance();
  }

  @Override
  public BsonMax visit(KvMaxKey value, Void arg) {
    return SimpleBsonMax.getInstance();
  }

  @Override
  public BsonUndefined visit(KvUndefined value, Void arg) {
    return SimpleBsonUndefined.getInstance();
  }

  @Override
  public BsonRegex visit(KvMongoRegex value, Void arg) {
    return new DefaultBsonRegex(value.getOptionsAsText(), value.getPattern());
  }

  @Override
  public BsonDbPointer visit(KvMongoDbPointer value, Void arg) {
    return new DefaultBsonDbPointer(value.getNamespace(), (BsonObjectId) visit(value.getId(), arg));
  }

  @Override
  public BsonValue visit(KvDeprecated value, Void arg) {
    return new StringBsonDeprecated(value.getValue());
  }

  private static class ToBsonValueTranslatorHolder {

    private static final ToBsonValueTranslator INSTANCE = new ToBsonValueTranslator();
  }

  //@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD")
  private Object readResolve() {
    return ToBsonValueTranslator.getInstance();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy