anon.infoservice
Class MixCascade

java.lang.Object
  extended by anon.infoservice.AbstractDatabaseEntry
      extended by anon.infoservice.AbstractDistributableDatabaseEntry
          extended by anon.infoservice.AbstractDistributableCertifiedDatabaseEntry
              extended by anon.infoservice.MixCascade
All Implemented Interfaces:
AnonServerDescription, IVerifyable, IDistributable, IXMLEncodable

public class MixCascade
extends AbstractDistributableCertifiedDatabaseEntry
implements AnonServerDescription, IVerifyable

Holds the information for a mixcascade.


Nested Class Summary
 
Nested classes/interfaces inherited from class anon.infoservice.AbstractDistributableDatabaseEntry
AbstractDistributableDatabaseEntry.SerialDBEntry, AbstractDistributableDatabaseEntry.Serials
 
Field Summary
private  boolean m_bDefaultVerified
           
private  boolean m_bFromCascade
          If this MixCascade has been recevied directly from a cascade connection.
private  boolean m_bImplicitTrust
           
private  CertPath m_certPath
           
private  byte[] m_compressedXmlStructure
           
private  boolean m_isPayment
          True, if this MixCascade is a payment cascade.
private  long m_lastUpdate
          Time (see System.currentTimeMillis()) when the mixcascade (first mix) has sent this HELO message.
private  java.util.Vector m_listenerInterfaces
          Holds the information about the interfaces (IP, Port) the mixcascade (first mix) is listening on.
private  JAPCertificate m_mixCascadeCertificate
          Stores the certificate for verifying the status messages of the mixcascade.
private  java.lang.String m_mixCascadeId
          This is the ID of the mixcascade.
private  java.util.Vector m_mixIds
          Holds IDs of all mixes in the cascade.
private  MixInfo[] m_mixInfos
           
private  java.util.Vector m_mixNodes
           
private  java.lang.String m_mixProtocolVersion
           
private  java.lang.String m_paymentProtocolVersion
           
private  long m_serial
           
private  XMLSignature m_signature
           
private  java.lang.String m_strMixIds
           
private  java.lang.String m_strName
          The name of the mixcascade.
private  boolean m_userDefined
          True, if this MixCascade is user defined, false if the Information comes from the InfoService.
private  org.w3c.dom.Element m_xmlStructure
          Stores the XML structure for this mixcascade.
static java.lang.String SUPPORTED_PAYMENT_PROTOCOL_VERSION
           
private static java.lang.String XML_ATTR_USER_DEFINED
           
static java.lang.String XML_ELEMENT_CONTAINER_NAME
           
static java.lang.String XML_ELEMENT_NAME
           
 
Fields inherited from class anon.infoservice.AbstractDistributableDatabaseEntry
XML_ATTR_LAST_UPDATE, XML_ATTR_SERIAL, XML_ATTR_VALID, XML_ATTR_VERIFIED
 
Fields inherited from class anon.infoservice.AbstractDatabaseEntry
XML_LAST_UPDATE
 
Fields inherited from interface anon.infoservice.IDistributable
FIELD_HTTP_REQUEST_STRING, FIELD_HTTP_SERIALS_REQUEST_STRING
 
Fields inherited from interface anon.util.IXMLEncodable
FIELD_XML_ELEMENT_CONTAINER_NAME, FIELD_XML_ELEMENT_NAME, XML_ATTR_ID, XML_ATTR_VERSION
 
Constructor Summary
  MixCascade(byte[] a_bCompressedMixCascadeNode)
          Creates a new MixCascade from XML description (MixCascade node).
private MixCascade(byte[] a_compressedMixCascadeNode, org.w3c.dom.Element a_mixCascadeNode, long a_expireTime, java.lang.String a_mixIDFromCascade)
          Creates a new MixCascade from XML description (MixCascade node).
  MixCascade(org.w3c.dom.Element a_mixCascadeNode)
          Creates a new MixCascade from XML description (MixCascade node).
  MixCascade(org.w3c.dom.Element a_mixCascadeNode, long a_expireTime)
          Creates a new MixCascade from XML description (MixCascade node).
  MixCascade(org.w3c.dom.Element a_mixCascadeNode, long a_expireTime, java.lang.String a_mixIDFromCascade)
          Creates a new MixCascade from XML description (MixCascade node).
  MixCascade(java.lang.String a_hostName, int a_port)
          Creates a new MixCascade from the hostName / IP and the port.
  MixCascade(java.lang.String a_name, java.lang.String a_id, java.lang.String a_hostName, int a_port)
          Creates a new MixCascade from the hostName / IP and the port.
  MixCascade(java.lang.String a_name, java.lang.String a_id, java.util.Vector a_listenerInterfaces)
           
  MixCascade(java.lang.String a_name, java.lang.String a_id, java.util.Vector a_mixIDs, java.util.Vector a_listenerInterfaces)
           
  MixCascade(java.lang.String a_name, java.lang.String a_id, java.util.Vector a_mixIDs, java.util.Vector a_listenerInterfaces, long a_timeout)
           
 
Method Summary
 boolean checkId()
          Checks if the ID is valid.
 boolean compareMixIDs(MixCascade a_cascade)
          Returns whether a given cascade has another number of mixes or mixes with other IDs than this one.
private  void createMixIDString()
           
 boolean equals(java.lang.Object a_object)
          Compares this object to another one.
 StatusInfo fetchCurrentStatus()
          Fetches the current status of the mixcascade from the InfoService.
private  org.w3c.dom.Element generateXmlRepresentation()
          Creates an XML node without signature for this MixCascade.
 JAPCertificate getCertificate()
          Returns the certificate appended to the signature of the MixCascade XML structure.
 CertPath getCertPath()
           
 byte[] getCompressedData()
           
 StatusInfo getCurrentStatus()
          Returns the current status of this mixcascade.
 java.lang.String getId()
          Returns the ID of the mixcascade.
 long getLastUpdate()
          Returns the time in milliseconds when this db entry was created from the origin instance.
 ListenerInterface getListenerInterface(int i)
          Returns the ListenerInterface with the number i from the list of all listener interfaces (count starts with 0).
 java.lang.String getMixId(int a_mixNumber)
          Returns the Mix ID of the mix with the specified position in the cascade.
 java.util.Vector getMixIds()
          Returns the IDs of all mixes in the cascade.
 java.lang.String getMixIDsAsString()
           
 MixInfo getMixInfo(int a_mixNumber)
          Returns the MixInfo object (if available) of the mix in the specified position in the cascade.
 MixInfo getMixInfo(java.lang.String a_mixId)
          Returns the MixInfo object (if available) of the mix with the specified id if this mix is part of this cascade.
 java.lang.String getMixProtocolVersion()
          Returns the cascade protocol version, but only if this cascade entry was received directly from a first mix.
 java.lang.String getName()
          Returns the name of the mixcascade.
 int getNumberOfListenerInterfaces()
          Returns the number of interfaces (IP, Port) the mixcascade (first mix) is listening on.
 int getNumberOfMixes()
          Returns the number of mixes in the cascade.
 java.lang.String getPaymentProtocolVersion()
           
 byte[] getPostData()
          This returns the data posted when this MixCascade information is forwarded to other infoservices.
 int getPostEncoding()
          Returns the content encoding of the post data.
 java.lang.String getPostFile()
          This returns the filename (InfoService command), where this MixCascade entry is posted at other InfoServices.
 long getVersionNumber()
          Returns the time when this MixCascade entry was created by the origin mixcascade (or by the JAP client if it is a user-defined entry).
 org.w3c.dom.Element getXmlStructure()
          Returns the XML structure for this MixCascade entry.
 int hashCode()
          Returns a hashcode for this instance of MixCascade.
 boolean isFromCascade()
          Returns if this MixCascade has been recevied directly from a cascade connection.
 boolean isPayment()
           
 boolean isShownAsTrusted()
           
 boolean isUserDefined()
          Returns whether this MixCascade entry was generated by a user within the JAP client (true) or was generated by the original mixcascade itself (false).
 boolean isValid()
          Returns if the object is valid at this time
 boolean isVerified()
          Returns if this entry has been verified with a certificate chain.
 void setUserDefined(boolean a_bUserDefined, MixCascade a_oldMixCascade)
           
 void showAsTrusted(boolean a_bImplicitTrust)
          May be set by this application to show this service as trusted.
 java.lang.String toString()
          Returns a String representation for this MixCascade object.
 
Methods inherited from class anon.infoservice.AbstractDistributableDatabaseEntry
getHttpRequestString, getHttpSerialsRequestString, toXmlElement
 
Methods inherited from class anon.infoservice.AbstractDatabaseEntry
getCreationTime, getExpireTime, isNewerThan, resetCreationTime
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

SUPPORTED_PAYMENT_PROTOCOL_VERSION

public static final java.lang.String SUPPORTED_PAYMENT_PROTOCOL_VERSION
See Also:
Constant Field Values

XML_ELEMENT_NAME

public static final java.lang.String XML_ELEMENT_NAME
See Also:
Constant Field Values

XML_ELEMENT_CONTAINER_NAME

public static final java.lang.String XML_ELEMENT_CONTAINER_NAME
See Also:
Constant Field Values

XML_ATTR_USER_DEFINED

private static final java.lang.String XML_ATTR_USER_DEFINED
See Also:
Constant Field Values

m_bDefaultVerified

private boolean m_bDefaultVerified

m_bImplicitTrust

private boolean m_bImplicitTrust

m_mixCascadeId

private java.lang.String m_mixCascadeId
This is the ID of the mixcascade.


m_lastUpdate

private long m_lastUpdate
Time (see System.currentTimeMillis()) when the mixcascade (first mix) has sent this HELO message.


m_strName

private java.lang.String m_strName
The name of the mixcascade.


m_listenerInterfaces

private java.util.Vector m_listenerInterfaces
Holds the information about the interfaces (IP, Port) the mixcascade (first mix) is listening on.


m_mixIds

private java.util.Vector m_mixIds
Holds IDs of all mixes in the cascade.


m_strMixIds

private java.lang.String m_strMixIds

m_mixInfos

private MixInfo[] m_mixInfos

m_mixNodes

private java.util.Vector m_mixNodes

m_serial

private long m_serial

m_mixCascadeCertificate

private JAPCertificate m_mixCascadeCertificate
Stores the certificate for verifying the status messages of the mixcascade.


m_xmlStructure

private org.w3c.dom.Element m_xmlStructure
Stores the XML structure for this mixcascade.


m_compressedXmlStructure

private byte[] m_compressedXmlStructure

m_signature

private XMLSignature m_signature

m_certPath

private CertPath m_certPath

m_userDefined

private boolean m_userDefined
True, if this MixCascade is user defined, false if the Information comes from the InfoService. This value is only meaningful within the context of the JAP client.


m_isPayment

private boolean m_isPayment
True, if this MixCascade is a payment cascade.


m_mixProtocolVersion

private java.lang.String m_mixProtocolVersion

m_paymentProtocolVersion

private java.lang.String m_paymentProtocolVersion

m_bFromCascade

private boolean m_bFromCascade
If this MixCascade has been recevied directly from a cascade connection.

Constructor Detail

MixCascade

public MixCascade(byte[] a_bCompressedMixCascadeNode)
           throws XMLParseException
Creates a new MixCascade from XML description (MixCascade node).

Parameters:
a_bCompressedMixCascadeNode - The MixCascade node from a compressed XML document.
Throws:
XMLParseException

MixCascade

public MixCascade(org.w3c.dom.Element a_mixCascadeNode)
           throws XMLParseException
Creates a new MixCascade from XML description (MixCascade node).

Parameters:
a_mixCascadeNode - The MixCascade node from an XML document.
Throws:
XMLParseException

MixCascade

public MixCascade(org.w3c.dom.Element a_mixCascadeNode,
                  long a_expireTime)
           throws XMLParseException
Creates a new MixCascade from XML description (MixCascade node).

Parameters:
a_mixCascadeNode - The MixCascade node from an XML document.
a_expireTime - forces a specific expire time; takes default expire time if <= 0
Throws:
XMLParseException

MixCascade

public MixCascade(org.w3c.dom.Element a_mixCascadeNode,
                  long a_expireTime,
                  java.lang.String a_mixIDFromCascade)
           throws XMLParseException
Creates a new MixCascade from XML description (MixCascade node).

Parameters:
a_mixCascadeNode - The MixCascade node from an XML document.
a_expireTime - forces a specific expire time; takes default expire time if <= 0
a_mixIDFromCascade - if this is a MixCascade node directly received from a cascade (it is stripped) it gets this mix id; otherwise it must be null
Throws:
XMLParseException

MixCascade

private MixCascade(byte[] a_compressedMixCascadeNode,
                   org.w3c.dom.Element a_mixCascadeNode,
                   long a_expireTime,
                   java.lang.String a_mixIDFromCascade)
            throws XMLParseException
Creates a new MixCascade from XML description (MixCascade node).

Parameters:
a_mixCascadeNode - The MixCascade node from an XML document.
a_expireTime - forces a specific expire time; takes default expire time if <= 0
a_mixIDFromCascade - if this is a MixCascade node directly received from a cascade (it is stripped) it gets this mix id; otherwise it must be null
Throws:
XMLParseException

MixCascade

public MixCascade(java.lang.String a_hostName,
                  int a_port)
           throws java.lang.Exception
Creates a new MixCascade from the hostName / IP and the port. The hostName and port are directly used for creating the ListenerInterface for this MixCascade. ID and the name are set to a generic value derived from the name and the port. The lastUpdate time is the current system time. One mixId is created, it is the same as the mixCascadeId. The current status is set to dummy value. Cause the infoservice does not know this mixCascadeId and the created mixId, you will never get a StatusInfo or a MixInfo other than the dummy one.

Parameters:
a_hostName - The hostname or IP address the mixcascade (first mix) is listening on.
a_port - The port the mixcascade (first mix) is listening on.
Throws:
java.lang.Exception

MixCascade

public MixCascade(java.lang.String a_name,
                  java.lang.String a_id,
                  java.lang.String a_hostName,
                  int a_port)
           throws java.lang.Exception
Creates a new MixCascade from the hostName / IP and the port. The hostName and port are directly used for creating the ListenerInterface for this MixCascade. If ID and the name are not provided, than they are set to a generic value derived from the name and the port. The lastUpdate time is the current system time. One mixId is created, it is the same as the mixCascadeId. The current status is set to dummy value. Cause the infoservice does not know this mixCascadeId and the created mixId, you will never get a StatusInfo or a MixInfo other than the dummy one.

Parameters:
a_name - A human readable name of this cascade, which could be display on the UI. If this value is null the name will be constructed from hostName and port.
a_id - The ID of this cascade. If null than it will be constructed from hostName and port.
a_hostName - The hostname or IP address the mixcascade (first mix) is listening on.
a_port - The port the mixcascade (first mix) is listening on.
Throws:
java.lang.Exception

MixCascade

public MixCascade(java.lang.String a_name,
                  java.lang.String a_id,
                  java.util.Vector a_listenerInterfaces)
           throws java.lang.Exception
Throws:
java.lang.Exception

MixCascade

public MixCascade(java.lang.String a_name,
                  java.lang.String a_id,
                  java.util.Vector a_mixIDs,
                  java.util.Vector a_listenerInterfaces)
           throws java.lang.Exception
Throws:
java.lang.Exception

MixCascade

public MixCascade(java.lang.String a_name,
                  java.lang.String a_id,
                  java.util.Vector a_mixIDs,
                  java.util.Vector a_listenerInterfaces,
                  long a_timeout)
           throws java.lang.Exception
Throws:
java.lang.Exception
Method Detail

compareMixIDs

public boolean compareMixIDs(MixCascade a_cascade)
Returns whether a given cascade has another number of mixes or mixes with other IDs than this one.

Parameters:
a_cascade - MixCascade
Returns:
if both cascades contain the same mix IDs (and are therefore identical); false otherwise

getId

public java.lang.String getId()
Returns the ID of the mixcascade.

Specified by:
getId in interface IDistributable
Specified by:
getId in class AbstractDatabaseEntry
Returns:
The ID of this mixcascade.

getMixProtocolVersion

public java.lang.String getMixProtocolVersion()
Returns the cascade protocol version, but only if this cascade entry was received directly from a first mix.

Returns:
String

getPaymentProtocolVersion

public java.lang.String getPaymentProtocolVersion()

isFromCascade

public boolean isFromCascade()
Returns if this MixCascade has been recevied directly from a cascade connection.

Returns:
if this MixCascade has been recevied directly from a cascade connection

getVersionNumber

public long getVersionNumber()
Returns the time when this MixCascade entry was created by the origin mixcascade (or by the JAP client if it is a user-defined entry).

Specified by:
getVersionNumber in class AbstractDatabaseEntry
Returns:
A version number which is used to determine the more recent MixCascade entry, if two entries are compared (higher version number -> more recent entry).

getLastUpdate

public long getLastUpdate()
Description copied from class: AbstractDatabaseEntry
Returns the time in milliseconds when this db entry was created from the origin instance.

Specified by:
getLastUpdate in class AbstractDatabaseEntry
Returns:
the time in milliseconds when this db entry was created from the origin instance

getName

public java.lang.String getName()
Returns the name of the mixcascade.

Returns:
The name of this mixcascade.

toString

public java.lang.String toString()
Returns a String representation for this MixCascade object. It's just the name of the mixcascade.

Overrides:
toString in class java.lang.Object
Returns:
The name of this mixcascade.

equals

public boolean equals(java.lang.Object a_object)
Compares this object to another one. This method returns only true, if the other object is also a MixCascade and has the same ID as this MixCascade.

Overrides:
equals in class java.lang.Object
Parameters:
a_object - The object with which to compare.
Returns:
True, if the object with which to compare is also a MixCascade which has the same ID as this instance. In any other case, false is returned.

checkId

public boolean checkId()
Description copied from class: AbstractDistributableCertifiedDatabaseEntry
Checks if the ID is valid.

Overrides:
checkId in class AbstractDistributableCertifiedDatabaseEntry
Returns:
boolean

hashCode

public int hashCode()
Returns a hashcode for this instance of MixCascade. The hashcode is calculated from the ID, so if two instances of MixCascade have the same ID, they will have the same hashcode.

Overrides:
hashCode in class java.lang.Object
Returns:
The hashcode for this MixCascade.

getNumberOfListenerInterfaces

public int getNumberOfListenerInterfaces()
Returns the number of interfaces (IP, Port) the mixcascade (first mix) is listening on.

Returns:
The number of listener interfaces.

getListenerInterface

public ListenerInterface getListenerInterface(int i)
Returns the ListenerInterface with the number i from the list of all listener interfaces (count starts with 0). If there is no ListenerInterface with this number, null is returned.

Parameters:
i - The number of the ListenerInterface.
Returns:
The ListenerInterface with the number i from the list of all listener interfaces of this MixCascade.

getNumberOfMixes

public int getNumberOfMixes()
Returns the number of mixes in the cascade.

Returns:
the number of mixes in the cascade

getMixIDsAsString

public java.lang.String getMixIDsAsString()

getMixInfo

public MixInfo getMixInfo(int a_mixNumber)
Returns the MixInfo object (if available) of the mix in the specified position in the cascade.

Parameters:
a_mixNumber - a mix position from 0 to getNumberOfMixes() - 1
Returns:
the MixInfo object for the specified mix or null if it was not found in this cascade

getMixInfo

public MixInfo getMixInfo(java.lang.String a_mixId)
Returns the MixInfo object (if available) of the mix with the specified id if this mix is part of this cascade.

Parameters:
a_mixId - a Mix id
Returns:
the MixInfo object for the specified mix or null if it was not found

getMixId

public java.lang.String getMixId(int a_mixNumber)
Returns the Mix ID of the mix with the specified position in the cascade.

Parameters:
a_mixNumber - a mix position from 0 to getNumberOfMixes() - 1
Returns:
the Mix ID of the mix with the specified position in the cascade or null if the specified mix is not present in this cascade

getMixIds

public java.util.Vector getMixIds()
Returns the IDs of all mixes in the cascade.

Returns:
A snapshot of the list with all mix IDs within the cascade.

isUserDefined

public boolean isUserDefined()
Returns whether this MixCascade entry was generated by a user within the JAP client (true) or was generated by the original mixcascade itself (false).

Overrides:
isUserDefined in class AbstractDatabaseEntry
Returns:
Whether this MixCascade entry is user-defined.

showAsTrusted

public void showAsTrusted(boolean a_bImplicitTrust)
May be set by this application to show this service as trusted. TrustModel.isTrusted will then return true, but TrustModel.checkTrust will still check the correct trust.

Parameters:
a_bImplicitTrust - if this service is shown as trusted in this application

isShownAsTrusted

public boolean isShownAsTrusted()

setUserDefined

public void setUserDefined(boolean a_bUserDefined,
                           MixCascade a_oldMixCascade)

fetchCurrentStatus

public StatusInfo fetchCurrentStatus()
Fetches the current status of the mixcascade from the InfoService. The StatusInfo is available by calling getCurrentStatus().


getCurrentStatus

public StatusInfo getCurrentStatus()
Returns the current status of this mixcascade. If there is no status available at the infoservice, a dummy StatusInfo (every value = -1) is returned. The current status is every time updated, when fetchCurrentStatus() is called.

Returns:
The current status of the mixcascade.

getPostFile

public java.lang.String getPostFile()
This returns the filename (InfoService command), where this MixCascade entry is posted at other InfoServices. It's always '/cascade'.

Specified by:
getPostFile in interface IDistributable
Returns:
The filename where the information about this MixCascade entry is posted at other InfoServices when this entry is forwarded.

getPostEncoding

public int getPostEncoding()
Description copied from class: AbstractDistributableDatabaseEntry
Returns the content encoding of the post data.

Specified by:
getPostEncoding in interface IDistributable
Overrides:
getPostEncoding in class AbstractDistributableDatabaseEntry
Returns:
the content encoding of the post data

getPostData

public byte[] getPostData()
This returns the data posted when this MixCascade information is forwarded to other infoservices. It's the XML structure of this MixCascade as we received it.

Specified by:
getPostData in interface IDistributable
Overrides:
getPostData in class AbstractDistributableDatabaseEntry
Returns:
The data posted to other infoservices when this entry is forwarded.

getCompressedData

public byte[] getCompressedData()

getXmlStructure

public org.w3c.dom.Element getXmlStructure()
Returns the XML structure for this MixCascade entry.

Specified by:
getXmlStructure in class AbstractDistributableDatabaseEntry
Returns:
The XML node for this MixCascade (MixCascade node).

getCertificate

public JAPCertificate getCertificate()
Returns the certificate appended to the signature of the MixCascade XML structure. If there is no appended certificate or this MixCascade is user-defined, null is returned.

Specified by:
getCertificate in class AbstractDistributableCertifiedDatabaseEntry
Returns:
The certificate of this mixcascade or null, if there is no appended certificate.

getCertPath

public CertPath getCertPath()
Specified by:
getCertPath in interface IVerifyable

isVerified

public boolean isVerified()
Description copied from class: AbstractDistributableCertifiedDatabaseEntry
Returns if this entry has been verified with a certificate chain.

Specified by:
isVerified in interface IVerifyable
Specified by:
isVerified in class AbstractDistributableCertifiedDatabaseEntry
Returns:
if this entry has been verified with a certificate chain

isValid

public boolean isValid()
Description copied from interface: IVerifyable
Returns if the object is valid at this time

Specified by:
isValid in interface IVerifyable
Returns:
if the object is valid at this time

generateXmlRepresentation

private org.w3c.dom.Element generateXmlRepresentation()
Creates an XML node without signature for this MixCascade.

Returns:
The MixCascade XML node.

isPayment

public boolean isPayment()

createMixIDString

private void createMixIDString()