📄 wikiengine.java
字号:
int word = 0; log.debug("Expecting "+items.length+" items"); // // Parse incoming search string // while( st.hasMoreTokens() ) { log.debug("Item "+word); String token = st.nextToken().toLowerCase(); items[word] = new QueryItem(); switch( token.charAt(0) ) { case '+': items[word].type = QueryItem.REQUIRED; token = token.substring(1); log.debug("Required word: "+token); break; case '-': items[word].type = QueryItem.FORBIDDEN; token = token.substring(1); log.debug("Forbidden word: "+token); break; default: items[word].type = QueryItem.REQUESTED; log.debug("Requested word: "+token); break; } items[word++].word = token; } Collection results = m_pageManager.findPages( items ); return results; } /** * Return a bunch of information from the web page. */ public WikiPage getPage( String pagereq ) { return getPage( pagereq, WikiProvider.LATEST_VERSION ); } /** * Returns specific information about a Wiki page. * @since 1.6.7. */ public WikiPage getPage( String pagereq, int version ) { try { WikiPage p = m_pageManager.getPageInfo( pagereq, version ); if( p == null ) { p = m_attachmentManager.getAttachmentInfo( (WikiContext)null, pagereq ); } return p; } catch( ProviderException e ) { log.error( "Unable to fetch page info",e); return null; } } /** * Returns a Collection of WikiPages containing the * version history of a page. */ public List getVersionHistory( String page ) { List c = null; try { c = m_pageManager.getVersionHistory( page ); if( c == null ) { c = m_attachmentManager.getVersionHistory( page ); } } catch( ProviderException e ) { log.error("FIXME"); } return c; } /** * Returns a diff of two versions of a page. * * @param page Page to return * @param version1 Version number of the old page. If * WikiPageProvider.LATEST_VERSION (-1), then uses current page. * @param version2 Version number of the new page. If * WikiPageProvider.LATEST_VERSION (-1), then uses current page. * * @return A HTML-ized difference between two pages. If there is no difference, * returns an empty string. */ public String getDiff( String page, int version1, int version2 ) { String page1 = getPureText( page, version1 ); String page2 = getPureText( page, version2 ); // Kludge to make diffs for new pages to work this way. if( version1 == WikiPageProvider.LATEST_VERSION ) { page1 = ""; } String diff = m_differenceEngine.makeDiff( page1, page2 ); diff = TextUtil.replaceEntities( diff ); try { if( diff.length() > 0 ) { diff = m_differenceEngine.colorizeDiff( diff ); } } catch( IOException e ) { log.error("Failed to colorize diff result.", e); } return diff; } /** * Returns this object's ReferenceManager. * @since 1.6.1 */ // (FIXME: We may want to protect this, though...) public ReferenceManager getReferenceManager() { return m_referenceManager; } /** * Returns the current plugin manager. * @since 1.6.1 */ public PluginManager getPluginManager() { return m_pluginManager; } public VariableManager getVariableManager() { return m_variableManager; } /** * Returns the current PageManager. */ public PageManager getPageManager() { return m_pageManager; } /** * Returns the current AttachmentManager. * @since 1.9.31. */ public AttachmentManager getAttachmentManager() { return m_attachmentManager; } /** * Returns the currently used authorization manager. */ public AuthorizationManager getAuthorizationManager() { return m_authorizationManager; } /** * Returns the currently used user manager. */ public UserManager getUserManager() { return m_userManager; } /** * Returns the manager responsible for the filters. * @since 2.1.88 */ public FilterManager getFilterManager() { return m_filterManager; } /** * Parses the given path and attempts to match it against the list * of specialpages to see if this path exists. It is used to map things * like "UserPreferences.jsp" to page "User Preferences". * * @return WikiName, or null if a match could not be found. */ private String matchSpecialPagePath( String path ) { // // Remove servlet root marker. // if( path.startsWith("/") ) { path = path.substring(1); } for( Iterator i = m_properties.entrySet().iterator(); i.hasNext(); ) { Map.Entry entry = (Map.Entry) i.next(); String key = (String)entry.getKey(); if( key.startsWith( PROP_SPECIALPAGE ) ) { String value = (String)entry.getValue(); if( value.equals( path ) ) { return key.substring( PROP_SPECIALPAGE.length() ); } } } return null; } /** * Figure out to which page we are really going to. Considers * special page names from the jspwiki.properties, and possible aliases. * * @param context The Wiki Context in which the request is being made. * @return A complete URL to the new page to redirect to * @since 2.2 */ public String getRedirectURL( WikiContext context ) { String pagename = context.getPage().getName(); String redirURL = null; redirURL = getSpecialPageReference( pagename ); if( redirURL == null ) { String alias = (String)context.getPage().getAttribute( WikiPage.ALIAS ); if( alias != null ) { redirURL = getViewURL( alias ); } else { redirURL = (String)context.getPage().getAttribute( WikiPage.REDIRECT ); } } return redirURL; } /** * Shortcut to create a WikiContext from the Wiki page. * * @since 2.1.15. */ // FIXME: We need to have a version which takes a fixed page // name as well, or check it elsewhere. public WikiContext createContext( HttpServletRequest request, String requestContext ) { if( !m_isConfigured ) { throw new InternalWikiException("WikiEngine has not been properly started. It is likely that the configuration is faulty. Please check all logs for the possible reason."); } String pagereq = safeGetParameter( request, "page" ); String template = safeGetParameter( request, "skin" ); // // Figure out the page name. // We also check the list of special pages, which incidentally // allows us to localize them, too. // if( pagereq == null || pagereq.length() == 0 ) { String servlet = request.getServletPath(); log.debug("Servlet path is: "+servlet); pagereq = matchSpecialPagePath( servlet ); log.debug("Mapped to "+pagereq); if( pagereq == null ) { pagereq = getFrontPage(); } } int hashMark = pagereq.indexOf('#'); if( hashMark != -1 ) { pagereq = pagereq.substring( 0, hashMark ); } int version = WikiProvider.LATEST_VERSION; String rev = request.getParameter("version"); if( rev != null ) { version = Integer.parseInt( rev ); } WikiPage wikipage = getPage( pagereq, version ); if( wikipage == null ) { wikipage = new WikiPage( pagereq ); } if( template == null ) { template = (String)wikipage.getAttribute( PROP_TEMPLATEDIR ); // FIXME: Most definitely this should be checked for // existence, or else it is possible to create pages that // cannot be shown. if( template == null || template.length() == 0 ) { template = getTemplateDir(); } } WikiContext context = new WikiContext( this, wikipage ); context.setRequestContext( requestContext ); context.setHttpRequest( request ); context.setTemplate( template ); UserProfile user = getUserManager().getUserProfile( request ); context.setCurrentUser( user ); return context; } /** * Returns the URL of the global RSS file. May be null, if the * RSS file generation is not operational. * @since 1.7.10 */ public String getGlobalRSSURL() { if( m_rssURL != null ) { return getBaseURL()+m_rssURL; } return null; } /** * @since 2.2 */ public String getRootPath() { return m_rootPath; } /** * Runs the RSS generation thread. * FIXME: MUST be somewhere else, this is not a good place. */ private class RSSThread extends Thread { public void run() { try { String fileName = m_properties.getProperty( RSSGenerator.PROP_RSSFILE, "rss.rdf" ); int rssInterval = TextUtil.parseIntParameter( m_properties.getProperty( RSSGenerator.PROP_INTERVAL ), 3600 ); log.debug("RSS file will be at "+fileName); log.debug("RSS refresh interval (seconds): "+rssInterval); while(true) { Writer out = null; Reader in = null; try { // // Generate RSS file, output it to // default "rss.rdf". // log.debug("Regenerating RSS feed to "+fileName); String feed = m_rssGenerator.generate(); File file = new File( m_rootPath, fileName ); in = new StringReader(feed); out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(file), "UTF-8") ); FileUtil.copyContents( in, out ); m_rssURL = fileName; } catch( IOException e ) { log.error("Cannot generate RSS feed to "+fileName, e ); m_rssURL = null; } finally { try { if( in != null ) in.close(); if( out != null ) out.close(); } catch( IOException e ) { log.fatal("Could not close I/O for RSS", e ); break; } } Thread.sleep(rssInterval*1000L); } // while } catch(InterruptedException e) { log.error("RSS thread interrupted, no more RSS feeds", e); } // // Signal: no more RSS feeds. // m_rssURL = null; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -