/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * BuildCraft is distributed under the terms of the Minecraft Mod Public * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.core.blueprints; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import org.apache.commons.lang3.ArrayUtils; import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import buildcraft.api.core.ISerializable; import buildcraft.core.lib.utils.NetworkUtils; public final class LibraryId implements Comparable<LibraryId>, ISerializable { public static final char BPT_SEP_CHARACTER = '-'; public byte[] uniqueId; public String name = ""; public String extension = "tpl"; public String completeId; public LibraryId() { } public void generateUniqueId(byte[] data) { try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] id = digest.digest(data); uniqueId = id; } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } public void write(NBTTagCompound nbt) { nbt.setByteArray("uniqueBptId", uniqueId); nbt.setString("name", name); nbt.setString("extension", extension); } public void read(NBTTagCompound nbt) { uniqueId = nbt.getByteArray("uniqueBptId"); name = nbt.getString("name"); if (nbt.hasKey("kind")) { extension = nbt.getByte("kind") > 0 ? "bpt" : "tpl"; } else { extension = nbt.getString("extension"); } } @Override public boolean equals(Object obj) { if (obj instanceof LibraryId) { return Arrays.equals(uniqueId, ((LibraryId) obj).uniqueId); } else { return false; } } @Override public int hashCode() { return Arrays.hashCode(ArrayUtils.addAll(uniqueId, name.getBytes())); } public String getCompleteId() { if (completeId == null) { if (uniqueId.length > 0) { completeId = name + BPT_SEP_CHARACTER + toString(uniqueId); } else { completeId = name; } } return completeId; } @Override public String toString() { return getCompleteId(); } private static char toHex(int i) { if (i < 10) { return (char) ('0' + i); } else { return (char) ('a' - 10 + i); } } private static int fromHex(char c) { if (c >= '0' && c <= '9') { return c - '0'; } else { return c - ('a' - 10); } } @Override public int compareTo(LibraryId o) { return getCompleteId().compareTo(o.getCompleteId()); } public static String toString(byte[] bytes) { char[] ret = new char[bytes.length * 2]; for (int i = 0; i < bytes.length; i++) { int val = bytes[i] + 128; ret[i * 2] = toHex(val >> 4); ret[i * 2 + 1] = toHex(val & 0xf); } return new String(ret); } public static byte[] toBytes(String suffix) { byte[] result = new byte[suffix.length() / 2]; for (int i = 0; i < result.length; ++i) { result[i] = (byte) ((byte) (fromHex(suffix.charAt(i * 2 + 1))) + (byte) (fromHex(suffix.charAt(i * 2)) << 4)); result[i] -= 128; } return result; } @Override public void readData(ByteBuf stream) { uniqueId = NetworkUtils.readByteArray(stream); name = NetworkUtils.readUTF(stream); extension = NetworkUtils.readUTF(stream); } @Override public void writeData(ByteBuf stream) { NetworkUtils.writeByteArray(stream, uniqueId); NetworkUtils.writeUTF(stream, name); NetworkUtils.writeUTF(stream, extension); } }