View Javadoc
1   package gov.usgs.volcanoes.winston.legacyServer.cmd;
2   
3   import java.nio.channels.SocketChannel;
4   import java.util.List;
5   import java.util.Map;
6   import java.util.logging.Level;
7   
8   import gov.usgs.net.NetTools;
9   import gov.usgs.volcanoes.winston.Channel;
10  import gov.usgs.volcanoes.winston.Instrument;
11  import gov.usgs.volcanoes.winston.db.Channels;
12  import gov.usgs.volcanoes.winston.db.WinstonDatabase;
13  import gov.usgs.volcanoes.winston.legacyServer.WWS;
14  import gov.usgs.volcanoes.winston.legacyServer.WWSCommandString;
15  
16  /**
17   *
18   * @author Dan Cervelli
19   */
20  public class GetMetadataCommand extends BaseCommand {
21    private final Channels channels;
22  
23    public GetMetadataCommand(final NetTools nt, final WinstonDatabase db, final WWS wws) {
24      super(nt, db, wws);
25      channels = new Channels(db);
26    }
27  
28    private String escape(final String s) {
29      if (s == null)
30        return "";
31      return s.replaceAll(",", "\\\\c").replaceAll("\n", "\\\\n");
32    }
33  
34    private void appendList(final StringBuilder sb, final String name, final List<String> list) {
35      sb.append(name);
36      sb.append("=");
37      if (list == null)
38        return;
39      for (final String value : list) {
40        sb.append(escape(value));
41        sb.append("\\c");
42      }
43    }
44  
45    private void appendMap(final StringBuilder sb, final Map<String, String> map) {
46      if (map == null)
47        return;
48  
49      for (final String key : map.keySet()) {
50        final String value = map.get(key);
51        sb.append(escape(key));
52        sb.append("=");
53        sb.append(escape(value));
54        sb.append(",");
55      }
56    }
57  
58    private void getInstrumentMetadata(final WWSCommandString cmd, final SocketChannel channel) {
59      final List<Instrument> insts = channels.getInstruments();
60      final StringBuilder sb = new StringBuilder(insts.size() * 60);
61      sb.append(String.format("%s %d\n", cmd.getID(), insts.size()));
62      for (final Instrument inst : insts) {
63        sb.append("name=");
64        sb.append(escape(inst.getName()));
65        sb.append(",");
66        sb.append("description=");
67        sb.append(escape(inst.getDescription()));
68        sb.append(",");
69        sb.append("longitude=");
70        sb.append(inst.getLongitude());
71        sb.append(",");
72        sb.append("latitude=");
73        sb.append(inst.getLatitude());
74        sb.append(",");
75        sb.append("height=");
76        sb.append(inst.getHeight());
77        sb.append(",");
78        sb.append("timezone=");
79        sb.append(inst.getTimeZone());
80        sb.append(",");
81        appendMap(sb, inst.getMetadata());
82        sb.append("\n");
83      }
84      netTools.writeString(sb.toString(), channel);
85    }
86  
87    private void getChannelMetadata(final WWSCommandString cmd, final SocketChannel channel) {
88      final List<Channel> chs = channels.getChannels(true);
89      final StringBuilder sb = new StringBuilder(chs.size() * 60);
90      sb.append(String.format("%s %d\n", cmd.getID(), chs.size()));
91      for (final Channel ch : chs) {
92        sb.append("channel=");
93        sb.append(ch.getCode().replace('$', ' '));
94        sb.append(",");
95        sb.append("instrument=");
96        sb.append(escape(ch.getInstrument().getName()));
97        sb.append(",");
98        sb.append("startTime=");
99        sb.append(timeOrMaxDays(ch.getMinTime()));
100       sb.append(",");
101       sb.append("endTime=");
102       sb.append(timeOrMaxDays(ch.getMaxTime()));
103       sb.append(",");
104       sb.append("alias=");
105       sb.append(escape(ch.getAlias()));
106       sb.append(",");
107       sb.append("unit=");
108       sb.append(escape(ch.getUnit()));
109       sb.append(",");
110       sb.append("linearA=");
111       sb.append(ch.getLinearA());
112       sb.append(",");
113       sb.append("linearB=");
114       sb.append(ch.getLinearB());
115       sb.append(",");
116       appendList(sb, "groups", ch.getGroups());
117       sb.append(",");
118       appendMap(sb, ch.getMetadata());
119       sb.append("\n");
120     }
121     netTools.writeString(sb.toString(), channel);
122   }
123 
124   public void doCommand(final Object info, final SocketChannel channel) {
125     final WWSCommandString cmd = new WWSCommandString((String) info);
126     final String[] ss = cmd.getCommandSplits();
127     if (ss.length <= 2)
128       return;
129 
130     if (ss[2].equals("INSTRUMENT"))
131       getInstrumentMetadata(cmd, channel);
132     else if (ss[2].equals("CHANNEL"))
133       getChannelMetadata(cmd, channel);
134 
135     wws.log(Level.FINER, "GETMETADATA.", channel);
136   }
137 }