|
原始代码是这样的
- package com.palm.messagingrouter;
5 A$ p4 L ^; [, G) ]& z8 G
& S! ~- v0 b7 s( d6 J2 g- import com.palm.oasis.activerecord.ActiveRecord;3 l& ^4 }/ c; |/ {3 ^! C' j
- import com.palm.oasis.activerecord.ActiveRecordException;
- r. g" L9 w% r H; a; E- C - import com.palm.oasis.activerecord.Association.Many;
) R4 X5 u/ w" V; f+ V - import com.palm.oasis.activerecord.Batch;
4 }2 ~: I4 x- t/ R; y r - import com.palm.oasis.activerecord.SqlFind;# V& h+ k5 N# l9 A9 l E% u# W! W. @
- import com.palm.oasis.util.Base64; }+ O- i* F9 Z7 c% K
- import com.palm.oasis.util.ServiceLogger;
z! t3 x1 w9 N& r - import com.palm.oasis.util.ZoneLogger;
3 W8 o1 y i7 f% O4 b7 `9 o( M - import java.io.ByteArrayOutputStream;/ q9 e% V, }9 C6 t7 c
- import java.io.IOException;
) i4 o+ c8 Y! [ - import java.io.PrintStream;
( n7 z1 {/ o! B/ n Q* V - import java.util.Iterator;
1 p0 W. g$ `" |) n- }, ~- A- [ - import java.util.List;8 j1 @# `* l+ w4 N+ Q
- import org.json.JSONException;
. Y% P. I8 u8 i+ U) _ - import org.json.JSONObject;; l. N# V! j! O, C" x# o
- ! }* F; _1 S8 m% Q
- public class SmsMessageSegmentContainer extends MessageSegmentContainer
" Z8 @- D" U+ }8 n0 j' l3 J - implements MessagingRouterJsonConstants, MessagingRouterTilConstants
9 Q( c, F! I8 B - {: `" D' w# H) \" d6 x6 i3 y6 b
- private static final long serialVersionUID = 1L;
8 Y3 q/ {) A# k N - private String completeMsgString;
0 A! W5 [# f: v - private String bodyEncoding;
" @" u, O: [1 G- i, H - protected static ZoneLogger logger = MessagingRouterService.getLogger(SmsMessageSegmentContainer.class.getSimpleName());
|' `7 w, H6 P* ~* c! i Z( T - Association.Many segments;
* K) f2 E9 \) E: f. i/ R/ ] - ( |1 G+ B, U2 S) J
- public SmsMessageSegmentContainer()
% t0 i+ z' R7 d - {" W' B4 J2 f: v5 |! Z* e3 a
- this.completeMsgString = null;
% t7 h$ R9 O3 h! @ - this.bodyEncoding = null;% Z* `) N1 u% v1 z
- this.segments = hasMany(SmsMessageFromTil.class, 1);+ t+ p8 a; E! n
- }
1 h1 _6 g, p1 R; v$ \ - - ^4 c. P2 L" y3 v2 T
- public SmsMessageSegmentContainer(long messageId, int totalSegments, String bodyEncoding)0 G% E; @2 H# V: e7 O M0 k1 R
- {
# u& r4 g; T( g# ~, P - super(System.currentTimeMillis(), messageId, totalSegments);
( \" W0 b" {- N: e6 Q0 l- ] - this.completeMsgString = null;1 s* Q( \- J" m$ L j7 V/ p& w
- this.bodyEncoding = null;
8 F$ Q+ l, o& g$ q0 n - this.segments = hasMany(SmsMessageFromTil.class, 1);9 R6 y" U# p( P9 i
- this.bodyEncoding = bodyEncoding;
! w* H$ W6 y+ E+ r - }
5 Q0 ]0 W3 R* G* l& K1 x - 4 H% F$ x4 }7 Y9 {( T
- SmsMessageSegmentContainer(String messageId, int totalSegments, String bodyEncoding)
9 A3 o: @1 C4 z2 u - {4 b8 m: R8 p, D( B" `
- super(System.currentTimeMillis(), Integer.parseInt(messageId), totalSegments);! |0 b- _9 [; ]- ?
- this.completeMsgString = null;7 k0 }3 b& ]7 Y0 f4 I( h
- this.bodyEncoding = null;
% A. @0 p( y* \* M; c - this.segments = hasMany(SmsMessageFromTil.class, 1);
# F2 A2 t8 o! t, b2 _9 u - this.bodyEncoding = bodyEncoding;
& d/ x, h# Z' t5 x+ S9 [# K( r - }- N. j( l8 M: B! u% S: u& Y. u; {
' e6 u; _5 X6 U, I- public String getBodyEncoding()
6 `; ~2 h9 h: F8 B4 D) q - {
( C" F1 H; n0 N4 L2 L) i2 y# g2 s - return this.bodyEncoding;$ ?7 h3 R$ O+ _; a& j" ^' J
- }
. Z9 T& B9 {! `' l9 L5 Q - ' C p& d: C+ K; P
- protected boolean isPrintableChar(char ch)
+ Q# I) D, }5 h A - {
6 r! I. p+ }* j2 M - boolean isItPrintableChar = false; [5 E$ y3 K5 x0 h, G
- if ((ch >= ' ') && (ch <= '~')) {! T2 X! M8 K/ X2 b& _
- isItPrintableChar = true;
! z. V a; w& T: b - }4 |* d; E) X: O8 @1 v6 ?
- else if ((ch >= 128) && (ch <= 168)) {6 y! h! [! v. r( `( `
- isItPrintableChar = true;
% b4 J8 j6 q0 C$ Y) n - }% r2 f8 R- J6 }4 y4 H7 k( ?! k
- else if ((ch >= 224) && (ch <= 247))6 ?- ]5 X0 d" Z4 z. ^$ N7 f [. b8 l
- isItPrintableChar = true;
/ m/ @+ B* e; O5 K$ \ K - return isItPrintableChar;
! }5 L( x0 x8 |: q - }
0 S6 r, z/ K, |
! o0 [- p% V; s# f' s+ J1 k- public boolean isMessageComplete(): o9 Z8 g% [* `3 Y' P; P
- {
7 o) v! ~( W2 O' @+ x - if (!(this.isMessageComplete))
( a6 x. p S: Q% S4 q6 P' N - try
' u; Z$ W* n/ r# \$ J - {1 Y1 B* P+ x; e
- synchronized (SmsMessageSegmentContainer.class)) F) S/ j; c1 [, B( ^- K, E
- {
3 _2 }6 m. L" C- @! { - List listSmsSegments = ActiveRecord.find(this.segments.sqlAll().orderBy("segmentNumber ASC"));& f2 k/ ~& u: X8 j6 G
- if ((listSmsSegments != null) && (listSmsSegments.size() == this.totalSegments))
' c. N8 Z- |- [ - {" _& \# z$ m3 r0 ^8 F: s
- this.isMessageComplete = true;
# ]9 i: U; Q' j; D7 m5 z" } - logger.fine("At this point all SMS message segments have been recieved so we are going to put it all together");- x; \( Y; v! p- A+ T7 p+ D/ t
- StringBuilder msgString = new StringBuilder(160 * this.totalSegments);
; W8 `; R& ]$ m0 t, i - if (msgString != null)6 `1 u' x0 \/ K- T
- {8 v& _( y4 _& O% o0 u& j9 u% U% G% _
- if ("bbin".equals(this.bodyEncoding))
- x- ?9 \ L$ k! R- b( I - {4 _" M- P4 U6 N% f
- ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
, b: v& Y% m3 U g T6 p - Iterator i$ = listSmsSegments.iterator();
* m) g* j( D7 |/ G' A - " n& }6 O1 n/ I' Z8 j2 h
- while (i$.hasNext()), V. L4 ~& Q. [% {4 I! f7 W
- {
6 l) S& u, k- A3 g6 c - SmsMessageFromTil msg = (SmsMessageFromTil)i$.next();
# j) j1 D+ i9 q- O- P$ t3 Q* m - if ((msg.getBody() != null) && (msg.getBody().length() != 0));
1 q7 J$ e* f3 S9 B' d3 | - byteOut.write(Base64.decode(msg.getBody()));
% U4 C6 T r0 U K% d - }
_2 }$ y/ x) I0 e7 {* ]- V( c* P" G - char[] testArray = byteOut.toString().toCharArray();
* X( g' H! Q# t. G/ Y3 Q- o - boolean isAllCharsPrintable = true; }4 P: l. r, {- D+ X B; E
- int i = 0;
* l0 v O- O$ O; a# C1 A - for (i = 0; (i < testArray.length) && (isAllCharsPrintable); ++i) {6 g, ~7 L7 A% Q5 R
- if (!(isPrintableChar(testArray[i])))
% M2 c- O- d0 Q7 H, U7 J - isAllCharsPrintable = false;# Y+ w5 U( O" z( ^/ _5 x5 E
- } E* t- D$ X2 T/ f' m" E' |3 Y
- if (isAllCharsPrintable)
$ M& b% ~( V" K" x: ]- H - this.completeMsgString = byteOut.toString() + "";+ A* s) C7 O2 J5 l! `
- else9 z# W" D. T4 }2 }/ m% F5 i" V
- this.completeMsgString = Base64.encodeBytes(byteOut.toByteArray()) + "";
" E! _4 w' N& E2 b# f$ t) M U# u+ {$ | - System.out.println(this.completeMsgString);
9 M2 m' o! e! _; Q - }
( j6 G% A, }$ F& [% R5 D0 Z - else {( @ d, p6 h4 U! v7 `2 p" x
- Iterator i$ = listSmsSegments.iterator();: ]/ S M8 |+ x5 ?- C0 C9 |4 N& v
" o% [; {: A' I% f* G3 T- while (i$.hasNext())3 t. P5 p& }6 n$ _6 Z v) _/ \
- {
) E$ C" @( W: V! E; ?( ] - SmsMessageFromTil msg = (SmsMessageFromTil)i$.next();
8 W% m% G4 B+ y1 W* Q - if ((msg.getBody() != null) && (msg.getBody().length() != 0));4 d4 n- J% f# Y" |* p
- msgString.append(TilUtils.decodeString(msg.getBodyEncoding(), msg.getBody()));: Z) b0 L4 M9 W) a0 j7 K. q' h8 L
- }) o$ `: R& z* I
- this.completeMsgString = msgString.toString() + "";5 v9 Z7 f. ~ v# m: a6 v6 r" M
- }
& x( I/ \( Y+ }7 x - }1 ]) X( k$ |% T) Z4 g
- else {
' t# C+ n$ ]' u d q - logger.severe("Error allocating memory to put Segmented SMS Message Together");
! |6 L$ G. N+ F C+ X0 J - }8 n% J$ q6 S* ~4 v9 I0 D+ Y
- }
" ~* A' A6 v, Y/ m. _* h# ? - else if ((listSmsSegments != null) && (listSmsSegments.size() > this.totalSegments)) {9 i2 J$ `8 w: o& k3 H
- 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); }
2 Z; _" p j9 y& B3 J - listSmsSegments = null;9 q, {- E0 k4 a5 d3 @
- }
8 n, a o1 ~! t. e$ N3 H - }
- A7 e* F- g: m$ D. K1 U3 m - catch (ActiveRecordException e). `- O1 O. g' z# r+ t: l
- {
# k# Y, H9 [* l; e7 i - logger.warning("SMS Message couldn't be retrieved from the database at this time.");* u* {. \7 n. B/ V1 u& Y- v4 p5 s
- }' \/ { X1 R _
- catch (NullPointerException e): V( }0 S; ]6 Y$ j+ y4 H
- {$ o, b% w" I9 I- @4 z
- logger.severe("Null Pointer Error putting Segmented SMS Message Together");
( v: s, f5 L: H - }
5 S6 W6 V6 H/ o' Z2 C2 ?9 ^ - catch (IOException e)" g; `4 ?( m- o; j
- {
6 P$ V! `0 g- }% J8 t* D( ] a, e - logger.severe("Error Decoding Binary Message");; `4 b3 _9 l5 j+ W/ Q* @3 L( Y
- }
w+ ~4 E1 j( [! n2 w - return this.isMessageComplete;
* V- \( _( D( v0 e - }
, A. D& c. n. F+ ] v$ B - 3 i' t& l e1 ]( M
- public String getCompletedBody()+ U7 ~+ o: o; D+ K( ^( W
- {/ { u8 Y- N. h0 y* @% o3 P
- if (!(isMessageComplete()))) m3 U* Q# u* @! \( p
- logger.warning("Message Not yet Complete so you should call this after testing with isMessageComplete");
) J: z2 j& D. w2 A( x7 q - return this.completeMsgString;
2 g% K/ w( M: g" t1 M - }& V" q$ l2 b8 ?3 F$ N
- 4 y { Z: ?- H2 {/ R- I
- public void addNewSegment(SmsMessageFromTil msgSegment), p. ?% }5 }% |) ]
- {
6 P! E/ q/ p- r6 W; ]/ r( d - try2 ^: H3 E4 g# D( `* [
- {
) A" M9 N) `& h: G8 V0 i - if (logger.getLogger().isFinerLoggable)3 j1 k0 i8 O8 m% Q0 o+ G k
- logger.finer("Attempting to Adding new SMS Message with MessageId:" + msgSegment.getMessageId() + " with SegmentNo:" + msgSegment.getSegmentNumber() + " of Total Segments:" + msgSegment.getTotalNumberOfSegments());1 A8 E0 e9 x2 T: x x
- synchronized (SmsMessageSegmentContainer.class)5 K X. g; L3 z3 u8 t; `" G
- {. {: I8 E( a D
- int numSegmentsAlreadyStoredWithThatSegNumber = ActiveRecord.count(this.segments.sqlAll().where("segmentNumber=?", new Object[] { # J |3 Q, f/ q- t
- Integer.valueOf(msgSegment.getSegmentNumber()) }));
) L* g% D) U; c' A( |: B - 4 c2 n3 G8 i; b& S# p
- if (numSegmentsAlreadyStoredWithThatSegNumber == 0)" R1 M: h4 N" |2 R6 w& _$ |% G
- {( N3 g* S, A9 [
- logger.finer("New SMS Segmeted Accepted. Adding it to SMS Container");
( ~- D# P/ [ |3 Y( C - logger.finer("saving segment to message holder");
1 R6 M4 p" D: S - Batch batch = new Batch();# O; y( \9 Z& z/ `4 D( O3 a* Z
- this.segments.push(batch, msgSegment);8 }; q7 G7 p( Q; K1 B
- msgSegment.save(batch);- L, x5 j" C( H6 \& a# \3 \4 C
- if (0L != msgSegment.getTimeStamp())% C+ u0 c0 [* m$ T
- setTimeStampLastReceivedSegment(msgSegment.getTimeStamp());" z; i6 D, w2 v( j# m+ J! v9 I
- save(batch);
6 h m2 u9 o( c1 _# _" D! j. y - batch.execute();
T- u$ n6 Q; e3 t/ R - }1 \/ i. s, S, z. b
- else {
! T* _6 j) E' E$ ^" y! v$ v - logger.warning("Found duplicate SMS Message segment already saved");
7 C1 ~' J: E4 X0 ~+ y G" B; Q9 B: v4 U - }- b" t5 m9 {+ k. i' X/ \
- }( }5 O+ n0 O* h+ O$ Y
- }8 v6 r6 i. [6 q! W9 f$ T M
- catch (ActiveRecordException e)% c2 |: {+ m9 F& W- L2 s) I- E% F
- {) Z1 _: G( p0 S2 m2 p) f
- logger.severe("Error saving SMS Message Segment. Data will probably be lost.");' C* O4 U1 }, n L
- }
# H% ~- Q, I* A: n, U) c - }
, r" Z3 H# @9 ]
+ K7 D8 g2 a" X: I# T1 A- private String convertToJson(boolean doHidePrivateData)# f5 [& l# u# w! o+ K: J7 R
- {
. R% e* d; z l2 h0 l" ~ - JSONObject smsJson = new JSONObject();
! h; E. t$ X' Z2 F8 z' R& I& A2 L - SmsMessageFromTil msgSeg = null;! O% K+ u) U7 y: [' x
- try
( R+ F" `) G; c7 u( U - {+ ?0 d* [- ~% I2 b$ I8 ~* P
- msgSeg = (SmsMessageFromTil)this.segments.findFirst();
' q* d7 B+ H" Q* t" D E - if (msgSeg != null)
8 Z5 l, D/ n+ T# j" @ - {
# m5 |& w, n4 S$ A) r$ G - if (doHidePrivateData)
+ @6 M0 Q1 x, t o' j0 v9 J1 w/ T - {
4 I5 l& M. y0 ^5 [. U! Y$ d8 B - smsJson.put("body", "This has been hidden for logging");
5 n9 s$ p2 o% p6 | - smsJson.put("address", "555-333-4444");
5 ]/ y/ r! X# I, @5 ?% O2 C7 \/ A - smsJson.put("callbackNumber", "555-333-4444");
! b! U+ @8 G# \/ f k/ H - }7 g( m; ]7 R$ R0 G3 J% R \
- else {! p2 e3 z0 e, n, c* i# r
- smsJson.put("body", getCompletedBody());
- i5 R- [4 V6 |& ~" B# { - smsJson.put("address", msgSeg.getWhoIsItFrom());& q# p2 T! {/ T z/ n5 [& p% Z# H& P( P
- smsJson.put("callbackNumber", msgSeg.getCallbackNumber());
1 |4 ]6 K) i& _ - }: P$ K6 m& y& Q. d! m# ~
- smsJson.put("networkMsgId", msgSeg.getMessageId());
) T- H2 H, q4 I1 m8 \ - smsJson.put("deliveryReportOptions", msgSeg.getDeliveryReportOptions());
% M# u2 m) @- f$ Q/ j b* P# X - smsJson.put("timeStamp", msgSeg.getTimeStamp());0 ?/ i8 J5 A0 J7 T2 e2 E/ v
- if (msgSeg.isThisMessageFromAGsmNetwork())# W4 W$ |: z7 n7 t/ o* n* J$ M6 O) ]
- { T/ H5 A4 P5 T0 _0 Z
- smsJson.put("priority", msgSeg.getSmsClassInfo());
0 R3 X! S2 [% d4 j# e# H: g - if (msgSeg.isFromSim())
6 C- Z6 |! f2 L- S3 Q- B - smsJson.put("isFromSim", true);# H7 {6 o1 |8 X
- }2 I( E5 O1 w' ^1 i( `% i
- else {
, A) v* J- X! A9 P - smsJson.put("priority", msgSeg.getPriority());
- w' m# N( K) ]5 Y) r4 z - }
7 n5 Z& J7 g/ ?4 k' X- Q* I - smsJson.put("displayMode", msgSeg.getDisplayMode());
$ @$ a. x% e/ N - smsJson.put("privacyMode", msgSeg.getPrivacyMode()); break label257:0 g5 p9 k) x- B" X1 G! Z3 s: ]
- }7 i: Y$ |4 K7 e; B& O9 _2 Z
2 g# B! Z" q2 E- logger.severe("Did not find Message Segment to generate JSON string");
1 W2 q4 s. N E; v - }
+ h4 f) [! J% g - catch (ActiveRecordException e), Z$ G4 ~3 W9 }( P' S( ?1 W
- {
+ [4 ~* n+ U; M4 A* } - logger.severe("Caught Exception", e);& @* c- X8 C3 T9 P! F) ?0 j
- }
C2 A( U7 I0 R* a- q( N. K - catch (JSONException e)
$ Q7 X( e0 ~& C' r3 S/ v# ?$ a4 K" Q - {
, ]) P0 S4 X! Y* q5 y6 W5 H - logger.severe("Caught Exception", e);
4 b% c; m" j" C8 Z2 B - }; [) J; A) s* P, W* g
- label257: String jsonString = smsJson.toString();
( L1 J: a2 P* k, V2 C: K! L% N% u1 j - logger.finer("toJSONString SMS Message: " + jsonString);
( A I( ~- T4 {& e# x* a - return jsonString;
/ c+ g1 ^2 T8 e9 E( \ - }, w- f; ^' @! D
6 d9 F$ A9 i; h: ]- public String toJSONString()5 N$ L+ c# d! H3 S9 K1 o& k! G' I# n
- {
2 w3 j8 _' v# d( P$ ~ - return convertToJson(false);# Y7 n$ [ }/ u" t3 i
- }1 L4 _6 o: U3 T8 \7 s" t
Y) y. ~" e* F: M- public String toDebugJSONString()0 P% L$ H( }: y$ d: m
- {
- a( J, ?7 N9 v3 D3 U - return convertToJson(true); a1 P, ^1 {8 c
- }
4 k5 e6 C, K/ b, k; N( n - }
复制代码 |
|