View Javadoc
1   /**
2    * Copyright 2011-2013 The Kuali Foundation Licensed under the
3    * Educational Community License, Version 2.0 (the "License"); you may
4    * not use this file except in compliance with the License. You may
5    * obtain a copy of the License at
6    *
7    * http://www.osedu.org/licenses/ECL-2.0
8    *
9    * Unless required by applicable law or agreed to in writing,
10   * software distributed under the License is distributed on an "AS IS"
11   * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12   * or implied. See the License for the specific language governing
13   * permissions and limitations under the License.
14   */
15  package org.kuali.mobility.push.service.send.config;
16  
17  import java.util.Properties;
18  
19  import net.rim.pushsdk.commons.PushSDKProperties;
20  
21  import org.apache.commons.lang.StringUtils;
22  import org.springframework.beans.factory.annotation.Autowired;
23  import org.springframework.beans.factory.annotation.Qualifier;
24  
25  /**
26   * Class to act as the configuration require for BlackBerry Push notifications.
27   * This class only implements public messaging (not BES or BDS)
28   *
29   * @author Kuali Mobility Team (mobility.dev@kuali.org)
30   * @since 2.2.0
31   */
32  public class BlackberryPushConfig implements PushSDKProperties {
33  
34  	/** Flag if this config is for the evaluation of Blackberry Push Service */
35  	private boolean eval = true;
36  
37  	/**
38  	 * Application ID
39  	 */
40  	private String applicationId;
41  
42  	/**
43  	 * Content provider ID
44  	 */
45  	private String cpid = "";
46  
47  	/**
48  	 * Base PPG URL
49  	 */
50  	private String ppgBaseUrl;
51  
52  	/**
53  	 * URL to send Push notifications too
54  	 */
55  	private String pushUrl;
56  
57  	/**
58  	 * A reference to the KME Properties
59  	 */
60  	@Autowired
61  	@Qualifier("kmeProperties")
62  	private Properties kmeProperties;
63  
64  	/**
65  	 * Maximum number of attempts to generate a unique push id before giving up
66  	 */
67  	// Property : regenerate.pushid.max.attempts
68  	private int regeneratePushIdMaxAttempts = 5;
69  
70  	/**
71  	 * The default deliver before timestamp is the current time plus this offset in milliseconds.
72  	 * Required for low level APIs. This is only used in the low-level PAP component, if no expiry date is specified through the push API.
73  	 * The high-level push uses the push application's defaultPushLiveTime, if not specified in the API through PushParameters.
74  	 */
75  	// Property : default.deliver.before.timestamp.offset
76  	private long defaultDeliverBeforeTimestampOffset = 3600000L;
77  
78  	/**
79  	 * List of parser special characters that should be avoided when specifying values of PAP message elements.
80   	 * For example, the characters below are not allowed for the pushId element of the PAP XML.
81   	 * Required for low level APIs
82  	 */
83  	// Property :
84  	private char[] parserSpecialCharacters = new char[] {'&','"',':','<'};
85  
86  	/**
87  	 *  Maximum number of SQL IN clause parameters allowed by the DB implementation being used (i.e. Oracle limit is 1000)
88  	 */
89  	// Property : "parser.special.characters
90  	private int maxInClauseValues = 1000;
91  
92  	/**
93  	 * Push submission URL of the public/BIS push server. If you are not using a public/BIS PPG, this value should not be set.
94  	 * Required for low level APIs (if using a BIS push server)
95  	 */
96  	// Property : public.ppg.address
97  	private String publicPpgAddress = "/mss/PD_pushRequest";
98  
99  	/**
100 	 * Push submission URL of the enterprise/BES central push server. If you are not using an enterprise/BES PPG, this value should not be set.
101  	 * Note: For backwards compatibility this URL may be a BDS PPG URL if you wish to use your existing push initiator unchanged to push to BB10 devices.
102 	 * Required for low level APIs (if using a BES push server)
103 	 */
104 	// Property : enterprise.ppg.address
105 	private String enterprisePpgAddress = "/pap";
106 
107 	/**
108 	 * Push submission URL of the enterprise/BDS central push server. If you are not using an enterprise/BDS PPG, this value should not be set.
109 	 * Required for low level APIs (if using a BDS push server)
110 	 */
111 	// Property : bds.ppg.address
112 	private String BDSPpgAddress = "/pap";
113 
114 	/**
115 	 * Maximum size of the result notification queue before it starts rejecting new notifications
116 	 */
117 	// Property : acknowledgement.max.queue.size
118 	private int acknowledgementMaxQueueSize = 100000;
119 
120 	/**
121 	 * Maximum number of threads processing the internal result notification queue and notifying the listeners
122 	 */
123 	// Property : acknowledgement.max.threads
124 	private int acknowledgementMaxThreads = 20;
125 
126 	/**
127 	 * Maximum number of result notifications in a batch for processing
128 	 */
129 	// Property : acknowledgement.batch.size
130 	private int acknowledgementBatchSize = 500;
131 
132 	/**
133 	 * Time in milliseconds to delay, after looking up and not finding the push request detail that corresponds to
134 	 * a result notification, before retrying the lookup.
135 	 * This property is needed for the case where the result notification has come back before the push request
136 	 * detail has been committed to storage.
137 	 * Note: This property only applies to push applications that have the "store push requests" flag set to true.
138 	 */
139 	// Property : acknowledgement.push.lookup.retry.delay
140 	private int acknowledgementPushLookupRetryDelay = 5000;
141 
142 	/**
143 	 * When the number of subscribers to validate are below this water mark an optimized query for small number of subscribers will be used;
144 	 * conversely when above this number a second optimized query for a large number of subscribers will be used
145 	 */
146 	// Property : subscription.validation.high.water.mark
147 	private int subscriptionValidationHighWaterMark = 100000;
148 
149 	/**
150 	 * Number of subscribers to load at once from the database to validate. Making this number too large may exceed available system memory.
151 	 * Making this number too small will decrease performance as more calls to the persistent store will be required.
152 	 * Important: This number should never be zero! One must be the minimum value
153 	 */
154 	// Property : subscription.validation.batch.size
155 	private int subscriptionValidationBatchSize = 100000;
156 
157 	/**
158 	 * Subscriber Deregistration URL for public/BIS push
159 	 * Note: If you are not using a public/BIS PPG, this value should not be set.
160 	 */
161 	// Property : subscription.deregistration.url
162 	private String subscriptionDeregistrationUrl = "/mss/PD_cpDeregUser?pin=";
163 
164 	/**
165 	 * Suspend Subscription URL for public/BIS push
166 	 * Note: If you are not using a public/BIS PPG, this value should not be set.
167 	 */
168 	// Property : subscription.suspend.url
169 	private String subscriptionSuspendUrl = "/mss/PD_cpSub?cpAction=suspend&pin=";
170 
171 	/**
172 	 * Resume Subscription URL for public/BIS push
173 	 * Note: If you are not using a public/BIS PPG, this value should not be set.
174 	 */
175 	// Property : subscription.resume.url
176 	private String subscriptionResumeUrl = "/mss/PD_cpSub?cpAction=resume&pin=";
177 
178 	/**
179 	 * Maximum number of threads to use for large subscription validation/subscription matching
180 	 */
181 	// Property : subscription.matching.max.threads
182 	private int subscriptionMatchingMaxThreads = 5;
183 
184 	/**
185 	 * The max. number of results returned by a subscriber find operation. Making this value too large may exceed available system memory.
186 	 */
187 	// Property : subscription.find.max.results
188 	private int subscriptionFindMaxResults = 100000;
189 
190 	/**
191 	 * The max. number of results returned by a push request detail find operation. Making this value too large may exceed available system memory.
192 	 */
193 	// Property : push.request.detail.find.max.results
194 	private int pushRequestDetailFindMaxResults = 100000;
195 
196 	/**
197 	 * Defines the type of database that the SDK is working with. The options are: mysql, oracle.
198 	 */
199 	// Property : database.type
200 	private String databaseType = "mysql";
201 
202 	/**
203 	 * DTD declaration to use when constructing XML to send to the public/BIS PPG (this property is not related to parsing XML sent from the PPG).
204 	 * Important: This property should not be changed unless the PPG changes the DTD it is using first!
205 	 * Required for low level APIs (if using BIS push server)
206 	 */
207 	// Property : dtd.declaration.public
208 	private String dtdDeclarationPublic = "<!DOCTYPE pap PUBLIC \"-//WAPFORUM//DTD PAP 2.1//EN\" \"http://www.openmobilealliance.org/tech/DTD/pap_2.1.dtd\">";
209 
210 	/**
211 	 * DTD declaration to use when constructing XML to send to the enterprise/BES and enterprise/BDS PPGs (this property is not related to parsing XML sent from the PPG).
212 	 * Important: This property should not be changed unless the PPG changes the DTD it is using first!
213 	 * Required for low level APIs (if using BES or BDS push server)
214 	 */
215 	// Property : dtd.declaration.enterprise
216 	private String dtdDeclarationEnterprise = "<!DOCTYPE pap PUBLIC \"-//WAPFORUM//DTD PAP 2.0//EN\" \"http://www.wapforum.org/DTD/pap_2.0.dtd\" [<?wap-pap-ver supported-versions=\"2.0\"?>]>";
217 
218 	/**
219 	 * Connection timeout in milliseconds
220 	 * Required for low level APIs
221 	 */
222 	// Property : http.connection.timeout
223 	private int httpConnectionTimeout = 60000;
224 
225 	/**
226 	 * Read timeout in milliseconds
227 	 * Required for low level APIs
228 	 */
229 	// Property : http.read.timeout
230 	private int httpReadTimeout = 120000;
231 
232 	/**
233 	 * Whether to use persistent connections (true or false)
234  	 * Required for low level APIs
235 	 */
236 	// Property : http.is.persistent
237 	private boolean httpIsPersistent = true;
238 
239 	/**
240 	 *  Queue size to use during unsubscribes for a hard application delete.
241 	 *  The queue will block and wait if the threads working on the unsubscribes cannot keep up with the queue filling up.
242 	 */
243 	// Property : pushapp.delete.unsubscribe.queuesize
244 	private int pushAppDeleteUnsubscribeQueueSize = 100000;
245 
246 	/**
247 	 *  The amount of time to wait (in minutes) for the unsubscribing of subscribers
248 	 *  for a hard application delete before timing out and throwing an exception.
249 	 */
250 	// Property : pushapp.delete.unsubscribe.timeout
251 	private int pushAppDeleteUnsubscribeTimeout = 30;
252 
253 	/**
254 	 *  The amount of time to wait (in minutes) for the deletion of subscribers
255 	 *  for a hard application delete before timing out and throwing an exception.
256 	 */
257 	// Property : pushapp.subscriber.delete.timeout
258 	private int pushAppSubscriberDeleteTimeout = 10;
259 
260 	/**
261 	 *  Queue size to use for large subscription validation/subscription matching
262 	 *  The queue will block and wait if the threads working on the subscription validation/matching cannot keep up with the queue filling up.
263 	 */
264 	// Property : subscription.matching.queuesize
265 	private int subscriptionMatchingQueueSize = 50000;
266 
267 	/**
268 	 *  When syncing up the status of subscribers with the PPG, the batch size to use for each sync request.
269 	 *  Important: The max. number of subscribers to include in each sync request is actually defined by the PPG.
270 	 *  It is present here in case it changes on the PPG end and has to be updated here on the SDK side.
271 	 *  Note: If you are not using a public/BIS PPG, this property will be ignored.
272 	 */
273 	// Property : subscription.ppg.sync.batch.size
274 	private int subscriptionPPGSyncBatchSize = 10000;
275 
276 	/**
277 	 * Subscription query URL for public/BIS push
278 	 * Note: If you are not using a public/BIS PPG, this value should not be set.
279 	 * Required for low level APIs (if using a BIS push server)
280 	 */
281 	// Property : subscription.query.url
282 	private String subscriptionQueryUrl = "/mss/PD_cpSubQuery";
283 
284 	/**
285 	 *  Queue size to use for syncing up the status of subscribers with the PPG.
286 	 *  The queue will block and wait if the threads working on the subscription status syncing cannot keep up with the queue filling up.
287 	 *  Note: If you are not using a public/BIS PPG, this property will be ignored.
288 	 */
289 	// Property : subscription.ppg.sync.queuesize
290 	private int subscriptionPPGSyncQueueSize = 5000;
291 
292 	/**
293 	 *  The amount of time to wait (in minutes) for the syncing up of the status of subscribers with the PPG before timing out
294 	 *  and throwing an exception.
295 	 *  Note: If you are not using a public/BIS PPG, this property will be ignored.
296 	 */
297 	// Property : subscription.ppg.sync.timeout
298 	private int subscriptionPPGSyncTimeout = 30;
299 
300 	/**
301 	 * Maximum number of threads to use for the syncing up of the status of subscribers with the PPG.
302 	 * Note: If you are not using a public/BIS PPG, this property will be ignored.
303 	 */
304 	// Property : subscription.ppg.sync.threads
305 	private int subscriptionPPGSyncMaxThreads = 5;
306 
307 	/**
308 	 *  The frequency (in seconds) with which push statistics are updated in storage.  All counts and content sums will be kept in memory until
309 	 *  a batch update is done to storage at the specified interval.  As a result, there might be slight inconsistencies in the stats until
310 	 *  the update takes place.  Setting a larger value for this property increases the chances for inconsistency.  Setting a smaller value
311 	 *  guarantees more regular updates, but will impact performance more significantly.
312 	 */
313 	// Property : push.stats.update.frequency
314 	private int pushStatsUpdateFrequency = 120;
315 
316 	/**
317 	 * The max. number of push statistics in the queue waiting to be sent for a batch update.
318 	 * If the queue has reached its max. size, it will block until the size of the queue goes down again.
319 	 */
320 	// Property : push.stats.update.queuesize
321 	private int pushStatsUpdateQueueSize = 100000;
322 
323 	/**
324 	 * Area from the push notifications url.
325 	 * Only required for production.
326 	 * Valid values are: na, ?
327 	 */
328 	private String pushArea = "na";
329 
330 	/**
331 	 * Method to initialise this class
332 	 */
333 	public void initialize(){
334 		this.setApplicationId(getKmeProperties().getProperty("push.blackberry.appId"));
335 		this.setEval(Boolean.valueOf(getKmeProperties().getProperty("push.blackberry.eval","true")));
336 	}
337 	/**
338 	 * Returns the base url for blackberry urls
339 	 * @return
340 	 */
341 	private String getBasePpgUrl(){
342 		if (this.ppgBaseUrl == null){
343 			if (this.eval){
344 				this.ppgBaseUrl = "https://"+this.cpid+".pushapi.eval.blackberry.com";
345 			}
346 			else{
347 				this.ppgBaseUrl = "https://"+this.cpid+".pushapi.blackberry.com";
348 			}
349 		}
350 		return ppgBaseUrl;
351 	}
352 
353 	/**
354 	 * Returns the url which should be used by the native app to open a push notifications listener
355 	 * @return
356 	 */
357 	public String getPushUrl(){
358 		if (this.pushUrl == null){
359 			if (this.eval){
360 				this.pushUrl = "http://cpXXX.pushapi.eval.blackberry.com";
361 			}
362 			else{
363 				this.pushUrl = "http://cp"+this.cpid+".pushapi." + this.pushArea + ".blackberry.com";
364 			}
365 		}
366 		return this.pushUrl;
367 
368 	}
369 
370 	/**
371 	 *
372 	 * @return
373 	 */
374 	public final String getBaseBdsUrl(){
375 		throw new IllegalArgumentException("Method not implemented");
376 	}
377 
378 	/**
379 	 *
380 	 * @return
381 	 */
382 	public final String getBaseBesUrl(){
383 		throw new IllegalArgumentException("Method not implemented");
384 	}
385 
386 	/**
387 	 * @see {@link #acknowledgementMaxQueueSize}
388 	 */
389 	public int getAcknowledgementMaxQueueSize(){
390 		return this.acknowledgementMaxQueueSize;
391 	}
392 
393 	/**
394 	 * @see {@link #acknowledgementMaxThreads}
395 	 */
396 	public int getAcknowledgementMaxThreads(){
397 		return this.acknowledgementMaxThreads;
398 	}
399 
400 	/**
401 	 * @see {@link #acknowledgementBatchSize}
402 	 */
403 	public int getAcknowledgementBatchSize() {
404 		return this.acknowledgementBatchSize;
405 	}
406 
407 	/**
408 	 * @see {@link #acknowledgementPushLookupRetryDelay}
409 	 */
410 	public int getAcknowledgementPushLookupRetryDelay(){
411 		return this.acknowledgementPushLookupRetryDelay;
412 	}
413 
414 	/**
415 	 * @see {@link #databaseType}
416 	 */
417 	public String getDatabaseType(){
418 		return this.databaseType;
419 	}
420 
421 	/**
422 	 * @see {@link #defaultDeliverBeforeTimestampOffset}
423 	 */
424 	public long getDefaultDeliverBeforeTimestampOffset() {
425 		return defaultDeliverBeforeTimestampOffset;
426 	}
427 
428 	/**
429 	 * @see {@link #maxInClauseValues}
430 	 */
431 	public int getMaxInClauseValues(){
432 		return this.maxInClauseValues;
433 	}
434 
435 	/**
436 	 * @see {@link #publicPpgAddress}
437 	 */
438 	public String getPublicPpgAddress() {
439 		return this.getBasePpgUrl() + this.publicPpgAddress;
440 	}
441 
442 	/**
443 	 * @see {@link #enterprisePpgAddress}
444 	 */
445 	public String getEnterprisePpgAddress(){
446 		return this.getBaseBesUrl() + this.enterprisePpgAddress;
447 	}
448 
449 
450 	/**
451 	 * @see {@link #BDSPpgAddress}
452 	 */
453 	public String getBDSPpgAddress(){
454 		return this.getBaseBdsUrl() + this.BDSPpgAddress;
455 	}
456 
457 	/**
458 	 * @see {@link #pushRequestDetailFindMaxResults}
459 	 */
460 	public int getPushRequestDetailFindMaxResults() {
461 		return this.pushRequestDetailFindMaxResults;
462 	}
463 
464 	/**
465 	 * @see {@link #regeneratePushIdMaxAttempts}
466 	 */
467 	public int getRegeneratePushIdMaxAttempts(){
468 		return this.regeneratePushIdMaxAttempts;
469 	}
470 
471 	/**
472 	 * @see {@link #subscriptionDeregistrationUrl}
473 	 */
474 	public String getSubscriptionDeregistrationUrl(){
475 		return this.getBasePpgUrl() + this.subscriptionDeregistrationUrl;
476 	}
477 
478 	/**
479 	 * @see {@link #subscriptionFindMaxResults}
480 	 */
481 	public int getSubscriptionFindMaxResults(){
482 		return this.subscriptionFindMaxResults;
483 	}
484 
485 	/**
486 	 * @see {@link #subscriptionMatchingMaxThreads}
487 	 */
488 	public int getSubscriptionMatchingMaxThreads(){
489 		return this.subscriptionMatchingMaxThreads;
490 	}
491 
492 	/**
493 	 * @see {@link #subscriptionResumeUrl}
494 	 */
495 	public String getSubscriptionResumeUrl(){
496 		return this.getBasePpgUrl() + this.subscriptionResumeUrl;
497 	}
498 
499 	/**
500 	 * @see {@link #subscriptionSuspendUrl}
501 	 */
502 	public String getSubscriptionSuspendUrl(){
503 		return this.getBasePpgUrl() + this.subscriptionSuspendUrl;
504 	}
505 
506 	/**
507 	 * @see {@link #subscriptionValidationBatchSize}
508 	 */
509 	public int getSubscriptionValidationBatchSize() {
510 		return this.subscriptionValidationBatchSize;
511 	}
512 
513 	/**
514 	 * @see {@link #subscriptionValidationHighWaterMark}
515 	 */
516 	public int getSubscriptionValidationHighWaterMark() {
517 		return this.subscriptionValidationHighWaterMark;
518 	}
519 
520 	/**
521 	 * @see {@link #acknowledgementMaxQueueSize}
522 	 */
523 	public void setAcknowledgementMaxQueueSize(int value){
524 		this.acknowledgementMaxQueueSize = value;
525 	}
526 
527 	/**
528 	 * @see {@link #acknowledgementMaxThreads}
529 	 */
530 	public void setAcknowledgementMaxThreads(int value){
531 		this.acknowledgementMaxThreads = value;
532 	}
533 
534 	/**
535 	 * @see {@link #acknowledgementBatchSize}
536 	 */
537 	public void setAcknowledgementBatchSize(int value){
538 		this.acknowledgementBatchSize = value;
539 	}
540 
541 	public boolean isEval() {
542 		return this.eval;
543 	}
544 
545 	public void setEval(boolean isEval) {
546 		this.eval = isEval;
547 	}
548 
549 	public String getCpid() {
550 		return cpid;
551 	}
552 
553 	public void setApplicationId(String appID) {
554 		if(!StringUtils.isEmpty(appID)) {
555 			final char cHYPHEN = '-';
556 			if( appID.indexOf( cHYPHEN ) > -1 ) {
557 				this.cpid = appID.substring(0, appID.indexOf(cHYPHEN));
558 			}
559 			this.applicationId = appID;
560 		}
561 	}
562 
563 	public String getApplicationId(){
564 		return this.applicationId;
565 	}
566 
567 	/**
568 	 * @see {@link #acknowledgementPushLookupRetryDelay}
569 	 */
570 	public void setAcknowledgementPushLookupRetryDelay(int value) {
571 		this.acknowledgementPushLookupRetryDelay = value;
572 	}
573 
574 	/**
575 	 * @see {@link #databaseType}
576 	 */
577 	public void setDatabaseType(String value) {
578 		this.databaseType = value;
579 	}
580 
581 	/**
582 	 * @see {@link #defaultDeliverBeforeTimestampOffset}
583 	 */
584 	public void setDefaultDeliverBeforeTimestampOffset(long value) {
585 		this.defaultDeliverBeforeTimestampOffset = value;
586 	}
587 
588 	/**
589 	 * @see {@link #maxInClauseValues}
590 	 */
591 	public void setMaxInClauseValues(int value) {
592 		this.maxInClauseValues = value;
593 	}
594 
595 	/**
596 	 * @see {@link #publicPpgAddress}
597 	 */
598 	public void setPublicPpgAddress(String value) {
599 		this.publicPpgAddress = value;
600 	}
601 
602 	/**
603 	 * @see {@link #enterprisePpgAddress}
604 	 */
605 	public void setEnterprisePpgAddress(String value){
606 		this.enterprisePpgAddress = value;
607 	}
608 
609 	/**
610 	 * @see {@link #BDSPpgAddress}
611 	 */
612 	public void setBDSPpgAddress(String value) {
613 		this.BDSPpgAddress = value;
614 	}
615 
616 	/**
617 	 * @see {@link #pushRequestDetailFindMaxResults}
618 	 */
619 	public void setPushRequestDetailFindMaxResults(int value) {
620 		this.pushRequestDetailFindMaxResults = value;
621 	}
622 
623 	/**
624 	 * @see {@link #regeneratePushIdMaxAttempts}
625 	 */
626 	public void setRegeneratePushIdMaxAttempts(int value) {
627 		this.regeneratePushIdMaxAttempts = value;
628 	}
629 
630 	/**
631 	 * @see {@link #subscriptionDeregistrationUrl}
632 	 */
633 	public void setSubscriptionDeregistrationUrl(String value) {
634 		this.subscriptionDeregistrationUrl = value;
635 	}
636 
637 	/**
638 	 * @see {@link #subscriptionFindMaxResults}
639 	 */
640 	public void setSubscriptionFindMaxResults(int value) {
641 		this.subscriptionFindMaxResults = value;
642 	}
643 
644 	/**
645 	 * @see {@link #subscriptionMatchingMaxThreads}
646 	 */
647 	public void setSubscriptionMatchingMaxThreads(int value) {
648 		this.subscriptionMatchingMaxThreads = value;
649 	}
650 
651 	/**
652 	 * @see {@link #subscriptionResumeUrl}
653 	 */
654 	public void setSubscriptionResumeUrl(String value) {
655 		this.subscriptionResumeUrl = value;
656 	}
657 
658 	/**
659 	 * @see {@link #subscriptionSuspendUrl}
660 	 */
661 	public void setSubscriptionSuspendUrl(String value) {
662 		this.subscriptionSuspendUrl = value;
663 	}
664 
665 	/**
666 	 * @see {@link #subscriptionValidationBatchSize}
667 	 */
668 	public void setSubscriptionValidationBatchSize(int value){
669 		if (value <= 0){
670 			this.subscriptionValidationBatchSize = 1;
671 		}else{
672 			this.subscriptionValidationBatchSize = value;
673 		}
674 	}
675 
676 	/**
677 	 * @see {@link #subscriptionValidationHighWaterMark}
678 	 */
679 	public void setSubscriptionValidationHighWaterMark(int value) {
680 		this.subscriptionValidationHighWaterMark = value;
681 	}
682 
683 	/**
684 	 * @see {@link #httpConnectionTimeout}
685 	 */
686 	public int getHttpConnectionTimeout() {
687 		return this.httpConnectionTimeout;
688 	}
689 
690 	/**
691 	 * @see {@link #httpIsPersistent}
692 	 */
693 	public boolean getHttpIsPersistent() {
694 		return this.httpIsPersistent;
695 	}
696 
697 	/**
698 	 * @see {@link #httpReadTimeout}
699 	 */
700 	public int getHttpReadTimeout() {
701 		return httpReadTimeout;
702 	}
703 
704 	/**
705 	 * @see {@link #httpConnectionTimeout}
706 	 */
707 	public void setHttpConnectionTimeout(int value) {
708 		this.httpConnectionTimeout = value;
709 	}
710 
711 	/**
712 	 * @see {@link #httpIsPersistent}
713 	 */
714 	public void setHttpIsPersistent(boolean value) {
715 		this.httpIsPersistent = value;
716 	}
717 
718 	/**
719 	 * @see {@link #httpReadTimeout}
720 	 */
721 	public void setHttpReadTimeout(int value){
722 		this.httpReadTimeout = value;
723 	}
724 
725 	/**
726 	 * @see {@link #pushAppDeleteUnsubscribeQueueSize}
727 	 */
728 	public int getPushAppDeleteUnsubscribeQueueSize(){
729 		return this.pushAppDeleteUnsubscribeQueueSize;
730 	}
731 
732 	/**
733 	 * @see {@link #pushAppDeleteUnsubscribeQueueSize}
734 	 */
735 	public void setPushAppDeleteUnsubscribeQueueSize(int size){
736 		this.pushAppDeleteUnsubscribeQueueSize = size;
737 	}
738 
739 	/**
740 	 * @see {@link #pushAppDeleteUnsubscribeTimeout}
741 	 */
742 	public int getPushAppDeleteUnsubscribeTimeout(){
743 		return this.pushAppDeleteUnsubscribeTimeout;
744 	}
745 
746 	/**
747 	 * @see {@link #pushAppDeleteUnsubscribeTimeout}
748 	 */
749 	public void setPushAppDeleteUnsubscribeTimeout(int timeout){
750 		this.pushAppDeleteUnsubscribeTimeout = timeout;
751 	}
752 
753 	/**
754 	 * @see {@link #pushAppSubscriberDeleteTimeout}
755 	 */
756 	public int getPushAppSubscriberDeleteTimeout(){
757 		return this.pushAppSubscriberDeleteTimeout;
758 	}
759 
760 	/**
761 	 * @see {@link #pushAppSubscriberDeleteTimeout}
762 	 */
763 	public void setPushAppSubscriberDeleteTimeout(int timeout){
764 		this.pushAppSubscriberDeleteTimeout = timeout;
765 	}
766 
767 	/**
768 	 * @see {@link #subscriptionMatchingQueueSize}
769 	 */
770 	public int getSubscriptionMatchingQueueSize() {
771 		return this.subscriptionMatchingQueueSize;
772 	}
773 
774 	/**
775 	 * @see {@link #subscriptionMatchingQueueSize}
776 	 */
777 	public void setSubscriptionMatchingQueueSize(int size) {
778 		this.subscriptionMatchingQueueSize = size;
779 	}
780 
781 	/**
782 	 * @see {@link #subscriptionPPGSyncBatchSize}
783 	 */
784 	public int getSubscriptionPPGSyncBatchSize(){
785 		return this.subscriptionPPGSyncBatchSize;
786 	}
787 
788 	/**
789 	 * @see {@link #subscriptionPPGSyncBatchSize}
790 	 */
791 	public void setSubscriptionPPGSyncBatchSize(int size){
792 		this.subscriptionPPGSyncBatchSize = size;
793 	}
794 
795 	/**
796 	 * @see {@link #subscriptionQueryUrl}
797 	 */
798 	public String getSubscriptionQueryUrl(){
799 		return this.getBasePpgUrl() + this.subscriptionQueryUrl;
800 	}
801 
802 	/**
803 	 * @see {@link #subscriptionQueryUrl}
804 	 */
805 	public void setSubscriptionQueryUrl(String url){
806 		this.subscriptionQueryUrl = url;
807 	}
808 
809 	/**
810 	 * @see {@link #subscriptionPPGSyncQueueSize}
811 	 */
812 	public int getSubscriptionPPGSyncQueueSize(){
813 		return this.subscriptionPPGSyncQueueSize;
814 	}
815 
816 	/**
817 	 * @see {@link #subscriptionPPGSyncQueueSize}
818 	 */
819 	public void setSubscriptionPPGSyncQueueSize(int size){
820 		this.subscriptionPPGSyncQueueSize = size;
821 	}
822 
823 	/**
824 	 * @see {@link #subscriptionPPGSyncTimeout}
825 	 */
826 	public int getSubscriptionPPGSyncTimeout() {
827 		return this.subscriptionPPGSyncTimeout;
828 	}
829 
830 	/**
831 	 * @see {@link #subscriptionPPGSyncTimeout}
832 	 */
833 	public void setSubscriptionPPGSyncTimeout(int timeout){
834 		this.subscriptionPPGSyncTimeout = timeout;
835 	}
836 
837 
838 	/**
839 	 * @see {@link #parserSpecialCharacters}
840 	 */
841 	public char[] getParserSpecialCharacters(){
842 		return  this.parserSpecialCharacters;
843 	}
844 
845 	/**
846 	 * @see {@link #subscriptionPPGSyncMaxThreads}
847 	 */
848 	public void setParserSpecialCharacters(char[] value){
849 		if(value != null){
850 			this.parserSpecialCharacters = value.clone();
851 //			this.parserSpecialCharacters = value;
852 		}
853 	}
854 
855 	/**
856 	 * @see {@link #subscriptionPPGSyncMaxThreads}
857 	 */
858 	public int getSubscriptionPPGSyncMaxThreads() {
859 		return this.subscriptionPPGSyncMaxThreads;
860 	}
861 
862 	/**
863 	 * @see {@link #subscriptionPPGSyncMaxThreads}
864 	 */
865 	public void setSubscriptionPPGSyncMaxThreads(int value){
866 		this.subscriptionPPGSyncMaxThreads = value;
867 	}
868 
869 	/**
870 	 * @see {@link #pushStatsUpdateFrequency}
871 	 */
872 	public int getPushStatsUpdateFrequency(){
873 		return this.pushStatsUpdateFrequency;
874 	}
875 
876 	/**
877 	 * @see {@link #pushStatsUpdateFrequency}
878 	 */
879 	public void setPushStatsUpdateFrequency(int value){
880 		this.pushStatsUpdateFrequency = value;
881 	}
882 
883 	/**
884 	 * @see {@link #pushStatsUpdateQueueSize}
885 	 */
886 	public int getPushStatsUpdateQueueSize(){
887 		return this.pushStatsUpdateQueueSize;
888 	}
889 
890 	/**
891 	 * @see {@link #pushStatsUpdateQueueSize}
892 	 */
893 	public void setPushStatsUpdateQueueSize(int value){
894 		this.pushStatsUpdateQueueSize = value;
895 	}
896 
897 	/**
898 	 * @see {@link #dtdDeclarationPublic}
899 	 */
900 	public String getDtdDeclarationPublic(){
901 		return this.dtdDeclarationPublic;
902 	}
903 
904 	/**
905 	 * @see {@link #dtdDeclarationPublic}
906 	 */
907 	public void setDtdDeclarationPublic(String value){
908 		this.dtdDeclarationPublic = value;
909 	}
910 
911 
912 	/**
913 	 * @see {@link #dtdDeclarationEnterprise}
914 	 */
915 	public String getDtdDeclarationEnterprise(){
916 		return this.dtdDeclarationEnterprise;
917 	}
918 
919 	/**
920 	 * @see {@link #dtdDeclarationEnterprise}
921 	 */
922 	public void setDtdDeclarationEnterprise(String value){
923 		this.dtdDeclarationEnterprise = value;
924 	}
925 
926 	/**
927 	 * @return the kmeProperties
928 	 */
929 	public Properties getKmeProperties() {
930 		return kmeProperties;
931 	}
932 
933 	/**
934 	 * @param kmeProperties the kmeProperties to set
935 	 */
936 	public void setKmeProperties(Properties kmeProperties) {
937 		this.kmeProperties = kmeProperties;
938 	}
939 }