001    /*
002     * Cumulus4j - Securing your data in the cloud - http://cumulus4j.org
003     * Copyright (C) 2011 NightLabs Consulting GmbH
004     *
005     * This program is free software: you can redistribute it and/or modify
006     * it under the terms of the GNU Affero General Public License as
007     * published by the Free Software Foundation, either version 3 of the
008     * License, or (at your option) any later version.
009     *
010     * This program is distributed in the hope that it will be useful,
011     * but WITHOUT ANY WARRANTY; without even the implied warranty of
012     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013     * GNU Affero General Public License for more details.
014     *
015     * You should have received a copy of the GNU Affero General Public License
016     * along with this program.  If not, see <http://www.gnu.org/licenses/>.
017     */
018    package org.cumulus4j.keymanager.back.shared;
019    
020    import java.io.Serializable;
021    
022    import javax.xml.bind.annotation.XmlRootElement;
023    
024    /**
025     * <p>
026     * Base-type for {@link Request} and {@link Response}.
027     * </p>
028     * <p>
029     * There should not be any other direct sub-classes of this class besides <code>Request</code> and
030     * <code>Response</code>.
031     * </p>
032     * <p>
033     * We implement a
034     * <a target="_blank" href="http://en.wikipedia.org/wiki/Request-response">request-response</a>
035     * <a target="_blank" href="http://en.wikipedia.org/wiki/Messaging_pattern">messaging-pattern</a>,
036     * hence for every <code>Request</code> instance,
037     * there must be exactly one <code>Response</code> instance. Both are identified
038     * by the {@link #getRequestID() requestID}
039     * </p>
040     *
041     * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de
042     */
043    @XmlRootElement
044    public abstract class Message implements Serializable
045    {
046            private static final long serialVersionUID = 1L;
047    
048            private String requestID;
049    
050            public Message() { }
051    
052            /**
053             * Get the request-identifier. Because a {@link Response} belongs
054             * to a {@link Request} in a 1-1-relationship, both use the same <code>requestID</code>.
055             * @return the identifier of the request.
056             * @see #setRequestID(String)
057             */
058            public String getRequestID() {
059                    return requestID;
060            }
061    
062            /**
063             * Set the request-identifier.
064             * @param requestID the identifier of the request.
065             * @see #getRequestID()
066             */
067            public void setRequestID(String requestID) {
068                    this.requestID = requestID;
069            }
070    
071            @Override
072            public int hashCode()
073            {
074                    return (requestID == null) ? 0 : requestID.hashCode();
075            }
076    
077            @Override
078            public boolean equals(Object obj)
079            {
080                    if (this == obj) return true;
081                    if (obj == null) return false;
082                    if (getClass() != obj.getClass()) return false;
083                    Message other = (Message) obj;
084                    return (
085                                    this.requestID == other.requestID ||
086                                    (this.requestID != null && this.requestID.equals(other.requestID))
087                    );
088            }
089    }