1 package uk.ac.cam.spectra.spectrasub.components;
2
3 import java.util.Arrays;
4 import java.util.Date;
5 import java.util.List;
6
7 import org.apache.log4j.Logger;
8 import org.apache.tapestry.BaseComponent;
9 import org.apache.tapestry.event.PageBeginRenderListener;
10 import org.apache.tapestry.event.PageEvent;
11 import org.apache.tapestry.form.IFormComponent;
12 import org.apache.tapestry.form.IPropertySelectionModel;
13 import org.apache.tapestry.form.LabeledPropertySelectionModel;
14 import org.apache.tapestry.form.StringPropertySelectionModel;
15 import org.apache.tapestry.valid.IValidationDelegate;
16 import org.apache.tapestry.valid.ValidationConstraint;
17
18 import uk.ac.cam.spectra.SpectraMetadata;
19 import uk.ac.cam.spectra.nmr.NMRMetadata;
20 import uk.ac.cam.spectra.spectrasub.DataPackage;
21
22 import com.hp.hpl.jena.rdf.model.Resource;
23
24
25
26
27
28
29
30
31
32
33
34 public abstract class NMRExperimentMetadata extends BaseComponent implements
35 PageBeginRenderListener, Formlet {
36
37 private final static Logger LOG = Logger
38 .getLogger(NMRExperimentMetadata.class);
39
40 public void clearSubmissionBlock() {
41 ;
42 }
43
44 public static final String[] NUCLEUS_2D_OPTION_LABELS = new String[] {
45 "[Select at least one]", "1H", "13C", "15N", "19F", "31P", "Other" };
46
47 public void pageBeginRender(PageEvent event) {
48 if (event.getRequestCycle().isRewinding()) {
49 setSpectrumDimension(1);
50 if (getNucleus2DSelection() == null) {
51 setNucleus2DSelection(new boolean[NUCLEUS_2D_OPTION_LABELS.length]);
52 }
53 }
54 }
55
56
57
58
59
60
61 public void setupPage(DataPackage p) {
62 Date experimentDate = p.getDateValue(SpectraMetadata.experiment_date);
63 if (experimentDate != null) {
64 setExperimentDate(experimentDate);
65 }
66 String experimentRef = p.getValue(SpectraMetadata.experiment_ref);
67 if (experimentRef != null) {
68 setExperimentRef(experimentRef);
69 }
70
71 if (getNucleus2DSelection() == null) {
72 setNucleus2DSelection(new boolean[NUCLEUS_2D_OPTION_LABELS.length]);
73 }
74 Integer spectrumDimensions = p
75 .getIntegerValue(NMRMetadata.spectrum_dimensions);
76 if (spectrumDimensions != null) {
77 setSpectrumDimension(spectrumDimensions);
78 switch (spectrumDimensions) {
79 case 1:
80 String nucleus1D = p.getValue(NMRMetadata.spectrum_nucleus);
81 if (nucleus1D != null) {
82 setNucleus1D(nucleus1D);
83 }
84 break;
85 case 2:
86 List<String> nucleii2D = p
87 .getValues(NMRMetadata.spectrum_nucleus);
88 if (!nucleii2D.isEmpty()) {
89 boolean[] slcted = getNucleus2DSelection();
90 for (String s : nucleii2D) {
91 int idx = Arrays.binarySearch(NUCLEUS_2D_OPTION_LABELS,
92 s);
93 if (idx >= 0) {
94 slcted[idx] = true;
95 } else {
96 LOG.warn("Could not find " + s
97 + " in the options array. Hmmm.");
98 }
99 }
100 setNucleus2DSelection(slcted);
101 }
102 String ps = p.getValue(NMRMetadata.pulse_sequence);
103 if (ps != null) {
104 setPulseSequence2D(ps);
105 }
106 break;
107 }
108 } else {
109 setSpectrumDimension(1);
110 }
111 String solvent = p.getValue(NMRMetadata.solvent);
112 if (solvent != null) {
113 setSolvent(solvent);
114 }
115
116 String temp = p.getValue(NMRMetadata.temperature);
117 if (temp != null) {
118 setTemperature(temp);
119 }
120 }
121
122
123
124
125
126
127 public void writeMetadata(Resource resource) {
128 if (getExperimentDate() != null) {
129 SpectraMetadata.experiment_date.add(resource, getExperimentDate());
130 }
131 if (getExperimentRef() != null) {
132 SpectraMetadata.experiment_ref.add(resource, getExperimentRef());
133 }
134
135 NMRMetadata.spectrum_dimensions.add(resource, getSpectrumDimension());
136 switch (getSpectrumDimension()) {
137 case 1:
138 if (getNucleus1D() != null) {
139 NMRMetadata.spectrum_nucleus.add(resource, getNucleus1D());
140 }
141 break;
142 case 2:
143 for (int i = 0; i < getNucleus2DSelection().length; i++) {
144 if (getNucleus2DSelection()[i]) {
145 NMRMetadata.spectrum_nucleus.add(resource,
146 NUCLEUS_2D_OPTION_LABELS[i]);
147 }
148 }
149 if (getPulseSequence2D() != null) {
150 NMRMetadata.pulse_sequence.add(resource, getPulseSequence2D());
151 }
152 }
153
154 if (getSolvent() != null) {
155 NMRMetadata.solvent.add(resource, getSolvent());
156 }
157
158 if (getTemperature() != null) {
159 NMRMetadata.temperature.add(resource, getTemperature());
160 }
161 }
162
163
164
165
166
167
168 public void validate(IValidationDelegate delegate) {
169 if (getSpectrumDimension() == 1) {
170 if (getNucleus1D() == null) {
171 delegate
172 .setFormComponent((IFormComponent) getComponent("nucleus1D"));
173 delegate.record("Nucleus required",
174 ValidationConstraint.REQUIRED);
175 }
176 } else {
177 boolean nuc2dSelected = false;
178 for (boolean b : getNucleus2DSelection()) {
179 if (b) {
180 nuc2dSelected = true;
181 break;
182 }
183 }
184 if (!nuc2dSelected) {
185 delegate
186 .setFormComponent((IFormComponent) getComponent("nucleus2D"));
187 delegate.record("At least one nucleus required",
188 ValidationConstraint.REQUIRED);
189 }
190 if (getPulseSequence2D() == null) {
191 delegate
192 .setFormComponent((IFormComponent) getComponent("pulseSequence2D"));
193 delegate.record("Pulse sequence required",
194 ValidationConstraint.REQUIRED);
195 }
196 }
197 }
198
199 public IPropertySelectionModel getNucleus1DOptions() {
200 return new LabeledPropertySelectionModel(
201 new StringPropertySelectionModel(new String[] { "1H", "13C",
202 "15N", "19F", "31P", "Other" }), "[Select one]");
203 }
204
205 public IPropertySelectionModel getPulseSequence2DOptions() {
206 final String[] values = new String[] { "NOESY", "COSY", "HETCOR",
207 "HMBC", "DOSY", "Other" };
208 final String[] labels = new String[] {
209 "NOE Correlation (NOESY, ROESY)",
210 "H-H Connectivity (COSY, TOCSY)",
211 "Direct H-X Connectivity (HETCOR, HMQC)",
212 "Long-range H-X Connectivity (HMBC)",
213 "Molecular size / chemical shift (DOSY)", "Other" };
214
215 return new LabeledPropertySelectionModel(new IPropertySelectionModel() {
216 public String getLabel(int i) {
217 return labels[i];
218 }
219
220 public Object getOption(int i) {
221 return values[i];
222 }
223
224 public int getOptionCount() {
225 return values.length;
226 }
227
228 public String getValue(int i) {
229 return values[i];
230 }
231
232 public Object translateValue(String val) {
233 return val;
234 }
235 }, "[ Select one ]");
236 }
237
238 public IPropertySelectionModel getSolventOptions() {
239 return new LabeledPropertySelectionModel(
240 new StringPropertySelectionModel(new String[] { "CDCl3",
241 "DMSO-d6", "D20", "H20", "C6D6", "Methanol-d4",
242 "Acetone-d6", "Toluene-d8", "Other" }), "[Select one]");
243 }
244
245 public IPropertySelectionModel getTemperatureOptions() {
246 return new LabeledPropertySelectionModel(
247 new StringPropertySelectionModel(new String[] { "Ambient",
248 "Low temperature", "High temperature" }),
249 "[Select one]");
250 }
251
252
253
254
255 public boolean allowSubmit() {
256 return true;
257 }
258
259 public abstract boolean[] getNucleus2DSelection();
260
261 public abstract void setNucleus2DSelection(boolean[] slctn);
262
263 public abstract String getPulseSequence2D();
264
265 public abstract void setPulseSequence2D(String pulseSequence);
266
267 public abstract String getSolvent();
268
269 public abstract void setSolvent(String sol);
270
271 public abstract String getTemperature();
272
273 public abstract void setTemperature(String t);
274
275 public abstract Integer getSpectrumDimension();
276
277 public abstract void setSpectrumDimension(Integer d);
278
279 public abstract String getNucleus1D();
280
281 public abstract void setNucleus1D(String nucleusType);
282
283 public abstract String getNucleusLabel();
284
285 public abstract Date getExperimentDate();
286
287 public abstract void setExperimentDate(Date experimentDate);
288
289 public abstract String getExperimentRef();
290
291 public abstract void setExperimentRef(String exptRef);
292
293 }