Search in sources :

Example 6 with Plugin

use of io.apiman.common.plugin.Plugin in project apiman by apiman.

the class DefaultPluginRegistry method readPluginFile.

/**
 * Reads the plugin into an object.  This method will fail if the plugin is not valid.
 * This could happen if the file is not a java archive, or if the plugin spec file is
 * missing from the archive, etc.
 */
protected Plugin readPluginFile(PluginCoordinates coordinates, File pluginFile) throws Exception {
    try {
        PluginClassLoader pluginClassLoader = createPluginClassLoader(pluginFile);
        URL specFile = pluginClassLoader.getResource(PluginUtils.PLUGIN_SPEC_PATH);
        if (specFile == null) {
            // $NON-NLS-1$
            throw new Exception(Messages.i18n.format("DefaultPluginRegistry.MissingPluginSpecFile", PluginUtils.PLUGIN_SPEC_PATH));
        } else {
            PluginSpec spec = PluginUtils.readPluginSpecFile(specFile);
            Plugin plugin = new Plugin(spec, coordinates, pluginClassLoader);
            // $NON-NLS-1$
            LOGGER.info("Read apiman plugin: {0}", spec);
            return plugin;
        }
    } catch (Exception e) {
        // $NON-NLS-1$
        throw new Exception(Messages.i18n.format("DefaultPluginRegistry.InvalidPlugin", pluginFile.getAbsolutePath()), e);
    }
}
Also used : PluginSpec(io.apiman.common.plugin.PluginSpec) URL(java.net.URL) URISyntaxException(java.net.URISyntaxException) TimeoutException(java.util.concurrent.TimeoutException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) PluginClassLoader(io.apiman.common.plugin.PluginClassLoader) Plugin(io.apiman.common.plugin.Plugin)

Example 7 with Plugin

use of io.apiman.common.plugin.Plugin in project apiman by apiman.

the class PluginResourceImpl method create.

/**
 * @see IPluginResource#create(io.apiman.manager.api.beans.plugins.NewPluginBean)
 */
@Override
public PluginBean create(NewPluginBean bean) throws PluginAlreadyExistsException, PluginNotFoundException, NotAuthorizedException {
    securityContext.checkAdminPermissions();
    PluginCoordinates coordinates = new PluginCoordinates(bean.getGroupId(), bean.getArtifactId(), bean.getVersion(), bean.getClassifier(), bean.getType());
    boolean isSnapshot = PluginUtils.isSnapshot(coordinates);
    if (isSnapshot) {
        // $NON-NLS-1$
        LOGGER.debug("Loading a snapshot version of plugin: " + coordinates);
    }
    boolean isUpgrade = isSnapshot || bean.isUpgrade();
    Plugin plugin;
    try {
        plugin = pluginRegistry.loadPlugin(coordinates);
        bean.setName(plugin.getName());
        bean.setDescription(plugin.getDescription());
    } catch (InvalidPluginException e) {
        throw new PluginNotFoundException(coordinates.toString(), e);
    }
    PluginBean pluginBean = new PluginBean();
    pluginBean.setGroupId(bean.getGroupId());
    pluginBean.setArtifactId(bean.getArtifactId());
    pluginBean.setVersion(bean.getVersion());
    pluginBean.setClassifier(bean.getClassifier());
    pluginBean.setType(bean.getType());
    pluginBean.setName(bean.getName());
    pluginBean.setDescription(bean.getDescription());
    pluginBean.setCreatedBy(securityContext.getCurrentUser());
    pluginBean.setCreatedOn(new Date());
    try {
        PluginBean existingPlugin = storage.getPlugin(bean.getGroupId(), bean.getArtifactId());
        boolean hasExistingPlugin = existingPlugin != null && !existingPlugin.isDeleted();
        boolean isUpdatePolicyDefs = false;
        if (hasExistingPlugin && !isUpgrade) {
            throw ExceptionFactory.pluginAlreadyExistsException();
        } else if (hasExistingPlugin && isUpgrade) {
            isUpdatePolicyDefs = true;
            existingPlugin.setName(pluginBean.getName());
            existingPlugin.setDescription(pluginBean.getDescription());
            existingPlugin.setVersion(pluginBean.getVersion());
            existingPlugin.setClassifier(pluginBean.getClassifier());
            existingPlugin.setType(pluginBean.getType());
            pluginBean.setId(existingPlugin.getId());
            storage.updatePlugin(existingPlugin);
        } else if (!hasExistingPlugin && existingPlugin != null) {
            isUpdatePolicyDefs = true;
            existingPlugin.setName(pluginBean.getName());
            existingPlugin.setDescription(pluginBean.getDescription());
            existingPlugin.setVersion(pluginBean.getVersion());
            existingPlugin.setClassifier(pluginBean.getClassifier());
            existingPlugin.setType(pluginBean.getType());
            existingPlugin.setCreatedOn(new Date());
            existingPlugin.setCreatedBy(securityContext.getCurrentUser());
            existingPlugin.setDeleted(false);
            pluginBean.setId(existingPlugin.getId());
            storage.updatePlugin(existingPlugin);
        } else {
            if (bean.isUpgrade()) {
                throw ExceptionFactory.pluginNotFoundException(0L);
            }
            storage.createPlugin(pluginBean);
        }
        // Process any contributed policy definitions.
        List<URL> policyDefs = plugin.getPolicyDefinitions();
        int createdPolicyDefCounter = 0;
        int updatedPolicyDefCounter = 0;
        for (URL url : policyDefs) {
            PolicyDefinitionBean policyDef = (PolicyDefinitionBean) MAPPER.reader(PolicyDefinitionBean.class).readValue(url);
            if (policyDef.getId() == null || policyDef.getId().trim().isEmpty()) {
                // $NON-NLS-1$
                throw ExceptionFactory.policyDefInvalidException(Messages.i18n.format("PluginResourceImpl.MissingPolicyDefId", policyDef.getName()));
            }
            policyDef.setPluginId(pluginBean.getId());
            if (policyDef.getId() == null) {
                policyDef.setId(BeanUtils.idFromName(policyDef.getName()));
            } else {
                policyDef.setId(BeanUtils.idFromName(policyDef.getId()));
            }
            if (policyDef.getFormType() == null) {
                policyDef.setFormType(PolicyFormType.Default);
            }
            PolicyDefinitionBean existingPolicyDef = storage.getPolicyDefinition(policyDef.getId());
            if (existingPolicyDef == null) {
                storage.createPolicyDefinition(policyDef);
                createdPolicyDefCounter++;
            } else if (isUpdatePolicyDefs) {
                existingPolicyDef.setName(policyDef.getName());
                existingPolicyDef.setDescription(policyDef.getDescription());
                existingPolicyDef.setIcon(policyDef.getIcon());
                existingPolicyDef.getTemplates().clear();
                existingPolicyDef.getTemplates().addAll(policyDef.getTemplates());
                existingPolicyDef.setFormType(policyDef.getFormType());
                existingPolicyDef.setForm(policyDef.getForm());
                existingPolicyDef.setDeleted(false);
                existingPolicyDef.setPolicyImpl(policyDef.getPolicyImpl());
                storage.updatePolicyDefinition(existingPolicyDef);
                updatedPolicyDefCounter++;
            } else {
                // $NON-NLS-1$
                throw ExceptionFactory.policyDefInvalidException(Messages.i18n.format("PluginResourceImpl.DuplicatePolicyDef", policyDef.getId()));
            }
        }
        LOGGER.info(// $NON-NLS-1$
        String.format(// $NON-NLS-1$
        "Created plugin mvn:%s:%s:%s", // $NON-NLS-1$
        pluginBean.getGroupId(), // $NON-NLS-1$
        pluginBean.getArtifactId(), pluginBean.getVersion()));
        // $NON-NLS-1$
        LOGGER.info(String.format("\tCreated %s policy definitions from plugin.", String.valueOf(createdPolicyDefCounter)));
        if (isUpdatePolicyDefs) {
            // $NON-NLS-1$
            LOGGER.info(String.format("\tUpdated %s policy definitions from plugin.", String.valueOf(updatedPolicyDefCounter)));
        }
    } catch (AbstractRestException e) {
        throw e;
    } catch (Exception e) {
        throw new SystemErrorException(e);
    }
    return pluginBean;
}
Also used : SystemErrorException(io.apiman.manager.api.rest.exceptions.SystemErrorException) PluginNotFoundException(io.apiman.manager.api.rest.exceptions.PluginNotFoundException) Date(java.util.Date) URL(java.net.URL) AbstractRestException(io.apiman.manager.api.rest.exceptions.AbstractRestException) StorageException(io.apiman.manager.api.core.exceptions.StorageException) PluginNotFoundException(io.apiman.manager.api.rest.exceptions.PluginNotFoundException) PluginResourceNotFoundException(io.apiman.manager.api.rest.exceptions.PluginResourceNotFoundException) InvalidPluginException(io.apiman.manager.api.core.exceptions.InvalidPluginException) SystemErrorException(io.apiman.manager.api.rest.exceptions.SystemErrorException) IOException(java.io.IOException) PluginAlreadyExistsException(io.apiman.manager.api.rest.exceptions.PluginAlreadyExistsException) NotAuthorizedException(io.apiman.manager.api.rest.exceptions.NotAuthorizedException) PolicyDefinitionNotFoundException(io.apiman.manager.api.rest.exceptions.PolicyDefinitionNotFoundException) PolicyDefinitionBean(io.apiman.manager.api.beans.policies.PolicyDefinitionBean) InvalidPluginException(io.apiman.manager.api.core.exceptions.InvalidPluginException) PluginCoordinates(io.apiman.common.plugin.PluginCoordinates) PluginBean(io.apiman.manager.api.beans.plugins.PluginBean) NewPluginBean(io.apiman.manager.api.beans.plugins.NewPluginBean) AbstractRestException(io.apiman.manager.api.rest.exceptions.AbstractRestException) Plugin(io.apiman.common.plugin.Plugin)

Example 8 with Plugin

use of io.apiman.common.plugin.Plugin in project apiman by apiman.

the class VertxPluginRegistryTest method getFakePluginFromCustomRegistry.

/**
 * Test with custom configuration (pluginRepositories and pluginsDir) to download a fake plugin from a fake Maven repo
 *
 * @param context
 * @throws java.io.IOException
 */
@Test
public void getFakePluginFromCustomRegistry(TestContext context) throws java.io.IOException {
    Async waitForPlugin = context.async();
    // Preparing JSON config Object
    List<String> pluginRepositories = Arrays.asList(mavenServerUri.toString());
    String pluginsDir = "/tmp/plugins-test2";
    JsonObject jsonObject = new JsonObject(getJsonConfig(pluginRepositories, pluginsDir));
    // Delete temp folder
    File TempDir = new File(pluginsDir);
    if (TempDir.exists())
        FileUtils.deleteDirectory(TempDir);
    // Referenced values to test
    Map<String, String> expected = new LinkedHashMap<String, String>() {

        {
            put("pluginRepositories", String.join(",", pluginRepositories));
            put("pluginsDir", pluginsDir);
        }
    };
    // Loading VertX configuration
    VertxEngineConfig config = new VertxEngineConfig(jsonObject);
    Map<String, String> pluginRegistryConfig = config.getPluginRegistryConfig();
    // Assert that JSON config object contains the rights parameters
    Assert.assertThat(pluginRegistryConfig, is(expected));
    // Create a fake engine for test plugins loading
    TestVerticle v = new TestVerticle(config);
    // Get pluginRegistry from engine
    IPluginRegistry pluginRegistry = v.createPluginRegistry();
    // Define simple header policy plugin coordinates
    PluginCoordinates coordinates = PluginCoordinates.fromPolicySpec(testPluginCoordinates);
    // Download the plugin
    pluginRegistry.loadPlugin(coordinates, result -> {
        if (result.isSuccess()) {
            // Get downloaded plugin
            Plugin plugin = result.getResult();
            // Assert that's the right plugin
            context.assertEquals(plugin.getCoordinates(), coordinates);
            // Assert plugin is in the right dir
            Path pluginPath = Paths.get(pluginsDir + "/io.apiman.test/testPlugin/1.0.0.Final/testPlugin.war");
            context.assertTrue(Files.exists(pluginPath));
            waitForPlugin.complete();
        } else {
            context.fail(result.getError());
        }
    });
    waitForPlugin.awaitSuccess();
}
Also used : IPluginRegistry(io.apiman.gateway.engine.IPluginRegistry) Path(java.nio.file.Path) JsonObject(io.vertx.core.json.JsonObject) Async(io.vertx.ext.unit.Async) VertxEngineConfig(io.apiman.gateway.platforms.vertx3.common.config.VertxEngineConfig) PluginCoordinates(io.apiman.common.plugin.PluginCoordinates) File(java.io.File) Plugin(io.apiman.common.plugin.Plugin) Test(org.junit.Test)

Example 9 with Plugin

use of io.apiman.common.plugin.Plugin in project apiman by apiman.

the class VertxPluginRegistryTest method getFakePluginUnreachableRegistry.

/**
 * Test with custom configuration (pluginRepositories and pluginsDir) to download a fake plugin from a fake Maven repo
 * Despite a unreachable repository in the pluginRepositories array.
 *
 * @param context
 * @throws java.io.IOException
 */
@Test
public void getFakePluginUnreachableRegistry(TestContext context) throws java.io.IOException {
    Async waitForPlugin = context.async();
    // Preparing JSON config Object with 2 custom repo : a real and a fake
    List<String> pluginRepositories = Arrays.asList("https://unreachable.maven.org/maven2/", mavenServerUri.toString());
    String pluginsDir = "/tmp/plugins-test3";
    JsonObject jsonObject = new JsonObject(getJsonConfig(pluginRepositories, pluginsDir));
    // Delete temp folder
    File TempDir = new File(pluginsDir);
    if (TempDir.exists())
        FileUtils.deleteDirectory(TempDir);
    // Referenced values to test
    Map<String, String> expected = new LinkedHashMap<String, String>() {

        {
            put("pluginRepositories", String.join(",", pluginRepositories));
            put("pluginsDir", pluginsDir);
        }
    };
    // Loading VertX configuration
    VertxEngineConfig config = new VertxEngineConfig(jsonObject);
    Map<String, String> pluginRegistryConfig = config.getPluginRegistryConfig();
    // Assert that JSON config object contains the rights parameters
    Assert.assertThat(pluginRegistryConfig, is(expected));
    // Create a fake engine for test plugins loading
    TestVerticle v = new TestVerticle(config);
    // Get pluginRegistry from engine
    IPluginRegistry pluginRegistry = v.createPluginRegistry();
    // Define simple header policy plugin coordinates
    PluginCoordinates coordinates = PluginCoordinates.fromPolicySpec(testPluginCoordinates);
    // Download the plugin
    pluginRegistry.loadPlugin(coordinates, result -> {
        if (result.isSuccess()) {
            // Get downloaded plugin
            Plugin plugin = result.getResult();
            // Assert that's the right plugin
            context.assertEquals(plugin.getCoordinates(), coordinates);
            // Assert plugin is in the right dir
            Path pluginPath = Paths.get(pluginsDir + "/io.apiman.test/testPlugin/1.0.0.Final/testPlugin.war");
            context.assertTrue(Files.exists(pluginPath));
            waitForPlugin.complete();
        } else {
            context.fail(result.getError());
        }
    });
    waitForPlugin.awaitSuccess();
}
Also used : IPluginRegistry(io.apiman.gateway.engine.IPluginRegistry) Path(java.nio.file.Path) JsonObject(io.vertx.core.json.JsonObject) Async(io.vertx.ext.unit.Async) VertxEngineConfig(io.apiman.gateway.platforms.vertx3.common.config.VertxEngineConfig) PluginCoordinates(io.apiman.common.plugin.PluginCoordinates) File(java.io.File) Plugin(io.apiman.common.plugin.Plugin) Test(org.junit.Test)

Example 10 with Plugin

use of io.apiman.common.plugin.Plugin in project apiman by apiman.

the class VertxPluginRegistryTest method getRealPluginFromCustomRegistry.

/**
 * Test with custom configuration (pluginRepositories and pluginsDir) to download a real plugin from Maven Central
 *
 * @param context
 * @throws java.io.IOException
 */
@Test
public void getRealPluginFromCustomRegistry(TestContext context) throws java.io.IOException {
    Async waitForPlugin = context.async();
    // Preparing JSON config Object
    List<String> pluginRepositories = Arrays.asList("https://repo1.maven.org/maven2/");
    String pluginsDir = "/tmp/plugins-test1";
    JsonObject jsonObject = new JsonObject(getJsonConfig(pluginRepositories, pluginsDir));
    // Delete temp folder
    File TempDir = new File(pluginsDir);
    if (TempDir.exists())
        FileUtils.deleteDirectory(TempDir);
    // Referenced values to test
    Map<String, String> expected = new LinkedHashMap<String, String>() {

        {
            put("pluginRepositories", String.join(",", pluginRepositories));
            put("pluginsDir", pluginsDir);
        }
    };
    // Loading VertX configuration
    VertxEngineConfig config = new VertxEngineConfig(jsonObject);
    Map<String, String> pluginRegistryConfig = config.getPluginRegistryConfig();
    // Assert that JSON config object contains the rights parameters
    Assert.assertThat(pluginRegistryConfig, is(expected));
    // Create a fake engine for test plugins loading
    TestVerticle v = new TestVerticle(config);
    // Get pluginRegistry from engine
    IPluginRegistry pluginRegistry = v.createPluginRegistry();
    // Define simple header policy plugin coordinates
    PluginCoordinates coordinates = PluginCoordinates.fromPolicySpec(RealPluginCoordinates);
    // Download the plugin
    pluginRegistry.loadPlugin(coordinates, result -> {
        if (result.isSuccess()) {
            // Get downloaded plugin
            Plugin plugin = result.getResult();
            // Assert that's the right plugin
            context.assertEquals(plugin.getCoordinates(), coordinates);
            // Assert plugin is in the right dir
            Path pluginPath = Paths.get(pluginsDir + "/io.apiman.plugins/apiman-plugins-simple-header-policy/1.5.1.Final/apiman-plugins-simple-header-policy.war");
            context.assertTrue(Files.exists(pluginPath));
            waitForPlugin.complete();
        } else {
            context.fail(result.getError());
        }
    });
    waitForPlugin.awaitSuccess();
}
Also used : IPluginRegistry(io.apiman.gateway.engine.IPluginRegistry) Path(java.nio.file.Path) JsonObject(io.vertx.core.json.JsonObject) Async(io.vertx.ext.unit.Async) VertxEngineConfig(io.apiman.gateway.platforms.vertx3.common.config.VertxEngineConfig) PluginCoordinates(io.apiman.common.plugin.PluginCoordinates) File(java.io.File) Plugin(io.apiman.common.plugin.Plugin) Test(org.junit.Test)

Aggregations

Plugin (io.apiman.common.plugin.Plugin)11 PluginCoordinates (io.apiman.common.plugin.PluginCoordinates)8 File (java.io.File)7 IOException (java.io.IOException)5 Test (org.junit.Test)5 PluginClassLoader (io.apiman.common.plugin.PluginClassLoader)4 IPluginRegistry (io.apiman.gateway.engine.IPluginRegistry)4 VertxEngineConfig (io.apiman.gateway.platforms.vertx3.common.config.VertxEngineConfig)4 JsonObject (io.vertx.core.json.JsonObject)4 Async (io.vertx.ext.unit.Async)4 Path (java.nio.file.Path)4 InvalidPluginException (io.apiman.manager.api.core.exceptions.InvalidPluginException)3 URL (java.net.URL)3 PluginSpec (io.apiman.common.plugin.PluginSpec)2 NewPluginBean (io.apiman.manager.api.beans.plugins.NewPluginBean)2 PluginBean (io.apiman.manager.api.beans.plugins.PluginBean)2 PolicyDefinitionBean (io.apiman.manager.api.beans.policies.PolicyDefinitionBean)2 StorageException (io.apiman.manager.api.core.exceptions.StorageException)2 AbstractRestException (io.apiman.manager.api.rest.exceptions.AbstractRestException)2 NotAuthorizedException (io.apiman.manager.api.rest.exceptions.NotAuthorizedException)2