001/*
002  GRANITE DATA SERVICES
003  Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004
005  This file is part of Granite Data Services.
006
007  Granite Data Services is free software; you can redistribute it and/or modify
008  it under the terms of the GNU Library General Public License as published by
009  the Free Software Foundation; either version 2 of the License, or (at your
010  option) any later version.
011
012  Granite Data Services is distributed in the hope that it will be useful, but
013  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015  for more details.
016
017  You should have received a copy of the GNU Library General Public License
018  along with this library; if not, see <http://www.gnu.org/licenses/>.
019*/
020
021package flex.messaging.messages;
022
023import java.util.Collection;
024import java.util.HashMap;
025import java.util.Map;
026
027import org.granite.util.StringUtil;
028import org.granite.util.UUIDUtil;
029
030
031/**
032 * @author Franck WOLFF
033 */
034public abstract class AbstractMessage implements Message {
035
036        private static final long serialVersionUID = 1L;
037
038        private Object body = null;
039    private Object clientId = null;
040    private String destination = null;
041    private Map<String, Object> headers = null;
042    private String messageId = null;
043    private long timestamp = 0L;
044    private long timeToLive = 0L;
045
046    public AbstractMessage() {
047        super();
048    }
049
050    public AbstractMessage(Message request) {
051        this(request, false);
052    }
053
054    public AbstractMessage(Message request, boolean keepClientId) {
055        super();
056        this.messageId = UUIDUtil.randomUUID();
057        this.timestamp = System.currentTimeMillis();
058        this.clientId = (keepClientId && request.getClientId() != null ? request.getClientId() : UUIDUtil.randomUUID());
059    }
060
061    public Object getBody() {
062        return body;
063    }
064
065    public void setBody(Object body) {
066        this.body = body;
067    }
068
069    public Object getClientId() {
070        return clientId;
071    }
072
073    public void setClientId(Object clientId) {
074        this.clientId = clientId;
075    }
076
077    public String getDestination() {
078        return destination;
079    }
080
081    public void setDestination(String destination) {
082        this.destination = destination;
083    }
084
085    public Map<String, Object> getHeaders() {
086        return headers;
087    }
088
089    public void setHeaders(Map<String, Object> headers) {
090        this.headers = headers;
091    }
092
093    public Object getHeader(String name) {
094        return (headers != null ? headers.get(name) : null);
095    }
096
097    public boolean headerExists(String name) {
098        return (headers != null ? headers.containsKey(name) : false);
099    }
100
101    public void setHeader(String name, Object value) {
102        if (headers == null)
103            headers = new HashMap<String, Object>();
104        headers.put(name, value);
105    }
106
107    public String getMessageId() {
108        return messageId;
109    }
110
111    public void setMessageId(String messageId) {
112        this.messageId = messageId;
113    }
114
115    public long getTimestamp() {
116        return timestamp;
117    }
118
119    public void setTimestamp(long timestamp) {
120        this.timestamp = timestamp;
121    }
122
123    public long getTimeToLive() {
124        return timeToLive;
125    }
126
127    public void setTimeToLive(long timeToLive) {
128        this.timeToLive = timeToLive;
129    }
130
131    protected void toString(StringBuilder sb, String indent, String bodyAlternative) {
132        sb.append('\n').append(indent).append("  destination = ").append(destination);
133
134        if (headers != null && headers.containsKey(REMOTE_CREDENTIALS_HEADER)) {
135            Map<String, Object> headersCopy = new HashMap<String, Object>(headers);
136            headersCopy.put(REMOTE_CREDENTIALS_HEADER, HIDDEN_CREDENTIALS);
137            sb.append('\n').append(indent).append("  headers = ").append(headersCopy);
138        }
139        else
140            sb.append('\n').append(indent).append("  headers = ").append(headers);
141
142        sb.append('\n').append(indent).append("  messageId = ").append(messageId);
143        sb.append('\n').append(indent).append("  timestamp = ").append(timestamp);
144        sb.append('\n').append(indent).append("  clientId = ").append(clientId);
145        sb.append('\n').append(indent).append("  timeToLive = ").append(timeToLive);
146        sb.append('\n').append(indent).append("  body = ").append(printBody(body, bodyAlternative));
147    }
148
149    private static String printBody(Object body, String bodyAlternative) {
150
151        body = (bodyAlternative != null ? bodyAlternative : body);
152        if (body == null)
153            return null;
154
155        if (body.getClass().isArray() || body instanceof Collection<?> || body instanceof Map<?, ?>)
156            return StringUtil.toString(body, 100); // limit to first 100 elements.
157
158        return body.toString();
159    }
160}