public void addAllWikiDocuments(XWikiContext context) throws XWikiException { XWiki wiki = context.getWiki(); try { List<String> documentNames = wiki.getStore().getQueryManager().getNamedQuery("getAllDocuments").execute(); for (String docName : documentNames) { add(docName, DocumentInfo.ACTION_OVERWRITE, context); } } catch (QueryException ex) { throw new PackageException( PackageException.ERROR_XWIKI_STORE_HIBERNATE_SEARCH, "Cannot retrieve the list of documents to export", ex); } }
public ActionForward execute(XWikiContext context) throws Exception { MonitorPlugin monitor = null; FileUploadPlugin fileupload = null; String docName = ""; try { String action = context.getAction(); // 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) { // If the wiki asked by the user doesn't exist, then we first attempt to use any existing // global // 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); String sajax = context.getRequest().get("ajax"); boolean ajax = false; if (sajax != null && !sajax.trim().equals("") && !sajax.equals("0")) { ajax = true; } context.put("ajax", ajax); // Any error before this will be treated using a redirection to an error page if (monitor != null) { monitor.startTimer("request"); } VelocityManager velocityManager = Utils.getComponent(VelocityManager.class); VelocityContext vcontext = velocityManager.getVelocityContext(); boolean eventSent = false; try { // 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"); } // 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()); } // Let's handle the notification and make sure it never fails if (monitor != null) { monitor.startTimer("prenotify"); } // For the moment we're sending the XWiki context as the data, but this will be // changed in the future, when the whole platform will be written using components // and there won't be a need for the context. try { ObservationManager om = Utils.getComponent(ObservationManager.class); ActionExecutingEvent event = new ActionExecutingEvent(context.getAction()); om.notify(event, context.getDoc(), context); eventSent = true; if (event.isCanceled()) { // Action has been canceled // 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 // 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, new DefaultResourceReferenceHandlerChain( Collections.<ResourceReferenceHandler>emptyList())); // 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); } // 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 (action(context)) { renderResult = render(context); } if (renderResult != null) { if (doc.isNew() && "view".equals(context.getAction()) && !"recyclebin".equals(context.getRequest().get("viewer"))) { String page = Utils.getPage(context.getRequest(), "docdoesnotexist"); Utils.parseTemplate(page, context); } else { String page = Utils.getPage(context.getRequest(), renderResult); 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", context.getMessageTool().get("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()) { // Don't log "Broken Pipe" exceptions since they're not real errors and we don't want to // pollute // the logs with unnecessary stack traces. It just means the client side has cancelled // the // 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) { // For the moment we're sending the XWiki context as the data, but this will be // changed in the future, when the whole platform will be written using components // and there won't be a need for the context. try { ObservationManager om = Utils.getComponent(ObservationManager.class); 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"); } // Make sure we cleanup database connections // There could be cases where we have some if ((context != null) && (xwiki != null)) { xwiki.getStore().cleanUp(context); } } } finally { // End request if (monitor != null) { monitor.endRequest(); } if (context != null) { if (fileupload != null) { fileupload.cleanFileList(context); } } } }