View Javadoc
1   package au.gov.amsa.ais.router.model;
2   
3   import java.io.Closeable;
4   import java.io.IOException;
5   import java.util.Optional;
6   
7   import org.slf4j.Logger;
8   import org.slf4j.LoggerFactory;
9   
10  import au.gov.amsa.streams.StringServer;
11  import rx.Observable;
12  
13  public final class Port implements Closeable {
14  
15      private static final Logger log = LoggerFactory.getLogger(Port.class);
16  
17      private final int port;
18      private final Optional<GroupMember> group;
19      private final boolean enabled;
20      private final Optional<UserGroup> userGroup;
21      private final Observable<String> lines;
22  
23      private Port(int port, Optional<GroupMember> group, boolean enabled,
24              Optional<UserGroup> userGroup) {
25          this.port = port;
26          this.group = group;
27          this.enabled = enabled;
28          this.userGroup = userGroup;
29          this.lines = createLines();
30      }
31  
32      private Observable<String> createLines() {
33          if (group.isPresent()) {
34              return group.get().lines();
35          } else {
36              return Observable.empty();
37          }
38      }
39  
40      public int port() {
41          return port;
42      }
43  
44      public Optional<GroupMember> group() {
45          return group;
46      }
47  
48      public Optional<UserGroup> userGroup() {
49          return userGroup;
50      }
51  
52      public boolean enabled() {
53          return enabled;
54      }
55  
56      public static Builder builder() {
57          return new Builder();
58      }
59  
60      private Optional<StringServer> server = Optional.empty();
61      private final Object serverLock = new Object();
62  
63      public void start() {
64          log.info("starting " + this);
65          synchronized (serverLock) {
66              if (server.isPresent()) {
67                  throw new RuntimeException("server already started");
68              } else if (enabled && group.isPresent()) {
69                  server = Optional.of(StringServer.create(lines.map(line -> line + "\n"), port));
70                  server.get().start();
71              }
72          }
73      }
74  
75      public void stop() {
76          synchronized (serverLock) {
77              if (server.isPresent()) {
78                  server.get().stop();
79              }
80          }
81      }
82  
83      public static class Builder {
84  
85          private int port;
86          private Optional<GroupMember> group = Optional.empty();
87          private final Optional<UserGroup> userGroup = Optional.empty();
88          private boolean enabled = true;
89  
90          private Builder() {
91          }
92  
93          public Builder port(int port) {
94              this.port = port;
95              return this;
96          }
97  
98          public Builder group(GroupMember group) {
99              this.group = Optional.of(group);
100             return this;
101         }
102 
103         public Builder enabled(boolean enabled) {
104             this.enabled = enabled;
105             return this;
106         }
107 
108         public Port build() {
109             return new Port(port, group, enabled, userGroup);
110         }
111     }
112 
113     @Override
114     public void close() throws IOException {
115         stop();
116     }
117 
118     @Override
119     public String toString() {
120         StringBuilder b = new StringBuilder();
121         b.append("Port [port=");
122         b.append(port);
123         b.append(", group=");
124         b.append(group);
125         b.append(", enabled=");
126         b.append(enabled);
127         b.append(", userGroup=");
128         b.append(userGroup);
129         b.append("]");
130         return b.toString();
131     }
132 
133 }