CharsetMapToCharacterEncodingGroupDataCodingProvider.java

1
package fr.sii.ogham.sms.sender.impl.cloudhopper.preparator;
2
3
import static com.cloudhopper.commons.charset.CharsetUtil.NAME_GSM;
4
import static com.cloudhopper.commons.charset.CharsetUtil.NAME_GSM7;
5
import static com.cloudhopper.commons.charset.CharsetUtil.NAME_GSM8;
6
import static com.cloudhopper.commons.charset.CharsetUtil.NAME_ISO_8859_1;
7
import static com.cloudhopper.commons.charset.CharsetUtil.NAME_PACKED_GSM;
8
import static com.cloudhopper.commons.charset.CharsetUtil.NAME_UCS_2;
9
import static com.cloudhopper.commons.gsm.DataCoding.CHAR_ENC_8BIT;
10
import static com.cloudhopper.commons.gsm.DataCoding.CHAR_ENC_DEFAULT;
11
import static com.cloudhopper.commons.gsm.DataCoding.CHAR_ENC_LATIN1;
12
import static com.cloudhopper.commons.gsm.DataCoding.CHAR_ENC_UCS2;
13
14
import java.util.Collections;
15
import java.util.HashMap;
16
import java.util.Map;
17
18
import com.cloudhopper.commons.charset.Charset;
19
import com.cloudhopper.commons.charset.CharsetUtil;
20
import com.cloudhopper.commons.gsm.DataCoding;
21
22
import fr.sii.ogham.sms.encoder.Encoded;
23
import fr.sii.ogham.sms.sender.impl.cloudhopper.encoder.NamedCharset;
24
import fr.sii.ogham.sms.sender.impl.cloudhopper.exception.DataCodingException;
25
import fr.sii.ogham.sms.sender.impl.cloudhopper.exception.UnsupportedCharsetException;
26
27
/**
28
 * Provide a Data Coding Scheme according to charset used to encode the message.
29
 * The resulting encoding is <b>Character Encoding Group</b>:
30
 * 
31
 * Bit 7 6 5 4 3 2 1 0<br>
32
 * <br>
33
 * Bits 7..4 contain the "Coding Group Bits" which control what values are
34
 * contained in bits 3..0 OR even 5..0<br>
35
 * <br>
36
 * <b>0000: Character Encoding Group</b>
37
 * <ul>
38
 * <li>Bits 0,1,2,3 Represent 16 Language Encodings</li>
39
 * </ul>
40
 * 
41
 * 
42
 * @author Aurélien Baudet
43
 *
44
 */
45
public class CharsetMapToCharacterEncodingGroupDataCodingProvider implements DataCodingProvider {
46
	private final boolean failIfUnknown;
47
	private final Map<String, Byte> alphabetIndexedByCharsetName;
48
49
	/**
50
	 * Provides {@link DataCoding} based on the charset used to encode the
51
	 * message.
52
	 * 
53
	 * <p>
54
	 * The default map is used (charset name {@literal ->} alphabet):
55
	 * <ul>
56
	 * <li>{@link CharsetUtil#NAME_GSM7} {@literal ->}
57
	 * {@link DataCoding#CHAR_ENC_DEFAULT}</li>
58
	 * <li>{@link CharsetUtil#NAME_PACKED_GSM} {@literal ->}
59
	 * {@link DataCoding#CHAR_ENC_DEFAULT}</li>
60
	 * <li>{@link CharsetUtil#NAME_GSM} {@literal ->}
61
	 * {@link DataCoding#CHAR_ENC_8BIT}</li>
62
	 * <li>{@link CharsetUtil#NAME_GSM8} {@literal ->}
63
	 * {@link DataCoding#CHAR_ENC_8BIT}</li>
64
	 * <li>{@link CharsetUtil#NAME_ISO_8859_1} {@literal ->}
65
	 * {@link DataCoding#CHAR_ENC_LATIN1}</li>
66
	 * <li>{@link CharsetUtil#NAME_UCS_2} {@literal ->}
67
	 * {@link DataCoding#CHAR_ENC_UCS2}</li>
68
	 * </ul>
69
	 * 
70
	 * @param failIfUnknown
71
	 *            if true it throws {@link UnsupportedCharsetException}, if
72
	 *            false is returns null to let other
73
	 *            {@link DataCodingProvider}(s) being executed.
74
	 */
75
	public CharsetMapToCharacterEncodingGroupDataCodingProvider(boolean failIfUnknown) {
76
		super();
77
		this.failIfUnknown = failIfUnknown;
78
		this.alphabetIndexedByCharsetName = defaultMap();
79
	}
80
81
	@Override
82
	public DataCoding provide(Encoded encoded) throws DataCodingException {
83
		NamedCharset charset = NamedCharset.from(encoded.getCharsetName());
84
		Byte encoding = alphabetIndexedByCharsetName.get(charset.getCharsetName());
85 4 1. provide : negated conditional → NO_COVERAGE
2. provide : negated conditional → TIMED_OUT
3. provide : negated conditional → KILLED
4. provide : negated conditional → KILLED
		if (encoding == null) {
86 2 1. provide : negated conditional → NO_COVERAGE
2. provide : negated conditional → KILLED
			if (failIfUnknown) {
87
				throw new UnsupportedCharsetException(encoded.getCharsetName() + " charset not supported for Character Encoding Group Data Coding Scheme", encoded);
88
			}
89
			return null;
90
		}
91 4 1. provide : replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::provide → NO_COVERAGE
2. provide : replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::provide → TIMED_OUT
3. provide : replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::provide → KILLED
4. provide : replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::provide → KILLED
		return DataCoding.createCharacterEncodingGroup(encoding);
92
	}
93
94
	/**
95
	 * Default mapping used to determine {@link DataCoding} encoding value from
96
	 * {@link Charset}:
97
	 * <ul>
98
	 * <li>{@link CharsetUtil#NAME_GSM7} {@literal ->}
99
	 * {@link DataCoding#CHAR_ENC_DEFAULT}</li>
100
	 * <li>{@link CharsetUtil#NAME_PACKED_GSM} {@literal ->}
101
	 * {@link DataCoding#CHAR_ENC_DEFAULT}</li>
102
	 * <li>{@link CharsetUtil#NAME_GSM} {@literal ->}
103
	 * {@link DataCoding#CHAR_ENC_8BIT}</li>
104
	 * <li>{@link CharsetUtil#NAME_GSM8} {@literal ->}
105
	 * {@link DataCoding#CHAR_ENC_8BIT}</li>
106
	 * <li>{@link CharsetUtil#NAME_ISO_8859_1} {@literal ->}
107
	 * {@link DataCoding#CHAR_ENC_LATIN1}</li>
108
	 * <li>{@link CharsetUtil#NAME_UCS_2} {@literal ->}
109
	 * {@link DataCoding#CHAR_ENC_UCS2}</li>
110
	 * </ul>
111
	 * 
112
	 * 
113
	 * @return the mapping
114
	 */
115
	public static Map<String, Byte> defaultMap() {
116
		Map<String, Byte> map = new HashMap<>();
117
		// @formatter:off
118
		map.put(NAME_GSM, 			CHAR_ENC_8BIT);
119
		map.put(NAME_GSM8, 			CHAR_ENC_8BIT);
120
		// SMPP v3.3 defines 0 for GSM 7-bit packed.
121
		// Since SMPP v3.4, meaning of DCS=0 is ambiguous...
122
		// But it is the only possible value for GSM 7-bit packed 
123
		map.put(NAME_GSM7, 			CHAR_ENC_DEFAULT);
124
		map.put(NAME_PACKED_GSM, 	CHAR_ENC_DEFAULT);
125
		map.put(NAME_ISO_8859_1, 	CHAR_ENC_LATIN1);
126
		map.put(NAME_UCS_2, 		CHAR_ENC_UCS2);
127
		// TODO: if other charset are used => which data coding values to use ? Where to find the information ???
128
//		map.put(CharsetUtil.NAME_AIRWIDE_GSM, DataCoding.);
129
//		map.put(CharsetUtil.NAME_AIRWIDE_IA5, DataCoding.);
130
//		map.put(CharsetUtil.NAME_ISO_8859_15, DataCoding.);
131
//		map.put(CharsetUtil.NAME_MODIFIED_UTF8, DataCoding.);
132
//		map.put(CharsetUtil.NAME_TMOBILENL_GSM, DataCoding.);
133
//		map.put(CharsetUtil.NAME_UTF_8, DataCoding.);
134
//		map.put(CharsetUtil.NAME_VFD2_GSM, DataCoding.);
135
//		map.put(CharsetUtil.NAME_VFTR_GSM, DataCoding.);
136
137
		
138
//		map.put(CharsetUtil.NAME_GSM, 		DataCoding.CHAR_ENC_8BIT);
139
//		map.put(CharsetUtil.NAME_GSM8, 		DataCoding.CHAR_ENC_8BIT);
140
//		map.put(CharsetUtil., 		DataCoding.CHAR_ENC_8BITA);
141
//		map.put(CharsetUtil., 		DataCoding.CHAR_ENC_CYRLLIC);
142
//		map.put(CharsetUtil.NAME_GSM7, 		DataCoding.CHAR_ENC_DEFAULT);
143
//		map.put(CharsetUtil.NAME_PACKED_GSM, 		DataCoding.CHAR_ENC_DEFAULT);
144
//		map.put(CharsetUtil., 		DataCoding.CHAR_ENC_EXKANJI);
145
//		map.put(CharsetUtil., 		DataCoding.CHAR_ENC_HEBREW);
146
//		map.put(CharsetUtil., 		DataCoding.CHAR_ENC_IA5);
147
//		map.put(CharsetUtil., 		DataCoding.CHAR_ENC_JIS);
148
//		map.put(CharsetUtil., 		DataCoding.CHAR_ENC_KSC5601);
149
//		map.put(CharsetUtil.NAME_ISO_8859_1, 		DataCoding.CHAR_ENC_LATIN1);
150
//		map.put(CharsetUtil., 		DataCoding.CHAR_ENC_MUSIC);
151
//		map.put(CharsetUtil., 		DataCoding.CHAR_ENC_PICTO);
152
//		map.put(CharsetUtil., 		DataCoding.CHAR_ENC_RSRVD);
153
//		map.put(CharsetUtil., 		DataCoding.CHAR_ENC_RSRVD2);
154
//		map.put(CharsetUtil., 		DataCoding.CHAR_ENC_RSRVD3);
155
//		map.put(CharsetUtil.NAME_UCS_2, 		DataCoding.CHAR_ENC_UCS2);
156
		// @formatter:on
157 4 1. defaultMap : replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::defaultMap → SURVIVED
2. defaultMap : replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::defaultMap → TIMED_OUT
3. defaultMap : replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::defaultMap → KILLED
4. defaultMap : replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::defaultMap → KILLED
		return Collections.unmodifiableMap(map);
158
	}
159
160
}

Mutations

85

1.1
Location : provide
Killed by : oghamall.it.sms.SmsSMPPGsm7bitTest.longMessage(oghamall.it.sms.SmsSMPPGsm7bitTest)
negated conditional → KILLED

2.2
Location : provide
Killed by : none
negated conditional → NO_COVERAGE

3.3
Location : provide
Killed by : none
negated conditional → TIMED_OUT

4.4
Location : provide
Killed by : oghamcloudhopper.ut.CharsetMapToCharacterEncodingGroupDataCodingProviderSpec
negated conditional → KILLED

86

1.1
Location : provide
Killed by : oghamcloudhopper.ut.CharsetMapToCharacterEncodingGroupDataCodingProviderSpec
negated conditional → KILLED

2.2
Location : provide
Killed by : none
negated conditional → NO_COVERAGE

91

1.1
Location : provide
Killed by : oghamcloudhopper.ut.CharsetMapToCharacterEncodingGroupDataCodingProviderSpec
replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::provide → KILLED

2.2
Location : provide
Killed by : none
replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::provide → NO_COVERAGE

3.3
Location : provide
Killed by : none
replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::provide → TIMED_OUT

4.4
Location : provide
Killed by : oghamall.it.sms.SmsSMPPGsm7bitTest.longMessage(oghamall.it.sms.SmsSMPPGsm7bitTest)
replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::provide → KILLED

157

1.1
Location : defaultMap
Killed by : none
replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::defaultMap → SURVIVED

2.2
Location : defaultMap
Killed by : oghamcloudhopper.ut.CharsetMapToCharacterEncodingGroupDataCodingProviderSpec
replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::defaultMap → KILLED

3.3
Location : defaultMap
Killed by : none
replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::defaultMap → TIMED_OUT

4.4
Location : defaultMap
Killed by : oghamall.it.sms.SmsSMPPGsm7bitTest.longMessage(oghamall.it.sms.SmsSMPPGsm7bitTest)
replaced return value with null for fr/sii/ogham/sms/sender/impl/cloudhopper/preparator/CharsetMapToCharacterEncodingGroupDataCodingProvider::defaultMap → KILLED

Active mutators

Tests examined


Report generated by PIT OGHAM