/* * Copyright (c) 2001-2007 Sun Microsystems, Inc. All rights reserved. * * The Sun Project JXTA(TM) Software License * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowledgment: "This product includes software * developed by Sun Microsystems, Inc. for JXTA(TM) technology." * Alternately, this acknowledgment may appear in the software itself, if * and wherever such third-party acknowledgments normally appear. * * 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must * not be used to endorse or promote products derived from this software * without prior written permission. For written permission, please contact * Project JXTA at http://www.jxta.org. * * 5. Products derived from this software may not be called "JXTA", nor may * "JXTA" appear in their name, without prior written permission of Sun. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SUN * MICROSYSTEMS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * JXTA is a registered trademark of Sun Microsystems, Inc. in the United * States and other countries. * * Please see the license information page at : * <http://www.jxta.org/project/www/license.html> for instructions on use of * the license in source files. * * ==================================================================== * * This software consists of voluntary contributions made by many individuals * on behalf of Project JXTA. For more information on Project JXTA, please see * http://www.jxta.org. * * This license is based on the BSD license adopted by the Apache Foundation. */ package net.jxta.protocol; import net.jxta.document.Document; import net.jxta.document.MimeMediaType; import net.jxta.peer.PeerID; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; /** * A generic message that can be used by services to push shared resources to * other peers on the network. * <p/> */ public abstract class SrdiMessage { /** * PERSIST Scope is persist only. i.e. A node receiving such message is expected to only persist * the indexes contained within. */ public static final int PERSISTONLY = 0; /** * REPLICATE Scope is persist and replicate. i.e. A node receiving such message is expected * to pnly persist the indexes contained within. */ public static final int REPLICATE = 1; private final Collection<Entry> entries = new HashSet<Entry>(); private PeerID peerid = null; private String primaryKey = null; /** * The scope of SrdiMesage (0, or 1) */ private int scope = 0; /** * Write advertisement into a document. asMimeType is a mime media-type * specification and provides the form of the document which is being * requested. Two standard document forms are defined. 'text/text' encodes * the document in a form nice for printing out and 'text/xml' which * provides an XML format. * * @param asMimeType mime-type requested representation for the returned * document * @return Document document representing the advertisement */ public abstract Document getDocument(MimeMediaType asMimeType); /** * returns the source peerid * * @return PeerID */ public PeerID getPeerID() { return peerid; } /** * get the primary key * * @return primaryKey */ public String getPrimaryKey() { return this.primaryKey; } /** * Returns the current scope of this message. * <p/> * Scope is either 0 (persist only), or 1 (persist and replicate) * * @return The current scope value. */ public int getScope() { return scope; } /** * Sets the current scope of this message. * <p/> * Scope is either 0 (persist only), or 1 (persist and replicate) * @see #PERSISTONLY * @see #REPLICATE * * @param scope The new TTL value. */ public void setScope(int scope) { this.scope = scope; } /** * Decrements TTL */ public void decrementTTL() { if (this.scope > 0) { this.scope--; } } /** * Returns the entries of this SrdiMessage * * @return the entries of this SrdiMessage */ public Collection<Entry> getEntries() { return new ArrayList<Entry>(entries); } /** * Adds an index entry * @param key key * @param value the value * @param expiration expiration in millisconds */ public void addEntry(String key, String value, long expiration) { addEntry(new SrdiMessage.Entry(key, value, expiration)); } public void addEntry(SrdiMessage.Entry entry) { entries.add(entry); } /** * Set the Entries for this SrdiMessage. * * @param newEntries The entries to be included in this message. */ public void setEntries(Collection<Entry> newEntries) { entries.clear(); entries.addAll(newEntries); } /** * Set the source peerid * * @param peerid the source PeerID */ public void setPeerID(PeerID peerid) { this.peerid = peerid; } /** * Set the primary key * * @param pkey the primary key */ public void setPrimaryKey(String pkey) { this.primaryKey = pkey; } /** * All messages have a type (in xml this is !doctype) which identifies the * message, if no expiration is defined Default expiration infinite for * entries. This is the amount of time which an entry will live in cache. * After this time, the entry is garbage collected, it also worthy to note * that it is up to the peer caching these entries to honor the lifetime of * the entry, and peer may choose to garbage collect entries based on * quotas, relationship with other peers, etc. * * * @return String "jxta:GenSRDI" */ public static String getMessageType() { return "jxta:GenSRDI"; } /** * Entries object, which describes each entry described by this message */ public final static class Entry { /** * Entry Expiration expressed in relative time in ms */ public long expiration; /** * Entry key attribute */ public String key; /** * Entry key value */ public String value; /** * {@inheritDoc} * <p/> * Expiration time is not considered in calculation. */ @Override public boolean equals(Object target) { if (this == target) { return true; } if (target instanceof Entry) { Entry likeMe = (Entry) target; return key.equals(likeMe.key) && value.equals(likeMe.value); } return false; } /** * {@inheritDoc} * <p/> * Expiration time is not considered in calculation. */ @Override public int hashCode() { int result = 0; if (null != key) { result ^= key.hashCode(); } if (null != value) { result ^= value.hashCode(); } return result; } /** * Creates a Entry with key, value, and expiration * * @param key key attribute * @param value key value * @param expiration expressed in relative time in ms */ public Entry(String key, String value, long expiration) { this.key = key; this.value = value; this.expiration = expiration; } @Override public String toString() { return "SrdiMessage.Entry(key=[" + key + "], value=[" + value + "], expiration=[" + expiration + "])"; } } }