Skip to main content

Java & Jython Support

The LSP provides full type-aware completions for Java/Jython development in Ignition, covering 26 packages with 146 classes from the standard Java library and Ignition SDK.

Why This Matters​

Ignition scripts run on Jython (Python implemented in Java), which means you can:

  • Import and use any Java class
  • Extend Java classes in Python
  • Call Java methods with full type safety
  • Use Java libraries alongside Python code

Generic Python editors don't understand this Java interop, leaving you with zero autocomplete for Java classes. ignition-nvim solves this.

How It Works​

Import Completions​

Type from java. to see available packages:

from java.util import ArrayList, HashMap
from java.io import File, BufferedReader
from java.awt import Color, Font
from javax.swing import JButton, JFrame

The LSP provides completions for:

  • Package names (java.util, javax.swing, etc.)
  • Class names within packages
  • Import aliases (from java.util import ArrayList as AL)

Class Member Completions​

After importing, get completions for all methods and fields:

from java.util import ArrayList

list = ArrayList()
list. # <- Type '.' to see: add(), remove(), size(), clear(), etc.

Static Method Completions​

Access static methods and constants directly:

from java.lang import Math, System

Math. # <- See: sqrt(), pow(), PI, E, etc.
System. # <- See: currentTimeMillis(), getProperty(), etc.

Constructor Completions​

Get parameter hints when constructing objects:

from java.io import File

f = File( # <- See constructor signatures with parameter names

Supported Packages​

Standard Java Libraries​

java.lang​

Core Java classes (String, Integer, Math, System, Thread, etc.)

Common Classes:

  • String - String manipulation
  • Integer, Double, Long - Number wrappers
  • Math - Mathematical operations
  • System - System properties and operations
  • Thread - Threading and concurrency
  • Object - Base class methods

Example:

from java.lang import Math, String

# Use Math constants and methods
area = Math.PI * radius ** 2
max_value = Math.max(10, 20)

# String utilities
formatted = String.format("Value: %d", 42)

java.util​

Collections, data structures, and utilities (ArrayList, HashMap, Date, etc.)

Common Classes:

  • ArrayList - Dynamic arrays
  • HashMap - Key-value maps
  • HashSet - Unique value sets
  • Date - Date/time handling (legacy)
  • UUID - Unique identifiers
  • Collections - Collection utilities
  • Arrays - Array utilities

Example:

from java.util import ArrayList, HashMap

# Type-safe collections
tags = ArrayList()
tags.add("Motor1/Speed")
tags.add("Motor1/Status")

# Key-value storage
config = HashMap()
config.put("server", "localhost")
config.put("port", 7806)

java.util.logging​

Logging framework (Logger, Level, Handler)

Common Classes:

  • Logger - Main logging interface
  • Level - Log levels (INFO, WARNING, SEVERE, etc.)
  • ConsoleHandler - Console output
  • FileHandler - File output

Example:

from java.util.logging import Logger

logger = Logger.getLogger("MyScript")
logger.info("Script started")
logger.warning("Tag quality is bad")
logger.severe("Critical error occurred")

java.io​

File I/O operations (File, FileInputStream, BufferedReader, etc.)

Common Classes:

  • File - File and directory paths
  • FileInputStream, FileOutputStream - Byte streams
  • BufferedReader, BufferedWriter - Buffered text I/O
  • PrintWriter - Formatted text output

Example:

from java.io import File, BufferedReader, FileReader

file = File("/path/to/config.txt")
if file.exists():
reader = BufferedReader(FileReader(file))
line = reader.readLine()
reader.close()

java.net​

Networking (URL, URLConnection, InetAddress)

Common Classes:

  • URL - URL parsing and connections
  • URLConnection - HTTP connections
  • InetAddress - IP address handling
  • Socket - Low-level networking

Example:

from java.net import URL, URLConnection

url = URL("https://api.example.com/data")
connection = url.openConnection()
stream = connection.getInputStream()

Java GUI Frameworks​

javax.swing​

Swing GUI components (JFrame, JButton, JTable, etc.)

Common Classes:

  • JFrame - Top-level windows
  • JButton, JLabel - Basic components
  • JTable - Data tables
  • JPanel - Container panels

Example:

from javax.swing import JButton
from java.awt.event import ActionListener

class ButtonHandler(ActionListener):
def actionPerformed(self, event):
print("Button clicked!")

button = JButton("Click Me")
button.addActionListener(ButtonHandler())

java.awt​

AWT graphics (Color, Font, Graphics, etc.)

Common Classes:

  • Color - RGB colors
  • Font - Text fonts
  • Dimension - Width/height
  • Point - X/Y coordinates

Example:

from java.awt import Color, Font

red = Color(255, 0, 0)
header_font = Font("Arial", Font.BOLD, 24)

Database & Time​

java.sql​

JDBC database connectivity (Connection, PreparedStatement, ResultSet)

Common Classes:

  • Connection - Database connections
  • PreparedStatement - Parameterized queries
  • ResultSet - Query results
  • DriverManager - Connection management

Example:

from java.sql import DriverManager

conn = DriverManager.getConnection("jdbc:mysql://localhost/db")
stmt = conn.prepareStatement("SELECT * FROM tags WHERE id = ?")
stmt.setInt(1, 42)
rs = stmt.executeQuery()

java.time​

Modern date/time API (LocalDateTime, Instant, Duration)

Common Classes:

  • LocalDateTime - Date and time without timezone
  • Instant - Timestamp
  • Duration - Time spans
  • ZonedDateTime - Timezone-aware dates

Example:

from java.time import LocalDateTime, Duration

now = LocalDateTime.now()
later = now.plusHours(2)
duration = Duration.between(now, later)

Security & Crypto​

java.security​

Security operations (MessageDigest, SecureRandom)

Common Classes:

  • MessageDigest - Hashing (MD5, SHA-256)
  • SecureRandom - Cryptographic random
  • KeyStore - Certificate management

Example:

from java.security import MessageDigest

md5 = MessageDigest.getInstance("MD5")
md5.update("password".encode())
hash_bytes = md5.digest()

javax.crypto​

Encryption/decryption (Cipher, KeyGenerator)

Common Classes:

  • Cipher - Encryption/decryption
  • KeyGenerator - Key generation
  • SecretKey - Symmetric keys

Ignition SDK​

com.inductiveautomation.ignition.common​

Common Ignition utilities and types

Common Classes:

  • BasicDataset - Dataset implementation
  • QualityCode - Tag quality codes
  • TypeUtilities - Type conversion helpers

Example:

from com.inductiveautomation.ignition.common import BasicDataset

headers = ["Name", "Value"]
data = [["Tag1", 100], ["Tag2", 200]]
dataset = BasicDataset(headers, data)

com.inductiveautomation.ignition.gateway​

Gateway-scoped SDK functions

Completion Features​

Each Java completion includes:

  • Full method signature with parameter types
  • Return type information
  • Static/instance method distinction
  • JavaDoc documentation where available
  • Deprecation warnings
  • Parameter snippets for quick filling

Type Detection​

The LSP tracks Java types through:

  • Import statements (from java.util import ArrayList)
  • Variable assignments (list = ArrayList())
  • Return types from method calls
  • Class member access patterns

This enables context-aware completions based on the actual type of each variable.

Inline Qualified Names​

You can use Java classes without imports:

# No import needed
thread = java.lang.Thread(runnable)
file = java.io.File("/tmp/data.txt")

The LSP provides completions for these inline qualified names too.

Tips​

Prefer java.time over java.util.Date​

# Old (java.util.Date)
from java.util import Date
date = Date()

# Modern (java.time)
from java.time import LocalDateTime
date = LocalDateTime.now()

Use java.util.logging for Better Logs​

from java.util.logging import Logger

logger = Logger.getLogger("ScriptName")
logger.info("Informational message")
logger.warning("Warning message") # Better than print()

Type Hints for Better Completions​

from java.util import ArrayList
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from java.lang import String

def process(items): # type: (ArrayList) -> None
for item in items:
# LSP knows items is ArrayList
item. # <- Get ArrayList method completions