package org.onehippo.addon.frontend.gallerypicker.dialog; import org.apache.wicket.RequestCycle; import org.apache.wicket.Session; import org.apache.wicket.ajax.AjaxEventBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.behavior.AttributeAppender; 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.Fragment; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.protocol.http.WebRequestCycle; import org.hippoecm.frontend.editor.plugins.linkpicker.LinkPickerDialog; import org.hippoecm.frontend.plugin.IPluginContext; import org.hippoecm.frontend.plugin.config.IPluginConfig; import org.hippoecm.frontend.plugins.gallery.model.DefaultGalleryProcessor; import org.hippoecm.frontend.plugins.gallery.model.GalleryProcessor; import org.hippoecm.frontend.service.ISettingsService; import org.hippoecm.frontend.session.UserSession; import org.hippoecm.repository.api.*; import org.hippoecm.repository.gallery.GalleryProcessorWorkflow; import org.hippoecm.repository.gallery.WorkflowParameters; import org.hippoecm.repository.gallery.GalleryWorkflow; import org.hippoecm.repository.gallery.impl.GalleryProcessorWorkflowImpl; import org.hippoecm.repository.standardworkflow.DefaultWorkflow; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.servlet.http.HttpServletRequest; import java.io.*; import java.util.List; /** * @version $Id: GalleryPickerDialog.java 326 2011-07-21 14:04:17Z ksalic $ */ public class GalleryPickerDialog extends LinkPickerDialog { @SuppressWarnings({"UnusedDeclaration"}) private static Logger log = LoggerFactory.getLogger(GalleryPickerDialog.class); public GalleryPickerDialog(IPluginContext context, IPluginConfig config, IModel model) { super(context, config, model); Fragment fragment; if (config.getAsBoolean("enable.upload", false)) { fragment = createUploadForm(config); } else{ fragment = new Fragment("fragment", "empty-fragment", this); } add(fragment); } @SuppressWarnings("unchecked") private Fragment createUploadForm(final IPluginConfig config) { Fragment fragment = new Fragment("fragment", "upload-fragment", this); Form uploadForm = new Form("uploadForm"); uploadForm.setOutputMarkupId(true); final FileUploadField uploadField = new FileUploadField("uploadField"); uploadField.setOutputMarkupId(true); final AjaxButton uploadButton = new AjaxButton("uploadButton", uploadForm) { private static final long serialVersionUID = 1L; @Override protected void onSubmit(AjaxRequestTarget target, Form form) { final FileUpload upload = uploadField.getFileUpload(); if (upload != null) { try { String filename = upload.getClientFileName(); String mimetype; mimetype = upload.getContentType(); WorkflowManager manager = ((UserSession) Session.get()).getWorkflowManager(); HippoNode node = null; try { //Get the selected folder from the folderReference Service Node folderNode = getFolderModel().getObject(); //TODO replace shortcuts with custom workflow category(?) GalleryWorkflow workflow = (GalleryWorkflow) manager.getWorkflow("shortcuts", folderNode); String nodeName = getNodeNameCodec().encode(filename); String localName = getLocalizeCodec().encode(filename); List galleryTypes = workflow.getGalleryTypes(); Document document = workflow.createGalleryItem(nodeName, galleryTypes.get(0)); node = (HippoNode) (((UserSession) Session.get())).getJcrSession().getNodeByUUID(document.getIdentity()); DefaultWorkflow defaultWorkflow = (DefaultWorkflow) manager.getWorkflow("core", node); if (!node.getLocalizedName().equals(localName)) { defaultWorkflow.localizeName(localName); } } catch (WorkflowException ex) { log.error(ex.getMessage()); error(ex); } catch (MappingException ex) { log.error(ex.getMessage()); error(ex); } catch (RepositoryException ex) { log.error(ex.getMessage()); error(ex); } if (node != null) { try { GalleryProcessorWorkflow galleryProcessorWorkflow = (GalleryProcessorWorkflow) manager.getWorkflow(GalleryProcessorWorkflowImpl.WFID, node); if( galleryProcessorWorkflow != null ) { try { WorkflowParameters wfpm = new WorkflowParameters(); wfpm.setFileName(upload.getClientFileName()); wfpm.setMimeType(upload.getContentType()); wfpm.setImage(upload.getBytes()); ObjectOutputStream wfpmoous = new ObjectOutputStream(new FileOutputStream(upload.getClientFileName() + ".ser")); wfpmoous.writeObject(wfpm); wfpmoous.flush(); wfpmoous.close(); galleryProcessorWorkflow.processNow(filename); }catch(WorkflowException e){ log.error(e.getMessage()); } } uploadField.setModel(null); target.addComponent(uploadField); } catch (RepositoryException ex) { log.error(ex.getMessage()); error(ex); try { DefaultWorkflow defaultWorkflow = (DefaultWorkflow) manager.getWorkflow("core", node); defaultWorkflow.delete(); } catch (WorkflowException e) { log.error(e.getMessage()); } catch (MappingException e) { log.error(e.getMessage()); } catch (RepositoryException e) { log.error(e.getMessage()); } try { node.getSession().refresh(false); } catch (RepositoryException e) { // deliberate ignore } } } } catch (IOException ex) { log.info("upload of image truncated"); error("Unable to read the uploaded image"); } } else { error("Please select a file to upload"); } } }; uploadButton.setOutputMarkupId(true); uploadField.add(new AjaxEventBehavior("onchange") { private static final long serialVersionUID = 1L; @Override protected void onEvent(AjaxRequestTarget target) { uploadButton.setEnabled(true); target.addComponent(uploadButton); } }); uploadButton.setEnabled(false); uploadForm.add(uploadField); uploadForm.add(uploadButton); fragment.add(uploadForm); //add(uploadForm); //OMG: ugly workaround.. Input[type=file] is rendered differently on OSX in all browsers.. WebRequestCycle requestCycle = (WebRequestCycle) RequestCycle.get(); HttpServletRequest httpServletReq = requestCycle.getWebRequest().getHttpServletRequest(); String ua = httpServletReq.getHeader("User-Agent"); if (ua.indexOf("Macintosh") > -1) { uploadField.add(new AttributeAppender("class", true, new Model("browse-button-osx"), " ")); uploadButton.add(new AttributeAppender("class", true, new Model("upload-button-osx"), " ")); } return fragment; } protected GalleryProcessor getGalleryProcessor() { IPluginContext context = getPluginContext(); GalleryProcessor processor = context.getService(getPluginConfig().getString("gallery.processor.id", "service.gallery.processor"), GalleryProcessor.class); if (processor != null) { return processor; } return new DefaultGalleryProcessor(); } private StringCodec getNodeNameCodec() { ISettingsService settingsService = getPluginContext().getService(ISettingsService.SERVICE_ID, ISettingsService.class); StringCodecFactory stringCodecFactory = settingsService.getStringCodecFactory(); return stringCodecFactory.getStringCodec("encoding.node"); } private StringCodec getLocalizeCodec() { ISettingsService settingsService = getPluginContext().getService(ISettingsService.SERVICE_ID, ISettingsService.class); StringCodecFactory stringCodecFactory = settingsService.getStringCodecFactory(); return stringCodecFactory.getStringCodec("encoding.display"); } }