Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
package org.jgroups.stack;
import org.jgroups.Event;
import org.jgroups.JChannel;
import org.jgroups.Message;
import org.jgroups.annotations.ManagedOperation;
import org.jgroups.annotations.Property;
import org.jgroups.conf.ClassConfigurator;
import org.jgroups.logging.Log;
import org.jgroups.logging.LogFactory;
import org.jgroups.protocols.TP;
import org.jgroups.util.MessageBatch;
import org.jgroups.util.SocketFactory;
import org.jgroups.util.ThreadFactory;
import org.jgroups.util.Util;
import org.w3c.dom.Node;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* The Protocol class provides a set of common services for protocol layers. Each layer has to
* be a subclass of Protocol and override a number of methods (typically just {@code up()},
* {@code down()} and {@code getName()}. Layers are stacked in a certain order to form
* a protocol stack. Events are passed from lower
* layers to upper ones and vice versa. E.g. a Message received by the UDP layer at the bottom
* will be passed to its higher layer as an Event. That layer will in turn pass the Event to
* its layer and so on, until a layer handles the Message and sends a response or discards it,
* the former resulting in another Event being passed down the stack.
*
* The important thing to bear in mind is that Events have to passed on between layers in FIFO
* order which is guaranteed by the Protocol implementation and must be guranteed by subclasses
* implementing their on Event queuing.
* Note that each class implementing interface Protocol MUST provide an empty, public
* constructor !
*
* @author Bela Ban
*/
public abstract class Protocol {
protected Protocol up_prot, down_prot;
protected ProtocolStack stack;
@Property(description="Determines whether to collect statistics (and expose them via JMX). Default is true")
protected boolean stats=true;
@Property(description="Enables ergonomics: dynamically find the best values for properties at runtime")
protected boolean ergonomics=true;
@Property(description="Fully qualified name of a class implementing ProtocolHook, will be called after creation of " +
"the protocol (before init())",writable=false)
protected String after_creation_hook;
@Property(description="Give the protocol a different ID if needed so we can have multiple " +
"instances of it in the same stack",writable=false)
protected short id=ClassConfigurator.getProtocolId(getClass());
protected final Log log=LogFactory.getLog(this.getClass());
/**
* Sets the level of a logger. This method is used to dynamically change the logging level of a running system,
* e.g. via JMX. The appender of a level needs to exist.
* @param level The new level. Valid values are "fatal", "error", "warn", "info", "debug", "trace"
* (capitalization not relevant)
*/
public T setLevel(String level) {log.setLevel(level); return (T)this;}
@Property(name="level", description="logger level (see javadocs)")
public String getLevel() {return log.getLevel();}
public T level(String level) {return setLevel(level);}
public boolean isErgonomics() {return ergonomics;}
public T setErgonomics(boolean ergonomics) {this.ergonomics=ergonomics; return (T)this;}
public ProtocolStack getProtocolStack() {return stack;}
public boolean statsEnabled() {return stats;}
public void enableStats(boolean flag) {stats=flag;}
public String getName() {return getClass().getSimpleName();}
public short getId() {return id;}
public T setId(short id) {this.id=id; return (T)this;}
public T getUpProtocol() {return (T)up_prot;}
public T getDownProtocol() {return (T)down_prot;}
public T setUpProtocol(Protocol prot) {this.up_prot=prot; return (T)this;}
public T setDownProtocol(Protocol prot) {this.down_prot=prot; return (T)this;}
public T setProtocolStack(ProtocolStack s) {this.stack=s; return (T)this;}
public String afterCreationHook() {return after_creation_hook;}
public Log getLog() {return log;}
public Object getValue(String name) {
if(name == null) return null;
Field field=Util.getField(getClass(), name);
if(field == null)
throw new IllegalArgumentException("field \"" + name + "\n not found");
return Util.getField(field, this);
}
public Protocol setValue(String name, Object value) {
if(name == null || value == null)
return this;
Field field=Util.getField(getClass(), name);
if(field == null)
throw new IllegalArgumentException("field " + name + " not found");
Property prop=field.getAnnotation(Property.class);
if(prop != null) {
String deprecated_msg=prop.deprecatedMessage();
if(deprecated_msg != null && !deprecated_msg.isEmpty())
log.warn("Field " + getName() + "." + name + " is deprecated: " + deprecated_msg);
}
Util.setField(field, this, value);
return this;
}
/**
* Resolves and applies the specified properties to this protocol.
* @param properties a map of property string values
* @return this protocol
* @throws Exception if any of the specified properties are unresolvable or unrecognized.
*/
public Protocol setProperties(Map properties) throws Exception {
// These Configurator methods are destructive, so make a defensive copy
Map copy = new HashMap<>(properties);
Configurator.removeDeprecatedProperties(this, copy);
Configurator.resolveAndAssignFields(this, copy);
Configurator.resolveAndInvokePropertyMethods(this, copy);
List