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

org.rx.bean.SUID Maven / Gradle / Ivy

There is a newer version: 3.0.0
Show newest version
package org.rx.bean;

import com.alibaba.fastjson.annotation.JSONType;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import io.netty.buffer.ByteBuf;
import lombok.*;
import org.rx.annotation.ErrorCode;
import org.rx.core.StringBuilder;
import org.rx.exception.ApplicationException;
import org.rx.io.Bytes;
import org.rx.codec.MD5Util;

import java.io.IOException;
import java.io.Serializable;
import java.lang.reflect.Type;
import java.util.Base64;
import java.util.UUID;

import static org.rx.core.Extends.values;

@JSONType(serializer = SUID.Serializer.class, deserializer = SUID.Serializer.class)
@EqualsAndHashCode
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public final class SUID implements Serializable {
    public static class Serializer implements ObjectSerializer, ObjectDeserializer {
        @Override
        public  T deserialze(DefaultJSONParser parser, Type fieldType, Object fieldName) {
            return (T) SUID.valueOf(parser.parse().toString());
        }

        @Override
        public int getFastMatchToken() {
            return 0;
        }

        @Override
        public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
            serializer.write(object.toString());
        }
    }

    private static final long serialVersionUID = -8613691951420514734L;

    public static SUID compute(String data) {
        return valueOf(newUUID(MD5Util.md5(data)));
    }

    @ErrorCode
    public static SUID valueOf(@NonNull String suid) {
        switch (suid.length()) {
            case 22:
                return new SUID(newUUID(Base64.getUrlDecoder().decode(suid)));
            case 32:
            case 36:
                if (suid.length() == 32) {
                    suid = new StringBuilder().append(suid.substring(0, 8)).append("-")
                            .append(suid.substring(8, 12)).append("-")
                            .append(suid.substring(12, 16)).append("-")
                            .append(suid.substring(16, 20)).append("-")
                            .append(suid.substring(20, 32)).toString();
                }
                return new SUID(UUID.fromString(suid));
        }
        throw new ApplicationException(values(suid));
    }

    public static SUID randomSUID() {
        return valueOf(UUID.randomUUID());
    }

    public static SUID valueOf(UUID uuid) {
        return new SUID(uuid);
    }

    public static UUID newUUID(byte[] guidBytes) {
        long msb = 0, lsb = 0;
        for (int i = 0; i < 8; i++) {
            msb = (msb << 8) | (guidBytes[i] & 0xff);
        }
        for (int i = 8; i < 16; i++) {
            lsb = (lsb << 8) | (guidBytes[i] & 0xff);
        }
        return new UUID(msb, lsb);
    }

    @Getter
    private final UUID uuid;
    private transient String base64String;

    public String getBase64String() {
        if (base64String == null) {
            ByteBuf buf = Bytes.heapBuffer(16, false)
                    .writeLong(uuid.getMostSignificantBits())
                    .writeLong(uuid.getLeastSignificantBits());
            try {
                base64String = Bytes.toString(Base64.getUrlEncoder().withoutPadding().encode(buf.nioBuffer()));
            } finally {
                buf.release();
            }
        }
        return base64String;
    }

    @Override
    public String toString() {
        return getBase64String();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy