类别

版本

本指南的目标是RapidMiner Studio 9.3引入的新连接管理,并取代了关于自定义配置器的部分。

要将旧式配置器转换为新的连接管理,请遵循说明在这里

创建自定义连接处理程序

假设您想要创建一个RapidMiner扩展,该扩展提供一个操作符,用于从共享数据系统读取数据。您的操作员需要访问共享数据的信息,例如用户名、密码和一些附加参数。一种方法是将文本字段添加到操作符的参数中,并让用户键入所需的信息。虽然这看起来很方便,但如果您想在其他RapidMiner进程或操作符中使用相同的信息,那么它就会变得相当多余,因为您必须多次输入信息。或者,您可以在存储库中定义共享数据连接,并让用户选择从哪个共享数据中获取数据。

在这种情况下连接类型会派上用场的。连接处理程序可以管理某种类型的连接对象,并允许您通过可自定义的连接对话框在存储库中创建、编辑和删除它们。对于本例,我们将实现共享数据项的连接处理程序,它允许我们使用可通过存储库项访问的对话框自动配置这些项。此外,连接处理程序可以与操作符中的参数一起使用,这使用户可以轻松地从存储库中选择连接。或者,操作符可以提供一个直通端口对,以便通过一个检索操作符。

您可以使用它跟踪自定义连接类型的实现扩展项目。扩展的创建方式与您在主要扩展开发人员文档。如果您有一个使用遗留配置器机制的扩展,您可以按照说明进行操作在这里将其转换为新的连接管理,并为现有连接提供内置转换机制的附加好处。

连接处理器

为了实现你自己的连接处理程序,你需要知道以下类和接口:

  • ConnectionHandler是要实现的接口,用于创建、验证和测试特定类型的连接。
  • ConnectionHandlerRegistry用于注册ConnectionHandlers在RapidMiner。
  • ConnectionInformation+ConnectionInformationBuilder连接信息包含配置和所有相关文件的路径。
  • ConnectionConfiguration+ConnectionConfigurationBuilder配置包含按组分类的所有参数,构建器帮助创建新的配置或从现有配置扩展。
  • ConfigurationParameter+ParameterUtility参数可以加密并具有默认值,也可以被注入。实用程序类为参数提供了构建器,例如在从头创建连接时。

要实现处理程序,请创建一个实现ConnectionHandler类。建议通过静态实例字段或将其实现为enum,使处理程序成为单例。

要实现接口的方法,我们建议按以下顺序执行

  1. 字符串方法():指定此处理程序可以管理的连接类型。该类型应该包含扩展的命名空间,以避免可能的重复,并且应该像这样:< extension_namespace >: <连接类型>

    在示例项目中共享数据,扩展的命名空间为shared_data按约定,连接类型为数据共享。这可能看起来令人困惑,但对于主要功能是新连接类型的扩展来说,这可能是常见的地方。完整的连接类型是shared_data:数据共享

    方法中将名称空间声明为常量是最佳实践PluginInit类,并将完整类型作为处理程序中的公共常量。

  2. 无效初始化()布尔isInitialized ()如果您的处理程序需要任何类型的一次性初始化,例如从扩展中提取文件,则将其放入初始化方法。这不会自动调用,但可以在您认为必要时触发初始化。同样的,isInitialized应指示处理程序是否已成功初始化。如果您不需要任何额外的初始化,只需使init方法成为noop实现并始终返回即可真正的在指标法中。

    注意:这些方法在这里是为了方便,而不是由RapidMiner直接调用或检查。

  3. ConnectionInformationcreateNewConnectionInformation(字符串名称)在此方法中,将创建指定类型的新“默认”连接。一个ConnectionInformation由(至少)a组成ConnectionConfiguration它保存了参数。

    1. 连接中的参数按组进行分类。您不需要有多个组,但至少需要一个组。组名称以及参数名称(也称为键)应该在snake_case,即所有单词都是小写的,并用下划线分隔。这将与i18n翻译相关。
    2. 可以通过调用构造器来创建参数ParameterUtility.getCPBuilder (< parameter_key >)然后指定参数的详细信息。您可以通过添加来创建加密参数真正的作为第二个参数getCPBuilder方法。使用参数构建器,您可以设置参数调用的启用状态使()禁用()使(布尔))以及默认值(callwithValue(字符串)).之后你可以构建参数。
    3. 在指定列表中收集属于一个组的参数。
    4. 你可以创建一个ConfigurationBuilder使用给定的名称和连接类型。
    5. 要在配置构建器中创建组,请调用本月中旬(< group_key >,
    6. 如果您也想要这些默认值,您可以在配置中添加标签或默认描述。

    在完成配置并构建它之后,将它交给ConnectionInformationBuilder然后建立ConnectionInformation从这一点。同样,我们建议将组和参数键保留为(公共)常量,以供以后和外部引用。

    此外,连接对象可以保存库文件(例如. jar. dll)以及其他文件(例如XML配置文件、纯文本文件等)。如果每个连接需要一个特定的文件,这可能是相关的。例如,在RapidMiner Studio中,这是为JDBC数据库连接完成的,以确保使用正确的JDBC驱动程序,并始终与给定的连接绑定。

    为了利用额外的文件,您将需要提供一些UI组件来处理这些文件。有关更多信息,请参见下一节。

  4. ValidationResult验证(ConnectionInformation连接)TestResult测试(ConnectionInformation连接)这些方法应该检查您的连接是否有正确的参数。验证应该只做一般的检查,比如确保设置了所有的强制参数,并且值是有意义的。这应该不会花费太多时间,因为它用于实时更新。另一方面,测试是异步完成的,可以有长时间运行的内容。在这里,您应该测试这些参数是否可以用于建立成功的连接。

    参数可以被注入,即在进程运行时提供。内置的提供程序是宏和服务器。有关这方面的更多信息,请参见本节。要帮助在验证期间检查参数,可以使用ParameterUtility # validateParameterValue方法。它将确定参数是否被设置,即如果它的值不为空或参数是否被注入。

  5. 额外的方法/类:为了创建到您的连接类型所代表的系统的“连接”,我们建议有一个中心点来建立它ConnectionInformation对象。这可以是处理程序中的(静态)方法,也可以是某个helper类中的方法。在其他扩展中,这通常会导致特定对象在使用连接时保持连接并负责清理。以这种方式处理连接将有助于在多个操作符中重用此连接类型,而无需重复代码。您可以在下面的操作符中找到有关连接使用的更多信息。

    要解析连接的所有参数,包括注入的值,只需调用ValueProviderHandlerRegistry.getInstance()。injectValues(连接,操作符,false)获取所有参数到值的映射。参数是完全限定的,即具有各自的组前缀。

完成连接处理程序后,可以将其注册到ConnectionHandlerRegistry。这应该在初始化你的方法PluginInit类。

ConnectionGUI和I18N

如果您的连接仅由字符串参数组成,无论是纯文本还是加密的,都可以简单地注册的实例DefaultConnectionGUIProvider对于您的连接,如下所示:

ConnectionGUIRegistry.INSTANCE。registerGUIProvider(new DefaultConnectionGUIProvider(), yourConnectionHandler.getType());

否则,您需要为连接的UI提供一些Java Swing组件。要实现自定义(定制)连接UI,您需要查看以下类:

  • AbstractConnectionGUIDefaultConnectionGUI以及各自的提供程序类:提供每个参数的标签和输入的主UI类;还提供了一些静态助手方法
  • ConnectionGUIRegistry注册中心是用于自定义连接gui的吗
  • ConnectionParameterLabelConnectionParameterTextFieldConnectionParameterCheckBox在GUI中使用简单的标签和参数输入组件吗
  • InjectableComponentWrapper组件助手类是可以被注入的参数吗

要自定义连接GUI,最简单的起点是DefaultConnectionGUI。它已经包含了几个帮助器方法,我们将按复杂程度进行讨论。默认的GUI将显示连接参数,类似于操作员参数的显示方式:左边是标签,右边是输入。更多关于标签的信息,请参见下面的i18n部分。因此,实现连接GUI的简单方法是扩展默认GUI。

  1. JComponentgetParameterInputComponent(字符串类型,ConnectionParameterModel参数):默认情况下,输入组件是一个简单的文本字段,它对参数是否加密做出反应,显示纯文本字段或密码字段(将文本与密码混淆)*符号)。这是ConnectionParameterTextField

    其他预定义的组件或辅助方法以复选框的形式存在于布尔参数(ConnectionParameterCheckBox)和一个可以创建的组合框InjectableComponentWrapper。getInjectableCombobox(参数,字符串[],字符串)。所有这些组件都使用anInjectableComponentWrapper要允许参数注入(参见主文档).

    由于GUI方法是为编辑模式和视图模式调用的,因此您可能需要区分这两种模式,以创建适当的输入组件。文本字段和复选框已经适应了这些模式,并显示为不可编辑。在示例项目中,我们选择在视图模式中将组合框显示为简单的不可编辑文本字段。

    在默认GUI中,复选框没有单独的标签组件,因为它们首先显示为复选框,然后显示为标签。此外,输入组件被一个信息图标包裹,该图标显示参数的描述。
    有关更多信息,请参阅下面的i18n部分。

    如果需要,可以构造更复杂的输入组件,但是上面解释的三种输入类型可以在示例项目中找到。

  2. < ConnectionParameterModel列表>getInjectableParameters (ConnectionParameterGroupModel组)在这里,你可以修改哪些参数实际上是可注入的。对于某些连接,不允许所有参数都是可注入的可能是有意义的。默认情况下,所有参数都是可注入的。

  3. < ConnectionParameterModel列表>orderedParameters (ConnectionParameterGroupModel groupModel):如果您想强制一个组的连接参数的顺序,您可以在这里这样做。用于连接持久化的json格式可能是手动创建的,因此并非所有参数都是有序的。注意,所有参数都在最终列表中,否则它们根本不会显示在GUI中。默认情况下,顺序取自组模型。

  4. 定义参数依赖关系:如果您希望某些参数仅在另一个参数具有特定值时才显示,则需要执行几个步骤。

    1. 首先,你应该重写JComponentgetComponentForGroup(ConnectionParameterGroupModel groupModel, ConnectionModel ConnectionModel)要确保所有涉及的参数都实际存在(请参阅getOrCreateParameter方法),然后将参数的启用属性注册为与其关联的值。如。singleAParameter.enabledProperty () .bind (optionParameter.valueProperty () .isEqualTo (OPTION_A));会设置一个参数,当且仅当选项参数设置为一个选择。准备好参数后,只需调用超级实现即可。

    2. 接下来,我们需要确保被禁用的参数不再显示在UI中。方法可以实现这一点visibilityWrapper方法,请参阅AbstractConnectionGUI。这个方法取任意值JComponent和一个ConnectionParameterModel将该参数的enabled属性绑定到组件的可见性。我们需要确保标签和输入组件都受到影响。

      要实现这一点,通过在一个可视包装器调用中包装超级实现调用来覆盖**getParameterLabelComponent**和**wrapInformationIcon**。

要对GUI进行更复杂的修改,请查看JavadocAbstractConnectionGUIDefaultConnectionGUI或者在上面提问社区

I18N

为了提高将RapidMiner翻译成其他语言的可能性,连接GUI的大部分都是国际化的,需要在GUI < ExtensionName > . properties文件。这包括连接类型的图标、标签和描述,对于组也是如此(目前还未使用图标和描述),以及每个参数的标签和描述。

所有用于连接的i18n键都带有gui.label.connection,后缀包括图标标签提示。具体说明如下:

  • 连接类型:类型。< extension_namespace >。<连接类型>
  • 组:组。< extension_namespace >。<连接类型>。< group_name >
  • 参数:参数。< extension_namespace >。<连接类型>,< group_name >。< parameter_name >

示例:参数选项基本示例项目的组具有完整的键

gui.label.connection.parameter.shared_data.shared-data.basic.option

接着是标签提示后缀。

您可以在示例项目中使用I18NHelper类创建所有与连接相关的i18n键,并使用一些简单的预填充标签。原始GUI属性文件保存为. bak文件,以防其他i18n密钥丢失。类助手类如下所示。

可运行初始化器= PluginInit::initPlugin;String namespace = PluginInit.NAMESPACE;Path propertyPath = Paths.get("src/main/乐鱼体育安装resources/com/rapidminer/extension/resources/i18n/GUI.properties").toAbsolutePath();if (!Files.exists(propertyPath)) {Files.createFile(propertyPath);} BiFunction defaultValues = connectionAdaptionHandlerDefaultValues(namespace);路径newPath = appendOrReplaceConnectionKeys(initializer, namespace, propertyPath, defaultValues);if (newPath == null){返回;} Files.copy(Files.newInputStream(newPath), propertyPath, StandardCopyOption.REPLACE_EXISTING);

现在您可以创建、编辑和查看自定义连接了!

使用

要在操作符中使用自定义连接,需要使用以下类:

  • ConnectionInformationSelector: Helper类,它提供对参数类型的访问,帮助进行元数据转换和数据转发,以及检索指定的连接
  • ConnectionSelectionProvider:访问选择器的接口(可选)

要将选择器与操作符合并,请创建一个字段,并使用当前操作符和完全限定连接类型初始化选择器,例如:shared_data:数据共享在示例项目中。这个最小的构造函数将自动为操作符创建输入和输出端口,以便输入到操作符的连接可以通过。

要定制这一点,可以使用第二个构造函数,它将输入和输出端口作为参数。端口可以是来自操作符的预配置端口,也可以保留为空,仅依赖于参数来指定连接。

我们建议按照以下步骤设置您的操作符:

  1. 在操作符构造函数中,如果至少有用于连接的输入端口,则调用ConnectionInformationSelector # makeDefaultPortTransformation为输入附加一个先决条件,以确保连接具有正确的类型,并为输入和输出端口添加一个直通规则(如果可能)。

  2. getParameterTypes方法,通过调用静态方法添加由选择器创建的所有参数类型ConnectionInformationSelector # createParameterTypes (ConnectionInformationSelector)。选择器默认使用key创建单个参数connection_entry并且,如果存在输入端口,则添加一个条件,以便在连接输入端口已连接时隐藏参数。

  3. 如果你实现了ConnectionSelectionProvider接口,将字段提供给getter方法,并将setter保留为无操作方法。如果您有多个需要特定选择器的操作符,则可以使用该接口,但大多数用例不需要此接口。

  4. doWork方法检索指定的连接时,调用ConnectionInformationSelector # getConnection。如果没有指定连接,该方法将自动抛出UserError,因此永远不会返回。然后,该连接可以与处理程序的中心方法一起使用(请参阅上面处理程序部分的最后一点),以与您的连接类型所代表的系统建立连接。之后,您可以执行任何必要的操作。

  5. 在最后doWork方法,别忘了调用ConnectionInformationSelector # passDataThroughConnectionInformationSelector # passCloneThrough如果选择器中有输入和输出端口来传递数据,无论是作为原始数据还是作为克隆数据。通过这种方式,可以很容易地将使用相同连接的操作符链接起来。