/*
* Copyright 2002-2017 the original author or authors.
*
* Licensed 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.springframework.integration.xmpp.support;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smackx.jiveproperties.JivePropertiesManager;
import org.jivesoftware.smackx.jiveproperties.packet.JivePropertiesExtension;
import org.springframework.integration.mapping.AbstractHeaderMapper;
import org.springframework.integration.xmpp.XmppHeaders;
import org.springframework.util.StringUtils;
/**
* Default implementation of {@link XmppHeaderMapper}.
*
* @author Mark Fisher
* @author Oleg Zhurakousky
* @author Florian Schmaus
* @author Stephane Nicoll
*
* @since 2.1
*/
public class DefaultXmppHeaderMapper extends AbstractHeaderMapper<Message> implements XmppHeaderMapper {
private static final List<String> STANDARD_HEADER_NAMES = new ArrayList<String>();
static {
STANDARD_HEADER_NAMES.add(XmppHeaders.FROM);
STANDARD_HEADER_NAMES.add(XmppHeaders.SUBJECT);
STANDARD_HEADER_NAMES.add(XmppHeaders.THREAD);
STANDARD_HEADER_NAMES.add(XmppHeaders.TO);
STANDARD_HEADER_NAMES.add(XmppHeaders.TYPE);
}
public DefaultXmppHeaderMapper() {
super(XmppHeaders.PREFIX, STANDARD_HEADER_NAMES, STANDARD_HEADER_NAMES);
}
@Override
protected Map<String, Object> extractStandardHeaders(Message source) {
Map<String, Object> headers = new HashMap<String, Object>();
String from = source.getFrom();
if (StringUtils.hasText(from)) {
headers.put(XmppHeaders.FROM, from);
}
String subject = source.getSubject();
if (StringUtils.hasText(subject)) {
headers.put(XmppHeaders.SUBJECT, subject);
}
String thread = source.getThread();
if (StringUtils.hasText(thread)) {
headers.put(XmppHeaders.THREAD, thread);
}
String to = source.getTo();
if (StringUtils.hasText(to)) {
headers.put(XmppHeaders.TO, to);
}
Message.Type type = source.getType();
if (type != null) {
headers.put(XmppHeaders.TYPE, type);
}
return headers;
}
@Override
protected Map<String, Object> extractUserDefinedHeaders(Message source) {
Map<String, Object> headers = new HashMap<String, Object>();
JivePropertiesExtension jpe = (JivePropertiesExtension) source.getExtension(JivePropertiesExtension.NAMESPACE);
if (jpe == null) {
return headers;
}
for (String propertyName : jpe.getPropertyNames()) {
headers.put(propertyName, JivePropertiesManager.getProperty(source, propertyName));
}
return headers;
}
@Override
protected void populateStandardHeaders(Map<String, Object> headers, Message target) {
String threadId = getHeaderIfAvailable(headers, XmppHeaders.THREAD, String.class);
if (StringUtils.hasText(threadId)) {
target.setThread(threadId);
}
String to = getHeaderIfAvailable(headers, XmppHeaders.TO, String.class);
if (StringUtils.hasText(to)) {
target.setTo(to);
}
String from = getHeaderIfAvailable(headers, XmppHeaders.FROM, String.class);
if (StringUtils.hasText(from)) {
target.setFrom(from);
}
String subject = getHeaderIfAvailable(headers, XmppHeaders.SUBJECT, String.class);
if (StringUtils.hasText(subject)) {
target.setSubject(subject);
}
Object typeHeader = getHeaderIfAvailable(headers, XmppHeaders.TYPE, Object.class);
if (typeHeader instanceof String) {
try {
typeHeader = Message.Type.valueOf((String) typeHeader);
}
catch (Exception e) {
if (logger.isWarnEnabled()) {
logger.warn("XMPP Type must be either a valid [Message.Type] " +
"enum value or a String representation of such.");
}
}
}
if (typeHeader instanceof Message.Type) {
target.setType((Message.Type) typeHeader);
}
}
@Override
protected void populateUserDefinedHeader(String headerName, Object headerValue, Message target) {
JivePropertiesManager.addProperty(target, headerName, headerValue);
}
}