|
原始代码是这样的
- package com.palm.messagingrouter;( H$ _2 G- v2 Q. V/ E
+ j2 D2 o$ x' x1 C+ n5 S A: Y7 I5 }- import com.palm.oasis.activerecord.ActiveRecord;2 W% C, `! ], u& f M
- import com.palm.oasis.activerecord.ActiveRecordException;8 x: R( M( W6 |# c$ Z7 Y5 a
- import com.palm.oasis.activerecord.Association.Many;
# [# [* G. U a& { - import com.palm.oasis.activerecord.Batch;) U1 F( o8 g+ `% E, {9 n' ~
- import com.palm.oasis.activerecord.SqlFind;
( V: Z% b& n- i% b/ X& f. ^" T, l% U - import com.palm.oasis.util.Base64;: Y/ r+ p" t2 H s' T
- import com.palm.oasis.util.ServiceLogger;
: Q, h3 I4 n" j9 J - import com.palm.oasis.util.ZoneLogger;
' Y2 C/ F9 p; Q( y - import java.io.ByteArrayOutputStream;
O! h6 `: r2 L1 `0 O - import java.io.IOException;
) w& l6 W- r9 h6 Z$ q - import java.io.PrintStream;) {$ R, H* }* z9 A: N0 U
- import java.util.Iterator;- {: i+ B2 W5 o" Z
- import java.util.List;4 e( l3 U; I3 U9 Q$ w7 {0 q7 y$ J9 F
- import org.json.JSONException;* A( C* q" y" K
- import org.json.JSONObject;" O# U: v* m% y. V6 y/ Q7 D
5 N+ G0 `* Z8 f/ X- J" O- public class SmsMessageSegmentContainer extends MessageSegmentContainer; C* v7 M1 w' G. m' V/ o, k9 Q. C
- implements MessagingRouterJsonConstants, MessagingRouterTilConstants1 l; Y0 e7 E; v2 `
- {; b- R! X7 l% D& ~
- private static final long serialVersionUID = 1L;2 E7 i3 `. Z+ R2 e1 W T* C& Z
- private String completeMsgString;: J# `$ e H8 r" R
- private String bodyEncoding;
+ t" K6 f" y! H C% y9 [( J - protected static ZoneLogger logger = MessagingRouterService.getLogger(SmsMessageSegmentContainer.class.getSimpleName());
( f" \2 y! f9 X* u1 T- A2 u) Q - Association.Many segments;
' j0 {1 |# C/ w7 @
6 g% h+ q3 J: T# p/ [- w" n, c4 w- public SmsMessageSegmentContainer()) N( ]# s) B2 I* P, s$ N
- {
# C ^- n7 f+ h: J - this.completeMsgString = null;" R E4 U! h- g$ k$ N* E# t
- this.bodyEncoding = null;. r0 [2 V5 b5 m9 k% s
- this.segments = hasMany(SmsMessageFromTil.class, 1);
: z' }4 b8 H% |1 g - }: R1 A2 k- S- G) Z' G% h0 Z" u2 Z: W& j
- P, f {, p G6 ~1 O: J
- public SmsMessageSegmentContainer(long messageId, int totalSegments, String bodyEncoding)
/ G* I1 y( z; e4 l - {) Y! V2 T$ @) Q* c" r" S# F3 J
- super(System.currentTimeMillis(), messageId, totalSegments);! u: U4 Q6 |* C# ]/ v7 d
- this.completeMsgString = null;
- a: ?* [' L0 J4 f6 C5 E1 ?: b2 } - this.bodyEncoding = null;: @5 O' A' n# l
- this.segments = hasMany(SmsMessageFromTil.class, 1);
8 o l2 N: U( g- u) o3 X E# A - this.bodyEncoding = bodyEncoding;) @5 j3 Z8 H) s! I6 {
- }1 V3 L- s7 F( I
- 4 g$ ?3 d& o& _. P
- SmsMessageSegmentContainer(String messageId, int totalSegments, String bodyEncoding). I0 u6 \: }) @4 O. L) @6 A
- {* K0 ]7 B: f4 U$ a c# p% L
- super(System.currentTimeMillis(), Integer.parseInt(messageId), totalSegments);
# U1 D9 A5 p! C/ V6 j+ i - this.completeMsgString = null;+ a9 ? J' h C( ~) \4 \
- this.bodyEncoding = null;% z1 o: s+ r2 B0 ^8 R) y
- this.segments = hasMany(SmsMessageFromTil.class, 1);/ q9 b4 j6 G$ h" v/ Y
- this.bodyEncoding = bodyEncoding;5 f# m+ I" Y4 [9 ~5 F1 i* x$ z; L, h
- }
" l$ Z" g; c2 z) d2 Q - / a' w, A( P! O, B
- public String getBodyEncoding()
3 N% V4 ]) L3 b* G7 w% h - {% u/ f% G% x1 L$ T. J
- return this.bodyEncoding;& {, ], Z8 I8 f3 T! U5 m1 v0 g/ u* k
- }
0 r) w9 k6 Q4 J; ^ `
: m$ h w/ G5 k% R: ~( c3 Y- protected boolean isPrintableChar(char ch). x Q t" I' _- I, h! z+ i
- {
. i+ W: }& S, K9 N9 J; P - boolean isItPrintableChar = false;0 S$ x7 @9 n p) ^
- if ((ch >= ' ') && (ch <= '~')) {
! f( ^) g! G0 [( ?3 z+ `! y* t - isItPrintableChar = true;! U( }1 p7 B. _% S5 j3 z
- }" M5 L) C: {! D+ ^, D
- else if ((ch >= 128) && (ch <= 168)) {
$ ^; x& h4 F* O# b3 h0 d - isItPrintableChar = true;& R0 t g5 e) P, m5 ~7 C
- }
7 W( [" s6 S% a2 n - else if ((ch >= 224) && (ch <= 247))
' j8 y- F$ R8 t. X# q3 X. D4 ^ - isItPrintableChar = true;
$ B; \' D# s3 d, d5 O- ^ - return isItPrintableChar;6 M5 X* _6 p4 U- D N8 Z5 z6 a1 C
- }
3 i0 P" s4 b- T8 K" _ - + V- s& k1 {! E
- public boolean isMessageComplete()
: z5 \; p" p1 ? - {! r) x4 z/ m0 V. M( m, @
- if (!(this.isMessageComplete)); Q+ }/ w; r/ e
- try
" z* r: `) `: l/ H3 N7 R! N6 M - {/ F# {7 y1 b/ h3 S
- synchronized (SmsMessageSegmentContainer.class)8 ?! n z4 _; J$ ^$ X
- {
$ j) O% X) S9 N% d - List listSmsSegments = ActiveRecord.find(this.segments.sqlAll().orderBy("segmentNumber ASC"));: X4 z6 I1 A) R0 Z6 k
- if ((listSmsSegments != null) && (listSmsSegments.size() == this.totalSegments))
+ ] J8 R g( x) N - {$ S6 Z2 y6 ]3 z
- this.isMessageComplete = true;
, M% k7 ^" U! X, g - logger.fine("At this point all SMS message segments have been recieved so we are going to put it all together");
: k# ^9 `! j% \. @- d6 w4 i - StringBuilder msgString = new StringBuilder(160 * this.totalSegments);
6 [+ I3 `- s- X. \+ l6 o! r - if (msgString != null)
6 a; ~" L L+ |9 `7 }! h F - {
( n# W9 _. u+ i- T* l. c0 ]! F - if ("bbin".equals(this.bodyEncoding))
# G; l+ H( H8 @ - {
+ B% w6 z7 b* v+ R- @ z/ I) f n - ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
9 o j" i, Z0 O4 Q- p6 n$ c ^ - Iterator i$ = listSmsSegments.iterator();( [/ W1 D5 |. n1 @* P
- " j' ?3 Y) w# W2 F
- while (i$.hasNext()); z) e& J+ {, `+ _& T6 m+ V& g
- {/ ]" m5 Z# R! g1 C0 C; ^
- SmsMessageFromTil msg = (SmsMessageFromTil)i$.next();
$ j; Y9 E6 ]. O; ` - if ((msg.getBody() != null) && (msg.getBody().length() != 0));
/ \- I9 F5 i9 S& o) }9 T$ M - byteOut.write(Base64.decode(msg.getBody()));
4 n3 o- X; a* |2 E& r - }
/ S" M, ?; l2 j0 m9 R- T) J - char[] testArray = byteOut.toString().toCharArray();
! i( ~/ B& F* _# L0 c% n. R4 r - boolean isAllCharsPrintable = true;$ [3 a+ t$ w* M Q
- int i = 0;- m9 q' P# H& y6 j
- for (i = 0; (i < testArray.length) && (isAllCharsPrintable); ++i) {
8 U P# g. {% v4 L2 z - if (!(isPrintableChar(testArray[i])))9 Y5 K$ C, D$ b& A7 ~5 ?
- isAllCharsPrintable = false;
' Y- [( g* `4 r2 Z - }3 Q0 |( x. d9 F5 p% ~6 J/ |# c# @
- if (isAllCharsPrintable) i6 O5 Y( k& r2 y3 p- C" `7 a& i, f
- this.completeMsgString = byteOut.toString() + "";+ w1 Y6 P3 m( P' j
- else
# F: h6 I/ t) j% W0 P" ~& h - this.completeMsgString = Base64.encodeBytes(byteOut.toByteArray()) + "";
( ~! u4 `1 D! ~, u+ x* |0 F2 V) k - System.out.println(this.completeMsgString);
% A- V( c5 A% W - }
3 [% |) G. T( t. |3 _ - else {
2 |+ r$ l4 D6 L# Q - Iterator i$ = listSmsSegments.iterator();
; e2 n9 m+ t3 i7 U7 f: J4 m- t/ e - ! r0 N8 g% D' K
- while (i$.hasNext())
7 y; K' ?0 Z% e* p - {
; P6 J$ s5 [3 o - SmsMessageFromTil msg = (SmsMessageFromTil)i$.next();
% e/ J$ }4 X1 p5 @+ b' y - if ((msg.getBody() != null) && (msg.getBody().length() != 0));, v* n. A k, e" T- \1 _$ j/ c
- msgString.append(TilUtils.decodeString(msg.getBodyEncoding(), msg.getBody()));
, H, P( Z9 X; Y' m4 i# v! m - }: `1 U) F- v) _& q
- this.completeMsgString = msgString.toString() + "";4 o9 ?0 Y3 x9 a# J5 w$ L
- }) R7 x! p1 A; L# ]. g1 u+ k
- }( c# Y+ n/ U$ ^) V4 ~
- else {
" G5 d( _* t9 c+ i- { - logger.severe("Error allocating memory to put Segmented SMS Message Together");
0 y" t) a9 b& K& ] - }
1 p# ~; G8 R" b: W* ] - }
. p* a/ n6 @7 h! {; C$ B8 F - else if ((listSmsSegments != null) && (listSmsSegments.size() > this.totalSegments)) {
! Y" Q8 V4 a4 y$ w+ u8 } - logger.severe("Too many SMS message segments found so assuming corrupted for " + this.segMsgContainerId + " in DB. We found:" + listSmsSegments.size() + " but we expected: " + this.totalSegments); }
# S- ^" x d% Y1 b - listSmsSegments = null;
( o. P/ O3 N r; I - }$ i& _7 V& @: j2 r
- }: X% B, d; ]( b8 I' S
- catch (ActiveRecordException e)4 S: q7 l7 j1 V) }1 I9 \
- {
( G$ `# `/ b) o* N' n - logger.warning("SMS Message couldn't be retrieved from the database at this time.");" J" N: F4 i% g- Z* F" x
- }
" b$ @' a' Y6 g5 o7 W$ h }8 I - catch (NullPointerException e)7 \- F( g. h, X3 s( h
- {5 W/ K9 \# f6 s5 E& J! |9 @
- logger.severe("Null Pointer Error putting Segmented SMS Message Together");
: E( \$ {: D8 t* l; M ^ - }
$ [/ Q* T( E0 w - catch (IOException e)
7 l& N) s% \8 s0 i0 r - {
# W# ^4 v3 k; K4 G) X - logger.severe("Error Decoding Binary Message");
0 A# m% r: |9 q- v - }
4 y3 q) Z& R3 Q8 M+ { - return this.isMessageComplete;6 h9 w# V# v* M$ o- s$ \6 w
- }
& n0 q: S+ E! [/ u5 m- I$ V - 1 @- L+ ~* q! { _0 B+ h. T
- public String getCompletedBody(). C# {* H6 h) u5 f9 O y8 e
- {0 l- k' b% e# k
- if (!(isMessageComplete()))% r& `# ~6 k* _% s* C0 `* k
- logger.warning("Message Not yet Complete so you should call this after testing with isMessageComplete");
2 @+ E! ^( m* q7 M# ` - return this.completeMsgString;/ M0 m. @. X: s v
- }7 H+ ?. X$ }8 _4 Y; y( j; u. N
% G: n4 o. r! m4 g! c6 n- public void addNewSegment(SmsMessageFromTil msgSegment)( ]; |3 l/ U! I: F3 w
- {
! q$ @, S" T+ c" P/ \+ E8 F- A3 q - try
3 x4 A( n9 i) `3 { - {
4 i) \: U1 x* a1 F! ]9 T( G - if (logger.getLogger().isFinerLoggable)
- z; Q: c, |; O5 ~$ { - logger.finer("Attempting to Adding new SMS Message with MessageId:" + msgSegment.getMessageId() + " with SegmentNo:" + msgSegment.getSegmentNumber() + " of Total Segments:" + msgSegment.getTotalNumberOfSegments());
2 {1 t1 T3 O$ b( y% j' G% H - synchronized (SmsMessageSegmentContainer.class)
{$ ~& |# L3 v# R# R - {4 Z; f+ ^0 Z7 C) q- e
- int numSegmentsAlreadyStoredWithThatSegNumber = ActiveRecord.count(this.segments.sqlAll().where("segmentNumber=?", new Object[] { ! \; I* P& j9 b) s1 k$ s
- Integer.valueOf(msgSegment.getSegmentNumber()) }));
$ |/ {* n4 Y; D6 y
; G2 b$ V' V1 L' t. r7 _3 v" _. M- if (numSegmentsAlreadyStoredWithThatSegNumber == 0)* J$ l# Z; {+ F# T
- {* M. f5 _: u) b5 d2 W) S
- logger.finer("New SMS Segmeted Accepted. Adding it to SMS Container");
( |& d( V5 B. s, h9 N; o# A/ F - logger.finer("saving segment to message holder");2 S; t% n: D$ I- e& q% A/ ~+ g8 J/ b
- Batch batch = new Batch();
5 `+ N+ s* Q. M9 d# X - this.segments.push(batch, msgSegment);. n) g8 @+ w1 D$ b* {4 w; U. y$ R
- msgSegment.save(batch);7 _9 r8 y8 N/ j) s7 P5 c% c
- if (0L != msgSegment.getTimeStamp())
5 Q0 j/ o5 g( G& t - setTimeStampLastReceivedSegment(msgSegment.getTimeStamp());! n7 F( l, Q# Y* O3 H- s
- save(batch);
( P9 T6 t7 ~: I, o - batch.execute();- Y L0 ?. i+ v# b7 I* i
- }1 f* J9 @5 z! B/ [
- else {6 S9 S8 L+ F- ]/ D. O; J3 W
- logger.warning("Found duplicate SMS Message segment already saved");2 B% B0 B/ {; p+ j6 S
- }
* M$ `2 ^" i$ n Y& P- x - }
8 ^$ x8 R6 l; X# [" F+ o" \8 p2 L - }8 `+ u% c* G, b4 L' H9 J5 M" \
- catch (ActiveRecordException e)
* g, f/ ^) K+ ~4 X: h - {
& v& @. _' T$ s - logger.severe("Error saving SMS Message Segment. Data will probably be lost.");
( A. ^: H/ m* w" e1 q C' \* Q - }& }3 h# ^+ o9 `1 g! V* s8 z
- }
# ~ L! D$ W$ N$ L" z' n( K
8 B% u0 H* M/ o: J9 I- private String convertToJson(boolean doHidePrivateData)1 m" J7 m: J" p6 y+ z4 \
- {
, m. \- I1 [2 h* ]. [/ b. i - JSONObject smsJson = new JSONObject();
8 V* H# E% q2 N1 m( ]; F; E$ T - SmsMessageFromTil msgSeg = null;# M2 c3 I( E; C5 X8 z# {2 z; L
- try, _5 B+ U* ^% P. N- R( |
- {1 R6 x& [6 W1 z! J1 V& E/ ?
- msgSeg = (SmsMessageFromTil)this.segments.findFirst();- y( C) ?: n; r. X* p: o
- if (msgSeg != null). U5 n% p+ H6 ?
- {$ ?4 n2 |# T# ~' o3 @7 A
- if (doHidePrivateData)
. Q6 i0 p7 `0 N2 z- I; t - {
& x" m: _" b$ Y j2 W - smsJson.put("body", "This has been hidden for logging");
; i+ ~" O2 S) i$ X6 f! I- N - smsJson.put("address", "555-333-4444");
3 c! [ ]7 o& G; T+ r4 p6 ~1 n5 j - smsJson.put("callbackNumber", "555-333-4444");& G2 \' [* l5 Q2 U5 u
- }" U/ ]3 }9 A6 v' `) F) R' ~
- else {
/ w$ c, W+ a/ l# X - smsJson.put("body", getCompletedBody());& G& V6 F5 v7 d
- smsJson.put("address", msgSeg.getWhoIsItFrom()); ]; Z. _% F6 l$ I3 z3 j6 ^9 s
- smsJson.put("callbackNumber", msgSeg.getCallbackNumber());
7 V- [( x9 r0 M7 B6 Z! f3 [4 x - }
' e& @) h+ m2 A7 F+ ] n! d1 d - smsJson.put("networkMsgId", msgSeg.getMessageId());' @( m- a! J( _( |7 e2 l
- smsJson.put("deliveryReportOptions", msgSeg.getDeliveryReportOptions());2 \3 D, v" V. N0 ~/ [/ q
- smsJson.put("timeStamp", msgSeg.getTimeStamp()); J* @, }& B9 S: X0 h5 z
- if (msgSeg.isThisMessageFromAGsmNetwork())
! J- P/ J: ?; X* T- L& O6 x - {* M, N4 O4 {# a9 L m/ f
- smsJson.put("priority", msgSeg.getSmsClassInfo());
. j/ P/ q2 o/ o - if (msgSeg.isFromSim()); t2 d. |/ n* x0 H2 \( c
- smsJson.put("isFromSim", true);% W0 L, |) G* }+ |& o# J1 |
- }+ d) p6 P1 m( Z+ Q0 n7 v
- else {
7 A8 c; b! p; E: U - smsJson.put("priority", msgSeg.getPriority());
; t- c, F! }% [' R* j) Z - }8 w* |. d8 ?# v$ n6 U0 w/ L: M
- smsJson.put("displayMode", msgSeg.getDisplayMode());6 m8 {$ M* n, m7 H( r% k5 J
- smsJson.put("privacyMode", msgSeg.getPrivacyMode()); break label257:
; m) o2 }: O( b3 ^ - }4 N9 a' p& w; p' b. m& z
- 9 l4 b& \# t( G+ @( @0 w1 H
- logger.severe("Did not find Message Segment to generate JSON string");1 S2 x) F2 m6 w; N' v
- }
6 S- h8 K( O1 S; A8 d# q - catch (ActiveRecordException e)5 _, R2 L6 u. s- U0 _1 J
- {4 Y' a( U# N* T+ v; i e" y* t
- logger.severe("Caught Exception", e);8 l8 A) |9 [& r3 `
- }5 L2 C0 F! i! p( l- M
- catch (JSONException e)- k; H7 g4 u) h0 D$ E- E9 B
- {! B Y6 c1 p& Q2 m
- logger.severe("Caught Exception", e);
, [, i" ^* b5 z) H - }
2 }1 T' {6 [! B+ r6 s - label257: String jsonString = smsJson.toString();) H# `$ P! m5 C; w
- logger.finer("toJSONString SMS Message: " + jsonString);
5 r$ j' J( J4 B/ j8 i - return jsonString;
( m0 ]3 w4 a8 H! i! d% @- | @9 y% K - }
: ^' O. X3 q) E/ ^+ x4 w" ^ - Y- c3 n. V. f0 c
- public String toJSONString()
. G+ a) ]4 }0 a, S8 h2 r: \8 K - {
! ^, e Y; o- n; @% x - return convertToJson(false);9 h/ P" D% g" l% \" o
- }$ O7 O- f: k# x5 L: ]
4 ]! Q6 J U; N3 r- public String toDebugJSONString()1 Q! z$ Q t4 P7 Q l I2 j) a
- {
( e9 S; ^6 P) t" P - return convertToJson(true);4 E! J. [) n" }" U
- }# r3 A6 u" u* f% e3 _' }# p( q
- }
复制代码 |
|