View Javadoc

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          // checkConfigurationDone();
31          if (getRequestCycle().isRewinding()) {
32              // Can't do anything - don't have access to form properties
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      * The metadata page to use is configured into spring via the profile.
112      * 
113      * @return
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      * Used to store the uploaded file
125      * 
126      * @return
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 }