1 package uk.ac.cam.spectra.spectrasub.pages;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.util.HashMap;
8 import java.util.Map;
9
10 import org.apache.commons.io.IOUtils;
11 import org.apache.log4j.Logger;
12 import org.apache.tapestry.IPage;
13 import org.apache.tapestry.PageRedirectException;
14 import org.apache.tapestry.annotations.InjectObject;
15 import org.apache.tapestry.annotations.InjectPage;
16 import org.apache.tapestry.form.IPropertySelectionModel;
17 import org.apache.tapestry.form.StringPropertySelectionModel;
18 import org.apache.tapestry.web.WebContext;
19
20 import uk.ac.cam.spectra.spectrasub.Constants;
21 import uk.ac.cam.spectra.spectrasub.servlet.SpectraContextLoader;
22
23 public abstract class ConfigureProfile extends BaseSPECTRaSubPage {
24
25 private static final String GAUSSIAN = "Computational Chemistry (Gaussian files)";
26
27 private static final String NMR = "NMR Spectra (JDX + MOL)";
28
29 private static final String CIF = "X-Ray Crystallography (CIF)";
30
31 private static final Logger LOG = Logger.getLogger(ConfigureProfile.class);
32
33 private static Map<String, String> PROFILES = new HashMap<String, String>();
34
35 private static Map<String, String> CONFIGS = new HashMap<String, String>();
36
37 static {
38 PROFILES.put(GAUSSIAN, "profile-compchem.xml");
39 PROFILES.put(NMR, "profile-nmr.xml");
40 PROFILES.put(CIF, "profile-cif.xml");
41 CONFIGS.put(GAUSSIAN, "config-compchem.properties");
42 CONFIGS.put(NMR, "config-nmr.properties");
43 CONFIGS.put(CIF, "config-cif.properties");
44 }
45
46 public static IPropertySelectionModel EXISTING_PROFILES = new StringPropertySelectionModel(
47 new String[] { CIF, NMR, GAUSSIAN });
48
49 public abstract String getExistingProfile();
50
51 public void existingClicked() {
52
53 WebContext ctx = getWebContext();
54 File workspace = new File((String) ctx
55 .getAttribute(Constants.WORKSPACE_ATTRIBUTE));
56 File profile = new File(workspace, Constants.PROFILE_FILENAME);
57 String profileName = PROFILES.get(getExistingProfile());
58 FileOutputStream fos = null;
59 InputStream in = null;
60 try {
61 profile.createNewFile();
62
63 LOG.debug("Using existing profile: " + profileName);
64 in = Thread.currentThread().getContextClassLoader()
65 .getResourceAsStream(profileName);
66 fos = new FileOutputStream(profile);
67 IOUtils.copy(in, fos);
68 } catch (IOException e) {
69 LOG.error("Problem creating profile file: " + e.getMessage(), e);
70 throw new RuntimeException("Problem creating profile file: "
71 + e.getMessage(), e);
72 } finally {
73 IOUtils.closeQuietly(in);
74 IOUtils.closeQuietly(fos);
75 }
76 File config = new File(workspace, Constants.CONFIG_PROPERTY_FILENAME);
77
78 if (!config.exists()) {
79 FileOutputStream fo = null;
80 InputStream in2 = null;
81 try {
82 config.createNewFile();
83 fo = new FileOutputStream(config);
84 String propName = CONFIGS.get(getExistingProfile());
85 in2 = Thread.currentThread().getContextClassLoader()
86 .getResourceAsStream(propName);
87 IOUtils.copy(in2, fo);
88 } catch (IOException e) {
89 throw new RuntimeException("Problem creating config props file: "+ e.getMessage(), e);
90 } finally {
91 IOUtils.closeQuietly(fo);
92 }
93 }
94 new SpectraContextLoader().checkAndReconfigure(getWebContext());
95 throw new PageRedirectException(getConfigurationComplete());
96 }
97
98 @InjectPage("ConfigurationComplete")
99 public abstract IPage getConfigurationComplete();
100
101 @InjectObject("service:tapestry.globals.WebContext")
102 public abstract WebContext getWebContext();
103
104 public void customClicked() {
105 new SpectraContextLoader().checkAndReconfigure(getWebContext());
106 throw new PageRedirectException(getConfigurationComplete());
107 }
108 }