On May 28, 2010, at 1:18 PM, Vincent Massol wrote:
> Hi Asiri,
>
> Some comments below.
>
> On May 28, 2010, at 1:03 PM, asiri (SVN) wrote:
>
>> Author: asiri
>> Date: 2010-05-28 13:03:53 +0200 (Fri, 28 May 2010)
>> New Revision: 29043
>>
>> Added:
>>
>> platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/TempResourceAction.java
>> Modified:
>> platform/core/trunk/xwiki-core/pom.xml
>>
>> platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/user/impl/xwiki/XWikiRightServiceImpl.java
>> platform/web/trunk/standard/src/main/webapp/WEB-INF/struts-config.xml
>> Log:
>> XWIKI-5227: Introduce a temp resource action.
>>
>> * Applying patch after review, refer
>> http://jira.xwiki.org/jira/browse/XWIKI-5227 for more details.
>>
>>
>> Modified: platform/core/trunk/xwiki-core/pom.xml
>> ===================================================================
>> --- platform/core/trunk/xwiki-core/pom.xml 2010-05-28 09:34:16 UTC (rev
>> 29042)
>> +++ platform/core/trunk/xwiki-core/pom.xml 2010-05-28 11:03:53 UTC (rev
>> 29043)
>> @@ -257,6 +257,13 @@
>> <groupId>commons-beanutils</groupId>
>> <artifactId>commons-beanutils</artifactId>
>> </dependency>
>> +
>> + <!-- For extracting metadata from various document types -->
>> + <dependency>
>> + <groupId>org.apache.tika</groupId>
>> + <artifactId>tika-core</artifactId>
>> + <version>0.7</version>
>> + </dependency>
>>
>> <!-- Logging -->
>> <dependency>
>>
>> Modified:
>> platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/user/impl/xwiki/XWikiRightServiceImpl.java
>> ===================================================================
>> ---
>> platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/user/impl/xwiki/XWikiRightServiceImpl.java
>> 2010-05-28 09:34:16 UTC (rev 29042)
>> +++
>> platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/user/impl/xwiki/XWikiRightServiceImpl.java
>> 2010-05-28 11:03:53 UTC (rev 29043)
>> @@ -137,6 +137,7 @@
>> actionMap.put("jsx", "view");
>> actionMap.put("ssx", "view");
>> actionMap.put("tex", "view");
>> + actionMap.put("temp", "view");
>
> why "temp" and not "tmp"?
>
>> actionMap.put("unknown", "view");
>> }
>>
>>
>> Added:
>> platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/TempResourceAction.java
>> ===================================================================
>> ---
>> platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/TempResourceAction.java
>> (rev 0)
>> +++
>> platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/TempResourceAction.java
>> 2010-05-28 11:03:53 UTC (rev 29043)
>> @@ -0,0 +1,128 @@
>> +/*
>> + * See the NOTICE file distributed with this work for additional
>> + * information regarding copyright ownership.
>> + *
>> + * This is free software; you can redistribute it and/or modify it
>> + * under the terms of the GNU Lesser General Public License as
>> + * published by the Free Software Foundation; either version 2.1 of
>> + * the License, or (at your option) any later version.
>> + *
>> + * This software 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
>> + * Lesser General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU Lesser General Public
>> + * License along with this software; if not, write to the Free
>> + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
>> + * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
>> + */
>> +package com.xpn.xwiki.web;
>> +
>> +import java.io.File;
>> +import java.io.IOException;
>> +import java.net.URI;
>> +import java.util.regex.Matcher;
>> +import java.util.regex.Pattern;
>> +
>> +import org.apache.commons.io.FileUtils;
>> +import org.apache.commons.io.IOUtils;
>> +import org.apache.commons.logging.Log;
>> +import org.apache.commons.logging.LogFactory;
>> +import org.apache.tika.Tika;
>> +import org.apache.tika.mime.MimeTypes;
>> +import org.xwiki.container.Container;
>> +
>> +import com.xpn.xwiki.XWikiContext;
>> +import com.xpn.xwiki.XWikiException;
>> +
>> +/**
>> + * Action responsible for downloading temporary resources created by
>> various modules. Refer JIRA issue:
>> + * <a>http://jira.xwiki.org/jira/browse/XWIKI-5227</a>.
>> + *
>> + * @version $Id$
>> + * @since 2.4M1
>> + */
>> +public class TempResourceAction extends XWikiAction
>> +{
>> + /**
>> + * URI pattern for this action.
>> + */
>> + public static final Pattern URI_PATTERN =
>> Pattern.compile(".*?/temp/([^/]*+)/([^/]*+)/([^/]*+)/(.*+)");
>> +
>> + /**
>> + * Logging support.
>> + */
>> + private static final Log LOG =
>> LogFactory.getLog(TempResourceAction.class);
>> +
>> + /**
>> + * Used for detecting mime-types of files.
>> + */
>> + private Tika tika = new Tika();
>> +
>> + /**
>> + * Used to resolve temporary working dir.
>> + */
>> + private Container container = Utils.getComponent(Container.class);
>> +
>> + /**
>> + * {...@inheritdoc}
>> + */
>> + public String render(XWikiContext context) throws XWikiException
>> + {
>> + XWikiRequest request = context.getRequest();
>> + XWikiResponse response = context.getResponse();
>> + String uri = request.getRequestURI();
>> +
>> + // Locate the temporary file.
>> + File tempFile = getTempFile(uri);
>
> Using File is not recommended IMO. Couldn't you use a URL instead?
>
>> + if (null == tempFile) {
>> + throw new XWikiException(XWikiException.MODULE_XWIKI_APP,
>> XWikiException.ERROR_XWIKI_APP_URL_EXCEPTION,
>> + "Invalid temporary resource URL");
>> + }
>> +
>> + // Write temporary file into response.
>> + response.setDateHeader("Last-Modified", tempFile.lastModified());
>> + String contentType = MimeTypes.OCTET_STREAM;
>> + try {
>> + contentType = tika.detect(tempFile);
>> + } catch (IOException ex) {
>> + LOG.warn(String.format("Unable to determine mime type for
>> temporary resource [%s]", tempFile
>> + .getAbsolutePath()), ex);
>> + }
>> + response.setContentType(contentType);
>> + try {
>> + response.setContentLength((int) tempFile.length());
>> + IOUtils.copy(FileUtils.openInputStream(tempFile),
>> response.getOutputStream());
>
> This is very bad for performance. You should stream the content instead.
hmm I may be wrong here... need to check what this signature does. I thought
you were copying the full file into memory but it seems it's ok after all.
Sorry about that.
Thanks
-Vincent
>
>> + } catch (IOException e) {
>> + throw new XWikiException(XWikiException.MODULE_XWIKI_APP,
>> + XWikiException.ERROR_XWIKI_APP_SEND_RESPONSE_EXCEPTION,
>> "Exception while sending response", e);
>> + }
>> + return null;
>> + }
>> +
>> + /**
>> + * Returns the temporary file corresponding to the specified URI.
>> + *
>> + * @param uri request URI.
>> + * @return temporary file corresponding to the specified URI or null if
>> no such file can be located.
>> + */
>> + private File getTempFile(String uri)
>
> I'd prefer a more explicit name such as getTemporaryFile()
>
>> + {
>> + Matcher matcher = URI_PATTERN.matcher(uri);
>> + File result = null;
>> + if (matcher.find()) {
>> + String space = matcher.group(1);
>> + String page = matcher.group(2);
>> + String module = matcher.group(3);
>> + String filePath = matcher.group(4);
>> + String prefix = String.format("temp/%s/%s/%s/", module, space,
>> page);
>> + String path = URI.create(prefix +
>> filePath).normalize().toString();
>> + if (path.startsWith(prefix)) {
>> + result = new
>> File(container.getApplicationContext().getTemporaryDirectory(), path);
>> + result = result.exists() ? result : null;
>> + }
>
> You should use the xwiki-url module to extract information from the URL IMO.
> It's much more complicated than what is written above. See code in xwiki-url
> for details.
>
>> + }
>> + return result;
>> + }
>> +}
>>
>> Modified:
>> platform/web/trunk/standard/src/main/webapp/WEB-INF/struts-config.xml
>> ===================================================================
>> --- platform/web/trunk/standard/src/main/webapp/WEB-INF/struts-config.xml
>> 2010-05-28 09:34:16 UTC (rev 29042)
>> +++ platform/web/trunk/standard/src/main/webapp/WEB-INF/struts-config.xml
>> 2010-05-28 11:03:53 UTC (rev 29043)
>> @@ -257,6 +257,11 @@
>> name="download"
>> scope="request">
>> </action>
>> + <action path="/temp/"
>> + type="com.xpn.xwiki.web.TempResourceAction"
>> + name="temp"
>> + scope="request">
>> + </action>
>> <action path="/downloadrev/"
>> type="com.xpn.xwiki.web.DownloadRevAction"
>> name="dowloadrev"
>
> Thanks
> -Vincent
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs