use of org.xwiki.observation.ObservationManager in project xwiki-platform by xwiki.
the class ContextComponentManagerTest method testDeleteDocument.
@Test
public void testDeleteDocument() throws Exception {
getMockery().checking(new Expectations() {
{
allowing(mockWikiDescriptorManager).getCurrentWikiId();
will(returnValue("wiki"));
allowing(mockCurrentSpaceReferenceProvider).get();
will(returnValue(new SpaceReference("space", new WikiReference("wiki"))));
allowing(mockCurrentDocumentReferenceProvider).get();
will(returnValue(new DocumentReference("wiki", "space", "document")));
allowing(mockDocumentAccessBridge).getCurrentUserReference();
will(returnValue(new DocumentReference("wiki", "XWiki", "user")));
}
});
ComponentManager documentCM = getComponentManager().getInstance(ComponentManager.class, "document");
DefaultComponentDescriptor<Role> cd = new DefaultComponentDescriptor<Role>();
cd.setRoleType(Role.class);
cd.setImplementation(RoleImpl.class);
// Register component for the current user
documentCM.registerComponent(cd);
// Verify we can lookup the component from the Context CM
ComponentManager contextCM = getComponentManager().getInstance(ComponentManager.class, "context");
Assert.assertNotNull(contextCM.getComponentDescriptor(Role.class, "default"));
ObservationManager observationManager = getComponentManager().getInstance(ObservationManager.class);
observationManager.notify(new DocumentDeletedEvent(new DocumentReference("wiki", "space", "document")), null, null);
Assert.assertNull(contextCM.getComponentDescriptor(Role.class, "default"));
}
use of org.xwiki.observation.ObservationManager in project xwiki-platform by xwiki.
the class XWiki method saveDocument.
/**
* @param document the document to save
* @param comment the comment to associated to the new version of the saved document
* @param isMinorEdit true if the new version is a minor version
* @param context see {@link XWikiContext}
*/
public void saveDocument(XWikiDocument document, String comment, boolean isMinorEdit, XWikiContext context) throws XWikiException {
String currentWiki = context.getWikiId();
try {
// Switch to document wiki
context.setWikiId(document.getDocumentReference().getWikiReference().getName());
// Setting comment & minor edit before saving
document.setComment(StringUtils.defaultString(comment));
document.setMinorEdit(isMinorEdit);
// We need to save the original document since saveXWikiDoc() will reset it and we
// need that original document for the notification below.
XWikiDocument originalDocument = document.getOriginalDocument();
// (which is not a good practice)
if (originalDocument == null) {
originalDocument = getDocument(new DocumentReference(document.getDocumentReference(), document.getLocale()), context);
document.setOriginalDocument(originalDocument);
}
ObservationManager om = getObservationManager();
if (om != null) {
CancelableEvent documentEvent;
if (originalDocument.isNew()) {
documentEvent = new DocumentCreatingEvent(document.getDocumentReference());
} else {
documentEvent = new DocumentUpdatingEvent(document.getDocumentReference());
}
om.notify(documentEvent, document, context);
// If the action has been canceled by the user then don't perform any save and throw an exception
if (documentEvent.isCanceled()) {
throw new XWikiException(XWikiException.MODULE_XWIKI_STORE, XWikiException.ERROR_XWIKI_STORE_HIBERNATE_SAVING_DOC, String.format("An Event Listener has cancelled the document save for [%s]. Reason: [%s]", document.getDocumentReference(), documentEvent.getReason()));
}
}
// Put attachments to remove in recycle bin
if (hasAttachmentRecycleBin(context)) {
for (XWikiAttachmentToRemove attachment : document.getAttachmentsToRemove()) {
if (attachment.isToRecycleBin()) {
getAttachmentRecycleBinStore().saveToRecycleBin(attachment.getAttachment(), context.getUser(), new Date(), context, true);
}
}
}
// Actually save the document.
getStore().saveXWikiDoc(document, context);
// Since the store#saveXWikiDoc resets originalDocument, we need to temporarily put it
// back to send notifications.
XWikiDocument newOriginal = document.getOriginalDocument();
try {
document.setOriginalDocument(originalDocument);
if (om != null) {
if (originalDocument.isNew()) {
om.notify(new DocumentCreatedEvent(document.getDocumentReference()), document, context);
} else {
om.notify(new DocumentUpdatedEvent(document.getDocumentReference()), document, context);
}
}
} catch (Exception ex) {
LOGGER.error("Failed to send document save notification for document [" + getDefaultEntityReferenceSerializer().serialize(document.getDocumentReference()) + "]", ex);
} finally {
document.setOriginalDocument(newOriginal);
}
} finally {
context.setWikiId(currentWiki);
}
}
use of org.xwiki.observation.ObservationManager in project xwiki-platform by xwiki.
the class XWiki method deleteDocument.
public void deleteDocument(XWikiDocument doc, boolean totrash, XWikiContext context) throws XWikiException {
String currentWiki = null;
currentWiki = context.getWikiId();
try {
context.setWikiId(doc.getDocumentReference().getWikiReference().getName());
// The source document is a new empty XWikiDocument to follow
// DocumentUpdatedEvent policy: source document in new document and the old version is available using
// doc.getOriginalDocument()
XWikiDocument blankDoc = new XWikiDocument(doc.getDocumentReference());
// Again to follow general event policy, new document author is the user who modified the document
// (here the modification is delete)
blankDoc.setOriginalDocument(doc.getOriginalDocument());
blankDoc.setAuthorReference(context.getUserReference());
blankDoc.setContentAuthorReference(context.getUserReference());
ObservationManager om = getObservationManager();
// an XWikiDocument as source and an XWikiContext as data.
if (om != null) {
om.notify(new DocumentDeletingEvent(doc.getDocumentReference()), blankDoc, context);
}
if (hasRecycleBin(context) && totrash) {
// Extract any existing batchId from the context.
String batchId = Utils.getComponent(BatchOperationExecutor.class).getCurrentBatchId();
// Save to recycle bin together with any determined batch ID.
getRecycleBinStore().saveToRecycleBin(doc, context.getUser(), new Date(), batchId, context, true);
}
getStore().deleteXWikiDoc(doc, context);
try {
// an XWikiDocument as source and an XWikiContext as data.
if (om != null) {
om.notify(new DocumentDeletedEvent(doc.getDocumentReference()), blankDoc, context);
}
} catch (Exception ex) {
LOGGER.error("Failed to send document delete notifications for document [{}]", doc.getDocumentReference(), ex);
}
} finally {
context.setWikiId(currentWiki);
}
}
Aggregations