Skip to content

Commit

Permalink
Merge pull request openhab#2 from jsjames/jeff
Browse files Browse the repository at this point in the history
Graal engine working - occasional "info" is null
  • Loading branch information
HolgerHees authored Dec 31, 2024
2 parents d15e57c + 01f5c47 commit 5f3378c
Show file tree
Hide file tree
Showing 4 changed files with 166 additions and 101 deletions.
239 changes: 148 additions & 91 deletions bundles/org.openhab.automation.pythonscripting/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,100 +12,157 @@

<artifactId>org.openhab.automation.pythonscripting</artifactId>

<name>openHAB Add-ons :: Bundles :: Automation :: Jython Scripting</name>
<name>openHAB Add-ons :: Bundles :: Automation :: Python Scripting</name>

<properties>
<bnd.fixupmessages><![CDATA["Classes found in the wrong directory","The default package '.' is not permitted by the Import-Package syntax"; restrict:=error; is:=warning]]></bnd.fixupmessages>
<bnd.importpackage>*blockhound*;resolution:=optional,com.cloudius.util;resolution:=optional,com.github.luben.zstd;resolution:=optional,com.informix.jdbc;resolution:=optional,com.jcraft.jzlib;resolution:=optional,com.ning.compress.*;resolution:=optional,com.oracle.svm.core.annotate;resolution:=optional,com.sun.management;resolution:=optional,custom_proxymaker.tests;resolution:=optional,jnr.*;resolution;resolution:=optional,*jpountz*;resolution:=optional,junit.framework;resolution:=optional,lzma.sdk.*;resolution:=optional,oracle.*;resolution:=optional,org.antlr.stringtemplate;resolution:=optional,org.apache.tools.*;resolution:=optional,org.brotli.dec;resolution:=optional,org.checkerframework.*;resolution:=optional,org.conscrypt;resolution:=optional,org.eclipse.jetty.*;resolution:=optional,org.hamcrest;resolution:=optional,org.jboss.marshalling;resolution:=optional,org.junit.*;resolution:=optional,org.python.apache.xml.resolver.*;resolution:=optional,org.python.google.*;resolution:=optional,org.python.netty.internal.tcnative;resolution:=optional,org.python.objectweb.asm.tree.*;resolution:=optional,org.python.proxies;resolution:=optional,org.tukaani.xz;resolution:=optional,sun.*;resolution:=optional,com.aayushatharva.brotli4j.*;resolution:=optional,javax.annotation.meta;resolution:=optional,org.python.bouncycastle.*;resolution:=optional</bnd.importpackage>
<properties>
<bnd.importpackage>
!sun.misc.*,
!sun.reflect.*,
!com.sun.management.*,
!jdk.internal.reflect.*,
!jdk.vm.ci.services
</bnd.importpackage>

<graalpy.version>24.1.1</graalpy.version>
<graalpy.edition>python-community</graalpy.edition>
</properties>

<build>
<plugins>
<plugin>
<groupId>org.graalvm.python</groupId>
<artifactId>graalpy-maven-plugin</artifactId>
<version>${graalpy.version}</version>
<executions>
<execution>
<graalpy.version>24.1.1</graalpy.version>
</properties>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<packages>
<package>termcolor</package>
</packages>
<pythonHome>
<includes>
<include>.*</include>
</includes>
<excludes></excludes>
</pythonHome>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
</transformers>
<filters>
<filter>
<artifact>*:*:*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
<goals>
<goal>process-graalpy-resources</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</plugin>
</plugins>
</build>

<dependencies>
<!-- dependencies needed for polyglot/polyglot - https://repo1.maven.org/maven2/org/graalvm/polyglot/polyglot/24.1.1/polyglot-24.1.1.pom -->
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>collections</artifactId>
<version>${graalpy.version}</version>
</dependency>

<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>nativeimage</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>polyglot</artifactId>
<version>${graalpy.version}</version>
<type>jar</type>
</dependency>

<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>graal-sdk</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>word</artifactId>
<version>${graalpy.version}</version>
</dependency>

<dependencies>
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>polyglot</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>collections</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>nativeimage</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>word</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>${graalpy.edition}</artifactId>
<version>${graalpy.version}</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.graalvm.python</groupId>
<artifactId>python-embedding</artifactId>
<version>${graalpy.version}</version>
</dependency>
<!-- <dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>graal-sdk</artifactId>
<version>${graal.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.truffle</groupId>
<artifactId>truffle-api</artifactId>
<version>${graal.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.llvm</groupId>
<artifactId>llvm-api</artifactId>
<version>${graal.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.regex</groupId>
<artifactId>regex</artifactId>
<version>${graal.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.python</groupId>
<artifactId>python-language</artifactId>
<version>${graal.version}</version>
</dependency>-->
</dependencies>
<!-- dependencies for python-language - https://repo1.maven.org/maven2/org/graalvm/python/python-language/24.1.1/python-language-24.1.1.pom -->
<dependency>
<groupId>org.graalvm.truffle</groupId>
<artifactId>truffle-api</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.tools</groupId>
<artifactId>profiler-tool</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.regex</groupId>
<artifactId>regex</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.truffle</groupId>
<artifactId>truffle-nfi</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.truffle</groupId>
<artifactId>truffle-nfi-libffi</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.llvm</groupId>
<artifactId>llvm-api</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.shadowed</groupId>
<artifactId>icu4j</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.graalvm.shadowed</groupId>
<artifactId>xz</artifactId>
<version>${graalpy.version}</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.78.1</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk18on</artifactId>
<version>1.78.1</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcutil-jdk18on</artifactId>
<version>1.78.1</version>
</dependency>
<dependency>
<groupId>org.graalvm.python</groupId>
<artifactId>python-language</artifactId>
<version>${graalpy.version}</version>
</dependency>
<!--
<dependency>
<groupId>org.graalvm.python</groupId>
<artifactId>python-resources</artifactId>
<version>${graalpy.version}</version>
</dependency>
-->
<dependency>
<groupId>org.graalvm.python</groupId>
<artifactId>python-embedding</artifactId>
<version>${graalpy.version}</version>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
<features name="org.openhab.automation.pythonscripting-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.4.0">
<repository>mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/${ohc.version}/xml/features</repository>

<feature name="openhab-automation-pythonscripting" description="Jython Scripting" version="${project.version}">
<feature name="openhab-automation-pythonscripting" description="Python Scripting" version="${project.version}">
<feature>openhab-runtime-base</feature>
<bundle start-level="80">mvn:org.openhab.addons.bundles/org.openhab.automation.pythonscripting/${project.version}</bundle>
</feature>
</features>
</features>
Original file line number Diff line number Diff line change
Expand Up @@ -41,30 +41,38 @@
import org.graalvm.home.Version;
import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Engine;
import org.graalvm.polyglot.HostAccess;
import org.graalvm.polyglot.Language;
import org.graalvm.polyglot.PolyglotException;
import org.graalvm.polyglot.Source;
import org.graalvm.polyglot.Value;
import org.graalvm.python.embedding.utils.GraalPyResources;
import org.openhab.core.OpenHAB;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public final class GraalPythonScriptEngineFactory implements ScriptEngineFactory {
private static final String LANGUAGE_ID = "python";

private final Logger logger = LoggerFactory.getLogger(GraalPythonScriptEngineFactory.class);
private static final Path PYTHON_DEFAULT_PATH = Paths.get(OpenHAB.getConfigFolder(), "automation", "python");

// private static final Context context = CreatePythonContext(polyglotEngine, PYTHON_DEFAULT_PATH);
private static final Context context = GraalPyResources.contextBuilder(PYTHON_DEFAULT_PATH).build();
// private static final Engine polyglotEngine = Engine.newBuilder().allowExperimentalOptions(true).build();
private static final Engine polyglotEngine = context.getEngine();

/***********************************************************/
/* Everything below is generic and does not need to change */
/***********************************************************/

// private final Engine polyglotEngine = Engine.newBuilder().build();
private final Engine polyglotEngine = GraalPyResources.contextBuilder(PYTHON_DEFAULT_PATH).allowAllAccess(true)
.allowHostAccess(HostAccess.ALL).build().getEngine();

// private final Engine polyglotEngine = GraalPyResources.createContext().getEngine();
private final Language language = polyglotEngine.getLanguages().get(LANGUAGE_ID);

public GraalPythonScriptEngineFactory() {
logger.debug("Languages: {}", polyglotEngine.getLanguages().keySet().toString());

context.eval("python", "print('Hello world')");
}

@Override
public String getEngineName() {
return language.getImplementationName();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
xsi:schemaLocation="https://openhab.org/schemas/addon/v1.0.0 https://openhab.org/schemas/addon-1.0.0.xsd">

<type>automation</type>
<name>Jython Scripting</name>
<description>This adds a Jython script engine.</description>
<name>Python Scripting</name>
<description>This adds a Python script engine.</description>
<connection>none</connection>

<service-id>org.openhab.automation.pythonscripting</service-id>
Expand Down

0 comments on commit 5f3378c

Please sign in to comment.