/* * Created by LuaView. * Copyright (c) 2017, Alibaba Group. All rights reserved. * * This source code is licensed under the MIT. * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree. */ package com.taobao.luaview.userdata.kit; import com.taobao.luaview.userdata.base.BaseUserdata; import com.taobao.luaview.util.JsonUtil; import org.luaj.vm2.Globals; import org.luaj.vm2.LuaValue; import org.luaj.vm2.Varargs; import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; /** * Data 用户数据封装,二进制数据 * * @author song * @date 15/9/6 */ public class UDData extends BaseUserdata { private static final int DEFAULT_BUFFER_SIZE = 128; public static final String DEFAULT_ENCODE = "utf-8"; public UDData(Globals globals, LuaValue metatable, Varargs varargs) { super(new ByteArrayOutputStream(DEFAULT_BUFFER_SIZE), globals, metatable, varargs); init(); } private void init() { ByteArrayOutputStream byteArrayBuffer = (ByteArrayOutputStream) userdata(); if (initParams != null) { try { for (int i = 0; i < initParams.narg(); i++) { Object obj = initParams.arg(i + 1); String str = String.valueOf(obj); byte[] data = str.getBytes(DEFAULT_ENCODE); byteArrayBuffer.write(data, 0, data.length); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } /** * get bytes of this data * @return */ public byte[] bytes() { if (userdata() instanceof ByteArrayOutputStream) { return ((ByteArrayOutputStream) userdata()).toByteArray(); } return null; } @Override public LuaValue add(LuaValue data2) { return new UDData(getGlobals(), getmetatable(), null).append(this).append(data2); } /** * 新增一部分数据 * * @param appendData * @return */ public UDData append(Object appendData) { ByteArrayOutputStream result = (ByteArrayOutputStream) this.userdata(); if (appendData instanceof UDData) { ByteArrayOutputStream buffer2 = (ByteArrayOutputStream) ((UDData) appendData).userdata(); result.write(buffer2.toByteArray(), 0, buffer2.size()); } else if (appendData instanceof byte[]) { byte[] buffer2 = (byte[]) appendData; result.write(buffer2, 0, buffer2.length); } return this; } @Override public String tojstring() { return toString(DEFAULT_ENCODE); } @Override public String toString() { return tojstring(); } /** * 转成给定的编码字符 * * @param encode * @return */ public String toString(String encode) { ByteArrayOutputStream buffer = (ByteArrayOutputStream) userdata(); try { return (buffer != null && buffer.size() > 0) ? new String(buffer.toByteArray(), encode != null ? encode : DEFAULT_ENCODE) : ""; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return ""; } /** * 将string转成方便阅读的Json数据 * * @param encode * @return */ public String toJson(String encode) { final String jsonString = toString(encode); return JsonUtil.isJson(jsonString) ? jsonString : null; } /** * 转成LuaTable * * @param encode * @return */ public LuaValue toTable(String encode) { final String jsonString = toString(encode); return JsonUtil.toLuaTable(jsonString); } }