1 package ffx.utilities;
2
3 import jakarta.xml.bind.annotation.adapters.XmlAdapter;
4
5 import java.util.logging.Logger;
6
7 import static java.lang.Double.parseDouble;
8 import static java.lang.String.format;
9
10
11
12
13
14
15
16
17
18
19
20 public class HistogramXmlAdapter extends XmlAdapter<String, double[][]> {
21
22
23
24
25 public static final Logger logger = Logger.getLogger(HistogramXmlAdapter.class.getName());
26
27
28
29
30 public HistogramXmlAdapter() {
31
32 }
33
34
35
36
37
38
39
40 @Override
41 public double[][] unmarshal(String value) {
42 double[][] data;
43 try {
44 String[] lines = value.split(System.lineSeparator());
45 int lambdaBins = lines.length;
46 data = new double[lambdaBins][];
47 for (int i = 0; i < lambdaBins; i++) {
48 String[] countToks = lines[i].split(" +");
49 int dUdLBins = countToks.length;
50 data[i] = new double[dUdLBins];
51 double[] row = data[i];
52 for (int j = 0; j < dUdLBins; j++) {
53 row[j] = parseDouble(countToks[j]);
54 }
55 }
56 } catch (Exception e) {
57 logger.warning(" Returning a null histogram due to an XML parsing exception:\n " + e);
58 data = null;
59 }
60 return data;
61 }
62
63
64
65
66
67
68
69 @Override
70 public String marshal(double[][] data) {
71 StringBuilder sb = new StringBuilder();
72 for (double[] row : data) {
73 sb.append(format("%.16e", row[0]));
74 int dUdLBins = row.length;
75 for (int j = 1; j < dUdLBins; j++) {
76 sb.append(" ").append(format("%.16e", row[j]));
77 }
78 sb.append(System.lineSeparator());
79 }
80 return sb.toString();
81 }
82 }
83