33import com .qcloud .cos .exception .CosServiceException ;
44import com .qcloud .cos .internal .CosServiceRequest ;
55import com .thoughtworks .xstream .XStream ;
6- import com .thoughtworks .xstream .converters .Converter ;
7- import com .thoughtworks .xstream .converters .MarshallingContext ;
8- import com .thoughtworks .xstream .converters .SingleValueConverter ;
9- import com .thoughtworks .xstream .converters .UnmarshallingContext ;
10- import com .thoughtworks .xstream .io .HierarchicalStreamReader ;
11- import com .thoughtworks .xstream .io .HierarchicalStreamWriter ;
12- import com .thoughtworks .xstream .io .xml .PrettyPrintWriter ;
13- import com .thoughtworks .xstream .io .xml .StaxDriver ;
14- import com .thoughtworks .xstream .mapper .Mapper ;
156import com .thoughtworks .xstream .security .AnyTypePermission ;
167
178import java .io .InputStream ;
18- import java .io .StringWriter ;
199import java .lang .reflect .Field ;
10+ import java .util .concurrent .ConcurrentHashMap ;
2011
2112public abstract class XStreamXmlResponsesSaxParser <T > {
22-
23- private XStream xstream ;
13+ private static final ConcurrentHashMap <String , XStream > xStreamMap = new ConcurrentHashMap <String , XStream >();
2414
2515 abstract T getResponse (InputStream in );
2616
@@ -29,17 +19,21 @@ static XStream initXStream(Object obj) {
2919 }
3020
3121 static <T > XStream initXStream (Class <T > cls ) {
32- XStream xstream = new XStream ();
33- //忽略不需要的节点
34- xstream .ignoreUnknownElements ();
35- //对指定的类使用Annotations 进行序列化
36- xstream .processAnnotations (cls );
37- xstream .addPermission (AnyTypePermission .ANY );
38- Field [] fields = CosServiceRequest .class .getDeclaredFields ();
39- for (Field field : fields ) {
40- xstream .omitField (CosServiceRequest .class , field .getName ());
22+ if (!xStreamMap .containsKey (cls .getName ())) {
23+ XStream xstream = new XStream ();
24+ //忽略不需要的节点
25+ xstream .ignoreUnknownElements ();
26+ //对指定的类使用Annotations 进行序列化
27+ xstream .processAnnotations (cls );
28+ xstream .addPermission (AnyTypePermission .ANY );
29+ Field [] fields = CosServiceRequest .class .getDeclaredFields ();
30+ for (Field field : fields ) {
31+ xstream .omitField (CosServiceRequest .class , field .getName ());
32+ }
33+ xStreamMap .put (cls .getName (), xstream );
34+ return xstream ;
4135 }
42- return xstream ;
36+ return xStreamMap . get ( cls . getName ()) ;
4337 }
4438
4539 public static String toXML (Object obj ) {
@@ -48,9 +42,9 @@ public static String toXML(Object obj) {
4842 }
4943
5044 public static <T > T toBean (InputStream inputStream , Class <T > cls ) {
51- try {
45+ try ( InputStream in = inputStream ) {
5246 XStream xstream = initXStream (cls );
53- return (T ) xstream .fromXML (inputStream );
47+ return (T ) xstream .fromXML (in );
5448 } catch (Exception e ) {
5549 e .printStackTrace ();
5650 throw new CosServiceException ("Response parse error" );
0 commit comments