use of org.xwiki.component.util.DefaultParameterizedType in project xwiki-platform by xwiki.
the class SendMailRunnableTest method sendMailWhenMailRetrievalFails.
@Test
public void sendMailWhenMailRetrievalFails() throws Exception {
// Create a Session with an invalid host so that it generates an error
Properties properties = new Properties();
Session session = Session.getDefaultInstance(properties);
MimeMessage msg1 = new MimeMessage(session);
msg1.setText("Content1");
ExtendedMimeMessage message1 = new ExtendedMimeMessage(msg1);
String id1 = message1.getUniqueMessageId();
MimeMessage msg2 = new MimeMessage(session);
msg2.setText("Content2");
ExtendedMimeMessage message2 = new ExtendedMimeMessage(msg2);
String id2 = message2.getUniqueMessageId();
MemoryMailListener listener = this.mocker.getInstance(MailListener.class, "memory");
String batchId = UUID.randomUUID().toString();
listener.onPrepareBegin(batchId, Collections.<String, Object>emptyMap());
((UpdateableMailStatusResult) listener.getMailStatusResult()).setTotalSize(2);
listener.onPrepareMessageSuccess(message1, Collections.<String, Object>emptyMap());
SendMailQueueItem item1 = new SendMailQueueItem(id1, session, listener, batchId, "xwiki");
listener.onPrepareMessageSuccess(message2, Collections.<String, Object>emptyMap());
SendMailQueueItem item2 = new SendMailQueueItem(id2, session, listener, batchId, "xwiki");
MailQueueManager mailQueueManager = this.mocker.getInstance(new DefaultParameterizedType(null, MailQueueManager.class, SendMailQueueItem.class));
// Simulate loading the message from the content store
MailContentStore contentStore = this.mocker.getInstance(MailContentStore.class, "filesystem");
when(contentStore.load(session, batchId, id1)).thenThrow(new MailStoreException("Store failure on message 1"));
when(contentStore.load(session, batchId, id2)).thenThrow(new MailStoreException("Store failure on message 2"));
// Send 2 mails. Both will fail but we want to verify that the second one is processed even though the first
// one failed.
mailQueueManager.addToQueue(item1);
mailQueueManager.addToQueue(item2);
MailRunnable runnable = this.mocker.getComponentUnderTest();
Thread thread = new Thread(runnable);
thread.start();
// Wait for the mails to have been processed.
try {
listener.getMailStatusResult().waitTillProcessed(10000L);
} finally {
runnable.stopProcessing();
thread.interrupt();
thread.join();
}
// This is the real test: we verify that there's been an error while sending each email.
Iterator<MailStatus> statuses = listener.getMailStatusResult().getByState(MailState.SEND_FATAL_ERROR);
int errorCount = 0;
while (statuses.hasNext()) {
MailStatus status = statuses.next();
// Note: I would have liked to assert the exact message but it seems there can be different ones returned.
// During my tests I got 2 different ones:
// "UnknownHostException: xwiki-unknown"
// "ConnectException: Connection refused"
// Thus for now I only assert that there's an error set, but not its content.
assertEquals("MailStoreException: Store failure on message " + ++errorCount, status.getErrorSummary());
}
assertEquals(2, errorCount);
}
use of org.xwiki.component.util.DefaultParameterizedType in project xwiki-platform by xwiki.
the class HtmlPackager method export.
/**
* Apply export and create the ZIP package.
*
* @param context the XWiki context used to render pages.
* @throws IOException error when creating the package.
* @throws XWikiException error when render the pages.
*/
public void export(XWikiContext context) throws IOException, XWikiException {
context.getResponse().setContentType("application/zip");
context.getResponse().addHeader("Content-disposition", "attachment; filename=" + Util.encodeURI(this.name, context) + ".zip");
context.setFinished(true);
ZipOutputStream zos = new ZipOutputStream(context.getResponse().getOutputStream());
File dir = this.environment.getTemporaryDirectory();
File tempdir = new File(dir, RandomStringUtils.randomAlphanumeric(8));
tempdir.mkdirs();
File attachmentDir = new File(tempdir, "attachment");
attachmentDir.mkdirs();
// Create and initialize a custom URL factory
ExportURLFactory urlf = new ExportURLFactory();
Provider<FilesystemExportContext> exportContextProvider = Utils.getComponent(new DefaultParameterizedType(null, Provider.class, FilesystemExportContext.class));
// Note that the following line will set a FilesystemExportContext instance in the Execution Context
// and this Execution Context will be cloned for each document rendered below.
// TODO: to be cleaner we should set the FilesystemExportContext in the EC used to render each document.
// However we also need to initialize the ExportURLFactory.
FilesystemExportContext exportContext = exportContextProvider.get();
urlf.init(this.pageReferences, tempdir, exportContext, context);
// Render pages to export
renderDocuments(zos, urlf, context);
// Add required skins to ZIP file
for (String skinName : urlf.getFilesystemExportContext().getNeededSkins()) {
addSkinToZip(skinName, zos, urlf.getFilesystemExportContext().getExportedSkinFiles(), context);
}
// Copy generated files in the ZIP file.
addDirToZip(tempdir, TrueFileFilter.TRUE, zos, "", null);
// Generate an index page
generateIndexPage(zos, context);
zos.setComment(this.description);
// Finish ZIP file
zos.finish();
zos.flush();
// Delete temporary directory
deleteDirectory(tempdir);
}
use of org.xwiki.component.util.DefaultParameterizedType in project xwiki-platform by xwiki.
the class XWikiAction method execute.
public ActionForward execute(XWikiContext context) throws Exception {
MonitorPlugin monitor = null;
FileUploadPlugin fileupload = null;
DefaultJobProgress actionProgress = null;
ObservationManager om = Utils.getComponent(ObservationManager.class);
Execution execution = Utils.getComponent(Execution.class);
String docName = "";
boolean debug = StringUtils.equals(context.getRequest().get("debug"), "true");
try {
String action = context.getAction();
// Start progress
if (debug && om != null && execution != null) {
actionProgress = new DefaultJobProgress(context.getURL().toExternalForm());
om.addListener(new WrappedThreadEventListener(actionProgress));
// Register the action progress in the context
ExecutionContext econtext = execution.getContext();
if (econtext != null) {
econtext.setProperty(XWikiAction.ACTION_PROGRESS, actionProgress);
}
}
getProgress().pushLevelProgress(2, this);
getProgress().startStep(this, "Get XWiki instance");
// Initialize context.getWiki() with the main wiki
XWiki xwiki;
// Verify that the requested wiki exists
try {
xwiki = XWiki.getXWiki(this.waitForXWikiInitialization, context);
// If XWiki is still initializing display initialization template
if (xwiki == null) {
// Display initialization template
renderInit(context);
// Initialization template has been displayed, stop here.
return null;
}
} catch (XWikiException e) {
// redirects. If there are none, then we display the specific error template.
if (e.getCode() == XWikiException.ERROR_XWIKI_DOES_NOT_EXIST) {
xwiki = XWiki.getMainXWiki(context);
// Initialize the url factory
XWikiURLFactory urlf = xwiki.getURLFactoryService().createURLFactory(context.getMode(), context);
context.setURLFactory(urlf);
// Initialize the velocity context and its bindings so that it may be used in the velocity templates
// that we
// are parsing below.
VelocityManager velocityManager = Utils.getComponent(VelocityManager.class);
VelocityContext vcontext = velocityManager.getVelocityContext();
if (!sendGlobalRedirect(context.getResponse(), context.getURL().toString(), context)) {
// Starting XWiki 5.0M2, 'xwiki.virtual.redirect' was removed. Warn users still using it.
if (!StringUtils.isEmpty(context.getWiki().Param("xwiki.virtual.redirect"))) {
LOGGER.warn(String.format("%s %s", "'xwiki.virtual.redirect' is no longer supported.", "Please update your configuration and/or see XWIKI-8914 for more details."));
}
// Display the error template only for actions that are not ignored
if (!ACTIONS_IGNORED_WHEN_WIKI_DOES_NOT_EXIST.contains(action)) {
// Add localization resources to the context
xwiki.prepareResources(context);
// Set the main home page in the main space of the main wiki as the current requested entity
// since we cannot set the non existing one as it would generate errors obviously...
EntityReferenceValueProvider valueProvider = Utils.getComponent(EntityReferenceValueProvider.class);
xwiki.setPhonyDocument(new DocumentReference(valueProvider.getDefaultValue(EntityType.WIKI), valueProvider.getDefaultValue(EntityType.SPACE), valueProvider.getDefaultValue(EntityType.DOCUMENT)), context, vcontext);
// Parse the error template
Utils.parseTemplate(context.getWiki().Param("xwiki.wiki_exception", "wikidoesnotexist"), context);
// Error template was displayed, stop here.
return null;
}
// At this point, we allow regular execution of the ignored action because even if the wiki
// does not exist, we still need to allow UI resources to be retrieved (from the filesystem
// and the main wiki) or our error template will not be rendered properly.
// Proceed with serving the main wiki
} else {
// Global redirect was executed, stop here.
return null;
}
} else {
LOGGER.error("Uncaught exception during XWiki initialisation:", e);
throw e;
}
}
// Send global redirection (if any)
if (sendGlobalRedirect(context.getResponse(), context.getURL().toString(), context)) {
return null;
}
XWikiURLFactory urlf = xwiki.getURLFactoryService().createURLFactory(context.getMode(), context);
context.setURLFactory(urlf);
// Handle ability to enter space URLs and convert them to page URLs (Nested Documents)
if (redirectSpaceURLs(action, urlf, xwiki, context)) {
return null;
}
String sajax = context.getRequest().get("ajax");
boolean ajax = false;
if (sajax != null && !sajax.trim().equals("") && !sajax.equals("0")) {
ajax = true;
}
context.put("ajax", ajax);
if (monitor != null) {
monitor.startTimer("request");
}
getProgress().startStep(this, "Execute request");
VelocityManager velocityManager = Utils.getComponent(VelocityManager.class);
VelocityContext vcontext = velocityManager.getVelocityContext();
getProgress().pushLevelProgress(7, this);
boolean eventSent = false;
try {
getProgress().startStep(this, "Prepare documents and put them in the context");
// Prepare documents and put them in the context
if (!xwiki.prepareDocuments(context.getRequest(), context, vcontext)) {
return null;
}
// Start monitoring timer
monitor = (MonitorPlugin) xwiki.getPlugin("monitor", context);
if (monitor != null) {
monitor.startRequest("", context.getAction(), context.getURL());
monitor.startTimer("multipart");
}
getProgress().startStep(this, "Parses multipart");
// Parses multipart so that params in multipart are available for all actions
fileupload = Utils.handleMultipart(context.getRequest().getHttpServletRequest(), context);
if (monitor != null) {
monitor.endTimer("multipart");
}
if (monitor != null) {
monitor.setWikiPage(context.getDoc().getFullName());
}
getProgress().startStep(this, "Send [" + context.getAction() + "] action start event");
// and there won't be a need for the context.
try {
ActionExecutingEvent event = new ActionExecutingEvent(context.getAction());
om.notify(event, context.getDoc(), context);
eventSent = true;
if (event.isCanceled()) {
// TODO: do something special ?
return null;
}
} catch (Throwable ex) {
LOGGER.error("Cannot send action notifications for document [" + context.getDoc() + " using action [" + context.getAction() + "]", ex);
}
if (monitor != null) {
monitor.endTimer("prenotify");
}
// Call the Actions
getProgress().startStep(this, "Search and execute entity resource handler");
// Call the new Entity Resource Reference Handler.
ResourceReferenceHandler entityResourceReferenceHandler = Utils.getComponent(new DefaultParameterizedType(null, ResourceReferenceHandler.class, ResourceType.class), "bin");
ResourceReference resourceReference = Utils.getComponent(ResourceReferenceManager.class).getResourceReference();
try {
entityResourceReferenceHandler.handle(resourceReference, DefaultResourceReferenceHandlerChain.EMPTY);
// Don't let the old actions kick in!
return null;
} catch (NotFoundResourceHandlerException e) {
// No Entity Resource Action has been found. Don't do anything and let it go through
// so that the old Action system kicks in...
} catch (Throwable e) {
// Some real failure, log it since it's a problem but still allow the old Action system a chance
// to do something...
LOGGER.error("Failed to handle Action for Resource [{}]", resourceReference, e);
}
getProgress().startStep(this, "Execute action render");
// Handle the XWiki.RedirectClass object that can be attached to the current document
boolean hasRedirect = false;
if (handleRedirectObject) {
hasRedirect = handleRedirectObject(context);
}
// Then call the old Actions for backward compatibility (and because a lot of them have not been
// migrated to new Actions yet).
String renderResult = null;
XWikiDocument doc = context.getDoc();
docName = doc.getFullName();
if (!hasRedirect && action(context)) {
renderResult = render(context);
}
if (renderResult != null) {
if (doc.isNew() && "view".equals(context.getAction()) && !"recyclebin".equals(context.getRequest().get("viewer")) && !"children".equals(context.getRequest().get("viewer")) && !"siblings".equals(context.getRequest().get("viewer"))) {
String page = Utils.getPage(context.getRequest(), "docdoesnotexist");
getProgress().startStep(this, "Execute template [" + page + "]");
Utils.parseTemplate(page, context);
} else {
String page = Utils.getPage(context.getRequest(), renderResult);
getProgress().startStep(this, "Execute template [" + page + "]");
Utils.parseTemplate(page, !page.equals("direct"), context);
}
}
return null;
} catch (Throwable e) {
if (e instanceof IOException) {
e = new XWikiException(XWikiException.MODULE_XWIKI_APP, XWikiException.ERROR_XWIKI_APP_SEND_RESPONSE_EXCEPTION, "Exception while sending response", e);
}
if (!(e instanceof XWikiException)) {
e = new XWikiException(XWikiException.MODULE_XWIKI_APP, XWikiException.ERROR_XWIKI_UNKNOWN, "Uncaught exception", e);
}
try {
XWikiException xex = (XWikiException) e;
if (xex.getCode() == XWikiException.ERROR_XWIKI_APP_SEND_RESPONSE_EXCEPTION) {
// Connection aborted from the client side, there's not much we can do on the server side. We
// simply ignore it.
LOGGER.debug("Connection aborted", e);
// We don't write any other message to the response, as the connection is broken, anyway.
return null;
} else if (xex.getCode() == XWikiException.ERROR_XWIKI_ACCESS_DENIED) {
Utils.parseTemplate(context.getWiki().Param("xwiki.access_exception", "accessdenied"), context);
return null;
} else if (xex.getCode() == XWikiException.ERROR_XWIKI_USER_INACTIVE) {
Utils.parseTemplate(context.getWiki().Param("xwiki.user_exception", "userinactive"), context);
return null;
} else if (xex.getCode() == XWikiException.ERROR_XWIKI_APP_ATTACHMENT_NOT_FOUND) {
context.put("message", "attachmentdoesnotexist");
Utils.parseTemplate(context.getWiki().Param("xwiki.attachment_exception", "attachmentdoesnotexist"), context);
return null;
} else if (xex.getCode() == XWikiException.ERROR_XWIKI_APP_URL_EXCEPTION) {
vcontext.put("message", localizePlainOrKey("platform.core.invalidUrl"));
xwiki.setPhonyDocument(xwiki.getDefaultSpace(context) + "." + xwiki.getDefaultPage(context), context, vcontext);
context.getResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST);
Utils.parseTemplate(context.getWiki().Param("xwiki.invalid_url_exception", "error"), context);
return null;
}
vcontext.put("exp", e);
if (LOGGER.isWarnEnabled()) {
// connection.
if (ExceptionUtils.getRootCauseMessage(e).equals("IOException: Broken pipe")) {
return null;
}
LOGGER.warn("Uncaught exception: " + e.getMessage(), e);
}
// If the request is an AJAX request, we don't return a whole HTML page, but just the exception
// inline.
String exceptionTemplate = ajax ? "exceptioninline" : "exception";
Utils.parseTemplate(Utils.getPage(context.getRequest(), exceptionTemplate), context);
return null;
} catch (XWikiException ex) {
if (ex.getCode() == XWikiException.ERROR_XWIKI_APP_SEND_RESPONSE_EXCEPTION) {
LOGGER.error("Connection aborted");
}
} catch (Exception e2) {
// I hope this never happens
LOGGER.error("Uncaught exceptions (inner): ", e);
LOGGER.error("Uncaught exceptions (outer): ", e2);
}
return null;
} finally {
// Let's make sure we have flushed content and closed
try {
context.getResponse().getWriter().flush();
} catch (Throwable e) {
// This might happen if the connection was closed, for example.
// If we can't flush, then there's nothing more we can send to the client.
}
if (monitor != null) {
monitor.endTimer("request");
monitor.startTimer("notify");
}
if (eventSent) {
// and there won't be a need for the context.
try {
om.notify(new ActionExecutedEvent(context.getAction()), context.getDoc(), context);
} catch (Throwable ex) {
LOGGER.error("Cannot send action notifications for document [" + docName + " using action [" + context.getAction() + "]", ex);
}
}
if (monitor != null) {
monitor.endTimer("notify");
}
getProgress().startStep(this, "Cleanup database connections");
// Make sure we cleanup database connections
// There could be cases where we have some
xwiki.getStore().cleanUp(context);
getProgress().popLevelProgress(this);
}
} finally {
// End request
if (monitor != null) {
monitor.endRequest();
}
// Stop progress
if (actionProgress != null) {
getProgress().popLevelProgress(this);
om.removeListener(actionProgress.getName());
}
if (fileupload != null) {
fileupload.cleanFileList(context);
}
}
}
use of org.xwiki.component.util.DefaultParameterizedType in project xwiki-platform by xwiki.
the class DefaultLinkRefactoringTest method configure.
@Before
public void configure() throws Exception {
XWiki xwiki = mock(XWiki.class);
when(this.xcontext.getWiki()).thenReturn(xwiki);
Provider<XWikiContext> xcontextProvider = this.mocker.getInstance(XWikiContext.TYPE_PROVIDER);
when(xcontextProvider.get()).thenReturn(this.xcontext);
this.resourceReferenceResolver = this.mocker.getInstance(DefaultResourceReferenceEntityReferenceResolver.TYPE_RESOURCEREFERENCE);
this.defaultReferenceDocumentReferenceResolver = this.mocker.getInstance(DocumentReferenceResolver.TYPE_REFERENCE);
this.compactEntityReferenceSerializer = this.mocker.getInstance(EntityReferenceSerializer.TYPE_STRING, "compact");
Provider<ComponentManager> contextComponentManagerProvider = this.mocker.registerMockComponent(new DefaultParameterizedType(null, Provider.class, ComponentManager.class), "context");
when(contextComponentManagerProvider.get()).thenReturn(this.mocker);
}
use of org.xwiki.component.util.DefaultParameterizedType in project xwiki-platform by xwiki.
the class IntegrationTests method initialize.
@RenderingTestSuite.Initialized
public void initialize(MockitoComponentManager componentManager) throws Exception {
// For performance reasons we mock some components to avoid having to draw all oldcore components
// Macro Reference Resolver
DocumentReferenceResolver<String> macroResolver = componentManager.registerMockComponent(new DefaultParameterizedType(null, DocumentReferenceResolver.class, String.class), "macro");
DocumentReference referencedDocumentReference = new DocumentReference("Wiki", "Space", "Page");
when(macroResolver.resolve(eq("Space.Page"), any(MacroBlock.class))).thenReturn(referencedDocumentReference);
// Document Access Bridge mock
// Simulate the XDOM of the referenced document
DocumentAccessBridge dab = componentManager.registerMockComponent(DocumentAccessBridge.class);
DocumentModelBridge dmb = mock(DocumentModelBridge.class);
when(dab.getTranslatedDocumentInstance(referencedDocumentReference)).thenReturn(dmb);
Parser parser = componentManager.getInstance(Parser.class, "xwiki/2.1");
XDOM xdom = parser.parse(new StringReader("= heading1 =\n==heading2=="));
when(dmb.getXDOM()).thenReturn(xdom);
}
Aggregations