Search in sources :

Example 1 with ConfigurationFactory

use of org.apache.plc4x.java.spi.configuration.ConfigurationFactory in project plc4x by apache.

the class OpcuaPlcDriver method getConnection.

@Override
public PlcConnection getConnection(String connectionString) throws PlcConnectionException {
    // Split up the connection string into it's individual segments.
    Matcher matcher = URI_PATTERN.matcher(connectionString);
    if (!matcher.matches()) {
        throw new PlcConnectionException("Connection string doesn't match the format '{protocol-code}:({transport-code})?//{transport-host}(:{transport-port})(/{transport-endpoint})(?{parameter-string)?'");
    }
    final String protocolCode = matcher.group("protocolCode");
    final String transportCode = (matcher.group("transportCode") != null) ? matcher.group("transportCode") : getDefaultTransport();
    final String transportHost = matcher.group("transportHost");
    final String transportPort = matcher.group("transportPort");
    final String transportEndpoint = matcher.group("transportEndpoint");
    final String paramString = matcher.group("paramString");
    // Check if the protocol code matches this driver.
    if (!protocolCode.equals(getProtocolCode())) {
        // Actually this shouldn't happen as the DriverManager should have not used this driver in the first place.
        throw new PlcConnectionException("This driver is not suited to handle this connection string");
    }
    // Create the configuration object.
    OpcuaConfiguration configuration = (OpcuaConfiguration) new ConfigurationFactory().createConfiguration(getConfigurationType(), paramString);
    if (configuration == null) {
        throw new PlcConnectionException("Unsupported configuration");
    }
    configuration.setTransportCode(transportCode);
    configuration.setHost(transportHost);
    configuration.setPort(transportPort);
    configuration.setTransportEndpoint(transportEndpoint);
    configuration.setEndpoint("opc." + transportCode + "://" + transportHost + ":" + transportPort + "" + transportEndpoint);
    // Try to find a transport in order to create a communication channel.
    Transport transport = null;
    ServiceLoader<Transport> transportLoader = ServiceLoader.load(Transport.class, Thread.currentThread().getContextClassLoader());
    for (Transport curTransport : transportLoader) {
        if (curTransport.getTransportCode().equals(transportCode)) {
            transport = curTransport;
            break;
        }
    }
    if (transport == null) {
        throw new PlcConnectionException("Unsupported transport " + transportCode);
    }
    // Inject the configuration into the transport.
    configure(configuration, transport);
    // Create an instance of the communication channel which the driver should use.
    ChannelFactory channelFactory = transport.createChannelFactory(transportHost + ":" + transportPort);
    if (channelFactory == null) {
        throw new PlcConnectionException("Unable to get channel factory from url " + transportHost + ":" + transportPort);
    }
    configure(configuration, channelFactory);
    // Give drivers the option to customize the channel.
    initializePipeline(channelFactory);
    // Make the "await setup complete" overridable via system property.
    boolean awaitSetupComplete = awaitSetupComplete();
    if (System.getProperty(PROPERTY_PLC4X_FORCE_AWAIT_SETUP_COMPLETE) != null) {
        awaitSetupComplete = Boolean.parseBoolean(System.getProperty(PROPERTY_PLC4X_FORCE_AWAIT_SETUP_COMPLETE));
    }
    // Make the "await disconnect complete" overridable via system property.
    boolean awaitDisconnectComplete = awaitDisconnectComplete();
    if (System.getProperty(PROPERTY_PLC4X_FORCE_AWAIT_DISCONNECT_COMPLETE) != null) {
        awaitDisconnectComplete = Boolean.parseBoolean(System.getProperty(PROPERTY_PLC4X_FORCE_AWAIT_DISCONNECT_COMPLETE));
    }
    if (configuration.getSecurityPolicy() != null && !(configuration.getSecurityPolicy().equals("None"))) {
        try {
            configuration.openKeyStore();
        } catch (Exception e) {
            throw new PlcConnectionException("Unable to open keystore, please confirm you have the correct permissions");
        }
    }
    this.isEncrypted = configuration.isEncrypted();
    // Make the "await disconnect complete" overridable via system property.
    boolean awaitDiscoverComplete = awaitDiscoverComplete();
    if (System.getProperty(PROPERTY_PLC4X_FORCE_AWAIT_DISCOVER_COMPLETE) != null) {
        awaitDiscoverComplete = Boolean.parseBoolean(System.getProperty(PROPERTY_PLC4X_FORCE_AWAIT_DISCOVER_COMPLETE));
    }
    return new DefaultNettyPlcConnection(canRead(), canWrite(), canSubscribe(), getFieldHandler(), getValueHandler(), configuration, channelFactory, awaitSetupComplete, awaitDisconnectComplete, awaitDiscoverComplete, getStackConfigurer(), getOptimizer());
}
Also used : Matcher(java.util.regex.Matcher) ConfigurationFactory(org.apache.plc4x.java.spi.configuration.ConfigurationFactory) PlcConnectionException(org.apache.plc4x.java.api.exceptions.PlcConnectionException) Transport(org.apache.plc4x.java.spi.transport.Transport) PlcConnectionException(org.apache.plc4x.java.api.exceptions.PlcConnectionException)

Example 2 with ConfigurationFactory

use of org.apache.plc4x.java.spi.configuration.ConfigurationFactory in project plc4x by apache.

the class GeneratedDriverBase method getConnection.

@Override
public PlcConnection getConnection(String connectionString) throws PlcConnectionException {
    // Split up the connection string into its individual segments.
    Matcher matcher = URI_PATTERN.matcher(connectionString);
    if (!matcher.matches()) {
        throw new PlcConnectionException("Connection string doesn't match the format '{protocol-code}:({transport-code})?//{transport-address}(?{parameter-string)?'");
    }
    final String protocolCode = matcher.group("protocolCode");
    final String transportCode = (matcher.group("transportCode") != null) ? matcher.group("transportCode") : getDefaultTransport();
    final String transportConfig = matcher.group("transportConfig");
    final String paramString = matcher.group("paramString");
    // Check if the protocol code matches this driver.
    if (!protocolCode.equals(getProtocolCode())) {
        // Actually this shouldn't happen as the DriverManager should have not used this driver in the first place.
        throw new PlcConnectionException("This driver is not suited to handle this connection string");
    }
    // Create the configuration object.
    Configuration configuration = new ConfigurationFactory().createConfiguration(getConfigurationType(), paramString);
    if (configuration == null) {
        throw new PlcConnectionException("Unsupported configuration");
    }
    // Try to find a transport in order to create a communication channel.
    Transport transport = null;
    ServiceLoader<Transport> transportLoader = ServiceLoader.load(Transport.class, Thread.currentThread().getContextClassLoader());
    for (Transport curTransport : transportLoader) {
        if (curTransport.getTransportCode().equals(transportCode)) {
            transport = curTransport;
            break;
        }
    }
    if (transport == null) {
        throw new PlcConnectionException("Unsupported transport " + transportCode);
    }
    // Inject the configuration into the transport.
    configure(configuration, transport);
    // Create an instance of the communication channel which the driver should use.
    ChannelFactory channelFactory = transport.createChannelFactory(transportConfig);
    if (channelFactory == null) {
        throw new PlcConnectionException("Unable to get channel factory from url " + transportConfig);
    }
    configure(configuration, channelFactory);
    // Give drivers the option to customize the channel.
    initializePipeline(channelFactory);
    // Make the "await setup complete" overridable via system property.
    boolean awaitSetupComplete = awaitSetupComplete();
    if (System.getProperty(PROPERTY_PLC4X_FORCE_AWAIT_SETUP_COMPLETE) != null) {
        awaitSetupComplete = Boolean.parseBoolean(System.getProperty(PROPERTY_PLC4X_FORCE_AWAIT_SETUP_COMPLETE));
    }
    // Make the "await disconnect complete" overridable via system property.
    boolean awaitDisconnectComplete = awaitDisconnectComplete();
    if (System.getProperty(PROPERTY_PLC4X_FORCE_AWAIT_DISCONNECT_COMPLETE) != null) {
        awaitDisconnectComplete = Boolean.parseBoolean(System.getProperty(PROPERTY_PLC4X_FORCE_AWAIT_DISCONNECT_COMPLETE));
    }
    // Make the "await disconnect complete" overridable via system property.
    boolean awaitDiscoverComplete = awaitDiscoverComplete();
    if (System.getProperty(PROPERTY_PLC4X_FORCE_AWAIT_DISCOVER_COMPLETE) != null) {
        awaitDiscoverComplete = Boolean.parseBoolean(System.getProperty(PROPERTY_PLC4X_FORCE_AWAIT_DISCOVER_COMPLETE));
    }
    return new DefaultNettyPlcConnection(canRead(), canWrite(), canSubscribe(), getFieldHandler(), getValueHandler(), configuration, channelFactory, awaitSetupComplete, awaitDisconnectComplete, awaitDiscoverComplete, getStackConfigurer(transport), getOptimizer());
}
Also used : Configuration(org.apache.plc4x.java.spi.configuration.Configuration) Matcher(java.util.regex.Matcher) ConfigurationFactory(org.apache.plc4x.java.spi.configuration.ConfigurationFactory) PlcConnectionException(org.apache.plc4x.java.api.exceptions.PlcConnectionException) Transport(org.apache.plc4x.java.spi.transport.Transport)

Example 3 with ConfigurationFactory

use of org.apache.plc4x.java.spi.configuration.ConfigurationFactory in project plc4x by apache.

the class ConnectionParserTest method parse.

@Test
void parse() throws PlcConnectionException {
    PropertiesDescriptor properties = new ConfigurationFactory().createConfiguration(PropertiesDescriptor.class, "rackId=2");
    assertEquals(2, properties.getRackId());
    assertEquals(1, properties.getSlotId());
}
Also used : ConfigurationFactory(org.apache.plc4x.java.spi.configuration.ConfigurationFactory) Test(org.junit.jupiter.api.Test)

Aggregations

ConfigurationFactory (org.apache.plc4x.java.spi.configuration.ConfigurationFactory)3 Matcher (java.util.regex.Matcher)2 PlcConnectionException (org.apache.plc4x.java.api.exceptions.PlcConnectionException)2 Transport (org.apache.plc4x.java.spi.transport.Transport)2 Configuration (org.apache.plc4x.java.spi.configuration.Configuration)1 Test (org.junit.jupiter.api.Test)1