/*
* Copyright 2008-2010 biaoping.yin
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.frameworkset.soa;
import java.beans.IntrospectionException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.UUID;
import org.frameworkset.soa.SerialFactory.MagicClass;
import org.frameworkset.spi.SOAApplicationContext;
import org.frameworkset.util.ClassUtil;
import org.frameworkset.util.ClassUtil.ClassInfo;
import org.frameworkset.util.ClassUtil.PropertieDescription;
import com.frameworkset.util.ValueObjectUtil;
/**
* <p>
* Title: ObjectSerializable.java
* </p>
* <p>
* Description: 解决对象方法调用转换为xml串的功能
* </p>
* <p>
* bboss workgroup
* </p>
* <p>
* Copyright (c) 2008
* </p>
*
* @Date 2011-5-10 上午11:14:21
* @author biaoping.yin
* @version 1.0
*/
public class ObjectSerializable {
public static final String content_header_gbk = "<?xml version=\"1.0\" encoding=\"gbk\"?>";
public static final String content_header_utf_8 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
public static final String call_header = "<esb><call>";
public static final String call_tailer = "</call></esb>";
public static final String CHARSET_UTF_8 = "UTF-8";
public static final String CHARSET_GBK = "GBK";
public static final String[] throwable_filterattributes = new String[] {
"message", "cause" };
/**
* 标识null值类型
*/
public static final String NULL_TYPE = "s:nvl";
/**
* @deprecated use method toObject(xml,Class)
* @return
*/
public static <T> T convertXMLToBeanObject(String name, String beanxml,
Class<T> beantype) {
SOAApplicationContext context = new SOAApplicationContext(beanxml);
T object = context.getTBeanObject(name, beantype);
context.destroy();
return object;
}
private static void convertMethodCallToXMLMethod(Writer ret,
String methodName, Object[] params, Class[] paramTypes,
String charset) throws Exception {
SerialStack stack = new SerialStack();
ret
.append("<p n=\"soamethodcall\" ")
.append("cs=\"org.frameworkset.soa.SOAMethodCall\" >")
.append(
"<p n=\"soamethodinfo\" cs=\"org.frameworkset.soa.SOAMethodInfo\" ")
.append("f:methodName=\"").append(methodName).append("\">");
if (paramTypes == null || paramTypes.length == 0) {
ret.append("<p n=\"params\" s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(Object[].class)).append(
"\"/>");
} else {
ret.append("<p n=\"params\">").append("<a cmt=\"").append(
ValueObjectUtil.getComponentTypeName(Object[].class))
.append("\">");
{
stack.addStack(params, "params");
ObjectSerializable.convertParams(ret, params, paramTypes, null,stack,"params");
}
ret.append("</a></p>");
}
stack.clear();
ret.append("</p></p>");
// SOAMethodCall method = new SOAMethodCall();
// return convertSOAMethodCallToXMLMethod(method);
}
public static String convertMethodCallToXMLMethod(Method method,
Object[] params, Class[] paramTypes, String charset)
throws Exception {
Writer ret = null;
try {
ret = new BBossStringWriter();
// if (charset.equals(CHARSET_UTF_8)) {
// ret.append(content_header_utf_8);
// } else
// ret.append(content_header_gbk);
ret.append(call_header);
convertMethodCallToXMLMethod(ret, method.getName(), params, paramTypes,
charset);
ret.append(call_tailer);
// ret.flush();
// return out.toString(charset);
return ret.toString();
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
finally
{
if(ret != null)
ret = null;
}
}
public static String convertSOAMethodCallToXMLMethod(SOAMethodCall method,
String charset) throws Exception,
IntrospectionException {
Writer ret = null;
try {
ret = new BBossStringWriter();
// if (charset.equals(CHARSET_UTF_8)) {
// ret.append(content_header_utf_8);
// } else
// ret.append(content_header_gbk);
ret.append(call_header);
SerialStack stack = new SerialStack();
convertBeanObjectToXML("soamethodcall", method, method.getClass(),false,
null, ret,stack,"soamethodcall",false);
stack.clear();
ret.append(call_tailer);
return ret.toString();
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
finally
{
if(ret != null)
ret = null;
}
}
public final static String convertBeanObjectToXML(Object obj, Class type,
String dateformat) throws Exception,
IntrospectionException {
Writer ret = null;
try {
ret = new BBossStringWriter();
SerialStack stack = new SerialStack();
String name = UUID.randomUUID().toString();
convertBeanObjectToXML(name, obj, type, ValueObjectUtil.isBasePrimaryType(type),dateformat, ret,stack,name,false);
stack.clear();
return ret.toString();
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
finally
{
if(ret != null)
ret = null;
}
}
/**
* @deprecated use Method toXML( Object obj).
*/
public final static String convertBeanObjectToXML(String name, Object obj,
Class type) throws Exception {
return convertBeanObjectToXML(name, obj, type, (String) null,
CHARSET_UTF_8);
}
public final static String toXML(Object obj) throws Exception {
if (obj == null)
return null;
return convertBeanObjectToXML("_dflt_", obj, obj.getClass(),
(String) null, CHARSET_UTF_8);
}
public final static String toXML(Object obj,String charset) throws Exception {
if (obj == null)
return null;
return convertBeanObjectToXML("_dflt_", obj, obj.getClass(),
(String) null, charset);
}
public final static void toXML(Object obj, Writer out)
throws Exception {
if (obj == null)
return ;
convertBeanObjectToXML("_dflt_", obj,
obj.getClass(), null, CHARSET_UTF_8,out);
// return convertBeanObjectToXML("_dflt_", obj, obj.getClass(),
// (String) null, CHARSET_UTF_8);
}
public static <T> T toBean(String beanxml, Class<T> beantype,String charset)
{
SOAApplicationContext context = new SOAApplicationContext(beanxml,charset,false);
context.setSerial(true);
context.init();
T object = context.getTBeanObject("_dflt_", beantype);
context.destroy();
return object;
}
public static <T> T toBean(String beanxml, Class<T> beantype) {
if (beanxml == null || beanxml.equals(""))
return null;
SOAApplicationContext context = new SOAApplicationContext(beanxml,false);
context.setSerial(true);
context.init();
T object = context.getTBeanObject("_dflt_", beantype);
context.destroy();
return object;
}
public static <T> T toBean(InputStream instream, Class<T> beantype) {
if (instream == null)
return null;
SOAApplicationContext context = new SOAApplicationContext(instream,false);
context.setSerial(true);
context.init();
T object = context.getTBeanObject("_dflt_", beantype);
context.destroy();
return object;
}
// public final static String convertBeanObjectToXML(String name, Object obj,
// Class type, String dateformat, String charset)
// throws NumberFormatException, IllegalArgumentException,
// IntrospectionException {
// StringBuffer ret = new StringBuffer();
//
// if (charset.equals(CHARSET_UTF_8)) {
// ret.append(content_header_utf_8);
// } else
// ret.append(content_header_utf_8);
// ret.append("<ps>");
// convertBeanObjectToXML(name, obj, type, dateformat, ret);
// ret.append("</ps>");
// return ret.toString();
// }
public final static String convertBeanObjectToXML1(String name, Object obj,
Class type, String dateformat, String charset)
throws Exception {
Writer ret = null;
try
{
ret = new BBossStringWriter();
convertBeanObjectToXML(name, obj,
type, dateformat, charset,ret);
// return new String(out.toByteArray(),charset);
return ret.toString();
}
finally
{
if(ret != null)
ret = null;
}
}
public final static String convertBeanObjectToXML(String name, Object obj,
Class type, String dateformat, String charset)
throws Exception {
// java.io.ByteArrayOutputStream out = null;
Writer ret = null;
try
{
// out = new java.io.ByteArrayOutputStream();
// ret = new OutputStreamWriter(out,Charset.forName(charset));
ret = new BBossStringWriter();
convertBeanObjectToXML(name, obj,
type, dateformat, charset,ret);
// return new String(out.toByteArray(),charset);
// return out.toString(charset);
return ret.toString();
}
finally
{
// if(out != null)
// try {
// out.close();
// } catch (IOException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
if(ret != null)
ret = null;
}
}
public final static void convertBeanObjectToXML(String name, Object obj,
Class ptype, String dateformat, String charset,Writer ret)
throws Exception {
// StringBuffer ret = new StringBuffer();
try {
// if (charset.equals(CHARSET_UTF_8)) {
// ret.append(content_header_utf_8);
// } else
// ret.append(content_header_gbk);
ret.append("<ps>");
SerialStack stack = new SerialStack();
convertBeanObjectToXML(name, obj, ptype,ValueObjectUtil.isBasePrimaryType(ptype), dateformat, ret,stack,name,false);
stack.clear();
ret.append("</ps>");
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
// return ret.toString();
}
public final static String convertBeanObjectToXML(Object obj, Class type)
throws Exception {
Writer ret = new BBossStringWriter();
try {
SerialStack stack = new SerialStack();
String name = UUID.randomUUID().toString();
convertBeanObjectToXML(name, obj, type,ValueObjectUtil.isBasePrimaryType(type), null, ret,stack,name,false);
stack.clear();
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
return ret.toString();
//
// java.io.ByteArrayOutputStream out = null;
// OutputStreamWriter ret = null;
//
//
// try
// {
// out = new java.io.ByteArrayOutputStream();
// ret = new OutputStreamWriter(out,Charset.forName(CHARSET_UTF_8));
// SerialStack stack = new SerialStack();
// String name = UUID.randomUUID().toString();
// convertBeanObjectToXML(name, obj, type, null, ret,stack,name);
// stack.clear();
// ret.flush();
// return out.toString(CHARSET_UTF_8);
// }
// finally
// {
// if(out != null)
// try {
// out.close();
// } catch (IOException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
// if(ret != null)
// try {
// ret.close();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
}
public final static String convertBeanObjectsToXML(List<String> names,
List<Object> objs, List<Class> types) throws Exception {
return convertBeanObjectsToXML(names, objs, types, CHARSET_UTF_8);
}
public final static String convertBeanObjectsToXML(List<String> names,
List<Object> objs, List<Class> types, String charset)
throws Exception {
Writer ret = null;
try {
ret = new BBossStringWriter();
// if (charset.equals(CHARSET_UTF_8)) {
// ret.append(content_header_utf_8);
// } else
// ret.append(content_header_gbk);
ret.append("<ps>");
if (objs != null && objs.size() > 0) {
int i = 0;
SerialStack stack = new SerialStack();
for (Object obj : objs) {
convertBeanObjectToXML(names.get(i), obj, types.get(i), ValueObjectUtil.isBasePrimaryType(types.get(i)),null,
ret,stack,names.get(i),false);
i++;
}
}
ret.append("</ps>");
return ret.toString();
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
finally
{
if(ret != null)
ret = null;
}
}
private static void arraytoxml(Writer ret,Object obj,String dateformat,String name,Class vtype,SerialStack serialStack,String currentAddress) throws Exception
{
if (obj == null) {
if (name == null)
ret.append("<p s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getTypeName(vtype)).append(
"\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getTypeName(vtype)).append(
"\"/>");
return;
} else {
// if (name == null)
// ret.append("<p s:t=\"").append(
// ValueObjectUtil.getSimpleTypeName(type)).append(
// "\">");
// else
// {
// ret.append("<p n=\"").append(name).append("\" s:t=\"")
// .append(ValueObjectUtil.getSimpleTypeName(type))
// .append("\">");
// currentAddress = currentAddress + "->" + name;
// }
if (name == null)
ret.append("<p s:t=\"").append(
ValueObjectUtil.getTypeName(vtype)).append(
"\">");
else
{
ret.append("<p n=\"").append(name).append("\" s:t=\"")
.append(ValueObjectUtil.getTypeName(vtype))
.append("\">");
// currentAddress = currentAddress + "->" + name;
}
}
ret.append("<a cmt=\"").append(
ValueObjectUtil.getComponentTypeName(vtype)).append("\">");
Object value = null;
int len = Array.getLength(obj);
for (int i = 0; i < len; i++) {
value = Array.get(obj, i);
if (value == null)
convertBeanObjectToXML(null, value, (Class)null, false,dateformat, ret,serialStack,currentAddress + "[" + i + "]",false);
else
convertBeanObjectToXML(null, value, value.getClass(), ValueObjectUtil.isBasePrimaryType(value.getClass()),
dateformat, ret,serialStack,currentAddress + "[" + i + "]",false);
}
ret.append("</a>");
ret.append("</p>");
}
private static void maptoxml(Writer ret,Object obj,String dateformat,String name,Class vtype,SerialStack serialStack,String currentAddress,ClassInfo classInfo) throws Exception
{
if (obj == null) {
if (name == null)
ret.append("<p s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\"/>");
}
else
{
obj = serialContainerObject( ret,
obj,
name,
vtype,
classInfo,false) ;
if(obj != null)
{
Map datas = (Map) obj;
// if (name == null)
// ret.append("<p s:t=\"").append(
// ValueObjectUtil.getSimpleTypeName(vtype)).append(
// "\">");
// else
// {
// ret.append("<p n=\"").append(name).append("\" s:t=\"")
// .append(ValueObjectUtil.getSimpleTypeName(vtype))
// .append("\">");
//// currentAddress = currentAddress + "->" + name;
// }
ret.append("<m cmt=\"bean\">");
Object value = null;
Iterator itr = datas.entrySet().iterator();
while (itr.hasNext())
{
Map.Entry entry = (Map.Entry) itr.next();
value = entry.getValue();
if (value == null)
convertBeanObjectToXML(String.valueOf(entry.getKey()),
value, (Class)null,false, dateformat, ret,serialStack,currentAddress + "[" + entry.getKey() + "]",false);
else
convertBeanObjectToXML(String.valueOf(entry.getKey()),
value, value.getClass(), ValueObjectUtil.isBasePrimaryType(value.getClass()),dateformat, ret,serialStack,currentAddress + "[" + entry.getKey() + "]",false);
}
ret.append("</m>");
ret.append("</p>");
}
}
}
private static void propertiestoxml(Writer ret,Object obj,String dateformat,String name,Class vtype,SerialStack serialStack,String currentAddress,ClassInfo classInfo) throws Exception
{
if (obj == null) {
if (name == null)
ret.append("<p s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\"/>");
}
else
{
obj = serialContainerObject( ret,
obj,
name,
vtype,
classInfo,false) ;
if(obj != null)
{
Properties datas = (Properties) obj;
// if (name == null)
// ret.append("<p s:t=\"").append(
// ValueObjectUtil.getSimpleTypeName(vtype)).append(
// "\">");
// else
// {
// ret.append("<p n=\"").append(name).append("\" s:t=\"")
// .append(ValueObjectUtil.getSimpleTypeName(vtype))
// .append("\">");
//// currentAddress = currentAddress + "->" + name;
// }
ret.append("<propes>");
Object value = null;
Iterator itr = datas.entrySet().iterator();
while (itr.hasNext())
{
Map.Entry entry = (Map.Entry) itr.next();
value = entry.getValue();
if (value == null)
convertBeanObjectToXML(String.valueOf(entry.getKey()),
value, (Class)null,false, dateformat, ret,serialStack,currentAddress + "[" + entry.getKey() + "]",false);
else
convertBeanObjectToXML(String.valueOf(entry.getKey()),
value, value.getClass(), ValueObjectUtil.isBasePrimaryType(value.getClass()),dateformat, ret,serialStack,currentAddress + "[" + entry.getKey() + "]",false);
}
ret.append("</propes>");
ret.append("</p>");
}
}
}
private static void settoxml(Writer ret,Object obj,String dateformat,String name,Class vtype,SerialStack serialStack,String currentAddress,ClassInfo classInfo) throws Exception
{
if (obj == null) {
if (name == null)
ret.append("<p s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\"/>");
}
else
{
obj = serialContainerObject( ret,
obj,
name,
vtype,
classInfo,false) ;
if(obj != null)
{
Set datas = (Set) obj;
// if (name == null)
// ret.append("<p s:t=\"").append(
// ValueObjectUtil.getSimpleTypeName(vtype)).append(
// "\">");
// else
// {
// ret.append("<p n=\"").append(name).append("\" s:t=\"")
// .append(ValueObjectUtil.getSimpleTypeName(vtype))
// .append("\">");
// // currentAddress = currentAddress + "->" + name;
// }
ret.append("<s cmt=\"bean\">");
Object value = null;
Iterator itr = datas.iterator();
int i = 0;
while (itr.hasNext())
{
value = itr.next();
if (value == null)
convertBeanObjectToXML(null, value, (Class)null,false, dateformat,
ret,serialStack,currentAddress + "[" + i + "]",false);
else
convertBeanObjectToXML(null, value, value.getClass(),ValueObjectUtil.isBasePrimaryType(value.getClass()),
dateformat, ret,serialStack,currentAddress + "[" + i + "]",false);
i ++;
}
ret.append("</s>");
ret.append("</p>");
}
}
}
private static void pluginserial(Object obj,MagicClass magicclass,String handleObjectClass,String name,Writer ret) throws IOException
{
String object = magicclass.getSerailObject().serialize(obj);
if (name == null)
{
if(handleObjectClass != null)
{
ret.append("<p cs=\"")
.append(handleObjectClass)
.append("\" mg=\"")
.append(magicclass.getMagicnumber())
.append("\">");
}
else
{
ret.append("<p mg=\"")
.append(magicclass.getMagicnumber())
.append("\">");
}
}
else
{
if(handleObjectClass != null)
{
ret.append("<p cs=\"")
.append(handleObjectClass)
.append("\" n=\"").append(name).append("\" mg=\"").append(magicclass.getMagicnumber()).append("\">");
}
else
{
ret.append("<p n=\"").append(name).append("\" mg=\"").append(magicclass.getMagicnumber()).append("\">");
}
}
ret.append("<![CDATA[")
.append(object)
.append("]]></p>");
}
private static void appendmghead(String name,MagicClass magicclass,String handleObjectClass,Writer ret,String className) throws IOException
{
if (name == null)
{
if(handleObjectClass != null)
{
ret.append("<p cs=\"")
.append(handleObjectClass)
.append("\" mg=\"")
.append(magicclass.getMagicnumber())
.append("\">");
}
else
{
ret.append("<p mg=\"")
.append(magicclass.getMagicnumber())
.append("\">");
}
}
else
{
if(handleObjectClass != null)
{
ret.append("<p cs=\"")
.append(handleObjectClass)
.append("\" n=\"").append(name).append("\" mg=\"").append(
magicclass.getMagicnumber()).append("\">");
}
else
{
ret.append("<p n=\"").append(name).append("\" mg=\"").append(
magicclass.getMagicnumber()).append("\">");
}
}
}
private static Object serialContainerObject(Writer ret,
Object obj,
String name,
Class vtype,
ClassInfo classInfo,boolean isobject) throws IOException
{
String className = classInfo.getName();
MagicClass magicclass = SerialFactory.getSerialFactory().getMagicClass(className);
String handleObjectClass = null;
if(magicclass != null)
{
if(magicclass.getPreserialObject() != null)
{
obj = magicclass.getPreserialObject().prehandle(obj);
handleObjectClass = magicclass.getPreserialObject().getVClazz();
if(handleObjectClass == null)
handleObjectClass = obj.getClass().getName();
if(handleObjectClass.equals(className))
handleObjectClass = null;
}
if(magicclass.getSerailObject() != null)//指定了序列化插件
{
pluginserial( obj, magicclass, handleObjectClass, name, ret);
return null;
}
else//根据魔法数字构建list头
{
appendmghead( name, magicclass, handleObjectClass, ret, className);
}
}
else
{
String typename = null;
if(isobject)
typename = "cs";
else
typename = "s:t";
if (name == null)
{
ret.append("<p ").append(typename).append(
"=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\">");
}
else
{
ret.append("<p n=\"").append(name).append("\" ").append(typename).append(
"=\"")
.append(ValueObjectUtil.getSimpleTypeName(vtype))
.append("\">");
// currentAddress = currentAddress + "->" + name;
}
}
return obj;
}
private static void listtoxml(Writer ret,Object obj,String dateformat,String name,Class vtype,SerialStack serialStack,String currentAddress,ClassInfo classInfo) throws Exception
{
if (obj == null) {
if (name == null)
ret.append("<p s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\"/>");
return;
}
else
{
obj = serialContainerObject( ret,
obj,
name,
vtype,
classInfo,false) ;//如果已经序列化完毕,则obj为null
if(obj != null)
{
List datas = (List) obj;
ret.append("<l cmt=\"bean\">");
Object value = null;
for (int i = 0; i < datas.size(); i++) {
value = datas.get(i);
if (value == null)
/**
* convertBeanObjectToXML(String name, Object obj,
Class type, String dateformat, Writer ret,SerialStack serialStack,String currentAddress)
*/
convertBeanObjectToXML(null, value, (Class)null,false, dateformat,
ret,serialStack,currentAddress + "[" + i + "]",false);
else
convertBeanObjectToXML(null, value, value.getClass(),ValueObjectUtil.isBasePrimaryType(value.getClass()),
dateformat, ret,serialStack,currentAddress + "[" + i + "]",false);
}
ret.append("</l>");
ret.append("</p>");
}
}
}
private static void stringtoxml(Writer ret,Object obj,String name,Class vtype) throws IOException
{
if (obj == null) {
if (name == null)
ret.append("<p s:nvl=\"true\" s:t=\"String\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:nvl=\"true\" s:t=\"String\"/>");
} else {
if (name == null)
{
// if(!obj.equals(""))
{
ret.append("<p s:t=\"String\"><![CDATA[").append((String)obj)
.append("]]></p>");
}
// else
// {
// ret.append("<p s:t=\"String\" v=\"\"/>");
// }
}
else
{
// if(!obj.equals(""))
{
ret.append("<p n=\"").append(name).append(
"\" s:t=\"String\"><![CDATA[").append((String)obj).append(
"]]></p>");
}
// else
// {
// ret.append("<p n=\"").append(name).append(
// "\" s:t=\"String\" v=\"\"/>");
// }
}
}
}
private static void filetoxml(Writer ret,Object obj,String name,Class vtype) throws IOException
{
if (obj == null) {
if (name == null)
ret.append("<p s:nvl=\"true\" s:t=\"File\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:nvl=\"true\" s:t=\"File\"/>");
return;
} else {
File object = (File) obj;
java.io.FileInputStream byteIn = null;
java.io.ByteArrayOutputStream fileOut = null;
try {
byteIn = new java.io.FileInputStream(object);
fileOut = new java.io.ByteArrayOutputStream();
byte v[] = new byte[1024];
int i = 0;
while ((i = byteIn.read(v)) > 0) {
fileOut.write(v, 0, i);
}
fileOut.flush();
if (name == null)
ret.append("<p s:t=\"File\"><![CDATA[").append(
ValueObjectUtil.byteArrayEncoder(fileOut
.toByteArray())).append("]]></p>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"File\"><![CDATA[").append(
ValueObjectUtil.byteArrayEncoder(fileOut
.toByteArray())).append("]]></p>");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (byteIn != null)
byteIn.close();
} catch (Exception e) {
}
try {
if (fileOut != null)
fileOut.close();
} catch (Exception e) {
}
}
}
}
private static void bytearraytoxml(Writer ret,Object obj,String name,Class vtype) throws IOException
{
if (obj == null) {
if (name == null)
ret.append("<p s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\"/>");
return;
} else {
if (!File.class.isAssignableFrom(vtype)) {
if (name == null)
{
ret
.append("<p s:t=\"")
.append(ValueObjectUtil.getSimpleTypeName(vtype))
.append("\"><![CDATA[")
.append(
ValueObjectUtil
.byteArrayEncoder((byte[]) obj))
.append("]]></p>");
}
else
ret
.append("<p n=\"")
.append(name)
.append("\" s:t=\"")
.append(ValueObjectUtil.getSimpleTypeName(vtype))
.append("\"><![CDATA[")
.append(
ValueObjectUtil
.byteArrayEncoder((byte[]) obj))
.append("]]></p>");
} else {
File object = (File) obj;
java.io.FileInputStream byteIn = null;
java.io.ByteArrayOutputStream fileOut = null;
try {
byteIn = new java.io.FileInputStream(object);
fileOut = new java.io.ByteArrayOutputStream();
byte v[] = new byte[1024];
int i = 0;
while ((i = byteIn.read(v)) > 0) {
fileOut.write(v, 0, i);
}
fileOut.flush();
if (name == null)
ret.append("<p s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype))
.append("\"><![CDATA[").append(
ValueObjectUtil
.byteArrayEncoder(fileOut
.toByteArray()))
.append("]]></p>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype))
.append("\"><![CDATA[").append(
ValueObjectUtil
.byteArrayEncoder(fileOut
.toByteArray()))
.append("]]></p>");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (byteIn != null)
byteIn.close();
} catch (Exception e) {
}
try {
if (fileOut != null)
fileOut.close();
} catch (Exception e) {
}
}
}
}
}
/**
* 根据对象值,对象类型查找到对应的方法,这个玩意儿,比较麻烦
* 需要判读currentAddress为空的情况,biaoping.yin
* @param obj
* @param type
* @param dateformat
* @param ret
* @throws Exception
*/
private final static void convertBeanObjectToXML(String name, Object obj,
Class ptype,boolean pisbasetype, String dateformat, Writer ret,SerialStack serialStack,String currentAddress,boolean frombeanpropety)
throws Exception {
ClassInfo classinfo = null;
Class vtype = null;
if (obj != null)
{
if(!pisbasetype)
{
vtype = obj.getClass();
classinfo = ClassUtil.getClassInfo(vtype);
String address = serialStack.getRefID(obj);
if(address != null)
{
if (name == null)
{
ret
.append("<p refid=\"attr:").append(address)
.append("\"/>");
}
else
{
ret
.append("<p n=\"")
.append(name)
.append("\" refid=\"attr:").append(address)
.append("\"/>");
}
return;
}
else
{
serialStack.addStack(obj, currentAddress);
}
}
else
vtype = ptype;
}
else
{
if(!frombeanpropety)
vtype = ptype;
else
return;
}
if (vtype == byte[].class) {
bytearraytoxml( ret, obj, name, vtype);
return;
}
else if (vtype != null && File.class.isAssignableFrom(vtype)) {
filetoxml(ret, obj, name, vtype);
return;
} else if (vtype == String.class) {
stringtoxml( ret, obj, name, vtype);
return;
} else if (vtype != null && List.class.isAssignableFrom(vtype)) {
listtoxml( ret, obj, dateformat, name, vtype, serialStack, currentAddress,classinfo);
return;
}
else if (vtype != null && Set.class.isAssignableFrom(vtype)) {
settoxml( ret, obj, dateformat, name, vtype, serialStack, currentAddress,classinfo);
}
else if (vtype != null && Properties.class.isAssignableFrom(vtype)) {
propertiestoxml( ret, obj, dateformat, name, vtype, serialStack, currentAddress,classinfo);
}
else if (vtype != null && Map.class.isAssignableFrom(vtype)) {
maptoxml( ret, obj, dateformat, name, vtype, serialStack, currentAddress,classinfo);
} else if (vtype != null && vtype.isArray()) {
arraytoxml( ret, obj, dateformat, name, vtype, serialStack, currentAddress);
}
else {
basicTypeCast(name, obj, vtype, classinfo, dateformat, ret, serialStack,currentAddress);
}
}
/**
* Description:基本的数据类型转圜
*
* @param obj
* @param type
* @param toType
* @return Object
*
* @throws Exception
*
*/
private final static boolean basicTypeCast(String name, Object obj,
Class ptype, ClassInfo classInfo,String dateformat, Writer ret,SerialStack stack,String currentAddress)
throws Exception {
if (obj == null) {
if (name == null)
{
if(ptype != null)
ret.append("<p s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(ptype)).append("\"/>");
else
ret.append("<p s:nvl=\"true\"/>");
}
else
{
if(ptype != null)
{
ret.append("<p n=\"").append(name).append(
"\" s:nvl=\"true\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(ptype)).append("\"/>");
}
else
{
ret.append("<p n=\"").append(name).append(
"\" s:nvl=\"true\"/>");
}
}
return true;
}
Class vtype = obj.getClass();
//
// if (type.isAssignableFrom(toType)) //
// type是toType的父类,父类向子类转换的过程,这个转换过程是不安全的
// {
// if (!java.util.Date.class.isAssignableFrom(type))
// return shell(toType, obj);
// }
/**
* 如果obj的类型不是String型时直接抛异常, 不支持非字符串和字符串数组的类型转换
*/
// if (type != String.class)
// throw new NoSupportTypeCastException(
// new StringBuffer("不支持[")
// .append(type)
// .append("]向[")
// .append(toType)
// .append("]的转换")
// .toString());
/*******************************************
* 字符串向基本类型及其包装器转换 * 如果obj不是相应得数据格式,将抛出 * NumberFormatException *
******************************************/
// 如果是字符串则直接返回obj.toString()
if (ptype == String.class) {
if (name == null)
ret.append("<p s:t=\"String\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"String\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (ptype == long.class ) {
// if (ValueObjectUtil.isNumber(obj))
// return ((Number) obj).longValue();
// else if (java.util.Date.class.isAssignableFrom(type)) {
// return ((java.util.Date) obj).getTime();
// }
// return Long.parseLong(obj.toString());
if (name == null)
ret.append("<p s:t=\"long\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"long\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (ptype == Long.class) {
// if (ValueObjectUtil.isNumber(obj))
// return ((Number) obj).longValue();
// else if (java.util.Date.class.isAssignableFrom(type)) {
// return ((java.util.Date) obj).getTime();
// }
// return Long.parseLong(obj.toString());
if (name == null)
ret.append("<p s:t=\"Long\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"Long\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (ptype == int.class ) {
if (name == null)
ret.append("<p s:t=\"int\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name)
.append("\" s:t=\"int\" v=\"").append(obj.toString()).append(
"\"/>");
return true;
}
else if (ptype == Integer.class) {
if (name == null)
ret.append("<p s:t=\"Integer\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name)
.append("\" s:t=\"Integer\" v=\"").append(obj.toString()).append(
"\"/>");
return true;
}
else if (ptype == float.class) {
if (name == null)
ret.append("<p s:t=\"float\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"float\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (ptype == Float.class) {
if (name == null)
ret.append("<p s:t=\"Float\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"Float\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (ptype == short.class) {
if (name == null)
ret.append("<p s:t=\"short\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"short\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (ptype == Short.class) {
if (name == null)
ret.append("<p s:t=\"Short\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"Short\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (ptype == double.class) {
if (name == null)
ret.append("<p s:t=\"double\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"double\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (ptype == Double.class) {
if (name == null)
ret.append("<p s:t=\"Double\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"Double\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (ptype == char.class ) {
if (name == null)
ret.append("<p s:t=\"char\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"char\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if ( ptype == Character.class) {
if (name == null)
ret.append("<p s:t=\"Character\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"Character\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (ptype == boolean.class) {
if (name == null)
ret.append("<p s:t=\"boolean\" v=\"").append(obj.toString())
.append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"boolean\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (ptype == Boolean.class) {
if (name == null)
ret.append("<p s:t=\"Boolean\" v=\"").append(obj.toString())
.append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"Boolean\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (ptype == byte.class) {
if (name == null)
ret.append("<p s:t=\"byte\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"byte\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if ( ptype == Byte.class) {
if (name == null)
ret.append("<p s:t=\"Byte\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"Byte\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (java.util.Date.class.isAssignableFrom(vtype)) {
// String value = ValueObjectUtil.getDateFormat(dateformat).format(
// (java.util.Date) obj);
long value = ((java.util.Date) obj).getTime();
if (name == null)
ret.append("<p s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\" v=\"").append(String.valueOf(value)).append("\"/>");
else
ret.append("<p n=\"").append(name).append("\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\" v=\"").append(String.valueOf(value)).append("\"/>");
return true;
}
else if (vtype == BigInteger.class) {
if (name == null)
ret.append("<p s:t=\"bigint\" v=\"").append(
(obj.toString())).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"bigint\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (vtype == BigDecimal.class) {
if (name == null)
ret.append("<p s:t=\"bigdecimal\" v=\"").append(
(obj.toString())).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"bigdecimal\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else if (ptype == Class.class) {
if (name == null)
ret.append("<p s:t=\"Class\" v=\"").append(
((Class) obj).getName()).append("\"/>");
else
ret.append("<p n=\"").append(name).append(
"\" s:t=\"Class\" v=\"").append(
((Class) obj).getName()).append("\"/>");
return true;
} else if (vtype.isEnum()) {
if (name == null)
ret.append("<p s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\" v=\"").append(obj.toString()).append("\"/>");
else
ret.append("<p n=\"").append(name).append("\" s:t=\"").append(
ValueObjectUtil.getSimpleTypeName(vtype)).append(
"\" v=\"").append(obj.toString()).append("\"/>");
return true;
}
else // 对象转换及对象状态转换
{
if (StackTraceElement.class.isAssignableFrom(vtype))
{
obj = serialContainerObject(ret, obj, name, vtype, classInfo,true);
if(obj != null)
{
appendStackTraceElementProperties(obj, vtype, dateformat, ret, stack,currentAddress);
}
else
{
return true;
}
// if (name == null)
// ret.append("<p cs=\"")
// .append(obj.getClass().getName())
// .append("\">");
// else
// ret.append("<p n=\"").append(name).append("\" cs=\"").append(
// obj.getClass().getName()).append("\">");
// appendStackTraceElementProperties(obj, vtype, dateformat, ret, stack,currentAddress);
}
else if (Throwable.class.isAssignableFrom(vtype))
{
obj = serialContainerObject(ret, obj, name, vtype, classInfo,true);
if(obj != null)
{
appendThrowableProperties(obj, vtype, dateformat, ret,stack,currentAddress);
}
else
{
return true;
}
// if (name == null)
// ret.append("<p cs=\"")
// .append(obj.getClass().getName())
// .append("\">");
// else
// ret.append("<p n=\"").append(name).append("\" cs=\"").append(
// obj.getClass().getName()).append("\">");
// appendThrowableProperties(obj, vtype, dateformat, ret,stack,currentAddress);
}
else
{
// ClassInfo classInfo = ClassUtil.getClassInfo(obj.getClass());
obj = serialContainerObject(ret, obj, name, vtype, classInfo,true);
if(obj != null)
{
appendBeanProperties(obj, vtype,classInfo, dateformat, ret,stack,currentAddress);
}
else
{
return true;
}
}
ret.append("</p>");
return true;
}
}
private static void appendThrowableProperties(Object obj, Class type,
String dateformat, Writer ret,SerialStack stack,String currentAddress) throws Exception {
// BeanInfo beanInfo = Introspector.getBeanInfo(type);
// ClassInfo beanInfo = ClassUtil.getClassInfo(type);
//
// List<PropertieDescription> attributes = beanInfo.getPropertyDescriptors();
ret.append("<construction>");
try {
Object value = ValueObjectUtil.getValue(obj, "message");
convertBeanObjectToXML("message", value, String.class, true,dateformat,
ret,stack,currentAddress + "{0}" ,false);
value = ValueObjectUtil.getValue(obj, "cause");
if (value != null) {
convertBeanObjectToXML("cause", value, value.getClass(),false,
dateformat, ret,stack,currentAddress + "{1}" ,false);
} else {
convertBeanObjectToXML("cause", value, Throwable.class,false,
dateformat, ret,stack,currentAddress + "{2}",false );
}
} catch (SerialException e) {
throw e;
}
catch (Exception e) {
// e.printStackTrace();
throw new SerialException("", e);
}
ret.append("</construction>");
appendBeanProperties(obj, type,ClassUtil.getClassInfo(type), dateformat, ret,
throwable_filterattributes,stack,currentAddress);
}
private static void appendStackTraceElementProperties(Object obj,
Class type, String dateformat, Writer ret,SerialStack serialStack,String currentAddress)
throws Exception {
// BeanInfo beanInfo = Introspector.getBeanInfo(type);
//
// PropertyDescriptor[] attributes = beanInfo.getPropertyDescriptors();
ret.append("<construction>");
try {
Object value = ValueObjectUtil.getValue(obj, "className");
convertBeanObjectToXML("declaringClass", value, String.class,true,
dateformat, ret,serialStack, currentAddress + "{0}",false);
value = ValueObjectUtil.getValue(obj, "methodName");
convertBeanObjectToXML("methodName", value, String.class,true,
dateformat, ret,serialStack, currentAddress + "{1}",false);
value = ValueObjectUtil.getValue(obj, "fileName");
convertBeanObjectToXML("fileName", value, String.class, true,dateformat,
ret,serialStack, currentAddress + "{2}",false);
value = ValueObjectUtil.getValue(obj, "lineNumber");
convertBeanObjectToXML("lineNumber", value, int.class, true,dateformat,
ret,serialStack, currentAddress + "{3}",false);
} catch (SerialException e) {
throw e;
}
catch (Exception e) {
// e.printStackTrace();
throw new SerialException("", e);
}
ret.append("</construction>");
}
private static void appendBeanProperties(Object obj, Class type,ClassInfo beanInfo,
String dateformat, Writer ret,SerialStack stack,String currentAddress) throws Exception {
appendBeanProperties(obj, type, beanInfo, dateformat, ret, null, stack,currentAddress);
}
private static boolean isexclusive(String name, String[] filters) {
if (filters == null || filters.length == 0)
return false;
for (String filter : filters) {
if (name.equals(filter))
return true;
}
return false;
}
private static void appendBeanProperties(Object obj, Class type1,ClassInfo beanInfo,
String dateformat, Writer ret, String[] filters,SerialStack stack,String currentAddress)
throws Exception {
// ClassInfo beanInfo = ClassUtil.getClassInfo(type);
// beanInfo_.getDeclaredFields();
// beanInfo_.getPropertyDescriptor("");
// BeanInfo beanInfo = Introspector.getBeanInfo(type);
// PropertyDescriptor[] attributes = beanInfo.getPropertyDescriptors();
List<PropertieDescription> attributes = beanInfo.getPropertyDescriptors();
for (int n = 0; attributes != null && n < attributes.size(); n++) {
// get bean attribute name
PropertieDescription propertyDescriptor = attributes.get(n);
String attrName = propertyDescriptor.getName();
// if (attrName.equals("class"))
// continue;
// else
if (isexclusive(attrName, filters)) {
continue;
}
Class ptype = propertyDescriptor.getPropertyType();
// create attribute value of correct type
// Method readmethod = propertyDescriptor.getReadMethod();
// Method writermethod = propertyDescriptor.getWriteMethod();
// if ((readmethod == null || writermethod == null) && propertyDescriptor.getField() == null )
if(!propertyDescriptor.canseriable())
continue;
try {
Object value = propertyDescriptor.getValue(obj);
boolean pisbasetype = ValueObjectUtil.isBasePrimaryType(ptype);
if (!pisbasetype && value != null && ValueObjectUtil.isBasePrimaryType(value.getClass()))
{
pisbasetype = true;
ptype = value.getClass();
}
convertBeanObjectToXML(attrName, value, ptype, pisbasetype,dateformat, ret,stack,currentAddress + "->" + attrName,true);
} catch (IllegalArgumentException e) {
throw new SerialException("", e);
} catch (IllegalAccessException e) {
throw new SerialException("", e);
} catch (InvocationTargetException e) {
Throwable target = e.getTargetException();
if(SerialFactory.getSerialFactory().isIgnoreException(target))
continue;
throw new SerialException("", target);
} catch (SerialException e) {
throw e;
}
catch (Exception e) {
if(SerialFactory.getSerialFactory().isIgnoreException(e))
continue;
throw new SerialException("", e);
}
}
}
private static void convertParams(Writer ret, Object[] params,
Class[] paramTypes, String dateformat,SerialStack stack,String currentAddress)
throws Exception {
for (int i = 0; i < params.length; i++) {
ObjectSerializable.convertBeanObjectToXML(null, params[i],
paramTypes[i], ValueObjectUtil.isBasePrimaryType(paramTypes[i]),dateformat, ret, stack,currentAddress + "[" + i+"]",false);
}
}
}