Skip to content

New Extension

papousek edited this page Apr 10, 2012 · 2 revisions

Create a New API Module

The module should have the following maven description

<groupId>org.sybila.parasim.extension</groupId>
<artifactId>your-new-extension-api</artifactId>
<packaging>jar</packaging>

To get configuration from Parasim

<parent>
    <groupId>org.sybila.parasim</groupId>
    <artifactId>parasim-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <relativePath>${path.to.the.parasim.parent.pom.xml}</relativePath>
</parent>

Create a New Implementation Module

The module should have the following maven description

<groupId>org.sybila.parasim.extension</groupId>
<artifactId>your-new-extension-impl</artifactId>
<packaging>jar</packaging>

To get configuration from Parasim

<parent>
    <groupId>org.sybila.parasim</groupId>
    <artifactId>parasim-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <relativePath>${path.to.the.parasim.parent.pom.xml}</relativePath>
</parent>

Loadable Extension

Implementation module of your extension has to contain a class implementing org.sybila.parasim.core.LoadableExtension. This class registers classes of your extension which provide the given functionality:

package org.sybila.parasim.myextension;

public class MyExtension implements LoadableExtension {
    public void register(ExtensionBuilder builder) {
        builder.extension(FunctionalityRegistrar.class);
    }
}

To provide loadable extension you have to put a special org.sybila.parasim.core.LoadableExtension file to your implementation module:

.
|-- pom.xml
|-- src
    |-- main
        `-- resources
            `-- META-INF
                `-- services
                    `-- org.sybila.parasim.core.LoadableExtension

This special file should contain names of classes implementing org.sybila.parasim.core.LoadableExtension seperated by new line:

package org.sybila.parasim.myextension.MyExtension;

Classes Providig Functionality

The first way:

public class FunctionalityRegistrar {
    @Inject
    private Instance<Functionality> functionality;

    public void registerFunctionality(@Observes ManagerStarted event, ...) {
        functionality.set(new Functionality(...));
    }
}

The second way:

public class FunctionalityRegistrar {
    @Provide
    public Functionality provideFunctionality(...) {
        functionality.set(new Functionality(...));
    }
}

You can fire a new event:

public class FunctionalityRegistrar {
    @Inject
    private Event<FunctionalityReady> event;

    @Provide
    public Functionality provideFunctionality(...) {
        functionality.set(new Functionality(...));
        event.fire(new FunctionalityReady());
    }
}