/* This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV This program is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program; if not, see http://www.gnu.org/licenses or write to the Free Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ package com.servoy.j2db.server.headlessclient; import java.awt.Dimension; import org.apache.wicket.Session; import org.apache.wicket.markup.html.DynamicWebResource; import org.apache.wicket.protocol.http.WebResponse; import org.apache.wicket.util.string.StringValueConversionException; import org.apache.wicket.util.time.Time; import com.servoy.j2db.AbstractActiveSolutionHandler; import com.servoy.j2db.FlattenedSolution; import com.servoy.j2db.persistence.IRepository; import com.servoy.j2db.persistence.IRootObject; import com.servoy.j2db.persistence.Media; import com.servoy.j2db.persistence.SolutionMetaData; import com.servoy.j2db.server.headlessclient.dataui.MediaResource; import com.servoy.j2db.server.shared.ApplicationServerRegistry; import com.servoy.j2db.server.shared.IApplicationServer; import com.servoy.j2db.util.Debug; import com.servoy.j2db.util.MimeTypes; /** * @author jcompagner * */ @SuppressWarnings("nls") public final class SharedMediaResource extends DynamicWebResource { private static final long serialVersionUID = 1L; private Time time = Time.valueOf(System.currentTimeMillis()); public SharedMediaResource() { setCacheable(true); } /* * (non-Javadoc) * * @see org.apache.wicket.markup.html.DynamicWebResource#setHeaders(org.apache.wicket.protocol.http.WebResponse) */ @Override protected void setHeaders(WebResponse response) { super.setHeaders(response); response.setHeader("Cache-Control", "public, max-age=" + getCacheDuration()); } @Override protected ResourceState getResourceState() { final String iconId = getParameters().getString("id"); final String solutionName = getParameters().getString("s"); int mediaOptions = 0; int width = 0; int height = 0; try { mediaOptions = getParameters().getInt("option", 0); width = getParameters().getInt("w", 0); height = getParameters().getInt("h", 0); } catch (StringValueConversionException ex) { Debug.error(ex); } ResourceState rs = getResource(iconId, solutionName); if (rs != null && rs.getData() != null && rs.getData().length > 0 && mediaOptions != 0 && mediaOptions != 1 && width != 0 && height != 0) { MediaResource mr = new MediaResource(rs.getData(), mediaOptions, rs.lastModifiedTime()); mr.checkResize(new Dimension(width, height)); return mr.getResourceState(); } return rs; } private ResourceState getResource(final String iconId, final String solutionName) { return new ResourceState() { private String contentType; private int length; byte[] array = null; @Override public Time lastModifiedTime() { try { IRootObject solution = ApplicationServerRegistry.get().getLocalRepository().getActiveRootObject(solutionName, IRepository.SOLUTIONS); if (solution != null) return Time.valueOf(solution.getLastModifiedTime()); } catch (Exception e) { Debug.trace(e); } return time; } @Override public byte[] getData() { if (array == null) { boolean closeFS = false; try { final IRepository repository = ApplicationServerRegistry.get().getLocalRepository(); FlattenedSolution fs = null; try { if (Session.exists() && ((WebClientSession)Session.get()).getWebClient() != null) { fs = ((WebClientSession)Session.get()).getWebClient().getFlattenedSolution(); } if (fs == null) { SolutionMetaData solutionMetaData = (SolutionMetaData)repository.getRootObjectMetaData(solutionName, IRepository.SOLUTIONS); if (solutionMetaData == null) return new byte[0]; closeFS = true; IApplicationServer as = ApplicationServerRegistry.getService(IApplicationServer.class); fs = new FlattenedSolution(solutionMetaData, new AbstractActiveSolutionHandler(as) { @Override public IRepository getRepository() { return repository; } }); } Media m = fs.getMedia(iconId); if (m == null) { try { Integer iIconID = new Integer(iconId); m = fs.getMedia(iIconID.intValue()); } catch (NumberFormatException ex) { Debug.error("no media found for: " + iconId); } } if (m != null) { array = m.getMediaData(); contentType = m.getMimeType(); } } finally { if (closeFS && fs != null) { fs.close(null); } } if (array != null) { if (contentType == null) { contentType = MimeTypes.getContentType(array); } length = array.length; } } catch (Exception ex) { Debug.error(ex); } } return array == null ? new byte[0] : array; } /** * @see wicket.markup.html.DynamicWebResource.ResourceState#getLength() */ @Override public int getLength() { return length; } @Override public String getContentType() { return contentType; } }; } public void touchTime() { time = Time.valueOf(System.currentTimeMillis()); } }