package org.jacorb.test.listenendpoints.echo_corbaloc;
import java.util.ArrayList;
import java.util.List;
public class ListenEndpoints {
/**
* Pickup endpoint addresses from command-line arguments -ORBListenEndPoints
*/
public static List<Endpoint> getEndpointList(String[] args) throws Exception
{
List<Endpoint> endpointList = new ArrayList<Endpoint>();
if (args != null)
{
for (int i = 0; i < args.length; i++)
{
if (args[i] == null) {
continue;
}
if (!args[i].equalsIgnoreCase("-ORBListenEndpoints"))
{
continue;
}
if (i+1 >= args.length || args[i+1] == null)
{
throw new Exception ("Invalid ORBListenEndpoints <value> format: -ORBListenEndpoints argument without value" );
}
/**
* an example of listen endpoint specification:
* -ORBListenEndPoint 'iiop://foo:9999/resuse_addr=1&foobar=50; ;iiop://;sliop://localhost:1234;;'
*/
String ep_args = args[i+1];
String ep_args_trim = ep_args.trim();
//check and remove single quotes if needed
if (ep_args_trim.charAt(0) == '\'' &&
ep_args_trim.charAt(ep_args_trim.length()-1) == '\'')
{
ep_args_trim = ep_args.trim().substring(1,ep_args.trim().length()-1);
}
// split up argument into segments using the semi-clone as delimiters
String[] seg_addr_list = ep_args_trim.split(";");
for (int xx = 0; xx < seg_addr_list.length; xx++)
{
String seg_args = seg_addr_list[xx].trim();
if (seg_args.equals(""))
{
continue;
}
// split up group of args into individual arg segments
// using the coma as delimiters
String[] indiv_list = seg_args.trim().split(",");
for (int xxx = 0; xxx < indiv_list.length; xxx++)
{
String address_str = null;
String ssl_port = null;
String[] options_args = null;
String addr_arg = indiv_list[xxx].trim();
if (addr_arg.equals(""))
{
continue;
}
// locate the first colon delimiter and
// pickup the protocol identifier string
int delim = addr_arg.indexOf(":");
String proto = addr_arg.substring (0,delim).toLowerCase();
// locate the double slash delimiter
int db_slash = addr_arg.indexOf("//", delim+1);
// System.out.println("xxx=" + xxx + ": delim=<" + db_slash + ">");
if (db_slash == -1)
{
throw new Exception ("Invalid ORBListenEndPoints <value;value;...> format: listen endpoint \'" + addr_arg + "\' is malformed!" );
}
// check if additional option delimiter is present
// and pick up the protocol address
String dbs = "/";
if (proto.equals("uiop"))
{
dbs = "|";
}
int opt_slash = addr_arg.indexOf(dbs, db_slash + 2);
if (opt_slash == -1)
{
address_str = addr_arg.substring(0);
}
else
{
address_str = addr_arg.substring(0, opt_slash);
}
// pick up optional arguments if present
if (opt_slash != -1)
{
options_args = addr_arg.substring(opt_slash+1).split("&");
for (int y = 0; y < options_args.length; y++)
{
String options_args_trim = options_args[xxx].trim();
int opt_delim = options_args_trim.indexOf('=');
if(opt_delim == -1)
{
throw new Exception ("error: listen endpoint options \'" + options_args[y] + "\' is malformed!");
}
else
{
String opt_str = options_args_trim.substring(0, opt_delim);
String opt_value = options_args_trim.substring(opt_delim+1);
if(opt_str.equalsIgnoreCase("ssl_port"))
{
ssl_port = new String(opt_value);
}
else
{
throw new Exception ("error: listen endpoint options \'" + options_args[y] + "\' is not supported!");
}
}
}
}
if(address_str != null)
{
String address_trim = address_str.trim();
// build an iiop/ssliop protocol address.
// create_protocol_address will allow iiop and ssliop only
if (proto.equals("iiop"))
{
Endpoint addr = null;
try
{
addr = createProtocolAddress(address_trim);
}
catch (Exception e)
{
throw new Exception(e.getMessage());
}
if (ssl_port != null)
{
addr.setSSLPort(Integer.parseInt(ssl_port));
}
endpointList.add(addr);
}
else
{
Endpoint addr = null;
try
{
addr = createProtocolAddress(address_trim);
}
catch (Exception e)
{
throw new Exception(e.getMessage());
}
endpointList.add(addr);
}
}
} //end for inner
} //end for
} //end for
} // end if
return endpointList;
}
private static Endpoint createProtocolAddress(String address_str) throws Exception
{
final Endpoint epoint = new Endpoint();
if (address_str != null)
{
int proto_delim = address_str.indexOf (':');
String proto = address_str.substring (0,proto_delim).toLowerCase();
epoint.setProtocol(proto);
final int addresss_start_ofs = proto_delim + 3;
if (!epoint.fromString(address_str.substring(addresss_start_ofs)))
{
throw new Exception("Invalid protocol address string: " + address_str);
}
}
else
{
throw new Exception("Invalid protocol address string (is null)");
}
return epoint;
}
}