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; }
@Override public boolean load(GetEndpointAttributesRequest request, ResultCapture<GetEndpointAttributesResult> extractor) { return resource.load(request, extractor); }
/** * Makes a call to the service to load this resource's attributes if they * are not loaded yet, and use a ResultCapture to retrieve the low-level * client response * The following request parameters will be populated from the data of this * <code>PlatformEndpoint</code> resource, and any conflicting parameter * value set in the request will be overridden: * <ul> * <li> * <b><code>EndpointArn</code></b> * - mapped from the <code>Arn</code> identifier. * </li> * </ul> * * <p> * * @return Returns {@code true} if the resource is not yet loaded when this * method was invoked, which indicates that a service call has been * made to retrieve the attributes. * @see GetEndpointAttributesRequest */ boolean load(GetEndpointAttributesRequest request, ResultCapture<GetEndpointAttributesResult> extractor);