Package org.apache.nutch.plugin

Source Code of org.apache.nutch.plugin.TestPluginSystem

/*
/**
* 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.nutch.plugin;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Locale;
import java.util.Properties;

import junit.framework.TestCase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapred.JobConf;
import org.apache.nutch.util.NutchConfiguration;
import org.apache.nutch.util.NutchJob;
import org.apache.nutch.util.NutchJobConf;

/**
* Unit tests for the plugin system
*
* @author joa23
*/
public class TestPluginSystem extends TestCase {
    private int fPluginCount;

    private LinkedList fFolders = new LinkedList();
    private Configuration conf ;
    private PluginRepository repository;

    protected void setUp() throws Exception {
        this.conf = NutchConfiguration.create();
        conf.set("plugin.includes", ".*");
//        String string = this.conf.get("plugin.includes", "");
//        conf.set("plugin.includes", string + "|Dummy*");
        fPluginCount = 5;
        createDummyPlugins(fPluginCount);
        this.repository = PluginRepository.get(conf);
    }

    /*
     * (non-Javadoc)
     *
     * @see junit.framework.TestCase#tearDown()
     */
    protected void tearDown() throws Exception {
        for (int i = 0; i < fFolders.size(); i++) {
            File folder = (File) fFolders.get(i);
            delete(folder);
            folder.delete();
        }

    }

    /**
     */
    public void testPluginConfiguration() {
        String string = getPluginFolder();
        File file = new File(string);
        if (!file.exists()) {
            file.mkdir();
        }
        assertTrue(file.exists());
    }

    /**
     */
    public void testLoadPlugins() {
        PluginDescriptor[] descriptors = repository
                .getPluginDescriptors();
        int k = descriptors.length;
        assertTrue(fPluginCount <= k);
        for (int i = 0; i < descriptors.length; i++) {
            PluginDescriptor descriptor = descriptors[i];
            if (!descriptor.getPluginId().startsWith("getPluginFolder()")) {
                continue;
            }
            assertEquals(1, descriptor.getExportedLibUrls().length);
            assertEquals(1, descriptor.getNotExportedLibUrls().length);
        }
    }

    public void testRepositoryCache() {
      Configuration config = NutchConfiguration.create();
      PluginRepository repo = PluginRepository.get(config);
      JobConf job = new NutchJobConf(config);
      PluginRepository repo1 = PluginRepository.get(job);
      assertTrue(repo == repo1);
      // now construct a config without UUID
      config = new Configuration();
      config.addResource("nutch-default.xml");
      config.addResource("nutch-site.xml");
      repo = PluginRepository.get(config);
      job = new NutchJobConf(config);
      repo1 = PluginRepository.get(job);
      assertTrue(repo1 != repo);
    }

    /**
     * 
     */
    public void testGetExtensionAndAttributes() {
        String xpId = " sdsdsd";
        ExtensionPoint extensionPoint =repository
                .getExtensionPoint(xpId);
        assertEquals(extensionPoint, null);
        Extension[] extension1 = repository
                .getExtensionPoint(getGetExtensionId()).getExtensions();
        assertEquals(extension1.length, fPluginCount);
        for (int i = 0; i < extension1.length; i++) {
            Extension extension2 = extension1[i];
            String string = extension2.getAttribute(getGetConfigElementName());
            assertEquals(string, getParameterValue());
        }
    }

    /**
     * @throws PluginRuntimeException
     */
    public void testGetExtensionInstances() throws PluginRuntimeException {
        Extension[] extensions = repository
                .getExtensionPoint(getGetExtensionId()).getExtensions();
        assertEquals(extensions.length, fPluginCount);
        for (int i = 0; i < extensions.length; i++) {
            Extension extension = extensions[i];
            Object object = extension.getExtensionInstance();
            if (!(object instanceof HelloWorldExtension))
                fail(" object is not a instance of HelloWorldExtension");
            ((ITestExtension) object).testGetExtension("Bla ");
            String string = ((ITestExtension) object).testGetExtension("Hello");
            assertEquals("Hello World", string);
        }
    }

    /**
     *
     * 
     */
    public void testGetClassLoader() {
        PluginDescriptor[] descriptors = repository
                .getPluginDescriptors();
        for (int i = 0; i < descriptors.length; i++) {
            PluginDescriptor descriptor = descriptors[i];
            assertNotNull(descriptor.getClassLoader());
        }
    }

    /**
     * @throws IOException
     */
    public void testGetResources() throws IOException {
        PluginDescriptor[] descriptors = repository
                .getPluginDescriptors();
        for (int i = 0; i < descriptors.length; i++) {
            PluginDescriptor descriptor = descriptors[i];
            if (!descriptor.getPluginId().startsWith("getPluginFolder()")) {
                continue;
            }
            String value = descriptor.getResourceString("key", Locale.UK);
            assertEquals("value", value);
            value = descriptor.getResourceString("key",
                    Locale.TRADITIONAL_CHINESE);
            assertEquals("value", value);

        }
    }

    /**
     * @return a PluginFolderPath
     */
    private String getPluginFolder() {
        String[] strings = conf.getStrings("plugin.folders");
        if (strings == null || strings.length == 0)
            fail("no plugin directory setuped..");

        String name = strings[0];
        return new PluginManifestParser(conf, this.repository).getPluginFolder(name).toString();
    }

    /**
     * Creates some Dummy Plugins
     *
     * @param pCount
     */
    private void createDummyPlugins(int pCount) {
        String string = getPluginFolder();
        try {
            File folder = new File(string);
            folder.mkdir();
            for (int i = 0; i < pCount; i++) {
                String pluginFolder = string + File.separator + "DummyPlugin"
                        + i;
                File file = new File(pluginFolder);
                file.mkdir();
                fFolders.add(file);
                createPluginManifest(i, file.getAbsolutePath());
                createResourceFile(file.getAbsolutePath());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Creates an ResourceFile
     *
     * @param pFolderPath
     * @throws FileNotFoundException
     * @throws IOException
     */
    private void createResourceFile(String pFolderPath)
            throws FileNotFoundException, IOException {
        Properties properties = new Properties();
        properties.setProperty("key", "value");
        properties.store(new FileOutputStream(pFolderPath + File.separator
                + "messages" + ".properties"), "");
    }

    /**
     * Deletes files in path
     *
     * @param path
     * @throws IOException
     */
    private void delete(File path) throws IOException {
        File[] files = path.listFiles();
        for (int i = 0; i < files.length; ++i) {
            if (files[i].isDirectory())
                delete(files[i]);
            files[i].delete();
        }
    }

    /**
     * Creates an Plugin Manifest File
     *
     * @param i
     * @param pFolderPath
     * @throws IOException
     */
    private void createPluginManifest(int i, String pFolderPath)
            throws IOException {
        FileWriter out = new FileWriter(pFolderPath + File.separator
                + "plugin.xml");
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                + "<!--this is just a simple plugin for testing issues.-->"
                + "<plugin id=\"org.apache.nutch.plugin."
                + i
                + "\" name=\""
                + i
                + "\" version=\"1.0\" provider-name=\"joa23\" "
                + "class=\"org.apache.nutch.plugin.SimpleTestPlugin\">"
                + "<extension-point id=\"aExtensioID\" "
                + "name=\"simple Parser Extension\" "
                + "schema=\"schema/testExtensionPoint.exsd\"/>"
                + "<runtime><library name=\"libs/exported.jar\"><extport/></library>"
                + "<library name=\"libs/not_exported.jar\"/></runtime>"
                + "<extension point=\"aExtensioID\">"
                + "<implementation name=\"simple Parser Extension\" "
                + "id=\"aExtensionId.\" class=\"org.apache.nutch.plugin.HelloWorldExtension\">"
                + "<parameter name=\"dummy-name\" value=\"a simple param value\"/>"
                + "</implementation></extension></plugin>";
        out.write(xml);
        out.flush();
        out.close();
    }

    private String getParameterValue() {
        return "a simple param value";
    }

    private static String getGetExtensionId() {
        return "aExtensioID";
    }

    private static String getGetConfigElementName() {
        return "dummy-name";
    }

    public static void main(String[] args) throws IOException {
        new TestPluginSystem().createPluginManifest(1, "/");
    }
}
TOP

Related Classes of org.apache.nutch.plugin.TestPluginSystem

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.