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 final 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 			if( appID.indexOf( "-" ) > -1 ) {
556 				this.cpid = appID.substring(0, appID.indexOf("-"));
557 			}
558 			this.applicationId = appID;
559 		}
560 	}
561 
562 	public String getApplicationId(){
563 		return this.applicationId;
564 	}
565 
566 	/**
567 	 * @see {@link #acknowledgementPushLookupRetryDelay}
568 	 */
569 	public void setAcknowledgementPushLookupRetryDelay(int value) {
570 		this.acknowledgementPushLookupRetryDelay = value;
571 	}
572 
573 	/**
574 	 * @see {@link #databaseType}
575 	 */
576 	public void setDatabaseType(String value) {
577 		this.databaseType = value;
578 	}
579 
580 	/**
581 	 * @see {@link #defaultDeliverBeforeTimestampOffset}
582 	 */
583 	public void setDefaultDeliverBeforeTimestampOffset(long value) {
584 		this.defaultDeliverBeforeTimestampOffset = value;
585 	}
586 
587 	/**
588 	 * @see {@link #maxInClauseValues}
589 	 */
590 	public void setMaxInClauseValues(int value) {
591 		this.maxInClauseValues = value;
592 	}
593 
594 	/**
595 	 * @see {@link #publicPpgAddress}
596 	 */
597 	public void setPublicPpgAddress(String value) {
598 		this.publicPpgAddress = value;
599 	}
600 
601 	/**
602 	 * @see {@link #enterprisePpgAddress}
603 	 */
604 	public void setEnterprisePpgAddress(String value){
605 		this.enterprisePpgAddress = value;
606 	}
607 
608 	/**
609 	 * @see {@link #BDSPpgAddress}
610 	 */
611 	public void setBDSPpgAddress(String value) {
612 		this.BDSPpgAddress = value;
613 	}
614 
615 	/**
616 	 * @see {@link #pushRequestDetailFindMaxResults}
617 	 */
618 	public void setPushRequestDetailFindMaxResults(int value) {
619 		this.pushRequestDetailFindMaxResults = value;
620 	}
621 
622 	/**
623 	 * @see {@link #regeneratePushIdMaxAttempts}
624 	 */
625 	public void setRegeneratePushIdMaxAttempts(int value) {
626 		this.regeneratePushIdMaxAttempts = value;
627 	}
628 
629 	/**
630 	 * @see {@link #subscriptionDeregistrationUrl}
631 	 */
632 	public void setSubscriptionDeregistrationUrl(String value) {
633 		this.subscriptionDeregistrationUrl = value;
634 	}
635 
636 	/**
637 	 * @see {@link #subscriptionFindMaxResults}
638 	 */
639 	public void setSubscriptionFindMaxResults(int value) {
640 		this.subscriptionFindMaxResults = value;
641 	}
642 
643 	/**
644 	 * @see {@link #subscriptionMatchingMaxThreads}
645 	 */
646 	public void setSubscriptionMatchingMaxThreads(int value) {
647 		this.subscriptionMatchingMaxThreads = value;
648 	}
649 
650 	/**
651 	 * @see {@link #subscriptionResumeUrl}
652 	 */
653 	public void setSubscriptionResumeUrl(String value) {
654 		this.subscriptionResumeUrl = value;
655 	}
656 
657 	/**
658 	 * @see {@link #subscriptionSuspendUrl}
659 	 */
660 	public void setSubscriptionSuspendUrl(String value) {
661 		this.subscriptionSuspendUrl = value;
662 	}
663 
664 	/**
665 	 * @see {@link #subscriptionValidationBatchSize}
666 	 */
667 	public void setSubscriptionValidationBatchSize(int value){
668 		if (value <= 0){
669 			value = 1;
670 		}
671 		this.subscriptionValidationBatchSize = value;
672 	}
673 
674 	/**
675 	 * @see {@link #subscriptionValidationHighWaterMark}
676 	 */
677 	public void setSubscriptionValidationHighWaterMark(int value) {
678 		this.subscriptionValidationHighWaterMark = value;
679 	}
680 
681 	/**
682 	 * @see {@link #httpConnectionTimeout}
683 	 */
684 	public int getHttpConnectionTimeout() {
685 		return this.httpConnectionTimeout;
686 	}
687 
688 	/**
689 	 * @see {@link #httpIsPersistent}
690 	 */
691 	public boolean getHttpIsPersistent() {
692 		return this.httpIsPersistent;
693 	}
694 
695 	/**
696 	 * @see {@link #httpReadTimeout}
697 	 */
698 	public int getHttpReadTimeout() {
699 		return httpReadTimeout;
700 	}
701 
702 	/**
703 	 * @see {@link #httpConnectionTimeout}
704 	 */
705 	public void setHttpConnectionTimeout(int value) {
706 		this.httpConnectionTimeout = value;
707 	}
708 
709 	/**
710 	 * @see {@link #httpIsPersistent}
711 	 */
712 	public void setHttpIsPersistent(boolean value) {
713 		this.httpIsPersistent = value;
714 	}
715 
716 	/**
717 	 * @see {@link #httpReadTimeout}
718 	 */
719 	public void setHttpReadTimeout(int value){
720 		this.httpReadTimeout = value;
721 	}
722 
723 	/**
724 	 * @see {@link #pushAppDeleteUnsubscribeQueueSize}
725 	 */
726 	public int getPushAppDeleteUnsubscribeQueueSize(){
727 		return this.pushAppDeleteUnsubscribeQueueSize;
728 	}
729 
730 	/**
731 	 * @see {@link #pushAppDeleteUnsubscribeQueueSize}
732 	 */
733 	public void setPushAppDeleteUnsubscribeQueueSize(int size){
734 		this.pushAppDeleteUnsubscribeQueueSize = size;
735 	}
736 
737 	/**
738 	 * @see {@link #pushAppDeleteUnsubscribeTimeout}
739 	 */
740 	public int getPushAppDeleteUnsubscribeTimeout(){
741 		return this.pushAppDeleteUnsubscribeTimeout;
742 	}
743 
744 	/**
745 	 * @see {@link #pushAppDeleteUnsubscribeTimeout}
746 	 */
747 	public void setPushAppDeleteUnsubscribeTimeout(int timeout){
748 		this.pushAppDeleteUnsubscribeTimeout = timeout;
749 	}
750 
751 	/**
752 	 * @see {@link #pushAppSubscriberDeleteTimeout}
753 	 */
754 	public int getPushAppSubscriberDeleteTimeout(){
755 		return this.pushAppSubscriberDeleteTimeout;
756 	}
757 
758 	/**
759 	 * @see {@link #pushAppSubscriberDeleteTimeout}
760 	 */
761 	public void setPushAppSubscriberDeleteTimeout(int timeout){
762 		this.pushAppSubscriberDeleteTimeout = timeout;
763 	}
764 
765 	/**
766 	 * @see {@link #subscriptionMatchingQueueSize}
767 	 */
768 	public int getSubscriptionMatchingQueueSize() {
769 		return this.subscriptionMatchingQueueSize;
770 	}
771 
772 	/**
773 	 * @see {@link #subscriptionMatchingQueueSize}
774 	 */
775 	public void setSubscriptionMatchingQueueSize(int size) {
776 		this.subscriptionMatchingQueueSize = size;
777 	}
778 
779 	/**
780 	 * @see {@link #subscriptionPPGSyncBatchSize}
781 	 */
782 	public int getSubscriptionPPGSyncBatchSize(){
783 		return this.subscriptionPPGSyncBatchSize;
784 	}
785 
786 	/**
787 	 * @see {@link #subscriptionPPGSyncBatchSize}
788 	 */
789 	public void setSubscriptionPPGSyncBatchSize(int size){
790 		this.subscriptionPPGSyncBatchSize = size;
791 	}
792 
793 	/**
794 	 * @see {@link #subscriptionQueryUrl}
795 	 */
796 	public String getSubscriptionQueryUrl(){
797 		return this.getBasePpgUrl() + this.subscriptionQueryUrl;
798 	}
799 
800 	/**
801 	 * @see {@link #subscriptionQueryUrl}
802 	 */
803 	public void setSubscriptionQueryUrl(String url){
804 		this.subscriptionQueryUrl = url;
805 	}
806 
807 	/**
808 	 * @see {@link #subscriptionPPGSyncQueueSize}
809 	 */
810 	public int getSubscriptionPPGSyncQueueSize(){
811 		return this.subscriptionPPGSyncQueueSize;
812 	}
813 
814 	/**
815 	 * @see {@link #subscriptionPPGSyncQueueSize}
816 	 */
817 	public void setSubscriptionPPGSyncQueueSize(int size){
818 		this.subscriptionPPGSyncQueueSize = size;
819 	}
820 
821 	/**
822 	 * @see {@link #subscriptionPPGSyncTimeout}
823 	 */
824 	public int getSubscriptionPPGSyncTimeout() {
825 		return this.subscriptionPPGSyncTimeout;
826 	}
827 
828 	/**
829 	 * @see {@link #subscriptionPPGSyncTimeout}
830 	 */
831 	public void setSubscriptionPPGSyncTimeout(int timeout){
832 		this.subscriptionPPGSyncTimeout = timeout;
833 	}
834 
835 
836 	/**
837 	 * @see {@link #parserSpecialCharacters}
838 	 */
839 	public char[] getParserSpecialCharacters(){
840 		return  this.parserSpecialCharacters;
841 	}
842 
843 	/**
844 	 * @see {@link #subscriptionPPGSyncMaxThreads}
845 	 */
846 	public void setParserSpecialCharacters(char[] value){
847 		this.parserSpecialCharacters = value;
848 	}
849 
850 	/**
851 	 * @see {@link #subscriptionPPGSyncMaxThreads}
852 	 */
853 	public int getSubscriptionPPGSyncMaxThreads() {
854 		return this.subscriptionPPGSyncMaxThreads;
855 	}
856 
857 	/**
858 	 * @see {@link #subscriptionPPGSyncMaxThreads}
859 	 */
860 	public void setSubscriptionPPGSyncMaxThreads(int value){
861 		this.subscriptionPPGSyncMaxThreads = value;
862 	}
863 
864 	/**
865 	 * @see {@link #pushStatsUpdateFrequency}
866 	 */
867 	public int getPushStatsUpdateFrequency(){
868 		return this.pushStatsUpdateFrequency;
869 	}
870 
871 	/**
872 	 * @see {@link #pushStatsUpdateFrequency}
873 	 */
874 	public void setPushStatsUpdateFrequency(int value){
875 		this.pushStatsUpdateFrequency = value;
876 	}
877 
878 	/**
879 	 * @see {@link #pushStatsUpdateQueueSize}
880 	 */
881 	public int getPushStatsUpdateQueueSize(){
882 		return this.pushStatsUpdateQueueSize;
883 	}
884 
885 	/**
886 	 * @see {@link #pushStatsUpdateQueueSize}
887 	 */
888 	public void setPushStatsUpdateQueueSize(int value){
889 		this.pushStatsUpdateQueueSize = value;
890 	}
891 
892 	/**
893 	 * @see {@link #dtdDeclarationPublic}
894 	 */
895 	public String getDtdDeclarationPublic(){
896 		return this.dtdDeclarationPublic;
897 	}
898 
899 	/**
900 	 * @see {@link #dtdDeclarationPublic}
901 	 */
902 	public void setDtdDeclarationPublic(String value){
903 		this.dtdDeclarationPublic = value;
904 	}
905 
906 
907 	/**
908 	 * @see {@link #dtdDeclarationEnterprise}
909 	 */
910 	public String getDtdDeclarationEnterprise(){
911 		return this.dtdDeclarationEnterprise;
912 	}
913 
914 	/**
915 	 * @see {@link #dtdDeclarationEnterprise}
916 	 */
917 	public void setDtdDeclarationEnterprise(String value){
918 		this.dtdDeclarationEnterprise = value;
919 	}
920 
921 	/**
922 	 * @return the kmeProperties
923 	 */
924 	public Properties getKmeProperties() {
925 		return kmeProperties;
926 	}
927 
928 	/**
929 	 * @param kmeProperties the kmeProperties to set
930 	 */
931 	public void setKmeProperties(Properties kmeProperties) {
932 		this.kmeProperties = kmeProperties;
933 	}
934 }