Subversion Repositories SmartDukaan

Rev

Rev 7508 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
7473 vikram.rag 1
package com.amazonservices.mws.orders.samples;
2
 
3
import in.shop2020.feeds.products.AmazonEnvelope;
4
import in.shop2020.feeds.products.AmazonEnvelope.Message;
5
import in.shop2020.feeds.products.OrderAcknowledgement;
6
import in.shop2020.feeds.products.Header;
7
import in.shop2020.logistics.LogisticsServiceException;
8
import in.shop2020.logistics.PickUpType;
9
import in.shop2020.model.v1.inventory.AmazonInventorySnapshot;
10
import in.shop2020.model.v1.order.AmazonOrdersToAcknowledge;
11
import in.shop2020.model.v1.order.OrderSource;
12
import in.shop2020.model.v1.order.OrderType;
13
import in.shop2020.model.v1.order.SourceDetail;
14
import in.shop2020.model.v1.order.TransactionServiceException;
15
import in.shop2020.model.v1.order.TransactionStatus;
16
import in.shop2020.model.v1.user.User;
17
import in.shop2020.model.v1.user.UserContextException;
18
import in.shop2020.payments.PaymentException;
19
import in.shop2020.payments.PaymentStatus;
20
import in.shop2020.thrift.clients.InventoryClient;
21
import in.shop2020.thrift.clients.PaymentClient;
22
import in.shop2020.thrift.clients.TransactionClient;
23
import in.shop2020.thrift.clients.UserClient;
24
import in.shop2020.utils.GmailUtils;
25
 
26
import java.io.File;
27
import java.io.FileInputStream;
28
import java.io.FileNotFoundException;
29
import java.io.IOException;
30
import java.math.BigInteger;
31
import java.security.DigestInputStream;
32
import java.security.MessageDigest;
33
import java.security.NoSuchAlgorithmException;
34
import java.util.ArrayList;
35
import java.util.Arrays;
36
import java.util.GregorianCalendar;
37
import java.util.HashMap;
38
import java.util.List;
39
import java.util.Map;
40
import java.util.Random;
41
 
42
import com.amazonaws.mws.model.SubmitFeedRequest;
43
import javax.xml.bind.JAXBContext;
44
import javax.xml.bind.JAXBException;
45
import javax.xml.bind.Marshaller;
46
import javax.xml.datatype.DatatypeConfigurationException;
47
import javax.xml.datatype.DatatypeFactory;
48
import javax.xml.datatype.XMLGregorianCalendar;
49
import javax.xml.transform.Result;
50
 
51
import org.apache.http.HttpStatus;
52
import org.apache.thrift.TException;
53
import org.apache.thrift.transport.TTransportException;
54
import org.apache.commons.codec.binary.Base64;
55
import org.apache.commons.logging.Log;
56
import org.apache.commons.logging.LogFactory;
57
import com.amazonaws.mws.MarketplaceWebService;
58
import com.amazonaws.mws.MarketplaceWebServiceClient;
59
import com.amazonaws.mws.MarketplaceWebServiceConfig;
60
import com.amazonaws.mws.MarketplaceWebServiceException;
61
import com.amazonaws.mws.model.FeedSubmissionInfo;
62
import com.amazonaws.mws.model.IdList;
63
import com.amazonaws.mws.model.ResponseMetadata;
64
import com.amazonaws.mws.model.SubmitFeedRequest;
65
import com.amazonaws.mws.model.SubmitFeedResponse;
66
import com.amazonaws.mws.model.SubmitFeedResult;
67
import com.amazonservices.mws.orders.MarketplaceWebServiceOrders;
68
import com.amazonservices.mws.orders.MarketplaceWebServiceOrdersClient;
69
import com.amazonservices.mws.orders.MarketplaceWebServiceOrdersException;
70
import com.amazonservices.mws.orders.model.FulfillmentChannelEnum;
71
import com.amazonservices.mws.orders.model.ListOrderItemsByNextTokenRequest;
72
import com.amazonservices.mws.orders.model.ListOrderItemsByNextTokenResponse;
73
import com.amazonservices.mws.orders.model.ListOrderItemsByNextTokenResult;
74
import com.amazonservices.mws.orders.model.ListOrderItemsRequest;
75
import com.amazonservices.mws.orders.model.ListOrderItemsResponse;
76
import com.amazonservices.mws.orders.model.ListOrderItemsResult;
77
import com.amazonservices.mws.orders.model.ListOrdersByNextTokenRequest;
78
import com.amazonservices.mws.orders.model.ListOrdersByNextTokenResponse;
79
import com.amazonservices.mws.orders.model.ListOrdersByNextTokenResult;
80
import com.amazonservices.mws.orders.model.ListOrdersRequest;
81
import com.amazonservices.mws.orders.model.ListOrdersResponse;
82
import com.amazonservices.mws.orders.model.ListOrdersResult;
83
import com.amazonservices.mws.orders.model.MarketplaceIdList;
84
import com.amazonservices.mws.orders.model.Order;
85
import com.amazonservices.mws.orders.model.OrderItem;
86
import com.amazonservices.mws.orders.model.OrderStatusEnum;
87
import com.amazonservices.mws.orders.model.OrderStatusList;
88
 
89
/**
90
 * This sample illustrates continuous order updates retrieval. It contains a
91
 * order updates fetcher job that fetches updates every 15 minutes.
92
 */
93
 
94
public class FetchOrderUpdatesJob {
95
 
96
	/*
97
	 * Add required parameters in OrdersConfig.java before trying out this
98
	 * sample.
99
	 */
100
 
101
	public static final Log log = LogFactory.getLog(OrderFetcherSample.class);
102
	private volatile boolean keepRunning = true;
103
 
104
	/*************************************
105
	 * Throttling Limits in Milliseconds *
106
	 *************************************/
107
	// 1 call per 10 mins
108
	static final long LIST_ORDERS_THROTTLE_LIMIT = 600000L;
109
	// 1 call per 12 secs
110
	static final long LIST_ORDER_ITEMS_THROTTLE_LIMIT = 12000L;
111
 
112
	static long tempId;
113
 
114
	static {
115
		TransactionClient tcl = null;
116
		UserClient ucl = null;
117
		try {
118
			tcl = new TransactionClient();
119
			ucl = new UserClient();
120
			try {
121
				SourceDetail source = tcl.getClient().getSourceDetail(1);
122
				User user = ucl.getClient().getUserByEmail(source.getEmail());
123
				tempId = user.getUserId();
124
			} catch (TException e) {
125
				// TODO Auto-generated catch block
126
				e.printStackTrace();
127
			} catch (UserContextException e) {
128
				// TODO Auto-generated catch block
129
				e.printStackTrace();
130
			}
131
		} catch (TTransportException e) {
132
			// TODO Auto-generated catch block
133
			e.printStackTrace();
134
		}
135
 
136
 
137
 
138
	}
139
 
140
	final public static String AMAZON_ORDER_ACKNOWLEDGEMENT_XML = "/home/vikram/OrderAcknowledgeMent.xml";
141
 
142
	static final int INTERVAL_IN_MINS = 1; // 15-minute update interval
143
 
144
	//static final int INTERVAL_IN_MINS = 15; // 15-minute update interval
145
 
146
	protected MarketplaceWebServiceOrders service;
147
	protected String sellerId = null;
148
	protected MarketplaceIdList marketplaceIdList = null;
149
	private File file;
150
 
151
	public FetchOrderUpdatesJob(
152
			MarketplaceWebServiceOrders marketplaceWebServiceOrdersClient,
153
			String sellerId, MarketplaceIdList marketplaceIdList) {
154
		if (marketplaceWebServiceOrdersClient == null) {
155
			throw new IllegalArgumentException(
156
			"MarketplaceWebServiceOrders object cannot be null.");
157
		}
158
		this.service = marketplaceWebServiceOrdersClient;
159
		this.sellerId = sellerId;
160
		this.marketplaceIdList = marketplaceIdList;
161
	}
162
 
163
	public static void main(String... args) {
164
		MarketplaceWebServiceOrders client = new MarketplaceWebServiceOrdersClient(
165
				OrdersConfig.accessKeyId,
166
				OrdersConfig.secretAccessKey,
167
				OrdersConfig.applicationName,
168
				OrdersConfig.applicationVersion,
169
				OrdersConfig.config);
170
		final FetchOrderUpdatesJob orderFetcher = new FetchOrderUpdatesJob(
171
				client, OrdersConfig.sellerId,
172
				OrdersConfig.marketplaceIdList);
173
 
174
		Thread fetchOrderUpdatesJobThread = new Thread(new Runnable() {
175
			public void run() {
176
				orderFetcher.startPeriodicSynch();
177
			}
178
		});
179
 
180
		// Start the FetchOrderUpdatesJob in the second thread.
181
		fetchOrderUpdatesJobThread.start();
182
 
183
		/*
184
		 * The following code puts this thread to sleep for an hour and then the
185
		 * stopSynch() method is called which stops the job in the second
186
		 * thread.
187
		 */
188
 
189
		/*
190
		 * TODO: Make sure to change this if you want it to run indefinitely or
191
		 * for some other length of time .
192
		 */
193
		try {
194
			log.info("Main thread sleeping.");
195
			Thread.sleep(3600000L); // = 1 hour
196
			log.info("Main thread awake.");
197
		} catch (InterruptedException e) {
198
			log.error(e.getMessage(), e);
199
			return;
200
		}
201
 
202
		log.info("Main thread setting keepRunning to false.");
203
		orderFetcher.stopSynch(); // Stops the FetchOrderUpdatesJob thread.
204
 
205
		// Join the two threads and wait for the fetchOrderUpdatesJobThread to
206
		// finish.
207
		try {
208
			fetchOrderUpdatesJobThread.join();
209
		} catch (InterruptedException e) {
210
			log.error(e.getMessage(), e);
211
			return;
212
		}
213
	}
214
 
215
	/**
216
	 * Call this method to start this job. Note that the job will run until the
217
	 * keepRunning flag is set to false.
218
	 */
219
	public void startPeriodicSynch() {
220
 
221
		DatatypeFactory df = null;
222
		try {
223
			df = DatatypeFactory.newInstance();
224
		} catch (DatatypeConfigurationException e) {
225
			log.error(e.getMessage(), e);
226
		}
227
		XMLGregorianCalendar startTime = df
228
		//	.newXMLGregorianCalendar(new GregorianCalendar());
229
		.newXMLGregorianCalendar(new GregorianCalendar(2013,04,28,10,0));
230
		// endTime = now -2. So, startTime = now - 2 - INTERVAL_IN_MINS.
231
		System.out.println("Sync job start time." + startTime.getDay() +"-"+ startTime.getMonth()+"-" + startTime.getHour()+":"+startTime.getMinute());
232
 
233
		startTime.add(df.newDurationDayTime(false, 0, 0, INTERVAL_IN_MINS ,
234
				0));
235
		System.out.println("Sync job start time after add .." + startTime.getDay() +"-"+ startTime.getMonth()+"-" + startTime.getHour()+":"+startTime.getMinute());
236
		/*
237
		 * This loop keeps running until the stopSynch() method is called.
238
		 * stopSynch() sets keepRunning to false.
239
		 */
240
		System.out.println("Sync job starting.");
241
		log.info("Sync job starting.");
242
		while (keepRunning) {
243
			// Subtract 2 minutes because endTime returned from server = now - 2
244
			// mins.
245
			long timeWaited = System.currentTimeMillis()
246
			- startTime.toGregorianCalendar().getTimeInMillis()
247
			- 120000;
248
 
249
			System.out.println("Time waited : " + timeWaited/60000 + "Minutes");
250
			/*
251
			 * If the timeWaited is greater than 30 times the interval, we exit
252
			 * from the loop as the job is lagging far behind in getting new
253
			 * orders.
254
			 */
255
			//if (timeWaited > 24 * 4 * INTERVAL_IN_MINS * 60L * 1000L) {
256
			if (timeWaited > 100000 * 60L * 1000L) {	
257
				keepRunning = false;
258
				System.out.println("Setting keep running to false");
259
				log
260
				.info("timeWaited is greater than 30 times the interval. This a too large a time interval for which to fetch orders.");
261
			}
262
			/*
263
			 * If the time lapsed is greater than or equal to 15 mins, we will
264
			 * try to fetchOrderUpdates giving it a startTime.
265
			 */
266
			else if (timeWaited >= INTERVAL_IN_MINS * 60L * 1000L) {
267
				log.info("Time to fetch new order updates.");
268
 
269
				XMLGregorianCalendar endTime = fetchOrderUpdatesSince(startTime);
270
				//System.out.println("End Time is : " + endTime.getDay() +"-"+ endTime.getMonth()+"-" + endTime.getHour()+":"+endTime.getMinute());
271
				createandsubmitOrderAcknowlegementFeed();
272
				if (endTime != null) {
273
					startTime = endTime;
274
				} else {
275
					log.info("endTime returned is null. Sleeping for "
276
							+ INTERVAL_IN_MINS + " minutes.");
277
					try {
278
						Thread.sleep(INTERVAL_IN_MINS * 60L * 1000L);
279
					} catch (InterruptedException e) {
280
						log.error(e.getMessage(), e);
281
						stopSynch();
282
						break;
283
					}
284
				}
285
			} else {
286
				try {
287
					long timeToSleepInMilliseconds = INTERVAL_IN_MINS * 60000L
288
					- timeWaited;
289
					log.info("Thread sleeping for "
290
							+ Math.round(timeToSleepInMilliseconds / 60000)
291
							+ " minutes.");
292
					// Sleep in 1 minute intervals for timeToSleepInMilliseconds
293
					// or until keepRunning is set to false.
294
					for (long i = timeToSleepInMilliseconds; i > 0
295
					&& keepRunning; i = i - 60000L) {
296
						if (i < 60000L) {
297
							Thread.sleep(i);
298
						} else {
299
							Thread.sleep(60000L);
300
						}
301
					}
302
 
303
				} catch (InterruptedException e) {
304
					log.error(e.getMessage(), e);
305
					stopSynch();
306
					break;
307
				}
308
			}
309
		}
310
		log.info("Sync job ending.");
311
	}
312
 
313
	/**
314
	 * Call this method to stop execution of this job. The job will stop after
315
	 * it has finished processing the current call (if it is in the middle of
316
	 * processing any). For example if a listOrders call has been invoked, then
317
	 * it will terminate the job only after the call returns with valid results.
318
	 * If this method is called while the thread is sleeping, because a request
319
	 * was throttled, the job will terminate after it wakes up.
320
	 */
321
	public void stopSynch() {
322
		keepRunning = false;
323
	}
324
 
325
	/**
326
	 * Gets all orders updated between the given startTime and the calculated
327
	 * endTime. The endTime is calculated by the service as server's system
328
	 * clock time minus 2 mins. The method returns this endTime.
329
	 * 
330
	 */
331
	protected XMLGregorianCalendar fetchOrderUpdatesSince(
332
			XMLGregorianCalendar startTime) {
333
		System.out.println("Fetching order updates since " + startTime.toString());
334
		log.info("Fetching order updates since " + startTime.toString());
335
		ListOrdersRequest listOrdersRequest = new ListOrdersRequest();
336
 
337
		listOrdersRequest.setSellerId(sellerId);
338
		if (OrdersConfig.marketplaceIdList != null) {
339
			listOrdersRequest
340
			.setMarketplaceId(OrdersConfig.marketplaceIdList);
341
		}
342
		listOrdersRequest.setLastUpdatedAfter(startTime);
343
		OrderStatusList statusList = new OrderStatusList();
344
		List<OrderStatusEnum> orderstatusList = new ArrayList<OrderStatusEnum>();
345
		orderstatusList.add(OrderStatusEnum.UNSHIPPED);
346
		orderstatusList.add(OrderStatusEnum.PARTIALLY_SHIPPED);
347
		//orderstatusList.add(OrderStatusEnum.CANCELED);
348
 
349
		statusList.setStatus(orderstatusList);
350
		listOrdersRequest.setOrderStatus(statusList);
351
		XMLGregorianCalendar lastUpdatedDate = null;
352
 
353
		try {
354
			ListOrdersResult listOrdersResult = listOrders(listOrdersRequest);
355
			if (listOrdersResult.isSetLastUpdatedBefore()) {
356
				lastUpdatedDate = listOrdersResult.getLastUpdatedBefore();
357
			}
358
 
359
			if (listOrdersResult != null && listOrdersResult.isSetNextToken()) {
360
				ListOrdersByNextTokenRequest listOrdersByNextTokenRequest = new ListOrdersByNextTokenRequest();
361
				listOrdersByNextTokenRequest.setSellerId(sellerId);
362
				String nextToken = listOrdersResult.getNextToken();
363
				ListOrdersByNextTokenResult listOrdersByNextTokenResult = null;
364
				while (nextToken != null && keepRunning) {
365
					listOrdersByNextTokenRequest.setNextToken(nextToken);
366
					listOrdersByNextTokenResult = listOrdersByNextToken(listOrdersByNextTokenRequest);
367
					nextToken = listOrdersByNextTokenResult.getNextToken();
368
				}
369
				if (listOrdersByNextTokenResult.isSetLastUpdatedBefore()) {
370
					lastUpdatedDate = listOrdersByNextTokenResult
371
					.getLastUpdatedBefore();
372
				}
373
			}
374
			return lastUpdatedDate;
375
		} catch (MarketplaceWebServiceOrdersException ex) {
376
			log.error(ex.getMessage(), ex);
377
			System.out.println("Caught Exception: " + ex.getMessage());
378
			System.out.println("Response Status Code: " + ex.getStatusCode());
379
			System.out.println("Error Code: " + ex.getErrorCode());
380
			System.out.println("Error Type: " + ex.getErrorType());
381
			System.out.println("Request ID: " + ex.getRequestId());
382
			System.out.print("XML: " + ex.getXML());
383
			return null;
384
		}
385
	}
386
	//This method will create Order Acknowledgement FEED
387
	public void createandsubmitOrderAcknowlegementFeed() {
388
		TransactionClient tcl=null;
389
		List<AmazonOrdersToAcknowledge> amazonOrdersToAcknowledge=null;
390
		try {
391
			tcl = new TransactionClient();
392
			amazonOrdersToAcknowledge = tcl.getClient().getAmazonOrdersToAcknowledge();
393
		} catch (TTransportException e2) {
394
			// TODO Auto-generated catch block
395
			e2.printStackTrace();
396
		} catch (TException e) {
397
			// TODO Auto-generated catch block
398
			e.printStackTrace();
399
		}
400
		if(amazonOrdersToAcknowledge!=null && amazonOrdersToAcknowledge.size() > 0){
401
			file = new File(AMAZON_ORDER_ACKNOWLEDGEMENT_XML);
402
			AmazonEnvelope amazonenvelope = new AmazonEnvelope();
403
			Header header = new Header();
404
			header.setDocumentVersion("1.0");
405
			header.setMerchantIdentifier("AF6E3O0VE0X4D");
406
			header.setOverrideReleaseId(null);
407
			amazonenvelope.setHeader(header);
408
			amazonenvelope.setMessageType("OrderAcknowledgement");
409
			amazonenvelope.setMarketplaceName(null);
410
			List<Message> messages = amazonenvelope.getMessage();
411
			Map<String,Long> amazonOrdertxnMap = new HashMap<String,Long>();
412
			Map<String,List<String>> amazonOrderIdOrderItemMap = new HashMap<String,List<String>>();
413
			Map<String,Integer> amazonOrderItemSuccessMap = new HashMap<String,Integer>();
414
			Map<String,Integer> amazonOrderItemFailureMap = new HashMap<String,Integer>();
415
			for(AmazonOrdersToAcknowledge amazonOrderToAcknowledge:amazonOrdersToAcknowledge ){
416
				if(!amazonOrdertxnMap.containsKey(amazonOrderToAcknowledge.getAmazonOrderId())){
417
					amazonOrdertxnMap.put(amazonOrderToAcknowledge.getAmazonOrderId(),amazonOrderToAcknowledge.getTransaction_id());
418
				}
419
				if(!amazonOrderIdOrderItemMap.containsKey(amazonOrderToAcknowledge.getAmazonOrderId())){
420
					List<String> orderItemsList = new ArrayList<String>();
421
					orderItemsList.add(amazonOrderToAcknowledge.getAmazonOrderItemId());
422
					amazonOrderIdOrderItemMap.put(amazonOrderToAcknowledge.getAmazonOrderId(),orderItemsList);
423
				}
424
				else{
425
					if(!amazonOrderIdOrderItemMap.get(amazonOrderToAcknowledge.getAmazonOrderId()).contains(amazonOrderToAcknowledge.getAmazonOrderItemId()))
426
						amazonOrderIdOrderItemMap.get(amazonOrderToAcknowledge.getAmazonOrderId()).add(amazonOrderToAcknowledge.getAmazonOrderItemId());
427
				}
428
				if(amazonOrderToAcknowledge.getStatus().equals("Order-Payment-Success")){
429
					amazonOrderItemSuccessMap.put(amazonOrderToAcknowledge.getAmazonOrderId()+amazonOrderToAcknowledge.getAmazonOrderItemId(),amazonOrderToAcknowledge.getCount());
430
				}
431
				if(amazonOrderToAcknowledge.getStatus().equals("Order-Payment-Failure")){
432
					amazonOrderItemFailureMap.put(amazonOrderToAcknowledge.getAmazonOrderId()+amazonOrderToAcknowledge.getAmazonOrderItemId(),amazonOrderToAcknowledge.getCount());
433
				}	
434
			}
435
			JAXBContext context;
436
			Marshaller m=null;
437
			try {
438
				context = JAXBContext.newInstance(AmazonEnvelope.class);
439
				m = context.createMarshaller();
440
			} catch (JAXBException e1) {
441
				// TODO Auto-generated catch block
442
				e1.printStackTrace();
443
			}
444
 
445
			for (Map.Entry<String,List<String>> entry : amazonOrderIdOrderItemMap.entrySet()){
446
				OrderAcknowledgement orderAcknowLedgement = new OrderAcknowledgement();
447
				List<OrderAcknowledgement.Item> acknowledgementItems = orderAcknowLedgement.getItem();
448
				String orderid = entry.getKey();
449
				orderAcknowLedgement.setAmazonOrderID(orderid);
450
				orderAcknowLedgement.setMerchantOrderID(amazonOrdertxnMap.get(orderid).toString());
451
				orderAcknowLedgement.setStatusCode("Failure");
452
				for(String orderItemId :entry.getValue()){
453
					OrderAcknowledgement.Item orderAcknowledgementItem = new OrderAcknowledgement.Item();
454
					if(amazonOrderItemSuccessMap.get(orderid+orderItemId)!=null && amazonOrderItemSuccessMap.get(orderid+orderItemId) > 0){
455
						orderAcknowledgementItem.setAmazonOrderItemCode(orderItemId);
456
						orderAcknowLedgement.setStatusCode("Success");
457
					}
458
					else{
459
						orderAcknowledgementItem.setAmazonOrderItemCode(orderItemId);
460
						orderAcknowledgementItem.setCancelReason("ShippingAddressUndeliverable");
461
					}
462
					acknowledgementItems.add(orderAcknowledgementItem);
463
 
464
				}
465
				AmazonEnvelope.Message message = new AmazonEnvelope.Message();
466
				Random rand = new Random();
467
				message.setMessageID(BigInteger.valueOf(Math.abs(rand.nextInt())));
468
				message.setOrderAcknowledgement(orderAcknowLedgement);
469
				messages.add(message);
470
			}
471
 
472
			System.out.println("Messages is " + messages);
473
			try {
474
				m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
475
				m.marshal(amazonenvelope, file);
476
				m.marshal(amazonenvelope, System.out);
477
 
478
			} catch (Exception e) {
479
				// TODO Auto-generated catch block
480
				e.printStackTrace();
481
 
482
			}
483
			if(submitAcknowledgementFeed()==0);
484
			//if(true)
485
			{
486
				for (Map.Entry<String,Long> entry : amazonOrdertxnMap.entrySet()){
487
					try {
488
						tcl.getClient().changeAmazonOrderStatus(entry.getKey(),"Acknowledgement-Sent");
489
					} catch (TException e) {
490
						// TODO Auto-generated catch block
491
						e.printStackTrace();
492
					}
493
 
494
				}
495
			}
496
//			GmailUtils  gm = GmailUtils();
497
//			gm.sendSSLMessage(arg0, arg1, arg2, arg3, arg4, arg5)
498
		}
499
 
500
 
501
	}
502
 
503
	/*
504
	 * listOrders call. If a request is throttled, this method calls the
505
	 * throttling handler and sets the retry flag to true.
506
	 */
507
	protected ListOrdersResult listOrders(ListOrdersRequest request)
508
	throws MarketplaceWebServiceOrdersException {
509
		boolean retry;
510
		ListOrdersResponse listOrdersResponse = null;
511
		ListOrdersResult listOrdersResult = null;
512
		do {
513
			retry = false;
514
			try {
515
				System.out.println("Calling ListOrders.");
516
				log.info("Calling ListOrders.");
517
				listOrdersResponse = service.listOrders(request);
518
			} catch (MarketplaceWebServiceOrdersException ex) {
519
				if (ex.getStatusCode() == HttpStatus.SC_SERVICE_UNAVAILABLE
520
						&& "RequestThrottled".equals(ex.getErrorCode())) {
521
					retry = true;
522
					requestThrottledExceptionHandler(LIST_ORDERS_THROTTLE_LIMIT);
523
				} else {
524
					throw ex;
525
				}
526
			}
527
			if (listOrdersResponse != null
528
					&& listOrdersResponse.isSetListOrdersResult()) {
529
				listOrdersResult = listOrdersResponse.getListOrdersResult();
530
				if (listOrdersResult.isSetOrders()
531
						&& listOrdersResult.getOrders().isSetOrder()) {
532
					processOrderUpdates(listOrdersResult.getOrders().getOrder());
533
				}
534
			}
535
		} while (retry && keepRunning);
536
		return listOrdersResult;
537
	}
538
 
539
	/*
540
	 * listOrdersByNextToken call. If a request is throttled, this method calls
541
	 * the throttling handler and sets the retry flag to true.
542
	 */
543
	protected ListOrdersByNextTokenResult listOrdersByNextToken(
544
			ListOrdersByNextTokenRequest listOrdersByNextTokenRequest)
545
	throws MarketplaceWebServiceOrdersException {
546
		boolean retry;
547
		ListOrdersByNextTokenResponse listOrdersByNextTokenResponse = null;
548
		ListOrdersByNextTokenResult listOrdersByNextTokenResult = null;
549
		do {
550
			retry = false;
551
			try {
552
				log.info("Calling ListOrdersByNextToken.");
553
				listOrdersByNextTokenResponse = service
554
				.listOrdersByNextToken(listOrdersByNextTokenRequest);
555
			} catch (MarketplaceWebServiceOrdersException ex) {
556
				if (ex.getStatusCode() == HttpStatus.SC_SERVICE_UNAVAILABLE
557
						&& "RequestThrottled".equals(ex.getErrorCode())) {
558
					retry = true;
559
					requestThrottledExceptionHandler(LIST_ORDERS_THROTTLE_LIMIT);
560
				} else {
561
					throw ex;
562
				}
563
			}
564
			if (listOrdersByNextTokenResponse != null
565
					&& listOrdersByNextTokenResponse
566
					.isSetListOrdersByNextTokenResult()) {
567
				listOrdersByNextTokenResult = listOrdersByNextTokenResponse
568
				.getListOrdersByNextTokenResult();
569
				if (listOrdersByNextTokenResult.isSetOrders()
570
						&& listOrdersByNextTokenResult.getOrders().isSetOrder()) {
571
					processOrderUpdates(listOrdersByNextTokenResult.getOrders()
572
							.getOrder());
573
				}
574
			}
575
		} while (retry && keepRunning);
576
		return listOrdersByNextTokenResult;
577
	}
578
 
579
	/**
580
	 * This method is called to process updates on each of the orders that are
581
	 * returned by the ListOrders and ListOrdersByNextToken calls.
582
	 */
583
	protected void processOrderUpdates(List<Order> orders)
584
	throws MarketplaceWebServiceOrdersException {
585
		ListOrderItemsResult listOrderItemsResult;
586
		log.info("Processing order updates.");
587
		for (Order order : orders) {
588
			if (shouldFetchOrderItems(order)) {
589
				log.info("Order being processed: " + order.getAmazonOrderId());
590
				listOrderItemsResult = listOrderItems(order);
591
				if (listOrderItemsResult != null
592
						&& listOrderItemsResult.isSetNextToken()) {
593
					ListOrderItemsByNextTokenRequest listOrderItemsByNextTokenRequest = new ListOrderItemsByNextTokenRequest();
594
					listOrderItemsByNextTokenRequest
595
					.setSellerId(OrdersConfig.sellerId);
596
					String nextToken = listOrderItemsResult.getNextToken();
597
 
598
					ListOrderItemsByNextTokenResult listOrderItemsByNextTokenResult = null;
599
 
600
					while (nextToken != null && keepRunning) {
601
						listOrderItemsByNextTokenRequest
602
						.setNextToken(nextToken);
603
						listOrderItemsByNextTokenResult = listOrderItemsByNextToken(
604
								listOrderItemsByNextTokenRequest, order);
605
						nextToken = listOrderItemsByNextTokenResult
606
						.getNextToken();
607
					}
608
				}
609
			}
610
		}
611
	}
612
 
613
	/*
614
	 * listOrderItems call. If a request is throttled, this method calls the
615
	 * throttling handler and sets the retry flag to true.
616
	 */
617
	protected ListOrderItemsResult listOrderItems(Order order)
618
	throws MarketplaceWebServiceOrdersException {
619
		System.out.println("Calling ListOrderItems.");
620
		log.info("Calling ListOrderItems.");
621
		boolean retry;
622
		List<OrderItem> items;
623
		ListOrderItemsRequest listOrderItemsRequest = new ListOrderItemsRequest();
624
		listOrderItemsRequest.setSellerId(sellerId);
625
		listOrderItemsRequest.setAmazonOrderId(order.getAmazonOrderId());
626
		ListOrderItemsResponse listOrderItemsResponse = null;
627
		ListOrderItemsResult listOrderItemsResult = null;
628
 
629
		do {
630
			retry = false;
631
			try {
632
				listOrderItemsResponse = service
633
				.listOrderItems(listOrderItemsRequest);
634
			} catch (MarketplaceWebServiceOrdersException ex) {
635
				if (ex.getStatusCode() == HttpStatus.SC_SERVICE_UNAVAILABLE
636
						&& "RequestThrottled".equals(ex.getErrorCode())) {
637
					retry = true;
638
					requestThrottledExceptionHandler(LIST_ORDER_ITEMS_THROTTLE_LIMIT);
639
				} else {
640
					throw ex;
641
				}
642
			}
643
			if (listOrderItemsResponse != null
644
					&& listOrderItemsResponse.isSetListOrderItemsResult()) {
645
				listOrderItemsResult = listOrderItemsResponse
646
				.getListOrderItemsResult();
647
				if (listOrderItemsResult.isSetOrderItems()
648
						&& listOrderItemsResult.getOrderItems()
649
						.isSetOrderItem()) {
650
					items = listOrderItemsResponse.getListOrderItemsResult()
651
					.getOrderItems().getOrderItem();
652
					processOrderItems(order, items);
653
				}
654
			}
655
 
656
		} while (retry && keepRunning);
657
 
658
		return listOrderItemsResult;
659
	}
660
 
661
	/*
662
	 * listOrderItemsByNextToken call. If a request is throttled, this method
663
	 * calls the throttling handler and sets the retry flag to true.
664
	 */
665
	protected ListOrderItemsByNextTokenResult listOrderItemsByNextToken(
666
			ListOrderItemsByNextTokenRequest listOrderItemsByNextTokenRequest,
667
			Order order) throws MarketplaceWebServiceOrdersException {
668
		log.info("Calling ListOrderItemsByNextToken.");
669
		boolean retry;
670
		List<OrderItem> items;
671
		ListOrderItemsByNextTokenResponse listOrderItemsByNextTokenResponse = null;
672
		ListOrderItemsByNextTokenResult listOrderItemsByNextTokenResult = null;
673
 
674
		do {
675
			retry = false;
676
			try {
677
				listOrderItemsByNextTokenResponse = service
678
				.listOrderItemsByNextToken(listOrderItemsByNextTokenRequest);
679
			} catch (MarketplaceWebServiceOrdersException ex) {
680
				if (ex.getStatusCode() == HttpStatus.SC_SERVICE_UNAVAILABLE
681
						&& "RequestThrottled".equals(ex.getErrorCode())) {
682
					retry = true;
683
					requestThrottledExceptionHandler(LIST_ORDER_ITEMS_THROTTLE_LIMIT);
684
				} else {
685
					throw ex;
686
				}
687
			}
688
			if (listOrderItemsByNextTokenResponse != null
689
					&& listOrderItemsByNextTokenResponse
690
					.isSetListOrderItemsByNextTokenResult()) {
691
				listOrderItemsByNextTokenResult = listOrderItemsByNextTokenResponse
692
				.getListOrderItemsByNextTokenResult();
693
				if (listOrderItemsByNextTokenResult.isSetOrderItems()
694
						&& listOrderItemsByNextTokenResult.getOrderItems()
695
						.isSetOrderItem()) {
696
					items = listOrderItemsByNextTokenResponse
697
					.getListOrderItemsByNextTokenResult()
698
					.getOrderItems().getOrderItem();
699
					processOrderItems(order, items);
700
				}
701
			}
702
		} while (retry && keepRunning);
703
 
704
		return listOrderItemsByNextTokenResult;
705
	}
706
 
707
	/**
708
	 * TODO: Change the logic to decide when order items need to be fetched.
709
	 * Probably only if this is the first time you are seeing the order.
710
	 */
711
	protected boolean shouldFetchOrderItems(Order order) {
712
		return true;
713
	}
714
 
715
	/**
716
	 * Simply prints out the data to standard out. TODO: Insert logic to process
717
	 * order items here (perhaps store it in your local datastore).
718
	 */
719
	public void processOrderItems(Order order, List<OrderItem> orderItems) {
720
		log.info("****************** Order info********************");
721
		log.info(order.toString());
722
		System.out.println("------------------------------------------");
723
		System.out.println("--------Amazon Order Details START--------");
724
		System.out.println("------------------------------------------");
725
		System.out.println("Amazon Order ID                  :  " + order.getAmazonOrderId());
726
		System.out.println("Buyer Email                      :  " + order.getBuyerEmail());
727
		System.out.println("Buyer Name                       :  " + order.getBuyerName());
728
		System.out.println("MarketPlace ID                   :  " + order.getMarketplaceId());
729
		System.out.println("Order Channel                    :  " + order.getOrderChannel());
730
		System.out.println("Sales Channel                    :  " + order.getSalesChannel());
731
		System.out.println("Seller Order ID                  :  " + order.getSellerOrderId());
732
		System.out.println("Shipment Service Level Category  :  " + order.getShipmentServiceLevelCategory());
733
		System.out.println("Shipment Service Level           :  " + order.getShipServiceLevel());
734
		System.out.println("TFM Shipment Status              :  " + order.getTFMShipmentStatus());
735
		System.out.println("Number of Items Shipped          :  " + order.getNumberOfItemsShipped());
736
		System.out.println("Number of Items UnShipped        :  " + order.getNumberOfItemsUnshipped());
737
		System.out.println("Fulfillment Channel              :  " + order.getFulfillmentChannel());
738
		System.out.println("Last Updated Date                :  " + order.getLastUpdateDate());
739
		System.out.println("Order Status                     :  " + order.getOrderStatus());
740
		//System.out.println("Order Currency code              :  " + order.getOrderTotal().getCurrencyCode());
741
		//System.out.println("Order Amount                     :  " + order.getOrderTotal().getAmount());
742
		System.out.println("Payment Method                   :  " + order.getPaymentMethod());
743
		System.out.println("Payment Execution Detail         :  " + order.getPaymentExecutionDetail());
744
		System.out.println("Purchase Date                    :  " + order.getPurchaseDate());
745
		System.out.println("Shipping Address                 :  " + order.getShippingAddress());
746
		System.out.println("------------------------------------------");
747
		System.out.println("-----------Amazon Order Details END-------");
748
		System.out.println("------------------------------------");
749
		Map<String,String> orderItemSkuMap = new HashMap<String,String>();
750
		if (orderItems != null && orderItems.size() > 0) {
751
			log.info("================== Order Items info ====================");
752
			System.out.println("================== Order Items info ====================");
753
			int i = 0;
754
			for (OrderItem item : orderItems) {
755
				log.info(item.toString());
756
				System.out.println("===================================");
757
				System.out.println("Order Item : " + (i+1));
758
				System.out.println("Item ASIN :  " + item.getASIN());
759
				System.out.println("Item Gift Message Text :  " + item.getGiftMessageText());
760
				System.out.println("Item Gift Wrap Level   :  " + item.getGiftWrapLevel());
761
				System.out.println("Order Item ID          :  " + item.getOrderItemId());
762
				System.out.println("Quantity Ordered       :  " + item.getQuantityOrdered());
763
				System.out.println("Saholic Item ID        :  " + item.getSellerSKU());
764
				System.out.println("Item Description       :  " + item.getTitle());
765
				System.out.println("Item Quantity Shipped  :  " + item.getQuantityShipped());
766
				System.out.println("Item Quantity Ordered  :  " + item.getQuantityOrdered());
767
				System.out.println("COD Fees               :  " + item.getCODFee());
768
				System.out.println("COD Fees Discount      :  " + item.getCODFeeDiscount());
769
				System.out.println("Gift Wrap Price        :  " + item.getGiftWrapPrice());
770
				System.out.println("Gift Wrap Text         :  " + item.getGiftWrapTax());
771
				System.out.println("Invoice Data           :  " + item.getInvoiceData());
772
				System.out.println("Item Price             :  " + item.getItemPrice());
773
				System.out.println("Item Tax               :  " + item.getItemTax());
774
				System.out.println("Promotion Discount     :  " + item.getPromotionDiscount());
775
				System.out.println("Promotion IDs          :  " + item.getPromotionIds());
776
				System.out.println("Shipping Discounts     :  " + item.getShippingDiscount());
777
				System.out.println("Shipping Price         :  " + item.getShippingPrice());
778
				System.out.println("Shipping Tax           :  " + item.getShippingTax());
779
				System.out.println("===================================");
780
				orderItemSkuMap.put(item.getSellerSKU(),item.getOrderItemId());
781
				System.out.println("SKU and Order Item Code are  : " + item.getSellerSKU() + " " +item.getOrderItemId() );
782
				i++;
783
			}
784
			//if(order.getFulfillmentChannel().equals(FulfillmentChannelEnum.MFN) && (order.getOrderStatus().equals(OrderStatusEnum.UNSHIPPED) || order.getOrderStatus().equals(OrderStatusEnum.CANCELED))){
785
			//if(order.getFulfillmentChannel().equals(FulfillmentChannelEnum.MFN) && (order.getOrderStatus().equals(OrderStatusEnum.UNSHIPPED) || order.getOrderStatus().equals(OrderStatusEnum.PARTIALLY_SHIPPED))){
786
			if(order.getFulfillmentChannel().equals(FulfillmentChannelEnum.MFN) && order.getOrderStatus().equals(OrderStatusEnum.UNSHIPPED) && order.getSellerOrderId()==null ){
787
				AmazonOrder amazonOrder = new AmazonOrder();
788
				long txnId = amazonOrder.persistTransaction(order,orderItems);
789
				TransactionClient tcl=null;
790
				InventoryClient icl = null;
791
				PaymentClient pcl = null;
792
				Map<Long,Double> saholicItemMap = new HashMap<Long,Double>();
793
				if (txnId != -1){
794
					List<in.shop2020.model.v1.order.AmazonOrder> amazonOrders = new ArrayList<in.shop2020.model.v1.order.AmazonOrder>();
795
					try {
796
 
797
						tcl = new TransactionClient();
798
						icl = new InventoryClient();
799
						pcl = new PaymentClient();;
800
						System.out.println("temp id is" +tempId);
801
						List<in.shop2020.model.v1.order.Order>  saholicOrders =tcl.getClient().getOrdersForTransaction(txnId,tempId);
802
						for(in.shop2020.model.v1.order.Order saholicOrder:saholicOrders)
803
						{
804
							List<in.shop2020.model.v1.order.LineItem> lineitems= saholicOrder.getLineitems();
805
							long itemId=0; 
806
							for(in.shop2020.model.v1.order.LineItem lineitem:lineitems){
807
								itemId = lineitem.getItem_id();
808
								if(saholicItemMap.get(lineitem.getItem_id())!=null)
809
									saholicItemMap.put(lineitem.getItem_id(),saholicItemMap.get(lineitem.getItem_id())+1);
810
								else
811
									saholicItemMap.put(lineitem.getItem_id(),lineitem.getQuantity());	
812
							}
813
							in.shop2020.model.v1.order.AmazonOrder aOrder = new in.shop2020.model.v1.order.AmazonOrder();
814
							aOrder.setAmazonOrderCode(order.getAmazonOrderId());
815
							aOrder.setAmazonOrderItemCode(orderItemSkuMap.get(Long.toString(itemId)));
816
							aOrder.setItem_id(itemId);
817
							aOrder.setOrderId(saholicOrder.getId());
818
							aOrder.setTransactionId(txnId);
819
							aOrder.setStatus("Order-Creation-Success");
820
							tcl.getClient().addAmazonOrder(aOrder);
821
							amazonOrders.add(aOrder);
822
						}
823
						long merchantPaymentId = pcl.getClient().createPayment(tempId, Double.parseDouble(order.getOrderTotal().getAmount()), 15, txnId, false);
824
						pcl.getClient().updatePaymentDetails(merchantPaymentId, "", "", "15", "", "", "", "", "", PaymentStatus.SUCCESS, "", null);
825
						boolean success=tcl.getClient().changeTransactionStatus(txnId, TransactionStatus.AUTHORIZED, "Payment authorized", PickUpType.COURIER.getValue(), OrderType.B2C, OrderSource.AMAZON);
826
						if(success){
827
							for(in.shop2020.model.v1.order.AmazonOrder aorder:amazonOrders){
828
								AmazonInventorySnapshot amazonInventorySnapshot=icl.getClient().getAmazonInventoryForItem(aorder.getItem_id());
829
								long reserved = (amazonInventorySnapshot.getReserved()+1);
830
								amazonInventorySnapshot.setReserved(reserved);
831
								icl.getClient().addOrUpdateAmazonInventoryForItem((amazonInventorySnapshot));
832
								tcl.getClient().updateAmazonOrderStatus(aorder.getOrderId(),"Order-Payment-Success");
833
							}
834
						}
835
					}
836
					catch (TTransportException e) {
837
						// TODO Auto-generated catch block
838
						for(in.shop2020.model.v1.order.AmazonOrder aorder:amazonOrders){
839
							try {
840
								tcl.getClient().updateAmazonOrderStatus(aorder.getOrderId(),"Order-Payment-Failure");
841
							} catch (TException e1) {
842
								// TODO Auto-generated catch block
843
								e1.printStackTrace();
844
							}
845
						}
846
 
847
						//e.printStackTrace();
848
					} catch (TException e) {
849
						// TODO Auto-generated catch block
850
						e.printStackTrace();
851
					} catch (PaymentException e) {
852
						// TODO Auto-generated catch block
853
						e.printStackTrace();
854
					} catch (TransactionServiceException e) {
855
						// TODO Auto-generated catch block
856
						e.printStackTrace();
857
					}
858
				}
859
			}
860
 
861
		}
862
	}
863
 
864
 
865
	/*
866
	 * When a request is throttled, this method is called to make the thread
867
	 * sleep for a period of time specified by the throttling limit.
868
	 */
869
	private void requestThrottledExceptionHandler(
870
			long throttlingLimitInMilliseconds) {
871
		try {
872
			log.info("Request throttled. Sleeping for "
873
					+ throttlingLimitInMilliseconds / 1000 + " seconds.");
874
 
875
			// Sleep in 1 minute intervals for throttlingLimitInMillis or until
876
			// keepRunning is set to false.
877
			for (long i = throttlingLimitInMilliseconds; i > 0 && keepRunning; i = i - 60000L) {
878
				if (i < 60000L) {
879
					Thread.sleep(i);
880
				} else {
881
					Thread.sleep(60000L);
882
				}
883
			}
884
		} catch (InterruptedException e) {
885
			log.error(e.getMessage(), e);
886
			return;
887
		}
888
	}
889
 
890
	public static String computeContentMD5HeaderValue( FileInputStream fis) {
891
		try {
892
			DigestInputStream dis = new DigestInputStream( fis,
893
					MessageDigest.getInstance( "MD5" ));
894
			byte[] buffer = new byte[8192];
895
			while( dis.read( buffer ) > 0 );
896
			String md5Content = new String(Base64.encodeBase64(dis.getMessageDigest().digest())
897
			);
898
			// Effectively resets the stream to be beginning of the file via a
899
			fis.getChannel().position( 0 );
900
			return md5Content;
901
		} catch (NoSuchAlgorithmException e) {
902
			// TODO Auto-generated catch block
903
			e.printStackTrace();
904
		} catch (IOException e) {
905
			// TODO Auto-generated catch block
906
			e.printStackTrace();
907
		}
908
		return null;
909
 
910
	}
911
 
912
	public int submitAcknowledgementFeed(){
913
 
914
	 	SubmitFeedRequest request= new SubmitFeedRequest();
915
		final String merchantId = "AF6E3O0VE0X4D";	
916
		// marketplaces to which this feed will be submitted; look at the
917
		// API reference document on the MWS website to see which marketplaces are
918
		// included if you do not specify the list yourself
919
		final IdList marketplaces = new IdList(Arrays.asList(
920
		"A21TJRUUN4KGV"));
921
		request.setMerchant(merchantId);
922
		FileInputStream fis=null;
923
		try {
924
			fis = new FileInputStream(AMAZON_ORDER_ACKNOWLEDGEMENT_XML);
925
		} catch (FileNotFoundException e1) {
926
			// TODO Auto-generated catch block
927
			e1.printStackTrace();
928
			return -1;
929
		}
930
		final String accessKeyId = "AKIAII3SGRXBJDPCHSGQ";
931
		final String secretAccessKey = "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";
932
 
933
		final String appName = "Test";
934
		final String appVersion = "1.0";
935
 
936
		MarketplaceWebServiceConfig config = new MarketplaceWebServiceConfig();
937
 
938
		// India
939
		config.setServiceURL("https://mws.amazonservices.in");
940
 
941
		request.setContentMD5(computeContentMD5HeaderValue(fis));
942
		request.setFeedContent(fis);
943
		request.setMarketplaceIdList(marketplaces);
944
		request.setFeedType("_POST_ORDER_ACKNOWLEDGEMENT_DATA_");
945
		MarketplaceWebService s_service = new MarketplaceWebServiceClient(
946
				accessKeyId, secretAccessKey, appName, appVersion, config);
947
 
948
		try {
949
 
950
			SubmitFeedResponse response = s_service.submitFeed(request);
951
 
952
			System.out.println("SubmitFeed Action Response");
953
			System.out
954
			.println("=============================================================================");
955
			System.out.println();
956
 
957
			System.out.print("    SubmitFeedResponse");
958
			System.out.println();
959
			if (response.isSetSubmitFeedResult()) {
960
				System.out.print("        SubmitFeedResult");
961
				//	System.out.println();
962
				SubmitFeedResult submitFeedResult = response
963
				.getSubmitFeedResult();
964
				if (submitFeedResult.isSetFeedSubmissionInfo()) {
965
					//	System.out.print("            FeedSubmissionInfo");
966
					//	System.out.println();
967
					FeedSubmissionInfo feedSubmissionInfo = submitFeedResult
968
					.getFeedSubmissionInfo();
969
					if (feedSubmissionInfo.isSetFeedSubmissionId()) {
970
						System.out.print("                FeedSubmissionId");
971
						System.out.println();
972
						System.out.print("                    "
973
								+ feedSubmissionInfo.getFeedSubmissionId());
974
 
975
						System.out.println();
976
					}
977
					if (feedSubmissionInfo.isSetFeedType()) {
978
						System.out.print("                FeedType");
979
						System.out.println();
980
						System.out.print("                    "
981
								+ feedSubmissionInfo.getFeedType());
982
						System.out.println();
983
					}
984
					if (feedSubmissionInfo.isSetSubmittedDate()) {
985
						System.out.print("                SubmittedDate");
986
						System.out.println();
987
						System.out.print("                    "
988
								+ feedSubmissionInfo.getSubmittedDate());
989
						System.out.println();
990
					}
991
					if (feedSubmissionInfo.isSetFeedProcessingStatus()) {
992
						System.out
993
						.print("                FeedProcessingStatus");
994
						System.out.println();
995
						System.out.print("                    "
996
								+ feedSubmissionInfo.getFeedProcessingStatus());
997
						System.out.println();
998
					}
999
					if (feedSubmissionInfo.isSetStartedProcessingDate()) {
1000
						System.out
1001
						.print("                StartedProcessingDate");
1002
						System.out.println();
1003
						System.out
1004
						.print("                    "
1005
								+ feedSubmissionInfo
1006
								.getStartedProcessingDate());
1007
						System.out.println();
1008
					}
1009
					if (feedSubmissionInfo.isSetCompletedProcessingDate()) {
1010
						System.out
1011
						.print("                CompletedProcessingDate");
1012
						System.out.println();
1013
						System.out.print("                    "
1014
								+ feedSubmissionInfo
1015
								.getCompletedProcessingDate());
1016
						System.out.println();
1017
					}
1018
				}
1019
			}
1020
			if (response.isSetResponseMetadata()) {
1021
				System.out.print("        ResponseMetadata");
1022
				System.out.println();
1023
				ResponseMetadata responseMetadata = response
1024
				.getResponseMetadata();
1025
				if (responseMetadata.isSetRequestId()) {
1026
					System.out.print("            RequestId");
1027
					System.out.println();
1028
					System.out.print("                "
1029
							+ responseMetadata.getRequestId());
1030
					System.out.println();
1031
				}
1032
			}
1033
			System.out.println(response.getResponseHeaderMetadata());
1034
			System.out.println();
1035
			System.out.println();
1036
			return 0;
1037
 
1038
		} catch (MarketplaceWebServiceException ex) {
1039
 
1040
			System.out.println("Caught Exception: " + ex.getMessage());
1041
			System.out.println("Response Status Code: " + ex.getStatusCode());
1042
			System.out.println("Error Code: " + ex.getErrorCode());
1043
			System.out.println("Error Type: " + ex.getErrorType());
1044
			System.out.println("Request ID: " + ex.getRequestId());
1045
			System.out.print("XML: " + ex.getXML());
1046
			System.out.println("ResponseHeaderMetadata: " + ex.getResponseHeaderMetadata());
1047
			return -1;
1048
		}
1049
 
1050
	}
1051
 
1052
}