1 package uk.ac.cam.spectra.spectrasub.pages;
2
3 import java.io.InputStream;
4
5 import javax.servlet.http.HttpServletRequest;
6
7 import org.apache.log4j.Logger;
8 import org.apache.tapestry.IPage;
9 import org.apache.tapestry.IRequestCycle;
10 import org.apache.tapestry.PageRedirectException;
11 import org.apache.tapestry.annotations.InjectObject;
12 import org.apache.tapestry.annotations.InjectPage;
13 import org.apache.tapestry.event.PageBeginRenderListener;
14 import org.apache.tapestry.event.PageEvent;
15 import org.apache.tapestry.request.IUploadFile;
16
17 import uk.ac.cam.spectra.Validation;
18 import uk.ac.cam.spectra.spectrasub.DataFile;
19 import uk.ac.cam.spectra.spectrasub.DataPackage;
20 import uk.ac.cam.spectra.spectrasub.DataPackageManager;
21 import uk.ac.cam.spectra.spectrasub.NotFoundException;
22 import uk.ac.cam.spectra.spectrasub.Profile;
23 import uk.ac.cam.spectra.spectrasub.components.UploadMessage.UploadInfo;
24
25 public abstract class Upload extends BaseSubmissionPage implements
26 PageBeginRenderListener {
27 private static final Logger LOG = Logger.getLogger(Upload.class);
28
29 public void pageBeginRender(PageEvent event) {
30
31 if (getRequestCycle().isRewinding()) {
32
33 } else {
34 setupPage(event);
35 }
36 }
37
38 private void setupPage(PageEvent event) {
39 String id = getPackageId();
40 if (id == null) {
41 Profile profile = getProfile();
42 LOG.debug("ID is null, creating new package from " + profile);
43 DataPackage pkg = getPackageDao().create(profile);
44 setPackageId(getPackageDao().save(pkg));
45 setPackage(pkg);
46 } else {
47 loadPackage();
48 }
49 }
50
51 public IPage doSubmit(IRequestCycle cycle) throws NotFoundException {
52 IUploadFile upload = getUploadedFile();
53 DataPackageManager man = getPackageManager();
54 InputStream in = upload.getStream();
55 if (in == null) {
56 throw new RuntimeException(
57 "File has already been uploaded, cannot use back button here");
58 }
59 DataFile df = man.nextData(getPackageId(), upload.getStream(), upload
60 .getFileName());
61
62 UploadInfo info = new UploadInfo();
63 String ua = getWebRequest().getHeader("User-Agent").toLowerCase();
64 info.setFilename(correctWindowsName(ua, df.getFileName()));
65 info.setMd5sum(df.getMD5Sum());
66 Validation v = df.getValidation();
67 if (v.hasErrors()) {
68 LOG.debug("Errors detected");
69 DataError error = getDataError();
70 error.setPackageId(getPackageId());
71 error.setDataFile(df);
72 error.setValidation(v);
73 error.setUploadInfo(info);
74 return error;
75 } else if (v.hasWarnings()) {
76 LOG.debug("Warnings detected");
77 DataWarning warning = getDataWarning();
78 warning.setPackageId(getPackageId());
79 warning.setDataFile(df);
80 warning.setUploadInfo(info);
81 return warning;
82 } else {
83 DataPackage dp = man.getDataPackageDao().load(getPackageId());
84 if (dp.getRemainingDataFiles().isEmpty()) {
85 AddMetadata am = getAddMetadata();
86 am.setPackageId(getPackageId());
87 am.setUploadInfo(info);
88 throw new PageRedirectException(am);
89 } else {
90 Upload h = getUpload();
91 h.setPackageId(getPackageId());
92 h.setUploadInfo(info);
93 throw new PageRedirectException(h);
94 }
95 }
96 }
97
98 @InjectObject("spring:packageManager")
99 public abstract DataPackageManager getPackageManager();
100
101 @InjectPage("Upload")
102 public abstract Upload getUpload();
103
104 @InjectPage("DataWarning")
105 public abstract DataWarning getDataWarning();
106
107 @InjectPage("DataError")
108 public abstract DataError getDataError();
109
110
111
112
113
114
115 public AddMetadata getAddMetadata() {
116 return (AddMetadata) getRequestCycle().getPage(
117 getProfile().getMetadataPage());
118 }
119
120 @InjectObject("spring:profile")
121 public abstract Profile getProfile();
122
123
124
125
126
127
128 public abstract IUploadFile getUploadedFile();
129
130 public abstract void setUploadInfo(UploadInfo info);
131
132 public abstract UploadInfo getUploadInfo();
133
134 private String correctWindowsName(String ua, String name) {
135 return (((ua.indexOf("msie") >= 0) && !(ua.indexOf("opera") >= 0)) || ua
136 .indexOf("microsoft internet explorer") >= 0) ? name.substring(
137 name.lastIndexOf("\\") + 1, name.length()) : name;
138 }
139
140 }