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
42 if (read.length() == 0) {
43 continue;
44 }
45
46
47 if (read.startsWith("#")) {
48 continue;
49 }
50
51
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
84 gateway = MemberImpl.parse(read.substring("gateway:".length()),
85 null);
86
87 } else {
88
89
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 }