package org.orienteer.core.component.property; import java.io.IOException; import java.io.OutputStream; import org.apache.wicket.markup.html.link.ResourceLink; import org.apache.wicket.markup.html.panel.GenericPanel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.request.resource.AbstractResource; import org.apache.wicket.request.resource.AbstractResource.ResourceResponse; import org.apache.wicket.request.resource.IResource.Attributes; import org.apache.wicket.util.string.Strings; import org.orienteer.core.service.IOClassIntrospector; import com.google.inject.Inject; import com.orientechnologies.orient.core.metadata.schema.OProperty; import com.orientechnologies.orient.core.record.impl.ODocument; /** * {@link GenericPanel} to view binary parameters (download) * * @param <V> the type of the panel's model object */ public class BinaryViewPanel<V> extends GenericPanel<V> { private IModel<String> nameModel; @Inject private IOClassIntrospector oClassIntrospector; @SuppressWarnings("unchecked") public BinaryViewPanel(String id, final IModel<ODocument> docModel, final IModel<OProperty> propModel, IModel<V> valueModel) { super(id, valueModel); nameModel = new LoadableDetachableModel<String>() { @Override protected String load() { String filename = docModel.getObject().field(propModel.getObject().getName()+BinaryEditPanel.FILENAME_SUFFIX, String.class); if(Strings.isEmpty(filename)){ filename = oClassIntrospector.getDocumentName(docModel.getObject()); filename += "."+propModel.getObject().getName()+".bin"; } return filename; } @Override public void detach() { super.detach(); docModel.detach(); propModel.detach(); } }; initialize(); } public BinaryViewPanel(String id, IModel<String> nameModel, IModel<V> valueModel) { super(id, valueModel); this.nameModel = nameModel; } protected void initialize() { add(new ResourceLink<byte[]>("data", new AbstractResource() { @Override protected ResourceResponse newResourceResponse(Attributes attributes) { ResourceResponse resourceResponse = new ResourceResponse(); resourceResponse.setContentType("application/octet-stream"); String filename = nameModel.getObject(); resourceResponse.setFileName(filename); resourceResponse.setWriteCallback(new WriteCallback() { @Override public void writeData(Attributes attributes) throws IOException { byte[] data = (byte[])BinaryViewPanel.this.getModelObject(); if(data!=null) { OutputStream outputStream = attributes.getResponse().getOutputStream(); outputStream.write((byte[])BinaryViewPanel.this.getModelObject()); } } }); return resourceResponse; } }).setBody(nameModel)); } @Override public void detachModels() { super.detachModels(); nameModel.detach(); } }