diff options
author | jestin | 2012-05-13 08:54:38 +0000 |
---|---|---|
committer | jestin | 2012-05-13 08:54:38 +0000 |
commit | e854a58a81ec90e419a4b3effa5a83caac05df90 (patch) | |
tree | 16eb84a66b62ff38e744c8cd474df81561436b9f /src/Domain.java | |
parent | 4ffe8b84071babe544086f94c66431380d301d59 (diff) | |
download | ivy-java-e854a58a81ec90e419a4b3effa5a83caac05df90.zip ivy-java-e854a58a81ec90e419a4b3effa5a83caac05df90.tar.gz ivy-java-e854a58a81ec90e419a4b3effa5a83caac05df90.tar.bz2 ivy-java-e854a58a81ec90e419a4b3effa5a83caac05df90.tar.xz |
Modified the tests to remove bus.getDomain(null)
make Waiter and WaiterClient sons of WaitFor
Added a few tests into svn
Diffstat (limited to 'src/Domain.java')
-rw-r--r-- | src/Domain.java | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/src/Domain.java b/src/Domain.java new file mode 100644 index 0000000..1d13e25 --- /dev/null +++ b/src/Domain.java @@ -0,0 +1,177 @@ +/** + * Intern representation of a domain, plus a set of helper static methods to + * parse strings like 127:2010,224.5.6.7:8910. + * + * Usually, you don't have to use this, and just rely on {@link bus.start} + * with a null parameter. However, if you want to parse a command line + * parameter, or output the result of Ivy libary guessing order, then you can + * use those methods. + * + * @author Yannick Jestin <a * href="mailto:yannick.jestin@enac.fr">yannick.jestin&enac.fr</a> + * @since 1.2.16 + */ +package fr.dgac.ivy; + +import java.util.regex.*; +import java.util.Collections; +import java.util.Collection; +import java.util.List; +import java.util.ArrayList; +import gnu.getopt.Getopt; + +public class Domain { + + /** + * the port for the UDP rendez vous, if none is supplied. + */ + public static final int DEFAULT_PORT = 2010; + + /** + * the domain for the UDP rendez vous. + */ + public static final String DEFAULT_DOMAIN = "127.255.255.255:" + DEFAULT_PORT; + + // private fields + private String domainaddr; + private int port; + private static Pattern numbersPoint, exp; + + public Domain(String ddomainaddr , int dport) { this.domainaddr = ddomainaddr;this.port = dport; } + + @Override public String toString() { return domainaddr + ":" + port; } + + // accessors + public String getDomainaddr() { return domainaddr; } + public int getPort() { return port; } + + + static { + try { + numbersPoint = Pattern.compile("([0-9]|\\.)+"); + exp = Pattern.compile( "^(\\d+\\.\\d+\\.\\d+\\.\\d+).*"); + } catch (PatternSyntaxException res) { + res.printStackTrace(); + System.out.println("Regular Expression bug in Ivy source code ... bailing out"); + throw new RuntimeException(); + } + } + + + static final String getDomain(final String domainbus) { + String db = null; + db = domainbus; + if ( db == null ) db = System.getProperty("IVYBUS"); + if ( db == null ) db = DEFAULT_DOMAIN; + return db; + } + + /* + private boolean isInDomain( InetAddress host ){ + return true; + // TODO check if this function is useful. for now, it always returns true + // deprecated since we use Multicast. How to check when we are in UDP + // broadcast ? + // + byte rem_addr[] = host.getAddress(); + for ( int i = 0 ; i < domainaddrList.size(); i++ ) { + byte addr[] = ((InetAddress)domainaddrList.elementAt(i)).getAddress(); + int j ; + for ( j = 0 ; j < 4 ; j++ ) + if ( (addr[j] != -1) && (addr[j] != rem_addr[j]) ) break; + if ( j == 4 ) { + traceDebug( "host " + host + " is in domain\n" ); + return true; + } + } + traceDebug( "host " + host + " Not in domain\n" ); + return false; + } + */ + + private static int extractPort(String net) { // returns 0 if no port is set + int sep_index = net.lastIndexOf( ":" ); + int port= ( sep_index == -1 ) ? 0 :Integer.parseInt( net.substring( sep_index +1 )); + // System.out.println("net: ["+net+"]\nsep_index: "+sep_index+"\nport: "+port); + //System.out.println("next port: "+port); + return port; + } + + private static String expandDomain(String net) throws IvyException { + // System.out.println("debug: net=[" + net+ "]"); + int sep_index = net.lastIndexOf( ":" ); + if ( sep_index != -1 ) { net = net.substring(0,sep_index); } + try { + Matcher m = numbersPoint.matcher(net); + if (!m.matches()) { + // traceDebug("should only have numbers and point ? I won't add anything... " + net); + return "127.255.255.255"; + // return net; + } + net += ".255.255.255"; + Matcher mm= exp.matcher(net); + if (!mm.matches()) { + System.out.println("Bad broascat addr " + net); + throw new IvyException("bad broadcast addr"); + } + net=mm.group(1); + } catch ( PatternSyntaxException e ){ + e.printStackTrace(); + throw new RuntimeException(); + } + //System.out.println("next domain: "+net); + return net; + } + + /** + * returns the domain bus. + * + * @since 1.2.8 + * @param progname The name of your program, for error message + * @param args the String[] of arguments passed to your main() + * @return returns the domain bus, ascending priority : ivy default bus, IVY_BUS + * property, -b domain on the command line + */ + + public static final String getDomainArgs(final String progname, final String[] args) { + Getopt opt = new Getopt(progname , args , "b:"); + int c; + if ( ((c = opt.getopt()) != -1) && c == 'b' ) return opt.getOptarg(); + return getDomain(null); + } + + final static List<Domain> parseDomains(final String domainbus) { + // assert(domainbus!=null); + List<Domain> d = new ArrayList<Domain>(); + for (String s: domainbus.split(",")) { + try { + d.add(new Domain(expandDomain(s) , extractPort(s))); + } catch (IvyException ie) { + // do nothing + ie.printStackTrace(); + } + } + // fixes the port values ... + Collections.reverse(d); + int lastport = DEFAULT_PORT; + for (Domain dom : d) { + if (dom.port == 0) dom.port = lastport; + lastport = dom.port; + } + Collections.reverse(d); + return d; + } + + + /** + * prints a human readable representation of the list of domains. + * + * @since 1.2.9 + */ + static public String domains(String toparse) { + StringBuffer s = new StringBuffer(); + if (toparse == null) toparse = getDomain(toparse); + for (Domain dd : parseDomains(toparse)) s.append(dd.getDomainaddr() + ":" + dd.getPort() + " "); + return s.toString(); + } + +} |