1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.openehealth.ipf.platform.camel.ihe.mllp.core;
17
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.util.UUID;
21
22
23
24
25
26
27
28 public class FragmentationUtils {
29
30
31
32
33 public static List<String> splitString(String s, char c) {
34 List<String> result = new ArrayList<>();
35 int startPos = 0;
36 while (true) {
37 int pos = s.indexOf(c, startPos);
38 if (pos == -1) {
39 break;
40 }
41 result.add(s.substring(startPos, pos));
42 startPos = pos + 1;
43 }
44 if (startPos != s.length()) {
45 result.add(s.substring(startPos, s.length()));
46 }
47 return result;
48 }
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 public static String ensureMaximalSegmentsLength(String message, int maxLength) {
67 if (maxLength == -1) {
68 return message;
69 }
70 if (maxLength <= 4) {
71 throw new IllegalArgumentException("maximal length must be greater than 4");
72 }
73 List<String> segments = splitString(message, '\r');
74
75
76 boolean needProcess = false;
77 for (String segment : segments) {
78 if (segment.length() > maxLength) {
79 needProcess = true;
80 break;
81 }
82 }
83 if ( ! needProcess) {
84 return message;
85 }
86
87
88 StringBuilder sb = new StringBuilder();
89 String prefix = "ADD" + message.charAt(3);
90 int restLength = maxLength - prefix.length();
91 for (String segment : segments) {
92
93 if (segment.length() <= maxLength) {
94 sb.append(segment).append('\r');
95 continue;
96 }
97
98
99 sb.append(segment.substring(0, maxLength)).append('\r');
100
101 int startPos;
102 for (startPos = maxLength; startPos + restLength <= segment.length(); startPos += restLength) {
103 sb.append(prefix)
104 .append(segment.substring(startPos, startPos + restLength))
105 .append('\r');
106 }
107
108 if (startPos < segment.length()) {
109 sb.append(prefix).append(segment.substring(startPos)).append('\r');
110 }
111 }
112 return sb.toString();
113 }
114
115
116
117
118
119 public static void appendSplitSegment(StringBuilder sb, List<String> fields, char fieldSeparator) {
120 for (String field : fields) {
121 sb.append(field).append(fieldSeparator);
122 }
123 for (int len = sb.length(); sb.charAt(--len) == fieldSeparator; ) {
124 sb.setLength(len);
125 }
126 sb.append('\r');
127 }
128
129
130
131
132
133 public static void appendSegments(StringBuilder sb, List<String> segments, int startIndex, int endIndex) {
134 for (int i = startIndex; i < endIndex; ++i) {
135 sb.append(segments.get(i)).append('\r');
136 }
137 }
138
139
140
141
142
143 public static CharSequence joinSegments(List<String> segments, int startIndex, int endIndex) {
144 StringBuilder sb = new StringBuilder();
145 appendSegments(sb, segments, startIndex, endIndex);
146 return sb;
147 }
148
149
150
151
152
153 public static String keyString(String... pieces) {
154 StringBuilder sb = new StringBuilder(pieces[0]);
155 for (int i = 1; i < pieces.length; ++i) {
156 sb.append('\0').append(pieces[i]);
157 }
158 return sb.toString();
159 }
160
161
162
163
164
165 public static String uniqueId() {
166 return UUID.randomUUID().toString();
167 }
168 }