| 1 | package fr.sii.ogham.sms.builder.cloudhopper; | |
| 2 | ||
| 3 | import static fr.sii.ogham.core.builder.configuration.MayOverride.overrideIfNotSet; | |
| 4 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_AUTO_DATA_CODING_SCHEME_ENABLED; | |
| 5 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_AUTO_GUESS_ENABLED; | |
| 6 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_BIND_TIMEOUT; | |
| 7 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_BIND_TYPE; | |
| 8 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_CHARSET; | |
| 9 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_CLOUDHOPPER_CONFIGURER_PRIORITY; | |
| 10 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_CONNECT_MAX_RETRIES; | |
| 11 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_CONNECT_RETRY_DELAY; | |
| 12 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_CONNECT_TIMEOUT; | |
| 13 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_ENQUIRE_LINK_INTERVAL; | |
| 14 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_ENQUIRE_LINK_RESPONSE_TIMEOUT; | |
| 15 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_ENQUIRE_LINK_REUSE_RESPONSE_TIMEOUT; | |
| 16 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_GSM7BIT_PACKED_ENCODING_PRIORITY; | |
| 17 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_GSM8_ENCODING_PRIORITY; | |
| 18 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_INTERFACE_VERSION; | |
| 19 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_KEEP_ALIVE_CONNECT_AT_STARTUP; | |
| 20 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_KEEP_ALIVE_ENABLED; | |
| 21 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_KEEP_ALIVE_MAX_CONSECUTIVE_TIMEOUTS; | |
| 22 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_LAST_INTERACTION_EXPIRATION_DELAY; | |
| 23 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_LATIN1_ENCODING_PRIORITY; | |
| 24 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_REQUEST_EXPIRY_TIMEOUT; | |
| 25 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_RESPONSE_TIMEOUT; | |
| 26 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_REUSE_SESSION_ENABLED; | |
| 27 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_SMPP_PORT; | |
| 28 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_SPLIT_ENABLED; | |
| 29 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_UCS2_ENCODING_PRIORITY; | |
| 30 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_UNBIND_TIMEOUT; | |
| 31 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_USE_SHORT_MESSAGE; | |
| 32 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_USE_TLV_MESSAGE_PAYLOAD; | |
| 33 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_WINDOW_MONITOR_INTERVAL; | |
| 34 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_WINDOW_SIZE; | |
| 35 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_WINDOW_WAIT_TIMEOUT; | |
| 36 | import static fr.sii.ogham.sms.CloudhopperConstants.DEFAULT_WRITE_TIMEOUT; | |
| 37 | import static fr.sii.ogham.sms.builder.cloudhopper.CloudhopperRetryablePredicates.canResendMessage; | |
| 38 | import static fr.sii.ogham.sms.builder.cloudhopper.CloudhopperRetryablePredicates.canRetryConnecting; | |
| 39 | ||
| 40 | import org.slf4j.Logger; | |
| 41 | import org.slf4j.LoggerFactory; | |
| 42 | ||
| 43 | import fr.sii.ogham.core.builder.MessagingBuilder; | |
| 44 | import fr.sii.ogham.core.builder.configurer.ConfigurerFor; | |
| 45 | import fr.sii.ogham.core.builder.configurer.MessagingConfigurer; | |
| 46 | import fr.sii.ogham.core.builder.context.BuildContext; | |
| 47 | import fr.sii.ogham.core.util.ClasspathUtils; | |
| 48 | import fr.sii.ogham.sms.splitter.GsmMessageSplitter; | |
| 49 | ||
| 50 | /** | |
| 51 | * Default configurer for Cloudhoppder that is automatically applied every time | |
| 52 | * a {@link MessagingBuilder} instance is created through | |
| 53 | * {@link MessagingBuilder#standard()}. | |
| 54 | * | |
| 55 | * <p> | |
| 56 | * The configurer has a priority of 40000 in order to be applied after | |
| 57 | * templating configurers. | |
| 58 | * </p> | |
| 59 | * | |
| 60 | * This configurer is applied only if {@code com.cloudhopper.smpp.SmppClient} is | |
| 61 | * present in the classpath. If not present, Cloudhopper implementation is not | |
| 62 | * registered at all. | |
| 63 | * | |
| 64 | * <p> | |
| 65 | * This configurer inherits environment configuration (see | |
| 66 | * {@link BuildContext}). | |
| 67 | * </p> | |
| 68 | * | |
| 69 | * <p> | |
| 70 | * This configurer applies the following configuration: | |
| 71 | * <ul> | |
| 72 | * <li>Configures SMPP protocol: | |
| 73 | * <ul> | |
| 74 | * <li>It uses one of "ogham.sms.cloudhopper.host" or "ogham.sms.smpp.host" | |
| 75 | * property if defined for SMPP server host address (IP or hostname)</li> | |
| 76 | * <li>It uses one of "ogham.sms.cloudhopper.port" or "ogham.sms.smpp.port" | |
| 77 | * property if defined for SMPP server port. Default port is 25</li> | |
| 78 | * <li>It uses "ogham.sms.cloudhopper.interface-version" property if defined for | |
| 79 | * the version of the protocol. Default is "3.4"</li> | |
| 80 | * </ul> | |
| 81 | * </li> | |
| 82 | * <li>Configures authentication: | |
| 83 | * <ul> | |
| 84 | * <li>It uses one of "ogham.sms.cloudhopper.system-id" or | |
| 85 | * "ogham.sms.smpp.system-id" property if defined for to identify an ESME ( | |
| 86 | * External Short Message Entity) or an SMSC (Short Message Service Centre) at | |
| 87 | * bind time</li> | |
| 88 | * <li>It uses one of "ogham.sms.cloudhopper.password" or | |
| 89 | * "ogham.sms.smpp.password" property if defined for an optional password</li> | |
| 90 | * </ul> | |
| 91 | * </li> | |
| 92 | * <li>Configures text message encoding: | |
| 93 | * <ul> | |
| 94 | * <li>It enables <a href="https://en.wikipedia.org/wiki/GSM_03.38">GSM | |
| 95 | * 03.38</a> encoding support. It automatically guess the supported encoding in | |
| 96 | * order to use the minimum octets for the text message: | |
| 97 | * <ul> | |
| 98 | * <li>It can encode using GSM 7-bit default alphabet if the message contains | |
| 99 | * only characters defined in the table. Message is packed so the message can | |
| 100 | * have a maximum length of 160 characters instead of 140.<br> | |
| 101 | * It uses one of "ogham.sms.cloudhopper.encoder.gsm7bit-packed.priority" or | |
| 102 | * "ogham.sms.encoder.gsm7bit-packed.priority" to set priority of GSM 7-bit | |
| 103 | * encoding.<br> | |
| 104 | * Default priority is set to 0 (disabled by default because most of providers | |
| 105 | * don't support it).</li> | |
| 106 | * <li>It encodes using GSM 8-bit data encoding if the message contains only | |
| 107 | * characters that can be encoded on one octet.<br> | |
| 108 | * It uses one of "ogham.sms.cloudhopper.encoder.gsm8bit.priority" or | |
| 109 | * "ogham.sms.encoder.gsm8bit.priority" to set priority of GSM 8-bit | |
| 110 | * encoding.<br> | |
| 111 | * Default priority is set to 99000.</li> | |
| 112 | * <li>It encodes using UCS-2 encoding if the message contains special | |
| 113 | * characters (Unicode characters) that can't be encoded on one octet. Each | |
| 114 | * character is encoded on two octets.<br> | |
| 115 | * It uses one of "ogham.sms.cloudhopper.encoder.ucs2.priority" or | |
| 116 | * "ogham.sms.encoder.ucs2.priority" to set priority of GSM 8-bit encoding.<br> | |
| 117 | * Default priority is set to 98000.</li> | |
| 118 | * </ul> | |
| 119 | * </li> | |
| 120 | * <li>If for any reason the message can't be encoded with standard encoding or | |
| 121 | * auto-guess is disabled, the default behavior is used: | |
| 122 | * <ul> | |
| 123 | * <li>It uses "ogham.sms.cloudhopper.encoder.default-charset" property to | |
| 124 | * encode messages using "GSM" (8-bit) charset</li> | |
| 125 | * </ul> | |
| 126 | * </li> | |
| 127 | * </ul> | |
| 128 | * </li> | |
| 129 | * <li>Configures message splitting: | |
| 130 | * <ul> | |
| 131 | * <li>Uses {@link GsmMessageSplitter} to split messages according to encoding: | |
| 132 | * <ul> | |
| 133 | * <li>If message is encoded using GSM 7-bit alphabet (7 bits per character), | |
| 134 | * one message of 160 characters can fit in a single segment of 140 octets (160 | |
| 135 | * characters * 7 / 8). If the message is over 160 characters, the message is | |
| 136 | * split in 140 octet segments including a 6 octet header meaning that each | |
| 137 | * segment can transport 153 characters ((140 - 6) * 8 / 7) and a partial | |
| 138 | * character (remaining octet).</li> | |
| 139 | * <li>If message is encoded using GSM 8-bit alphabet (1 octet per character), | |
| 140 | * one message of 140 characters can fit in a single segment of 140 octets. If | |
| 141 | * the message is over 140 characters, the message is split in 140 octet | |
| 142 | * segments including a 6 octet header meaning that each segment can transport | |
| 143 | * 134 characters (140 - 6).</li> | |
| 144 | * <li>If message is encoded using UCS-2 alphabet (2 octets per character), one | |
| 145 | * message of 70 characters can fit in a single segment of 140 octets (70 | |
| 146 | * characters * 2). If the message is over 70 characters, the message is split | |
| 147 | * in 140 octet segments including a 6 octet header meaning that each segment | |
| 148 | * can transport 67 characters ((140 - 6) / 2).</li> | |
| 149 | * </ul> | |
| 150 | * </li> | |
| 151 | * </ul> | |
| 152 | * </li> | |
| 153 | * <li>Configures session management: | |
| 154 | * <ul> | |
| 155 | * <li>Timeouts through properties</li> | |
| 156 | * <li>The window management through properties</li> | |
| 157 | * <li>The connection retry handling through properties</li> | |
| 158 | * </ul> | |
| 159 | * </li> | |
| 160 | * </ul> | |
| 161 | * | |
| 162 | * @author Aurélien Baudet | |
| 163 | * | |
| 164 | */ | |
| 165 | public final class DefaultCloudhopperConfigurer { | |
| 166 | private static final Logger LOG = LoggerFactory.getLogger(DefaultCloudhopperConfigurer.class); | |
| 167 | ||
| 168 | @ConfigurerFor(targetedBuilder = "standard", priority = DEFAULT_CLOUDHOPPER_CONFIGURER_PRIORITY) | |
| 169 | public static class CloudhopperConfigurer implements MessagingConfigurer { | |
| 170 | @Override | |
| 171 | public void configure(MessagingBuilder msgBuilder) { | |
| 172 |
5
1. configure : negated conditional → KILLED 2. configure : negated conditional → KILLED 3. configure : negated conditional → KILLED 4. configure : negated conditional → KILLED 5. configure : negated conditional → KILLED |
if (!canUseCloudhopper()) { |
| 173 | LOG.debug("[{}] skip configuration", this); | |
| 174 | return; | |
| 175 | } | |
| 176 | LOG.debug("[{}] apply configuration", this); | |
| 177 | // add additional checks to indicate that a message should not be | |
| 178 | // retried in some circumstances | |
| 179 | msgBuilder.sms().autoRetry().retryable(canResendMessage()::and); | |
| 180 | // configure message sender | |
| 181 | CloudhopperBuilder builder = msgBuilder.sms().sender(CloudhopperBuilder.class); | |
| 182 | // @formatter:off | |
| 183 | builder | |
| 184 | .systemId().properties("${ogham.sms.cloudhopper.system-id}", "${ogham.sms.smpp.system-id}").and() | |
| 185 | .password().properties("${ogham.sms.cloudhopper.password}", "${ogham.sms.smpp.password}").and() | |
| 186 | .host().properties("${ogham.sms.cloudhopper.host}", "${ogham.sms.smpp.host}").and() | |
| 187 | .port().properties("${ogham.sms.cloudhopper.port}", "${ogham.sms.smpp.port}").defaultValue(overrideIfNotSet(DEFAULT_SMPP_PORT)).and() | |
| 188 | .bindType().properties("${ogham.sms.cloudhopper.bind-type}", "${ogham.sms.smpp.bind-type}").defaultValue(overrideIfNotSet(DEFAULT_BIND_TYPE)).and() | |
| 189 | .systemType().properties("${ogham.sms.cloudhopper.system-type}", "${ogham.sms.smpp.system-type}").and() | |
| 190 | .interfaceVersion().properties("${ogham.sms.cloudhopper.interface-version}").defaultValue(overrideIfNotSet(DEFAULT_INTERFACE_VERSION)).and() | |
| 191 | .userData() | |
| 192 | .useShortMessage().properties("${ogham.sms.cloudhopper.user-data.use-short-message}", "${ogham.sms.smpp.user-data.use-short-message}").defaultValue(overrideIfNotSet(DEFAULT_USE_SHORT_MESSAGE)).and() | |
| 193 | .useTlvMessagePayload().properties("${ogham.sms.cloudhopper.user-data.use-tlv-message-payload}", "${ogham.sms.smpp.user-data.use-tlv-message-payload}").defaultValue(overrideIfNotSet(DEFAULT_USE_TLV_MESSAGE_PAYLOAD)).and() | |
| 194 | .and() | |
| 195 | .encoder() | |
| 196 | // packed algorithm disabled by default because it is not supported by most of providers | |
| 197 | .gsm7bitPacked().properties("${ogham.sms.cloudhopper.encoder.gsm7bit-packed.priority}", "${ogham.sms.smpp.encoder.gsm7bit-packed.priority}").defaultValue(overrideIfNotSet(DEFAULT_GSM7BIT_PACKED_ENCODING_PRIORITY)).and() | |
| 198 | .gsm8bit().properties("${ogham.sms.cloudhopper.encoder.gsm8bit.priority}", "${ogham.sms.smpp.encoder.gsm8bit.priority}").defaultValue(overrideIfNotSet(DEFAULT_GSM8_ENCODING_PRIORITY)).and() | |
| 199 | .latin1().properties("${ogham.sms.cloudhopper.encoder.latin1.priority}", "${ogham.sms.smpp.encoder.latin1.priority}").defaultValue(overrideIfNotSet(DEFAULT_LATIN1_ENCODING_PRIORITY)).and() | |
| 200 | .ucs2().properties("${ogham.sms.cloudhopper.encoder.ucs2.priority}", "${ogham.sms.smpp.encoder.ucs2.priority}").defaultValue(overrideIfNotSet(DEFAULT_UCS2_ENCODING_PRIORITY)).and() | |
| 201 | .autoGuess().properties("${ogham.sms.cloudhopper.encoder.auto-guess.enable}", "${ogham.sms.smpp.encoder.auto-guess.enable}").defaultValue(overrideIfNotSet(DEFAULT_AUTO_GUESS_ENABLED)).and() | |
| 202 | .fallback().properties("${ogham.sms.cloudhopper.encoder.default-charset}", "${ogham.sms.smpp.encoder.default-charset}").defaultValue(overrideIfNotSet(DEFAULT_CHARSET)).and() | |
| 203 | .and() | |
| 204 | .splitter() | |
| 205 | .enable().properties("${ogham.sms.cloudhopper.split.enable}", "${ogham.sms.smpp.split.enable}", "${ogham.sms.split.enable}").defaultValue(overrideIfNotSet(DEFAULT_SPLIT_ENABLED)).and() | |
| 206 | .referenceNumber() | |
| 207 | .random() | |
| 208 | .and() | |
| 209 | .and() | |
| 210 | .dataCodingScheme() | |
| 211 | .auto().properties("${ogham.sms.cloudhopper.data-coding-scheme.auto.enable}", "${ogham.sms.smpp.data-coding-scheme.auto.enable}").defaultValue(overrideIfNotSet(DEFAULT_AUTO_DATA_CODING_SCHEME_ENABLED)).and() | |
| 212 | .value().properties("${ogham.sms.cloudhopper.data-coding-scheme.value}", "${ogham.sms.smpp.data-coding-scheme.value}").and() | |
| 213 | .and() | |
| 214 | .session() | |
| 215 | .sessionName().properties("${ogham.sms.cloudhopper.session.name}").and() | |
| 216 | .bindTimeout().properties("${ogham.sms.cloudhopper.session.bind-timeout}").defaultValue(overrideIfNotSet(DEFAULT_BIND_TIMEOUT)).and() | |
| 217 | .connectTimeout().properties("${ogham.sms.cloudhopper.session.connect-timeout}").defaultValue(overrideIfNotSet(DEFAULT_CONNECT_TIMEOUT)).and() | |
| 218 | .requestExpiryTimeout().properties("${ogham.sms.cloudhopper.session.request-expiry-timeout}").defaultValue(overrideIfNotSet(DEFAULT_REQUEST_EXPIRY_TIMEOUT)).and() | |
| 219 | .windowMonitorInterval().properties("${ogham.sms.cloudhopper.session.window-monitor-interval}").defaultValue(overrideIfNotSet(DEFAULT_WINDOW_MONITOR_INTERVAL)).and() | |
| 220 | .windowSize().properties("${ogham.sms.cloudhopper.session.window-size}").defaultValue(overrideIfNotSet(DEFAULT_WINDOW_SIZE)).and() | |
| 221 | .windowWait().properties("${ogham.sms.cloudhopper.session.window-wait-timeout}").defaultValue(overrideIfNotSet(DEFAULT_WINDOW_WAIT_TIMEOUT)).and() | |
| 222 | .writeTimeout().properties("${ogham.sms.cloudhopper.session.write-timeout}").defaultValue(overrideIfNotSet(DEFAULT_WRITE_TIMEOUT)).and() | |
| 223 | .responseTimeout().properties("${ogham.sms.cloudhopper.session.response-timeout}").defaultValue(overrideIfNotSet(DEFAULT_RESPONSE_TIMEOUT)).and() | |
| 224 | .unbindTimeout().properties("${ogham.sms.cloudhopper.session.unbind-timeout}").defaultValue(overrideIfNotSet(DEFAULT_UNBIND_TIMEOUT)).and() | |
| 225 | .reuseSession() | |
| 226 | .enable().properties("${ogham.sms.cloudhopper.session.reuse-session.enable}").defaultValue(overrideIfNotSet(DEFAULT_REUSE_SESSION_ENABLED)).and() | |
| 227 | .lastInteractionExpiration().properties("${ogham.sms.cloudhopper.session.reuse-session.last-interaction-expiration-delay}").defaultValue(overrideIfNotSet(DEFAULT_LAST_INTERACTION_EXPIRATION_DELAY)).and() | |
| 228 | .responseTimeout().properties("${ogham.sms.cloudhopper.session.reuse-session.response-timeout}").defaultValue(overrideIfNotSet(DEFAULT_ENQUIRE_LINK_REUSE_RESPONSE_TIMEOUT)).and() | |
| 229 | .and() | |
| 230 | .keepAlive() | |
| 231 | .enable().properties("${ogham.sms.cloudhopper.session.keep-alive.enable}").defaultValue(overrideIfNotSet(DEFAULT_KEEP_ALIVE_ENABLED)).and() | |
| 232 | .interval().properties("${ogham.sms.cloudhopper.session.keep-alive.request-interval}").defaultValue(overrideIfNotSet(DEFAULT_ENQUIRE_LINK_INTERVAL)).and() | |
| 233 | .responseTimeout().properties("${ogham.sms.cloudhopper.session.keep-alive.response-timeout}").defaultValue(overrideIfNotSet(DEFAULT_ENQUIRE_LINK_RESPONSE_TIMEOUT)).and() | |
| 234 | .connectAtStartup().properties("${ogham.sms.cloudhopper.session.keep-alive.connect-at-startup}").defaultValue(overrideIfNotSet(DEFAULT_KEEP_ALIVE_CONNECT_AT_STARTUP)).and() | |
| 235 | .maxConsecutiveTimeouts().properties("${ogham.sms.cloudhopper.session.keep-alive.max-consecutive-timeouts}").defaultValue(overrideIfNotSet(DEFAULT_KEEP_ALIVE_MAX_CONSECUTIVE_TIMEOUTS)).and() | |
| 236 | .and() | |
| 237 | .connectRetry() | |
| 238 | .retryable(canRetryConnecting()) | |
| 239 | .fixedDelay() | |
| 240 | .maxRetries().properties("${ogham.sms.cloudhopper.session.connect-retry.max-attempts}").defaultValue(overrideIfNotSet(DEFAULT_CONNECT_MAX_RETRIES)).and() | |
| 241 | .delay().properties("${ogham.sms.cloudhopper.session.connect-retry.delay-between-attempts}").defaultValue(overrideIfNotSet(DEFAULT_CONNECT_RETRY_DELAY)).and() | |
| 242 | .and() | |
| 243 | .exponentialDelay() | |
| 244 | .maxRetries().properties("${ogham.sms.cloudhopper.session.connect-retry.max-attempts}").defaultValue(overrideIfNotSet(DEFAULT_CONNECT_MAX_RETRIES)).and() | |
| 245 | .initialDelay().properties("${ogham.sms.cloudhopper.session.connect-retry.exponential-initial-delay}").and() | |
| 246 | .and() | |
| 247 | .perExecutionDelay() | |
| 248 | .maxRetries().properties("${ogham.sms.cloudhopper.session.connect-retry.max-attempts}").defaultValue(overrideIfNotSet(DEFAULT_CONNECT_MAX_RETRIES)).and() | |
| 249 | .delays().properties("${ogham.sms.cloudhopper.session.connect-retry.per-execution-delays}").and() | |
| 250 | .and() | |
| 251 | .fixedInterval() | |
| 252 | .maxRetries().properties("${ogham.sms.cloudhopper.session.connect-retry.max-attempts}").defaultValue(overrideIfNotSet(DEFAULT_CONNECT_MAX_RETRIES)).and() | |
| 253 | .interval().properties("${ogham.sms.cloudhopper.session.connect-retry.execution-interval}"); | |
| 254 | // @formatter:on | |
| 255 | } | |
| 256 | ||
| 257 | private static boolean canUseCloudhopper() { | |
| 258 |
6
1. canUseCloudhopper : replaced boolean return with true for fr/sii/ogham/sms/builder/cloudhopper/DefaultCloudhopperConfigurer$CloudhopperConfigurer::canUseCloudhopper → SURVIVED 2. canUseCloudhopper : replaced boolean return with false for fr/sii/ogham/sms/builder/cloudhopper/DefaultCloudhopperConfigurer$CloudhopperConfigurer::canUseCloudhopper → KILLED 3. canUseCloudhopper : replaced boolean return with false for fr/sii/ogham/sms/builder/cloudhopper/DefaultCloudhopperConfigurer$CloudhopperConfigurer::canUseCloudhopper → KILLED 4. canUseCloudhopper : replaced boolean return with false for fr/sii/ogham/sms/builder/cloudhopper/DefaultCloudhopperConfigurer$CloudhopperConfigurer::canUseCloudhopper → KILLED 5. canUseCloudhopper : replaced boolean return with false for fr/sii/ogham/sms/builder/cloudhopper/DefaultCloudhopperConfigurer$CloudhopperConfigurer::canUseCloudhopper → KILLED 6. canUseCloudhopper : replaced boolean return with false for fr/sii/ogham/sms/builder/cloudhopper/DefaultCloudhopperConfigurer$CloudhopperConfigurer::canUseCloudhopper → KILLED |
return ClasspathUtils.exists("com.cloudhopper.smpp.SmppClient"); |
| 259 | } | |
| 260 | } | |
| 261 | ||
| 262 | private DefaultCloudhopperConfigurer() { | |
| 263 | super(); | |
| 264 | } | |
| 265 | } | |
Mutations | ||
| 172 |
1.1 2.2 3.3 4.4 5.5 |
|
| 258 |
1.1 2.2 3.3 4.4 5.5 6.6 |