View Javadoc

1   /***
2    * 
3    */
4   package de.cohesion.bssh.impl;
5   
6   import java.io.File;
7   import java.io.FileInputStream;
8   import java.io.IOException;
9   import java.io.InputStreamReader;
10  import java.io.LineNumberReader;
11  import java.util.Collections;
12  import java.util.HashSet;
13  import java.util.Set;
14  
15  import de.cohesion.bssh.Member;
16  import de.cohesion.bssh.MemberSource;
17  
18  /***
19   * @author schulzs
20   */
21  public class FileMemberSource implements MemberSource {
22  
23  	private Set<Member> addresses;
24  
25  	public FileMemberSource(final File f) throws IOException {
26  		LineNumberReader reader = new LineNumberReader(new InputStreamReader(
27  				new FileInputStream(f)));
28  
29  		addresses = new HashSet<Member>();
30  
31  		Set<String> seenFiles = new HashSet<String>();
32  		seenFiles.add(f.getAbsolutePath());
33  
34  		Member gateway = null;
35  
36  		String read = null;
37  		while ((read = reader.readLine()) != null) {
38  
39  			read = read.trim();
40  			
41  			/* Skip empty lines. */
42  			if (read.length() == 0) {
43  				continue;
44  			}
45  			
46  			/* Skip commentary lines. */
47  			if (read.startsWith("#")) {
48  				continue;
49  			}
50  
51  			/* Process import statement. */
52  			if (read.toLowerCase().startsWith("import:")) {
53  				String[] fileNames = read.substring("import:".length()).split(
54  						",");
55  				for (String name : fileNames) {
56  
57  					File file = new File(name.trim());
58  					if (!file.isAbsolute()) {
59  						file = new File(f.getAbsoluteFile().getParentFile()
60  								.getPath()
61  								+ File.separator + file.getPath());
62  					}
63  
64  					if (seenFiles.contains(file.getAbsoluteFile())) {
65  						continue;
66  					} else {
67  						seenFiles.add(file.getAbsolutePath());
68  					}
69  
70  					FileMemberSource source = null;
71  					try {
72  						source = new FileMemberSource(file);
73  					} catch (IOException ioe) {
74  						IOException wrapper = new IOException(
75  								"importing group file failed");
76  						wrapper.initCause(ioe);
77  						throw wrapper;
78  					}
79  					addresses.addAll(source.getMembers());
80  				}
81  			} else if (read.toLowerCase().startsWith("gateway:")) {
82  
83  				/* Process gateway header. */
84  				gateway = MemberImpl.parse(read.substring("gateway:".length()),
85  						null);
86  
87  			} else {
88  
89  				/* Process host header. */
90  				addresses.add(MemberImpl.parse(read, gateway));
91  
92  			}
93  		}
94  	}
95  
96  	public Set<Member> getMembers() {
97  		return Collections.unmodifiableSet(addresses);
98  	}
99  
100 }