/*
* Copyright 1999-2010 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is
* distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
*
* See the License for the specific language governing permissions and limitations under the License.
*/
package org.globus.common;
import java.util.StringTokenizer;
/**
* The purpose of this class is to parse resource manager contact strings.
* It can handle literal IPv6 addresses enclosed in square brackets
* ('[' and ']').
*/
public class ResourceManagerContact {
public final static String DEFAULT_SERVICE = "/jobmanager";
public final static int DEFAULT_PORT = 2119;
protected String hostName = null;
protected int portNumber = -1;
protected String serviceName = null;
protected String globusDN = null;
/* just for the super classes */
protected ResourceManagerContact() {
}
public ResourceManagerContact(String contact) {
parse(contact);
}
protected void parse(String contact) {
char c;
int i;
i = getHostToken(contact);
if (i == -1) {
hostName = contact;
return;
}
hostName = contact.substring(0, i);
c = contact.charAt(i);
if (c == '/') {
parseService(contact, i);
} else {
int j = getToken(contact, i+1);
if (j == -1) {
portNumber = parsePort(contact.substring(i+1));
return;
}
portNumber = parsePort(contact.substring(i+1, j));
c = contact.charAt(j);
if (c == ':') {
globusDN = contact.substring(j+1);
return;
} else if (c == '/') {
parseService(contact, j);
}
}
}
private int parsePort(String port) {
if (port.length() == 0) {
return DEFAULT_PORT;
} else {
return Integer.parseInt(port);
}
}
private void parseService(String contact, int from) {
int pos = contact.indexOf(":", from);
if (pos == -1) {
serviceName = contact.substring(from);
} else {
serviceName = contact.substring(from, pos);
globusDN = contact.substring(pos+1);
}
}
private int getToken(String contact, int from) {
int len = contact.length();
char c;
int i;
for (i=from;i<len;i++) {
c = contact.charAt(i);
if (c == '/' || c == ':') {
return i;
}
}
return -1;
}
private int getHostToken(String contact) {
int len = contact.length();
if (contact.charAt(0) == '[') {
int from = contact.indexOf(']');
if (from == -1) {
throw new IllegalArgumentException(
"Missing ']' in IPv6 address: "+ contact
);
}
return (from+1 == len) ? -1 : from+1;
}
return getToken(contact, 0);
}
public static String convertDN(String globusDN) {
if (globusDN == null) return null;
StringTokenizer tokens = new StringTokenizer(globusDN, "/");
StringBuffer buf = new StringBuffer();
while( tokens.hasMoreTokens() ) {
buf.insert(0, tokens.nextToken());
if (tokens.hasMoreTokens())
buf.insert(0, ", ");
}
return buf.toString();
}
public String getHostName() {
return hostName;
}
public int getPortNumber() {
if (portNumber == -1) {
return DEFAULT_PORT;
} else {
return portNumber;
}
}
public String getServiceName() {
if (serviceName == null) {
return DEFAULT_SERVICE;
} else {
return serviceName;
}
}
public String getSubject() {
return globusDN;
}
public String getGlobusDN() {
return globusDN;
}
public String getDN() {
return globusDN;
}
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append("Host name : " + hostName + "\n");
buf.append("Port number : " + getPortNumber() + "\n");
buf.append("Service : " + getServiceName() + "\n");
buf.append("DN : " + getGlobusDN() + "\n");
return buf.toString();
}
}