Sergiu, Please don't introduce new APIs using String instead of DocumentReference. Thanks -Vincent On Jan 11, 2010, at 1:46 AM, sdumitriu (SVN) wrote:
Author: sdumitriu Date: 2010-01-11 01:46:18 +0100 (Mon, 11 Jan 2010) New Revision: 26101
Added: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/api/DeletedAttachment.java Modified: platform/core/trunk/xwiki-core/pom.xml platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/XWiki.java platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/api/XWiki.java platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/doc/DeletedAttachment.java platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/DeleteAction.java platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/DeleteAttachmentAction.java platform/core/trunk/xwiki-core/src/main/resources/ApplicationResources.properties Log: XWIKI-4739: New APIs for accessing deleted attachments from the trash Done.
XE-584: Attachment trash Added L10N resources.
Modified: platform/core/trunk/xwiki-core/pom.xml =================================================================== --- platform/core/trunk/xwiki-core/pom.xml 2010-01-11 00:46:10 UTC (rev 26100) +++ platform/core/trunk/xwiki-core/pom.xml 2010-01-11 00:46:18 UTC (rev 26101) @@ -888,7 +888,9 @@ <configuration> <includes> **/api/Api.java, + **/api/DeletedAttachment.java, **/api/User.java, + **/doc/DeletedAttachment.jave, **/xmlrpc/ConfluenceRpcInterface, **/xmlrpc/Attachment.java, **/xmlrpc/SpaceSummary.java, @@ -912,7 +914,9 @@ **/*AttachmentVersioningStore.java, **/api/StatsService.java, **/stats/**/*.java, - **/store/hibernate/query/*.java + **/store/hibernate/query/*.java, + **/store/AttachmentRecycleBinStore.java, + **/store/hibernate/HibernateAttachmentRecycleBinStore.java </includes> <excludes> **/RenamePageReplaceLinkHandler.java,
Modified: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/XWiki.java =================================================================== --- platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/XWiki.java 2010-01-11 00:46:10 UTC (rev 26100) +++ platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/XWiki.java 2010-01-11 00:46:18 UTC (rev 26101) @@ -69,6 +69,7 @@ import org.apache.commons.httpclient.util.URIUtil; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.net.smtp.SMTPClient; @@ -100,6 +101,7 @@ import com.xpn.xwiki.api.Document; import com.xpn.xwiki.api.User; import com.xpn.xwiki.criteria.api.XWikiCriteriaService; +import com.xpn.xwiki.doc.DeletedAttachment; import com.xpn.xwiki.doc.XWikiAttachment; import com.xpn.xwiki.doc.XWikiAttachmentArchive; import com.xpn.xwiki.doc.XWikiDeletedDocument; @@ -1423,6 +1425,7 @@ /** * @deprecated since 2.2M1 use {@link #getDocument(DocumentReference, XWikiContext)} instead */ + @Deprecated public XWikiDocument getDocument(String fullname, XWikiContext context) throws XWikiException { XWikiDocument doc = new XWikiDocument(); @@ -1433,6 +1436,7 @@ /** * @deprecated since 2.2M1 use {@link #getDocument(DocumentReference, XWikiContext)} instead */ + @Deprecated public XWikiDocument getDocument(String web, String fullname, XWikiContext context) throws XWikiException { int i1 = fullname.lastIndexOf("."); @@ -1528,6 +1532,69 @@ } }
+ /** + * Retrieve all the deleted attachments that belonged to a certain document. Note that this does not distinguish + * between different incarnations of a document name, and it does not require that the document still exists, it + * returns all the attachments that at the time of their deletion had a document with the specified name as their + * owner. + * + * @param docName the {@link XWikiDocument#getFullName() name} of the owner document + * @param context the current request context + * @return A list with all the deleted attachments which belonged to the specified document. If no such attachments + * are found in the trash, an empty list is returned. + * @throws XWikiException if an error occurs while loading the attachments + */ + public List<DeletedAttachment> getDeletedAttachments(String docName, XWikiContext context) throws XWikiException + { + if (hasAttachmentRecycleBin(context)) { + XWikiDocument doc = new XWikiDocument(); + doc.setFullName(docName, context); + return getAttachmentRecycleBinStore().getAllDeletedAttachments(doc, context, true); + } + return null; + } + + /** + * Retrieve all the deleted attachments that belonged to a certain document and had the specified name. Multiple + * versions can be returned since the same file can be uploaded and deleted several times, creating different + * instances in the trash. Note that this does not distinguish between different incarnations of a document name, + * and it does not require that the document still exists, it returns all the attachments that at the time of their + * deletion had a document with the specified name as their owner. + * + * @param docName the {@link DeletedAttachment#getDocName() name of the document} the attachment belonged to + * @param filename the {@link DeletedAttachment#getFilename() name} of the attachment to search for + * @param context the current request context + * @return A list with all the deleted attachments which belonged to the specified document and had the specified + * filename. If no such attachments are found in the trash, an empty list is returned. + * @throws XWikiException if an error occurs while loading the attachments + */ + public List<DeletedAttachment> getDeletedAttachments(String docName, String filename, XWikiContext context) + throws XWikiException + { + if (hasAttachmentRecycleBin(context)) { + XWikiDocument doc = new XWikiDocument(); + doc.setFullName(docName, context); + XWikiAttachment attachment = new XWikiAttachment(doc, filename); + return getAttachmentRecycleBinStore().getAllDeletedAttachments(attachment, context, true); + } + return null; + } + + /** + * Retrieve a specific attachment from the trash. + * + * @param id the unique identifier of the entry in the trash + * @return specified attachment from the trash, {@code null} if not found + * @throws XWikiException if an error occurs while loading the attachments + */ + public DeletedAttachment getDeletedAttachment(String id, XWikiContext context) throws XWikiException + { + if (hasAttachmentRecycleBin(context)) { + return getAttachmentRecycleBinStore().getDeletedAttachment(NumberUtils.toInt(id), context, true); + } + return null; + } + public XWikiRenderingEngine getRenderingEngine() { return this.renderingEngine; @@ -5601,7 +5668,7 @@ /** * @return the cache factory creating local caches. * @since 1.5M2. - * @deprecated Since 1.7M1, use {@link CacheManager} component instead using {@link Utils#getComponent(Class)} + * @deprecated Since 1.7M1, use {@link CacheManager} component instead using {@link Utils#getComponent(Class)} */ @Deprecated public CacheFactory getLocalCacheFactory()
Added: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/api/DeletedAttachment.java =================================================================== --- platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/api/DeletedAttachment.java (rev 0) +++ platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/api/DeletedAttachment.java 2010-01-11 00:46:18 UTC (rev 26101) @@ -0,0 +1,219 @@ +/* + * 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.api; + +import java.util.Calendar; +import java.util.Date; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.xpn.xwiki.XWikiConfig; +import com.xpn.xwiki.XWikiContext; +import com.xpn.xwiki.XWikiException; +import com.xpn.xwiki.doc.XWikiDocument; +import com.xpn.xwiki.util.Programming; + +/** + * Information about a deleted attachment in the recycle bin. Note that this does not hold much information about the + * real attachment, but only meta-information relevant to the trash: original document and filename, deleter, deletion + * date. The attachment can be accessed using {@link #getAttachment()}. + * <p> + * This object is immutable, since entries in the trash can not be modified. + * </p> + * + * @version $Id$ + * @since 2.2M1 + */ +public class DeletedAttachment extends Api +{ + /** Logging helper object. */ + private static final Log LOG = LogFactory.getLog(DeletedAttachment.class); + + /** The internal object wrapped by this API. */ + private final com.xpn.xwiki.doc.DeletedAttachment deletedAttachment; + + /** + * Simple constructor, initializes a new API object with the current {@link com.xpn.xwiki.XWikiContext context} and + * the specified protected {@link com.xpn.xwiki.doc.DeletedAttachment deleted attachment} object. + * + * @param deletedAttachment the internal object wrapped by this API + * @param context the current request context + */ + public DeletedAttachment(com.xpn.xwiki.doc.DeletedAttachment deletedAttachment, XWikiContext context) + { + super(context); + this.deletedAttachment = deletedAttachment; + } + + /** + * Retrieve the internal entry index, used to uniquely identify this entity in the trash. This is needed because a + * file can be attached and deleted multiple times, so the document name and filename are not enough to uniquely + * identify a deleted attachment. + * + * @return internal identifier of the corresponding trash entry + */ + public long getId() + { + return this.deletedAttachment.getId(); + } + + /** + * Retrieve the original name of this attachment. + * + * @return the original filename, for example {@code MyPhoto.png} + */ + public String getFilename() + { + return this.deletedAttachment.getFilename(); + } + + /** + * Retrieve the name of the document this attachment belonged to. + * + * @return the name of the owner document, in the {@code Space.Document} format + */ + public String getDocName() + { + return this.deletedAttachment.getDocName(); + } + + /** + * Retrieve the name of the user who deleted this attachment. + * + * @return the user who deleted the attachment, as its document name (e.g. {@code XWiki.Admin}) + */ + public String getDeleter() + { + return this.deletedAttachment.getDeleter(); + } + + /** + * Retrieve the date and time this attachment has been deleted. + * + * @return the date of the deletion + */ + public Date getDate() + { + return this.deletedAttachment.getDate(); + } + + /** + * Access to the real attachment object. + * + * @return the attachment as it was before being deleted, and as it currently is in the recycle bin + */ + public Attachment getAttachment() + { + try { + Document doc = this.context.getWiki().getDocument(getDocName(), this.context).newDocument(this.context); + return new Attachment(doc, this.deletedAttachment.restoreAttachment(null, this.context), this.context); + } catch (XWikiException ex) { + LOG.warn("Failed to parse deleted attachment: " + ex.getMessage(), ex); + return null; + } + } + + /** + * Privileged access to the internal object wrapped by this API. + * + * @return original deleted attachment if the current user has programming rights, else {@code null}. + */ + @Programming + public com.xpn.xwiki.doc.DeletedAttachment getDeletedAttachment() + { + if (hasProgrammingRights()) { + return this.deletedAttachment; + } else { + return null; + } + } + + /** + * Check if the current user has the right to restore the attachment. + * + * @return {@code true} if the current user can restore this document, {@code false} otherwise + */ + public boolean canRestore() + { + // FIXME Temporary disabled until this action is implemented. + // As a workaround, the attachment can be downloaded and re-attached. + return false; + } + + /** + * Check if the current user has the right to permanently delete the attachment from the trash. + * + * @return {@code true} if the current user can purge this document, {@code false} otherwise + * @xwikicfg xwiki.store.recyclebin.adminWaitDays How many days should an administrator wait before being able to + * permanently delete this document from the recycle bin. 0 by default. + * @xwikicfg xwiki.store.recyclebin.waitDays How many days should a normal user with "delete" right wait before + * being able to permanently delete this document from the recycle bin. 7 by default. + */ + public boolean canDelete() + { + try { + XWikiDocument doc = new XWikiDocument(); + doc.setFullName(getDocName(), this.context); + if (!hasAdminRights() + && !getXWikiContext().getWiki().getRightService().checkAccess("delete", doc, this.context)) { + return false; + } + String waitdays; + XWikiConfig config = getXWikiContext().getWiki().getConfig(); + if (hasAdminRights()) { + waitdays = config.getProperty("xwiki.store.recyclebin.adminWaitDays", "0"); + } else { + waitdays = config.getProperty("xwiki.store.recyclebin.waitDays", "7"); + } + int seconds = (int) (Double.parseDouble(waitdays) * 24 * 60 * 60 + 0.5); + Calendar cal = Calendar.getInstance(); + cal.setTime(getDate()); + cal.add(Calendar.SECOND, seconds); + return cal.before(Calendar.getInstance()); + } catch (Exception ex) { + // Public APIs should not throw exceptions + LOG.warn("Exception while checking if entry [" + getId() + "] can be removed from the recycle bin", ex); + return false; + } + } + + /** + * Permanently delete this attachment from the trash. Throws an access denied exception if the user does not have + * the right to perform this action, which will trigger the generic Access Denied message. Any other failures will + * be silently ignored. + * + * @throws XWikiException if the user does not have the right to perform this action + */ + public void delete() throws XWikiException + { + if (this.canDelete()) { + try { + this.context.getWiki().getAttachmentRecycleBinStore().deleteFromRecycleBin(getId(), this.context, true); + } catch (Exception ex) { + LOG.warn("Failed to purge deleted attachment", ex); + } + } else { + java.lang.Object[] args = {this.getFilename(), this.getDocName()}; + throw new XWikiException(XWikiException.MODULE_XWIKI_ACCESS, XWikiException.ERROR_XWIKI_ACCESS_DENIED, + "Cannot permanently delete attachment {0}@{1} from the trash", null, args); + } + } +}
Property changes on: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/api/DeletedAttachment.java ___________________________________________________________________ Name: svn:keywords + Author Id Revision HeadURL Name: svn:eol-style + native
Modified: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/api/XWiki.java =================================================================== --- platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/api/XWiki.java 2010-01-11 00:46:10 UTC (rev 26100) +++ platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/api/XWiki.java 2010-01-11 00:46:18 UTC (rev 26101) @@ -30,6 +30,7 @@ import org.apache.commons.logging.LogFactory; import org.suigeneris.jrcs.diff.delta.Chunk; import org.xwiki.query.QueryManager; +import org.xwiki.rendering.renderer.PrintRendererFactory; import org.xwiki.rendering.syntax.Syntax;
import com.xpn.xwiki.XWikiContext; @@ -41,14 +42,16 @@ import com.xpn.xwiki.plugin.query.XWikiQuery; import com.xpn.xwiki.stats.impl.DocumentStats; import com.xpn.xwiki.user.api.XWikiUser; +import com.xpn.xwiki.util.Programming; import com.xpn.xwiki.web.Utils; import com.xpn.xwiki.web.XWikiEngineContext; -import org.xwiki.rendering.renderer.PrintRendererFactory;
public class XWiki extends Api { + /** Logging helper object. */ protected static final Log LOG = LogFactory.getLog(XWiki.class);
+ /** The internal object wrapped by this API. */ private com.xpn.xwiki.XWiki xwiki;
/** @@ -77,10 +80,11 @@ }
/** - * Priviledge API allowing to access the underlying main XWiki Object + * Privileged API allowing to access the underlying main XWiki Object * - * @return Priviledged Main XWiki Object + * @return Privileged Main XWiki Object */ + @Programming public com.xpn.xwiki.XWiki getXWiki() { if (hasProgrammingRights()) { @@ -165,8 +169,87 @@ }
/** - * Returns wether a document exists or not + * Retrieve all the deleted attachments that belonged to a certain document. Note that this does not distinguish + * between different incarnations of a document name, and it does not require that the document still exists, it + * returns all the attachments that at the time of their deletion had a document with the specified name as their + * owner. * + * @param docName the {@link XWikiDocument#getFullName() name} of the owner document + * @return A list with all the deleted attachments which belonged to the specified document. If no such attachments + * are found in the trash, an empty list is returned. + */ + public List<DeletedAttachment> getDeletedAttachments(String docName) + { + try { + List<com.xpn.xwiki.doc.DeletedAttachment> attachments = + this.xwiki.getDeletedAttachments(docName, this.context); + if (attachments == null || attachments.isEmpty()) { + attachments = Collections.emptyList(); + } + List<DeletedAttachment> result = new ArrayList<DeletedAttachment>(attachments.size()); + for (com.xpn.xwiki.doc.DeletedAttachment attachment : attachments) { + result.add(new DeletedAttachment(attachment, this.context)); + } + return result; + } catch (Exception ex) { + LOG.warn("Failed to retrieve deleted attachments", ex); + } + return Collections.emptyList(); + } + + /** + * Retrieve all the deleted attachments that belonged to a certain document and had the specified name. Multiple + * versions can be returned since the same file can be uploaded and deleted several times, creating different + * instances in the trash. Note that this does not distinguish between different incarnations of a document name, + * and it does not require that the document still exists, it returns all the attachments that at the time of their + * deletion had a document with the specified name as their owner. + * + * @param docName the {@link DeletedAttachment#getDocName() name of the document} the attachment belonged to + * @param filename the {@link DeletedAttachment#getFilename() name} of the attachment to search for + * @return A list with all the deleted attachments which belonged to the specified document and had the specified + * filename. If no such attachments are found in the trash, an empty list is returned. + */ + public List<DeletedAttachment> getDeletedAttachments(String docName, String filename) + { + try { + List<com.xpn.xwiki.doc.DeletedAttachment> attachments = + this.xwiki.getDeletedAttachments(docName, filename, this.context); + if (attachments == null) { + attachments = Collections.emptyList(); + } + List<DeletedAttachment> result = new ArrayList<DeletedAttachment>(attachments.size()); + for (com.xpn.xwiki.doc.DeletedAttachment attachment : attachments) { + result.add(new DeletedAttachment(attachment, this.context)); + } + return result; + } catch (Exception ex) { + LOG.warn("Failed to retrieve deleted attachments", ex); + } + return Collections.emptyList(); + } + + /** + * Retrieve a specific attachment from the trash. + * + * @param id the unique identifier of the entry in the trash + * @return specified attachment from the trash, {@code null} if not found + */ + public DeletedAttachment getDeletedAttachment(String id) + { + try { + com.xpn.xwiki.doc.DeletedAttachment attachment = this.xwiki.getDeletedAttachment(id, this.context); + if (attachment != null) { + return new DeletedAttachment(attachment, this.context); + } + } catch (Exception ex) { + LOG.warn("Failed to retrieve deleted attachment", ex); + } + return null; + } + + /** + * Returns whether a document exists or not + * * @param fullname Fullname of the XWiki document to be loaded * @return true if the document exists, false if not * @throws XWikiException @@ -2643,7 +2726,7 @@ */ public QueryManager getQueryManager() { - return (QueryManager) Utils.getComponent(QueryManager.class, "secure"); + return Utils.getComponent(QueryManager.class, "secure"); }
/**
Modified: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/doc/DeletedAttachment.java =================================================================== --- platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/doc/DeletedAttachment.java 2010-01-11 00:46:10 UTC (rev 26100) +++ platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/doc/DeletedAttachment.java 2010-01-11 00:46:18 UTC (rev 26101) @@ -158,7 +158,7 @@ /** * Setter for {@link #filename}. * - * @param filename The attachment filename. Used only by hibernate. + * @param filename The attachment filename to set. Used only by hibernate. */ protected void setFilename(String filename) { @@ -178,7 +178,7 @@ /** * Setter for {@link #date}. * - * @param date The date of delete action to set. Used only by Hibernate. + * @param date The date of the delete action to set. Used only by Hibernate. */ protected void setDate(Date date) { @@ -188,7 +188,7 @@ /** * Getter for {@link #deleter}. * - * @return The user which has removed the document. + * @return the user who deleted the attachment, as its document name (e.g. {@code XWiki.Admin}) */ public String getDeleter() { @@ -228,9 +228,9 @@ /** * Export {@link XWikiAttachment} to {@link DeletedAttachment}. * - * @param doc Deleted attachment. - * @param context The current context. Used in the XML export. - * @throws XWikiException If an exception occurs during the XML export. + * @param attachment the deleted attachment + * @param context the current context, used in the XML export + * @throws XWikiException if an exception occurs during the XML export */ protected void setAttachment(XWikiAttachment attachment, XWikiContext context) throws XWikiException { @@ -238,11 +238,13 @@ }
/** - * Restore a {@link XWikiAttachment} from a {@link DeletedAttachment}. + * Restore a {@link XWikiAttachment} from a {@link DeletedAttachment}. Note that this method does not actually + * restore the attachment to its owner document, it simply recomposes an {@link XWikiAttachment} object from the + * saved data. * - * @return Restored attachment - * @param attachment Optional attachment object to restore, if not <code>null</code>. - * @param context The current {@link XWikiContext context}. + * @return restored attachment + * @param attachment optional object where to put the attachment data, if not <code>null</code> + * @param context the current {@link XWikiContext context} * @throws XWikiException If an exception occurs while the Attachment is restored from the XML. See * {@link XWikiAttachment#fromXML(String)}. */
Modified: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/DeleteAction.java =================================================================== --- platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/DeleteAction.java 2010-01-11 00:46:10 UTC (rev 26100) +++ platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/DeleteAction.java 2010-01-11 00:46:18 UTC (rev 26101) @@ -67,8 +67,14 @@ if (!ddapi.canDelete()) { throw new XWikiException(XWikiException.MODULE_XWIKI_ACCESS, XWikiException.ERROR_XWIKI_ACCESS_DENIED, - "You can't delete from recycle bin before some time has passed"); + "You are not allowed to delete a document from the trash " + + "immediately after it has been deleted from the wiki"); } + if (!dd.getFullName().equals(doc.getFullName())) { + throw new XWikiException(XWikiException.MODULE_XWIKI_APP, + XWikiException.ERROR_XWIKI_APP_URL_EXCEPTION, + "The specified trash entry does not match the current document"); + } xwiki.getRecycleBinStore().deleteFromRecycleBin(doc, index, context, true); } sendRedirect(response, Utils.getRedirect("view", context));
Modified: platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/DeleteAttachmentAction.java =================================================================== --- platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/DeleteAttachmentAction.java 2010-01-11 00:46:10 UTC (rev 26100) +++ platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/web/DeleteAttachmentAction.java 2010-01-11 00:46:18 UTC (rev 26101) @@ -21,21 +21,58 @@
import java.util.ArrayList;
+import org.apache.commons.lang.math.NumberUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.xpn.xwiki.XWiki; import com.xpn.xwiki.XWikiContext; import com.xpn.xwiki.XWikiException; +import com.xpn.xwiki.doc.DeletedAttachment; import com.xpn.xwiki.doc.XWikiAttachment; import com.xpn.xwiki.doc.XWikiDocument; import com.xpn.xwiki.util.Util;
public class DeleteAttachmentAction extends XWikiAction { + private static final Log LOG = LogFactory.getLog(DeleteAttachmentAction.class); + + @Override public boolean action(XWikiContext context) throws XWikiException { XWikiRequest request = context.getRequest(); XWikiResponse response = context.getResponse(); XWikiDocument doc = context.getDoc(); XWikiAttachment attachment = null; + XWiki xwiki = context.getWiki(); String filename; + + // Delete from the trash + if (request.getParameter("trashId") != null) { + long trashId = NumberUtils.toLong(request.getParameter("trashId")); + DeletedAttachment da = xwiki.getAttachmentRecycleBinStore().getDeletedAttachment(trashId, context, true); + // If the attachment hasn't been previously deleted (i.e. it's not in the deleted attachment store) then + // don't try to delete it and instead redirect to the attachment list. + if (da != null) { + com.xpn.xwiki.api.DeletedAttachment daapi = new com.xpn.xwiki.api.DeletedAttachment(da, context); + if (!daapi.canDelete()) { + throw new XWikiException(XWikiException.MODULE_XWIKI_ACCESS, + XWikiException.ERROR_XWIKI_ACCESS_DENIED, + "You are not allowed to delete an attachment from the trash " + + "immediately after it has been deleted from the wiki"); + } + if (!da.getDocName().equals(doc.getFullName())) { + throw new XWikiException(XWikiException.MODULE_XWIKI_APP, + XWikiException.ERROR_XWIKI_APP_URL_EXCEPTION, + "The specified trash entry does not match the current document"); + } + // TODO: Add a confirmation check + xwiki.getAttachmentRecycleBinStore().deleteFromRecycleBin(trashId, context, true); + } + sendRedirect(response, Utils.getRedirect("attach", context)); + return false; + } + if (context.getMode() == XWikiContext.MODE_PORTLET) { filename = request.getParameter("filename"); } else { @@ -49,7 +86,7 @@
// An attachment can be indicated either using an id, or using the filename. if (request.getParameter("id") != null) { - int id = Integer.parseInt(request.getParameter("id")); + int id = NumberUtils.toInt(request.getParameter("id")); attachment = newdoc.getAttachmentList().get(id); } else { attachment = newdoc.getAttachment(filename);
Modified: platform/core/trunk/xwiki-core/src/main/resources/ApplicationResources.properties =================================================================== --- platform/core/trunk/xwiki-core/src/main/resources/ApplicationResources.properties 2010-01-11 00:46:10 UTC (rev 26100) +++ platform/core/trunk/xwiki-core/src/main/resources/ApplicationResources.properties 2010-01-11 00:46:18 UTC (rev 26101) @@ -1893,6 +1893,23 @@ xe.index.trash.documents.delete.failed=Failed to delete: xe.index.trash.documents.deleteInformation=Deleted by {0} on {1}
+xe.index.attachmentsTrash=Deleted Attachments +xe.index.trash.attachments.empty=No deleted attachments +xe.index.trash.attachments.datt.filename=Attachment +xe.index.trash.attachments.datt.docName=Document +xe.index.trash.attachments.datt.date=Deleted on +xe.index.trash.attachments.datt.deleter=Deleted by +xe.index.trash.attachments.actions= +xe.index.trash.attachments.actions.restore.tooltip=Restore attachment +xe.index.trash.attachments.actions.restore.text=[restore] +xe.index.trash.attachments.actions.cannotRestore.tooltip=The attachment cannot be restored to its original location because another file with the same name has been attached +xe.index.trash.attachments.actions.cannotRestore.text=[cannot restore] +xe.index.trash.attachments.actions.delete.tooltip=Permanently delete attachment +xe.index.trash.attachments.actions.delete.text=[delete] +xe.index.trash.attachments.delete.inProgress=Permanently deleting attachment... +xe.index.trash.attachments.delete.done=Attachment permanently deleted +xe.index.trash.attachments.delete.failed=Failed to delete: + xe.document.copy=Copy a document xe.document.copying=Copying document {0} to {1} xe.document.copy.source=Source Document:
_______________________________________________ notifications mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/notifications