package de.elatexam.editor.pages.taskdef; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.charset.Charset; import java.util.List; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import net.databinder.hib.Databinder; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.event.IEvent; import org.apache.wicket.event.IEventSource; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.markup.html.link.DownloadLink; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.AbstractReadOnlyModel; import org.hibernate.Transaction; import com.visural.wicket.component.confirmer.ConfirmerLink; import de.elatexam.editor.TaskEditorSession; import de.elatexam.editor.components.GermanConfirmerLink; import de.elatexam.editor.components.panels.tree.ComplexTaskDefTree; import de.elatexam.editor.components.panels.tree.ComplexTaskHierarchyFacade; import de.elatexam.editor.preview.PreviewComplexLink; import de.elatexam.editor.user.BasicUser; import de.elatexam.editor.util.Stuff; import de.elatexam.model.ComplexTaskDef; import de.elatexam.model.ComplexTaskDef.Revisions; import de.elatexam.model.ComplexTaskDef.Revisions.Revision; import de.elatexam.model.Indexed; import de.elatexam.model.ObjectFactory; import de.elatexam.model.SubTaskDef; import de.elatexam.model.manual.HomogeneousTaskBlock; /** * Actions operating on ComplexTaskDefs * * */ public class TaskDefActions extends Panel{ private final Link<File> downloadLink; private final Link<?> previewLink; private final ConfirmerLink deleteLink; private final AddElementLink addLink; private final ComplexTaskDefTree<Indexed> tree; public TaskDefActions(String id, ComplexTaskDefTree<Indexed> t) { super(id); this.tree = t; this.downloadLink = createDownloadLink(); setOutputMarkupId(true); ModalWindow taskblockselectormodal = new TaskBlockSelectorModalWindow("taskblockmodal") { @Override void onSelect(Class<? extends HomogeneousTaskBlock> taskblockclass) { addLink.createTaskblock(taskblockclass); } }; add(taskblockselectormodal); TaskSelectorModalWindow taskselectormodal = new TaskSelectorModalWindow("taskmodal") { @Override void onSelect(AjaxRequestTarget target, SubTaskDef... subtaskdefs) { addLink.addTasks(subtaskdefs); target.addComponent(tree); } }; add(taskselectormodal); this.addLink = new AddElementLink("add", taskblockselectormodal,taskselectormodal, tree); deleteLink = new GermanConfirmerLink("delete") { @Override public void onClick() { // which domain object do we need to delete? final Object toDelete = new ComplexTaskHierarchyFacade(tree.getProvider()).removeFromParent(tree.getSelected().getObject()); // do not delete subtaskdefs, only remove them from the current // complextaskdef if (!(toDelete instanceof SubTaskDef)) { final org.hibernate.Session session = Databinder .getHibernateSession(); session.delete(toDelete); session.getTransaction().commit(); } else { Stuff.saveAll(tree.getSelected().getObject()); } } }; deleteLink.setEnabled(false); deleteLink.setMessageContentHTML("Sind Sie sicher, dass das selektierte Element gelöscht werden soll?"); previewLink = new PreviewComplexLink("preview", new AbstractReadOnlyModel<ComplexTaskDef>() { @Override public ComplexTaskDef getObject() { return tree.getCurrentTaskdef().getObject(); } }); previewLink.setEnabled(false); add(previewLink); add(downloadLink); add(addLink); add(deleteLink); } /** * Create a link that allows to download a serialized xml file for the * currently selected taskdef. * * @return */ private DownloadLink createDownloadLink() { DownloadLink downloadLink = new DownloadLink("export", new AbstractReadOnlyModel<File>() { @Override public File getObject() { File tempFile = null; try { tempFile = File.createTempFile("taskdef", "export"); // marshal to xml final Marshaller marshaller = Stuff.getContext().createMarshaller(); Writer w = new OutputStreamWriter(new FileOutputStream(tempFile),Charset.forName("UTF8")); final ComplexTaskDef ctd = tree.getCurrentTaskdef().getObject(); addRevisionTo(ctd); Stuff.makeIDsUnique(ctd); marshaller.marshal(ctd, w); w.close(); } catch (final IOException e) { error("Konnte leider keine Datei schreiben, Infos siehe Logfile."); e.printStackTrace(); } catch (final JAXBException e) { error("Konnte leider kein XML erstellen, Infos siehe Logfile."); e.printStackTrace(); } return tempFile; } /** * Add current timestamp+author name as new revision. * * @param ctd */ private void addRevisionTo(final ComplexTaskDef ctd) { final Revision rev = new ObjectFactory().createComplexTaskDefRevisionsRevision(); rev.setAuthor(TaskEditorSession.get().getUser().getUsername()); rev.setDate(System.currentTimeMillis()); Revisions revisions = ctd.getRevisions(); if(revisions==null){ revisions=new ObjectFactory().createComplexTaskDefRevisions(); ctd.setRevisions(revisions); } final List<Revision> revList = ctd.getRevisions().getRevision(); rev.setSerialNumber(revList.size() + 1); revList.add(rev); } }, "pruefung.xml"); downloadLink.setDeleteAfterDownload(true); downloadLink.setEnabled(false); return downloadLink; } /* (non-Javadoc) * @see org.apache.wicket.Component#onEvent(org.apache.wicket.event.IEvent) */ @Override public void onEvent(IEvent<?> event) { super.onEvent(event); IEventSource source = event.getSource(); if (source instanceof ComplexTaskDefTree) { Object selected = ((ComplexTaskDefTree) source).getSelected().getObject(); boolean enabled = !(selected instanceof BasicUser); if (selected instanceof ComplexTaskDef) { this.previewLink.setEnabled(true); this.downloadLink.setEnabled(true); } else { this.previewLink.setEnabled(false); this.downloadLink.setEnabled(false); } if (selected instanceof SubTaskDef) { this.addLink.setEnabled(false); } else { this.addLink.setEnabled(true); } this.deleteLink.setEnabled(enabled); // no admin user should be able to delete himself.... if (selected instanceof BasicUser) { this.deleteLink.setEnabled( false == ((BasicUser) selected).getUsername() .equals( TaskEditorSession.get().getUser().getUsername()) ); } ((AjaxRequestTarget)event.getPayload()).add(this); } } }