org.apache.wiki.TestEngine.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.wiki.TestEngine.java

Source

/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at
    
   http://www.apache.org/licenses/LICENSE-2.0
    
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
 */

package org.apache.wiki;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.util.Locale;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.wiki.api.exceptions.ProviderException;
import org.apache.wiki.api.exceptions.WikiException;
import org.apache.wiki.attachment.Attachment;
import org.apache.wiki.auth.AuthenticationManager;
import org.apache.wiki.auth.SessionMonitor;
import org.apache.wiki.auth.Users;
import org.apache.wiki.auth.WikiSecurityException;
import org.apache.wiki.event.WikiPageEvent;
import org.apache.wiki.providers.AbstractFileProvider;
import org.apache.wiki.providers.BasicAttachmentProvider;
import org.apache.wiki.providers.FileSystemProvider;
import org.apache.wiki.util.FileUtil;
import org.apache.wiki.util.PropertyReader;
import org.apache.wiki.util.TextUtil;

import net.sourceforge.stripes.mock.MockHttpServletRequest;
import net.sourceforge.stripes.mock.MockHttpSession;
import net.sourceforge.stripes.mock.MockServletContext;

/**
 *  Simple test engine that always assumes pages are found.
 */
public class TestEngine extends WikiEngine {
    static Logger log = Logger.getLogger(TestEngine.class);

    private WikiSession m_adminWikiSession = null;
    private WikiSession m_janneWikiSession = null;
    private WikiSession m_guestWikiSession = null;

    // combined properties file (jspwiki.properties + custom override, if any)
    private static Properties combinedProperties = null;

    /**
     * Creates WikiSession with the privileges of the administrative user.
     * For testing purposes, obviously.
     * @return the wiki session
     * @throws WikiSecurityException
     */
    public WikiSession adminSession() throws WikiSecurityException {
        if (m_adminWikiSession == null) {
            // Set up long-running admin session
            HttpServletRequest request = newHttpRequest();
            m_adminWikiSession = WikiSession.getWikiSession(this, request);
            this.getAuthenticationManager().login(m_adminWikiSession, request, Users.ADMIN, Users.ADMIN_PASS);
        }
        return m_adminWikiSession;
    }

    /**
     * Creates guest WikiSession with the no privileges.
     * For testing purposes, obviously.
     * @return the wiki session
     */
    public WikiSession guestSession() {
        if (m_guestWikiSession == null) {
            // Set up guest session
            HttpServletRequest request = newHttpRequest();
            m_guestWikiSession = WikiSession.getWikiSession(this, request);
        }
        return m_guestWikiSession;
    }

    /**
     * Creates WikiSession with the privileges of the Janne.
     * For testing purposes, obviously.
     * @return the wiki session
     * @throws WikiSecurityException
     */
    public WikiSession janneSession() throws WikiSecurityException {
        if (m_janneWikiSession == null) {
            // Set up a test Janne session
            HttpServletRequest request = newHttpRequest();
            m_janneWikiSession = WikiSession.getWikiSession(this, request);
            this.getAuthenticationManager().login(m_janneWikiSession, request, Users.JANNE, Users.JANNE_PASS);
        }
        return m_janneWikiSession;
    }

    public TestEngine(Properties props) throws WikiException {
        super(new MockServletContext("test"), "test", cleanTestProps(props));

        // Stash the WikiEngine in the servlet context
        ServletContext servletContext = this.getServletContext();
        servletContext.setAttribute("org.apache.wiki.WikiEngine", this);
    }

    /**
     * Creates a correctly-instantiated mock HttpServletRequest with an associated
     * HttpSession.
     * @return the new request
     */
    public MockHttpServletRequest newHttpRequest() {
        return newHttpRequest("/Wiki.jsp");
    }

    /**
     * Creates a correctly-instantiated mock HttpServletRequest with an associated
     * HttpSession and path.
     * @param path the path relative to the wiki context, for example "/Wiki.jsp"
     * @return the new request
     */
    public MockHttpServletRequest newHttpRequest(String path) {
        MockHttpServletRequest request = new MockHttpServletRequest("/JSPWiki", path);
        request.setSession(new MockHttpSession(this.getServletContext()));
        request.addLocale(new Locale(""));
        return request;
    }

    public static void emptyWorkDir() {
        emptyWorkDir(null);
    }

    public static void emptyWorkDir(Properties properties) {
        if (properties == null) {
            properties = getTestProperties();
        }

        String workdir = properties.getProperty(WikiEngine.PROP_WORKDIR);
        if (workdir != null) {
            File f = new File(workdir);

            if (f.exists() && f.isDirectory() && new File(f, "refmgr.ser").exists()) {
                // System.out.println( "Deleting " + f.getAbsolutePath() );
                deleteAll(f);
            }
        }
    }

    public static void emptyWikiDir() {
        emptyWikiDir(null);
    }

    public static void emptyWikiDir(Properties properties) {
        if (properties == null) {
            properties = getTestProperties();
        }

        String wikidir = properties.getProperty(AbstractFileProvider.PROP_PAGEDIR);
        if (wikidir != null) {
            File f = new File(wikidir);

            if (f.exists() && f.isDirectory()) {
                deleteAll(f);
            }
        }
    }

    public static final Properties getTestProperties() {
        if (combinedProperties == null) {
            combinedProperties = PropertyReader.getCombinedProperties(PropertyReader.CUSTOM_JSPWIKI_CONFIG);
        }
        // better to make a copy via putAll instead of Properties(properties)
        // constructor, see http://stackoverflow.com/a/2004900
        Properties propCopy = new Properties();
        propCopy.putAll(combinedProperties);
        return propCopy;
    }

    public static final Properties getTestProperties(String customPropFile) {
        return PropertyReader.getCombinedProperties(customPropFile);
    }

    /*
        public static final InputStream findTestProperties()
        {
    return findTestProperties( "/jspwiki.properties" );
        }
        
        public static final InputStream findTestProperties( String properties )
        {
    InputStream in = TestEngine.class.getResourceAsStream( properties );
        
    if( in == null ) throw new InternalWikiException("Unable to locate test property resource: "+properties);
        
    return in;
        }
    */
    /**
     *  Deletes all files under this directory, and does them recursively.
     */
    public static void deleteAll(File file) {
        if (file != null) {
            if (file.isDirectory()) {
                File[] files = file.listFiles();

                if (files != null) {
                    for (File file2 : files) {
                        if (file2.isDirectory()) {
                            deleteAll(file2);
                        }

                        file2.delete();
                    }
                }
            }

            file.delete();
        }
    }

    /**
     *  Copied from FileSystemProvider
     */
    protected static String mangleName(String pagename) throws IOException {
        Properties properties = new Properties();
        String m_encoding = properties.getProperty(WikiEngine.PROP_ENCODING, AbstractFileProvider.DEFAULT_ENCODING);

        pagename = TextUtil.urlEncode(pagename, m_encoding);
        pagename = TextUtil.replaceString(pagename, "/", "%2F");
        return pagename;
    }

    /**
     *  Removes a page, but not any auxiliary information.  Works only
     *  with FileSystemProvider.
     */
    public void deleteTestPage(String name) {
        Properties properties = getTestProperties();

        try {
            String files = properties.getProperty(FileSystemProvider.PROP_PAGEDIR);

            File f = new File(files, mangleName(name) + FileSystemProvider.FILE_EXT);

            f.delete();

            // Remove the property file, too
            f = new File(files, mangleName(name) + ".properties");

            if (f.exists()) {
                f.delete();
            }

            deleteAttachments(name);
            firePageEvent(WikiPageEvent.PAGE_DELETED, name);
        } catch (Exception e) {
            log.error("Couldn't delete " + name, e);
        }
    }

    /**
     *  Deletes all attachments related to the given page.
     */
    public static void deleteAttachments(String page) {
        Properties properties = getTestProperties();

        try {
            String files = properties.getProperty(BasicAttachmentProvider.PROP_STORAGEDIR);

            File f = new File(files, TextUtil.urlEncodeUTF8(page) + BasicAttachmentProvider.DIR_EXTENSION);

            deleteAll(f);
        } catch (Exception e) {
            log.error("Could not remove attachments.", e);
        }
    }

    /**
     *  Makes a temporary file with some content, and returns a handle to it.
     */
    public File makeAttachmentFile() throws Exception {
        File tmpFile = File.createTempFile("test", "txt");
        tmpFile.deleteOnExit();

        FileWriter out = new FileWriter(tmpFile);

        FileUtil.copyContents(new StringReader("asdfa???dfzbvasdjkfbwfkUg783gqdwog"), out);

        out.close();

        return tmpFile;
    }

    /**
     *  Adds an attachment to a page for testing purposes.
     * @param pageName
     * @param attachmentName
     * @param data
     */
    public void addAttachment(String pageName, String attachmentName, byte[] data)
            throws ProviderException, IOException {
        Attachment att = new Attachment(this, pageName, attachmentName);

        getAttachmentManager().storeAttachment(att, new ByteArrayInputStream(data));
    }

    /**
     * Convenience method that saves a wiki page by constructing a fake
     * WikiContext and HttpServletRequest. We always want to do this using a
     * WikiContext whose subject contains Role.ADMIN.
     * Note: the WikiPage author will have the default value of "Guest".
     * @param pageName
     * @param content
     * @throws WikiException
     */
    public void saveText(String pageName, String content) throws WikiException {
        // Build new request and associate our admin session
        MockHttpServletRequest request = newHttpRequest();
        WikiSession wikiSession = SessionMonitor.getInstance(this).find(request.getSession());
        this.getAuthenticationManager().login(wikiSession, request, Users.ADMIN, Users.ADMIN_PASS);

        // Create page and wiki context
        WikiPage page = new WikiPage(this, pageName);
        WikiContext context = new WikiContext(this, request, page);
        saveText(context, content);
    }

    public void saveTextAsJanne(String pageName, String content) throws WikiException {
        // Build new request and associate our Janne session
        MockHttpServletRequest request = newHttpRequest();
        WikiSession wikiSession = SessionMonitor.getInstance(this).find(request.getSession());
        this.getAuthenticationManager().login(wikiSession, request, Users.JANNE, Users.JANNE_PASS);

        // Create page and wiki context
        WikiPage page = new WikiPage(this, pageName);
        page.setAuthor(Users.JANNE);
        WikiContext context = new WikiContext(this, request, page);
        saveText(context, content);
    }

    public static void trace() {
        try {
            throw new Exception("Foo");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Supplies a clean set of test properties for the TestEngine constructor.
     * @param props the properties supplied by callers
     * @return the corrected/clean properties
     */
    private static Properties cleanTestProps(Properties props) {
        String pageDir = props.getProperty("jspwiki.fileSystemProvider.pageDir");
        String stripNumbers = pageDir.substring(pageDir.lastIndexOf('/'));
        props.put(AuthenticationManager.PROP_LOGIN_THROTTLING, "false");
        props.setProperty("jspwiki.fileSystemProvider.pageDir", pageDir.substring(0, pageDir.lastIndexOf('/'))
                + stripNumbers.replaceAll("\\d", StringUtils.EMPTY) + System.currentTimeMillis());
        return props;
    }

}