@Override public PublishResult publish(PublishRequest publishRequest) throws AmazonClientException { String topicArn = publishRequest.getTopicArn(); if (!_subscriptionsForTopic.containsKey(topicArn)) { throw new NotFoundException("no such topic " + topicArn); } List<Subscription> topicSubscriptions = FluentIterable. from(_subscriptionsForTopic.get(topicArn)). transform(Functions.forMap(_subscriptionsByArn)). toList(); for (Subscription subscription : topicSubscriptions) { String queueName = getLast(subscription.getEndpoint().split(":")); String queueUrl = _sqsClient. getQueueUrl(new GetQueueUrlRequest().withQueueName(queueName)). getQueueUrl(); _sqsClient.sendMessage(new SendMessageRequest(). withQueueUrl(queueUrl). withMessageBody(publishRequest.getMessage())); } return new PublishResult(); }
@Test public void publishToNonExistentTopic() { assertSNSThrownBy(() -> sns.publish("arn:aws:sns:us-east-1:12345:a", "message")) .isInstanceOf(NotFoundException.class) .hasErrorCode("NotFound") .hasErrorMessage("Topic does not exist") .hasStatusCode(404); }
public void verifyPlatformApplication(AmazonSNS client) { try { if (!BatchCreatePlatformEndpointSample.listOfRegions .contains(this.region = this.applicationArn.split(":")[3])) { System.err.println("[ERROR] The region " + region + " is invalid"); System.exit(BatchCreatePlatformEndpointSample.MALFORMED_PROPERTIES_ERROR_CODE); } } catch (ArrayIndexOutOfBoundsException aioobe) { System.err.println("[ERROR] The ARN " + this.applicationArn + " is malformed"); System.exit(BatchCreatePlatformEndpointSample.MALFORMED_PROPERTIES_ERROR_CODE); } client.setEndpoint("https://sns." + this.region + ".amazonaws.com/"); try { GetPlatformApplicationAttributesRequest applicationAttributesRequest = new GetPlatformApplicationAttributesRequest(); applicationAttributesRequest .setPlatformApplicationArn(this.applicationArn); @SuppressWarnings("unused") GetPlatformApplicationAttributesResult getAttributesResult = client .getPlatformApplicationAttributes(applicationAttributesRequest); } catch (NotFoundException nfe) { System.err .println("[ERROR: APP NOT FOUND] The application ARN provided: " + this.applicationArn + " does not correspond to any existing platform applications. " + nfe.getMessage()); System.exit(BatchCreatePlatformEndpointSample.NOT_FOUND_ERROR_CODE); } catch (InvalidParameterException ipe) { System.err .println("[ERROR: APP ARN INVALID] The application ARN provided: " + this.applicationArn + " is malformed" + ipe.getMessage()); System.exit(BatchCreatePlatformEndpointSample.NOT_FOUND_ERROR_CODE); } }
@Override public UnsubscribeResult unsubscribe(UnsubscribeRequest unsubscribeRequest) throws AmazonClientException { if (!_subscriptionsByArn.containsKey(unsubscribeRequest.getSubscriptionArn())) throw new NotFoundException("no such subscription"); Subscription removed = _subscriptionsByArn.remove(unsubscribeRequest.getSubscriptionArn()); _subscriptionsForTopic.get(removed.getSubscriptionArn()).remove(removed.getSubscriptionArn()); return new UnsubscribeResult(); }
static SNSExceptionBuilder newNotFoundException(String message) { return new SNSExceptionBuilder( new NotFoundException(message), "NotFound", 404); }
String createApplicationEndpoint(String backendId, String appId, PushService service, String token) { Optional<PlatformApplication> application = getApplication(appId, service); if (!application.isPresent()) throw Exceptions.illegalArgument(// "push service [%s] of mobile application [%s] not registered in AWS", // appId, service); String applicationArn = application.get().getPlatformApplicationArn(); String endpointArn = null; try { endpointArn = getSnsClient() .createPlatformEndpoint(// new CreatePlatformEndpointRequest()// .withPlatformApplicationArn(applicationArn)// .withToken(token))// .getEndpointArn(); } catch (InvalidParameterException e) { String message = e.getErrorMessage(); Utils.info("Exception message: %s", message); Pattern p = Pattern.compile(".*Endpoint (arn:aws:sns[^ ]+) already exists " + "with the same token.*"); Matcher m = p.matcher(message); if (m.matches()) { // The platform endpoint already exists for this token, but with // additional custom data that // createEndpoint doesn't want to overwrite. Just use the // existing platform endpoint. endpointArn = m.group(1); } else { throw e; } } if (endpointArn == null) throw new RuntimeException("failed to create device notification endpoint: try again later"); boolean updateNeeded = false; try { GetEndpointAttributesResult endpointAttributes = getSnsClient() .getEndpointAttributes(new GetEndpointAttributesRequest().withEndpointArn(endpointArn)); updateNeeded = !endpointAttributes.getAttributes().get("Token").equals(token) || !endpointAttributes.getAttributes().get("Enabled").equalsIgnoreCase("true"); } catch (NotFoundException nfe) { // We had a stored ARN, but the platform endpoint associated with it // disappeared. Recreate it. endpointArn = null; } if (endpointArn == null) throw new RuntimeException("failed to create device notification endpoint: try again later"); if (updateNeeded) { // The platform endpoint is out of sync with the current data; // update the token and enable it. Map<String, String> attribs = new HashMap<>(); attribs.put("Token", token); attribs.put("Enabled", "true"); getSnsClient().setEndpointAttributes(// new SetEndpointAttributesRequest()// .withEndpointArn(endpointArn)// .withAttributes(attribs)); } return endpointArn; }
String createApplicationEndpoint(String backendId, String appId, PushServices service, String token) { PlatformApplication application = getApplication(backendId, appId, service)// .orElseThrow(// () -> Exceptions.illegalArgument(// "push service [%s] not registered for mobile application [%s]", // appId, service)); String endpointArn = null; String applicationArn = application.getPlatformApplicationArn(); try { endpointArn = getSnsClient() .createPlatformEndpoint(// new CreatePlatformEndpointRequest()// .withPlatformApplicationArn(applicationArn)// .withToken(token))// .getEndpointArn(); } catch (InvalidParameterException e) { String message = e.getErrorMessage(); Utils.info("Exception message: %s", message); Pattern p = Pattern.compile(".*Endpoint (arn:aws:sns[^ ]+) already exists " + "with the same token.*"); Matcher m = p.matcher(message); if (m.matches()) { // The platform endpoint already exists for this token, but with // additional custom data that // createEndpoint doesn't want to overwrite. Just use the // existing platform endpoint. endpointArn = m.group(1); } else { throw e; } } if (endpointArn == null) throw new RuntimeException("failed to create device notification endpoint: try again later"); boolean updateNeeded = false; try { GetEndpointAttributesResult endpointAttributes = getSnsClient() .getEndpointAttributes(new GetEndpointAttributesRequest().withEndpointArn(endpointArn)); updateNeeded = !endpointAttributes.getAttributes().get("Token").equals(token) || !endpointAttributes.getAttributes().get("Enabled").equalsIgnoreCase("true"); } catch (NotFoundException nfe) { // We had a stored ARN, but the platform endpoint associated with it // disappeared. Recreate it. endpointArn = null; } if (endpointArn == null) throw new RuntimeException("failed to create device notification endpoint: try again later"); if (updateNeeded) { // The platform endpoint is out of sync with the current data; // update the token and enable it. Map<String, String> attribs = new HashMap<String, String>(); attribs.put("Token", token); attribs.put("Enabled", "true"); getSnsClient().setEndpointAttributes(// new SetEndpointAttributesRequest()// .withEndpointArn(endpointArn)// .withAttributes(attribs)); } return endpointArn; }