View Javadoc

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   * Needs to implement an interface (to be defined) that allows the container
26   * page (AddMetadata) to get a Model from the metadata entered here. Also needs
27   * to contribute itself into a list of included metadata components on the page
28   * (unless there's some way AddMetadata can scan its child components for
29   * Metadata sub-forms...).
30   * 
31   * @author ojd20
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       * (non-Javadoc)
58       * 
59       * @see uk.ac.cam.spectra.spectrasub.components.Formlet#setupPage(uk.ac.cam.spectra.spectrasub.DataPackage)
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      * (non-Javadoc)
124      * 
125      * @see uk.ac.cam.spectra.spectrasub.components.Formlet#writeMetadata(com.hp.hpl.jena.rdf.model.Resource)
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      * (non-Javadoc)
165      * 
166      * @see uk.ac.cam.spectra.spectrasub.components.Formlet#validate(org.apache.tapestry.valid.IValidationDelegate)
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      * This component has no reason to block submission.
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 }