make service parser more generic
This commit is contained in:
		
							parent
							
								
									b3fda3e6c1
								
							
						
					
					
						commit
						7d2596e0fe
					
				@ -4,6 +4,8 @@ import java.io.BufferedReader;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.FileReader;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.StringTokenizer;
 | 
			
		||||
@ -28,36 +30,41 @@ public class NetServices {
 | 
			
		||||
            System.getProperty("sigar.net.services.file", defaultFile);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void parseServices(String type, Map services) {
 | 
			
		||||
        File file = new File(SERVICE_FILE);
 | 
			
		||||
    private interface EntryReader {
 | 
			
		||||
        public void process(String name, String port, List aliases);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void parse(String fileName, EntryReader entry) {
 | 
			
		||||
        File file = new File(fileName);
 | 
			
		||||
        if (!file.exists()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        BufferedReader reader = null;
 | 
			
		||||
        ArrayList aliases = new ArrayList();
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            reader = new BufferedReader(new FileReader(file));
 | 
			
		||||
            String line;
 | 
			
		||||
            while ((line = reader.readLine()) != null) {
 | 
			
		||||
                String name, protocol;
 | 
			
		||||
    
 | 
			
		||||
                line = line.trim();
 | 
			
		||||
                if ((line.length() == 0) || (line.charAt(0) == '#')) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
    
 | 
			
		||||
                StringTokenizer st = new StringTokenizer(line, " \t/#");
 | 
			
		||||
                if (st.countTokens() < 3) {
 | 
			
		||||
                aliases.clear();
 | 
			
		||||
                int ix = line.indexOf("#");
 | 
			
		||||
                if (ix != -1) {
 | 
			
		||||
                    line = line.substring(0, ix);
 | 
			
		||||
                }
 | 
			
		||||
                StringTokenizer st = new StringTokenizer(line, " \t");
 | 
			
		||||
                if (st.countTokens() < 2) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                name = st.nextToken().trim();
 | 
			
		||||
                String pnum = st.nextToken().trim();
 | 
			
		||||
                protocol = st.nextToken().trim();
 | 
			
		||||
                if (!type.equals(protocol)) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                String name = st.nextToken().trim();
 | 
			
		||||
                String port = st.nextToken().trim();
 | 
			
		||||
                while (st.hasMoreTokens()) {
 | 
			
		||||
                    aliases.add(st.nextToken().trim());
 | 
			
		||||
                }
 | 
			
		||||
                services.put(Long.valueOf(pnum), name);
 | 
			
		||||
                entry.process(name, port, aliases);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            return;
 | 
			
		||||
@ -70,6 +77,33 @@ public class NetServices {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static class ServicesReader implements EntryReader {
 | 
			
		||||
        private String protocol;
 | 
			
		||||
        private Map services;
 | 
			
		||||
 | 
			
		||||
        private ServicesReader(String protocol, Map services) {
 | 
			
		||||
            this.protocol = protocol;
 | 
			
		||||
            this.services = services;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void process(String name, String port, List aliases) {
 | 
			
		||||
            String pnum, protocol;
 | 
			
		||||
            int ix = port.indexOf('/');
 | 
			
		||||
            if (ix == -1) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            pnum = port.substring(0, ix);
 | 
			
		||||
            protocol = port.substring(ix+1);
 | 
			
		||||
            if (this.protocol.equals(protocol)) {
 | 
			
		||||
                this.services.put(Long.valueOf(pnum), name);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void parseServices(String type, Map services) {
 | 
			
		||||
        parse(SERVICE_FILE, new ServicesReader(type, services));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static String getName(String protocol, long port) {
 | 
			
		||||
        if (protocol.equals("tcp")) {
 | 
			
		||||
            return getTcpName(port);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user