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
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 }