/* * 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 <http://www.gnu.org/licenses/>. */ package com.torodb.kvdocument.conversion.mongowp; import static com.eightkdata.mongowp.bson.BinarySubtype.FUNCTION; import static com.eightkdata.mongowp.bson.BinarySubtype.GENERIC; import static com.eightkdata.mongowp.bson.BinarySubtype.MD5; import static com.eightkdata.mongowp.bson.BinarySubtype.OLD_BINARY; import static com.eightkdata.mongowp.bson.BinarySubtype.OLD_UUID; import static com.eightkdata.mongowp.bson.BinarySubtype.USER_DEFINED; import static com.eightkdata.mongowp.bson.BinarySubtype.UUID; import com.eightkdata.mongowp.bson.BsonArray; import com.eightkdata.mongowp.bson.BsonBinary; import com.eightkdata.mongowp.bson.BsonBoolean; import com.eightkdata.mongowp.bson.BsonDateTime; import com.eightkdata.mongowp.bson.BsonDbPointer; import com.eightkdata.mongowp.bson.BsonDeprecated; import com.eightkdata.mongowp.bson.BsonDocument; import com.eightkdata.mongowp.bson.BsonDouble; import com.eightkdata.mongowp.bson.BsonInt32; import com.eightkdata.mongowp.bson.BsonInt64; import com.eightkdata.mongowp.bson.BsonJavaScript; import com.eightkdata.mongowp.bson.BsonJavaScriptWithScope; import com.eightkdata.mongowp.bson.BsonMax; import com.eightkdata.mongowp.bson.BsonMin; import com.eightkdata.mongowp.bson.BsonNull; import com.eightkdata.mongowp.bson.BsonObjectId; import com.eightkdata.mongowp.bson.BsonRegex; import com.eightkdata.mongowp.bson.BsonString; import com.eightkdata.mongowp.bson.BsonTimestamp; import com.eightkdata.mongowp.bson.BsonUndefined; import com.eightkdata.mongowp.bson.BsonValue; import com.eightkdata.mongowp.bson.BsonValueVisitor; import com.eightkdata.mongowp.bson.impl.InstantBsonDateTime; import com.torodb.kvdocument.conversion.mongowp.values.BsonKvString; import com.torodb.kvdocument.values.KvBinary.KvBinarySubtype; import com.torodb.kvdocument.values.KvBoolean; import com.torodb.kvdocument.values.KvDouble; import com.torodb.kvdocument.values.KvInteger; import com.torodb.kvdocument.values.KvLong; import com.torodb.kvdocument.values.KvNull; import com.torodb.kvdocument.values.KvValue; import com.torodb.kvdocument.values.heap.ByteArrayKvMongoObjectId; import com.torodb.kvdocument.values.heap.ByteSourceKvBinary; import com.torodb.kvdocument.values.heap.DefaultKvMongoTimestamp; import com.torodb.kvdocument.values.heap.InstantKvInstant; import com.torodb.kvdocument.values.heap.LongKvInstant; import java.util.function.Function; /** * */ public class FromBsonValueTranslator implements BsonValueVisitor<KvValue<?>, Void>, Function<BsonValue<?>, KvValue<?>> { private FromBsonValueTranslator() { } public static FromBsonValueTranslator getInstance() { return FromBsonValueTranslatorHolder.INSTANCE; } @Override public KvValue<?> apply(BsonValue<?> bsonValue) { return bsonValue.accept(this, null); } @Override public KvValue<?> visit(BsonArray value, Void arg) { return MongoWpConverter.toEagerArray(value); } @Override public KvValue<?> visit(BsonBinary value, Void arg) { KvBinarySubtype subtype; switch (value.getSubtype()) { case FUNCTION: subtype = KvBinarySubtype.MONGO_FUNCTION; break; case GENERIC: subtype = KvBinarySubtype.MONGO_GENERIC; break; case MD5: subtype = KvBinarySubtype.MONGO_MD5; break; case OLD_BINARY: subtype = KvBinarySubtype.MONGO_OLD_BINARY; break; case OLD_UUID: subtype = KvBinarySubtype.MONGO_OLD_UUID; break; case USER_DEFINED: subtype = KvBinarySubtype.MONGO_USER_DEFINED; break; case UUID: subtype = KvBinarySubtype.MONGO_UUID; break; default: subtype = KvBinarySubtype.UNDEFINED; break; } return new ByteSourceKvBinary(subtype, value.getNumericSubType(), value.getByteSource() .getDelegate()); } @Override public KvValue<?> visit(BsonDbPointer value, Void arg) { throw new UnsupportedBsonTypeException(value.getType()); } @Override public KvValue<?> visit(BsonDateTime value, Void arg) { if (value instanceof InstantBsonDateTime) { return new InstantKvInstant(value.getValue()); } return new LongKvInstant(value.getMillisFromUnix()); } @Override public KvValue<?> visit(BsonDocument value, Void arg) { return MongoWpConverter.toEagerDocument(value); } @Override public KvValue<?> visit(BsonDouble value, Void arg) { return KvDouble.of(value.doubleValue()); } @Override public KvValue<?> visit(BsonInt32 value, Void arg) { return KvInteger.of(value.intValue()); } @Override public KvValue<?> visit(BsonInt64 value, Void arg) { return KvLong.of(value.longValue()); } @Override public KvValue<?> visit(BsonBoolean value, Void arg) { if (value.getPrimitiveValue()) { return KvBoolean.TRUE; } return KvBoolean.FALSE; } @Override public KvValue<?> visit(BsonJavaScript value, Void arg) { throw new UnsupportedBsonTypeException(value.getType()); } @Override public KvValue<?> visit(BsonJavaScriptWithScope value, Void arg) { throw new UnsupportedBsonTypeException(value.getType()); } @Override public KvValue<?> visit(BsonMax value, Void arg) { throw new UnsupportedBsonTypeException(value.getType()); } @Override public KvValue<?> visit(BsonMin value, Void arg) { throw new UnsupportedBsonTypeException(value.getType()); } @Override public KvValue<?> visit(BsonNull value, Void arg) { return KvNull.getInstance(); } @Override public KvValue<?> visit(BsonObjectId value, Void arg) { return new ByteArrayKvMongoObjectId(value.toByteArray()); } @Override public KvValue<?> visit(BsonRegex value, Void arg) { throw new UnsupportedBsonTypeException(value.getType()); } @Override public KvValue<?> visit(BsonString value, Void arg) { return new BsonKvString(value); } @Override public KvValue<?> visit(BsonUndefined value, Void arg) { return KvNull.getInstance(); } @Override public KvValue<?> visit(BsonTimestamp value, Void arg) { return new DefaultKvMongoTimestamp(value.getSecondsSinceEpoch(), value.getOrdinal()); } @Override public KvValue<?> visit(BsonDeprecated value, Void arg) { throw new UnsupportedBsonTypeException(value.getType()); } private static class FromBsonValueTranslatorHolder { private static final FromBsonValueTranslator INSTANCE = new FromBsonValueTranslator(); } //@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD") private Object readResolve() { return FromBsonValueTranslator.getInstance(); } }