/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.apns; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.List; import com.notnoop.apns.APNS; import com.notnoop.apns.ApnsNotification; import com.notnoop.exceptions.ApnsException; import org.apache.camel.Exchange; import org.apache.camel.component.apns.model.ApnsConstants; import org.apache.camel.component.apns.model.MessageType; import org.apache.camel.component.apns.util.StringUtils; import org.apache.camel.impl.DefaultProducer; import org.apache.camel.util.ObjectHelper; public class ApnsProducer extends DefaultProducer { private List<String> tokenList; public ApnsProducer(ApnsEndpoint endpoint) { super(endpoint); initiate(endpoint); } @Override public ApnsEndpoint getEndpoint() { return (ApnsEndpoint) super.getEndpoint(); } private void initiate(ApnsEndpoint apnsEndpoint) { configureTokens(apnsEndpoint); } private void configureTokens(ApnsEndpoint apnsEndpoint) { if (ObjectHelper.isNotEmpty(apnsEndpoint.getTokens())) { this.tokenList = extractTokensFromString(apnsEndpoint.getTokens()); } } public boolean isTokensConfiguredUsingUri() { return tokenList != null; } public void process(Exchange exchange) throws Exception { notify(exchange); } private void notify(Exchange exchange) throws ApnsException { MessageType messageType = getHeaderMessageType(exchange, MessageType.STRING); if (messageType == MessageType.APNS_NOTIFICATION) { ApnsNotification apnsNotification = exchange.getIn().getBody(ApnsNotification.class); getEndpoint().getApnsService().push(apnsNotification); } else { constructNotificationAndNotify(exchange, messageType); } } private void constructNotificationAndNotify(Exchange exchange, MessageType messageType) { String payload; Collection<String> tokens; if (isTokensConfiguredUsingUri()) { if (hasTokensHeader(exchange)) { throw new IllegalArgumentException("Tokens already configured on endpoint " + ApnsConstants.HEADER_TOKENS); } tokens = new ArrayList<String>(tokenList); } else { String tokensHeader = getHeaderTokens(exchange); tokens = extractTokensFromString(tokensHeader); } if (messageType == MessageType.STRING) { String message = exchange.getIn().getBody(String.class); payload = APNS.newPayload().alertBody(message).build(); } else { String message = exchange.getIn().getBody(String.class); payload = message; } Date expiry = exchange.getIn().getHeader(ApnsConstants.HEADER_EXPIRY, Date.class); if (expiry != null) { getEndpoint().getApnsService().push(tokens, payload, expiry); } else { getEndpoint().getApnsService().push(tokens, payload); } } public String getHeaderTokens(Exchange exchange) { return exchange.getIn().getHeader(ApnsConstants.HEADER_TOKENS, String.class); } public MessageType getHeaderMessageType(Exchange exchange, MessageType defaultMessageType) { String messageTypeStr = (String)exchange.getIn().getHeader(ApnsConstants.HEADER_MESSAGE_TYPE); if (messageTypeStr == null) { return defaultMessageType; } MessageType messageType = MessageType.valueOf(messageTypeStr); return messageType; } private boolean hasTokensHeader(Exchange exchange) { return getHeaderTokens(exchange) != null; } private List<String> extractTokensFromString(String tokensStr) { tokensStr = StringUtils.trim(tokensStr); if (tokensStr.isEmpty()) { throw new IllegalArgumentException("No token specified"); } String[] tokenArray = tokensStr.split(";"); int tokenArrayLength = tokenArray.length; for (int i = 0; i < tokenArrayLength; i++) { String token = tokenArray[i]; tokenArray[i] = token.trim(); int tokenLength = token.length(); if (tokenLength != 64) { throw new IllegalArgumentException("Token has wrong size['" + tokenLength + "']: " + token); } } List<String> tokens = Arrays.asList(tokenArray); return tokens; } }