package de.elatexam.editor.pages; import java.io.IOException; import java.util.Collection; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import net.databinder.hib.Databinder; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.upload.FileUpload; import org.apache.wicket.markup.html.form.upload.FileUploadField; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.util.lang.Bytes; import org.hibernate.Session; import com.visural.wicket.component.submitters.IndicateModalSubmitLink; import de.elatexam.editor.TaskEditorSession; import de.elatexam.editor.user.BasicUser; import de.elatexam.editor.util.Stuff; import de.elatexam.model.ComplexTaskDef; import de.elatexam.model.SubTaskDef; import de.thorstenberger.taskmodel.util.JAXBUtils; /** * @author sdienst */ public class UploadComplexTaskdefPage extends SecurePage { private class FileUploadForm<T> extends Form<T> { private FileUploadField fileUploadField; public FileUploadForm(final String name) { super(name); // set this form to multipart mode (allways needed for uploads!) setMultiPart(true); // Add one file input field add(fileUploadField = new FileUploadField("fileInput")); setMaxSize(Bytes.kilobytes(1000)); add(new FeedbackPanel("feedback")); add(new IndicateModalSubmitLink("submit")); } /** * @see org.apache.wicket.markup.html.form.Form#onSubmit() */ @Override protected void onSubmit() { final FileUpload upload = fileUploadField.getFileUpload(); if (upload != null) { try { final ComplexTaskDef taskdef = loadTaskDef(upload); if (taskdef != null) { persistIntoDB(taskdef); setResponsePage(StatisticPage.class); } else { error(String.format("Die Datei '%s' enthält keine gültige Aufgabendefinition!", upload.getClientFileName())); } } catch (final Exception e) { throw new IllegalStateException("Unable to add new complextaskdef to database!", e); } } } } public UploadComplexTaskdefPage() { add(new FileUploadForm("uploadform")); } /** * @param upload * @return */ public ComplexTaskDef loadTaskDef(final FileUpload upload) { final JAXBContext context = Stuff.getContext(); Unmarshaller unmarshaller = null; try { unmarshaller = JAXBUtils.getJAXBUnmarshaller(context); final Object result = unmarshaller.unmarshal(upload.getInputStream()); return (ComplexTaskDef) result; } catch (final JAXBException e) { e.printStackTrace(); } catch (final IOException e) { e.printStackTrace(); }finally{ if(unmarshaller!=null) JAXBUtils.releaseJAXBUnmarshaller(context, unmarshaller); } return null; } public void persistIntoDB(final ComplexTaskDef taskdef) throws Exception { final Session session = Databinder.getHibernateSession(); Collection<SubTaskDef> newSubtaskdefs = Stuff.getAllSubtaskdefs(taskdef); for (SubTaskDef std : newSubtaskdefs) { session.save(std); } session.save(taskdef); // add to current user final BasicUser user = TaskEditorSession.get().getUser(); user.getTaskdefs().add(taskdef); user.getSubtaskdefs().addAll(newSubtaskdefs); session.saveOrUpdate(user); session.getTransaction().commit(); } }