Files
Brainstorm/Orb/src/com/de22/orb/Address.java
2014-05-30 10:31:51 -07:00

243 lines
6.6 KiB
Java

/*
* Copyright (c) 1999,2009 Declarative Engineering LLC.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Declarative Engineering LLC
* verson 1 which accompanies this distribution, and is available at
* http://declarativeengineering.com/legal/DE_Developer_License_v1.txt
*/
package com.de22.orb;
import com.common.comparison.Comparator;
import com.common.debug.*;
public class Address implements IAddress {
public static final int INVALID_PORT = -1;
private String name = null;
private int port = INVALID_PORT;
private String resource = null;
/**
* Address constructor.
*/
public Address() {
this(null, -1, null);
}//Address()//
/**
* Address constructor.
* @param address The address in string form which follows the URL rules.
*/
public Address(String address) {
super();
parseAddress(address);
}//Address()//
/**
* Address constructor.
* @param name The address URL or IP address.
* @param port The address port number.
*/
public Address(String name, int port) {
this(name, port, null);
}//Address()//
/**
* Address constructor.
* <p>Note: At least one of the parameters should normally be non-null. Some methods will require that multiple parameters be non-null.</p>
* @param name The address URL or IP address.
* @param port The address port number.
* @param resource The referenced resource at the address.
*/
public Address(String name, int port, String resource) {
super();
this.name = name;
this.port = port;
this.resource = resource;
}//Address()//
/* (non-Javadoc)
* @see java.lang.Object#clone()
*/
public Object clone() throws CloneNotSupportedException {
return super.clone();
}//clone()//
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return port ^ (name != null ? name.hashCode() : 0) ^ (resource != null ? resource.hashCode() : 0);
}//hashCode()//
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object object) {
return object instanceof Address && ((Address) object).port == port && Comparator.equals(((Address) object).name, name) && Comparator.equals(((Address) object).resource, resource);
}//equals()//
/**
* Gets the ip address or machine name that identifies the first part of the address.
* @return The IP or URL name of the computer being addressed.
*/
public String getName() {
return name;
}//getName()//
/**
* Gets the port number that identifies the second part of the address.
* @return The addressed computer's port identifying the listener (server socket) being addressed.
*/
public int getPort() {
return port;
}//getPort()//
/**
* Gets the name of the resource that is being referenced at the address.
* @return The addressed resource's name.
*/
public String getResource() {
return resource;
}//getResource()//
/**
* Parses the address from a string containing the name and port in the format (or variation of): [protocol]://[name]:[port]/[object].
* @param address The address in string form.
*/
private void parseAddress(String address) {
address = address.trim();
try {
int lastIndex = 0;
int index = address.indexOf("://", lastIndex);
//Try both slash directions.//
if(index == -1) {
index = address.indexOf(":\\\\", lastIndex);
}//if//
//Ignore beginning protocol and slashes.//
if(index != -1) {
//TODO: Capture the protocol.//
lastIndex = index + 3;
}//if//
index = address.indexOf("//", lastIndex);
//Try both slash directions.//
if(index == -1) {
index = address.indexOf("\\\\", lastIndex);
}//if//
//Ignore beginning slashes.//
if(index != -1) {
lastIndex = index + 2;
}//if//
index = address.indexOf(':', lastIndex);
//Capture the name and or port.//
if((index != -1) && (address.indexOf('/', lastIndex) != lastIndex) && (address.indexOf('\\', lastIndex) != lastIndex)) {
int index2 = 0;
if(index != lastIndex) {
name = address.substring(lastIndex, index);
}//if//
lastIndex = index + 1;
index = address.indexOf('/', lastIndex);
index2 = address.indexOf("\\", lastIndex);
index = (index2 != -1) && (index2 < index) ? index2 : index;
if(index == -1) {
port = Integer.parseInt(address.substring(lastIndex));
lastIndex = -1;
}//if//
else {
port = Integer.parseInt(address.substring(lastIndex, index));
lastIndex = index;
}//else//
}//if//
if((lastIndex != -1) && (name == null) && (address.indexOf('/', lastIndex) != lastIndex) && (address.indexOf('\\', lastIndex) != lastIndex)) {
int index2 = address.indexOf("\\", lastIndex);
index = address.indexOf('/', lastIndex);
index = (index2 != -1) && (index2 < index) ? index2 : index;
if(index == -1) {
String part = address.substring(lastIndex);
boolean isNumber = true;
for(int ch = 0; isNumber && ch < part.length(); ch++) {
isNumber = Character.isDigit(part.charAt(ch));
}//for//
if(isNumber) {
//This allows input of just a port number.//
port = Integer.parseInt(part);
}//if//
else {
name = address.substring(lastIndex);
}//else//
lastIndex = -1;
}//if//
else {
name = address.substring(lastIndex, index);
lastIndex = index + 1;
}//else//
}//if//
//Read the resource name.//
if(lastIndex != -1) {
if(address.startsWith("\\", lastIndex) || address.startsWith("/", lastIndex)) {
lastIndex++;
}//if//
resource = address.substring(lastIndex);
}//if//
}//try//
catch(Throwable e) {
Debug.log(e);
Debug.halt();
}//catch//
}//parseAddress()//
/**
* Sets the ip address or machine name that identifies the first part of the address.
* @param name The IP or URL name of the computer being addressed.
*/
public void setName(String name) {
this.name = name;
}//setName()//
/**
* Sets the port number that identifies the second part of the address.
* @param port The addressed computer's port identifying the listener (server socket) being addressed.
*/
public void setPort(int port) {
this.port = port;
}//setPort()//
/**
* Sets the name of the resource that is being referenced at the address.
* @param resource The addressed resource's name.
*/
public void setResource(String resource) {
this.resource = resource;
}//setResource()//
/**
* Gets a string representation of the address.
* @return A representation of the address in string form.
*/
public String toString() {
String result = "";
if(name != null) {
result += name;
if(port != INVALID_PORT) {
result += ":" + port;
}//if//
}//if//
else if(port != INVALID_PORT) {
result += "<any>:" + port;
}//else if//
if(resource != null) {
result += '/' + resource;
}//if//
return result;
}//toString()//
}//Address//