0
头像

DocumentOperation 在部署时表现不同

你好

不知何故,我在这里看到了一个模式。我有一个 DocumentOperation,它在从 IDE 启动时工作正常,但在作为插件运行时表现不同。 

这可能与: https://support.geneious.com/hc/en-us/community/posts/115001972371-Plugin-works-only-from-IDE-not-in-packaged-form-Why有关 

包 de.mpicbg.gef;

导入 com.biomatters.geneious.publicapi.components.Dialogs;
导入 com.biomatters.geneious.publicapi.databaseservice.DatabaseServiceException;
导入 com.biomatters.geneious.publicapi.documents.AnnotatedPluginDocument;
导入 com.biomatters.geneious.publicapi.documents.sequence.SequenceAnnotation;
导入 com.biomatters.geneious.publicapi.documents.sequence.SequenceDocument;
导入 com.biomatters.geneious.publicapi.plugin.*;
导入 jebl.util.ProgressListener;

导入 java.util.ArrayList;
导入 java.util.LinkedList;
导入 java.util.List;

/**
* 由 Stephan Janosch 于 17 年 11 月 17 日创建。
*/
公共类 GefPrimerOperation 扩展了 DocumentOperation {


@覆盖
公共 GeneiousActionOptions getActionOptions() {
GeneiousActionOptions actionOptions = new GeneiousActionOptions("围绕注释创建引物", "围绕注释生成引物", null, GeneiousActionOptions.Category.None);
actionOptions.setMainMenuLocation(GeneiousActionOptions.MainMenu.Sequence);
actionOptions.setInMainToolbar(false);

返回操作选项;
}

@覆盖
公共字符串 getHelp() {
返回 ””;
}

@覆盖
公共 DocumentSelectionSignature[] getSelectionSignatures() {
DocumentSelectionSignature sequenceSelSig = new DocumentSelectionSignature(SequenceDocument.class, 1, 100);
返回新的 DocumentSelectionSignature[]{sequenceSelSig};
}


@覆盖
public void performOperation(AnnotatedPluginDocument[] annotatedDocuments, ProgressListener progressListener, Options options, SequenceSelection sequenceSelection, OperationCallback callback) 抛出 DocumentOperationException {

String tagType = options.getValueAsString("tagType");

int i = 0;
for (AnnotatedPluginDocument 文档:annotatedDocuments) {
我++;
progressListener.setProgress(i, annotatedDocuments.length);
SequenceDocument sequenceDocument = (SequenceDocument) document.getDocument();
//找到标签
SequenceAnnotation tagAnnotation = null;
for (SequenceAnnotation 注解:sequenceDocument.getSequenceAnnotations()) {
if (tagAnnotation == null && annotation.getType().equalsIgnoreCase(tagType))
tagAnnotation = 注释;
else if (annotation.getType().equalsIgnoreCase(tagType))
throw new DocumentOperationException("在以下位置找到更多的标签:" + document.getName());
}

if (tagAnnotation == null)
throw new DocumentOperationException("在以下位置找不到标签:" + document.getName());

String fromPosition = String.valueOf(tagAnnotation.getInterval().getMinimumIndex());
String toPosition = String.valueOf(tagAnnotation.getInterval().getMaximumIndex());

DocumentOperation primeOperation = PluginUtilities.getDocumentOperation("Operation_com.biomatters.plugins.primerDesign.DesignAnnotationGenerator");

选项primerOperationOptions =primerOperation.getOptions(document);

// System.out.println(primerOperationOptions.getDescriptionAndState());
// System.out.println("可用选项:" +primerOperationOptions.getNamesAndValues(true));

断言primerOperationOptions.setStringValue("taskOptions.chooser", "designNewOptions");
断言primerOperationOptions.setStringValue("taskOptions.designNewOptions.oligosToPickOptions.forwardOption", "true");
断言primerOperationOptions.setStringValue("taskOptions.designNewOptions.oligosToPickOptions.reverseOption", "true");
断言primerOperationOptions.setStringValue("taskOptions.designNewOptions.oligosToPickOptions.probeOption", "false");

断言primerOperationOptions.setStringValue("panelForRegionType.designRegionTypeOption", "genericOptionValue");
断言primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.enableIncludedRegionOption", "false");

断言primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.enableTargetRegionOption", "true");
断言primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.targetRegionFromOption", fromPosition);
断言primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.targetRegionToOption", toPosition);

断言primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.enableProductSizeOption", "true");
断言primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.productSizeFromOption", options.getValueAsString("productSizeFromOption"));
断言primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.productSizeToOption", options.getValueAsString("productSizeToOption"));

断言primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.enableOptimalProductSizeOption", "false");
断言primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.numPairsOption", "1");


尝试 {
callback.setSubFolder("启动序列");
} catch (DatabaseServiceException e) {
e.printStackTrace();
}
primerOperation.performOperation(new AnnotatedPluginDocument[]{document},ProgressListener.EMPTY,primerOperationOptions,sequenceSelection,callback);

}

}


@覆盖
公共选项 getOptions(DocumentOperationInput operationInput) 抛出 DocumentOperationException {
选项 options = new Options(getClass());
options.addLabel("选择标签的注释类型:");
Options.OptionValue preselectedTag = null;
列表<String>tagTypeList = 新的 LinkedList<String> ();
for (AnnotatedPluginDocument doc : operationInput.getInputDocumentsList()) {
SequenceDocument 序列文档 = null;
if (doc.getDocument() instanceof SequenceDocument) {
sequenceDocument = (SequenceDocument) doc.getDocument();
}
if (sequenceDocument == null)
继续;
for (SequenceAnnotation 注解:sequenceDocument.getSequenceAnnotations()) {
String annoType = annotation.getType().toLowerCase();
if (!tagTypeList.contains(annoType) && annoType != null && !annoType.isEmpty())
tagTypeList.add(annoType);
}
}

如果 (tagTypeList.isEmpty())
throw new DocumentOperationException("没有找到注释");

final Options.OptionValue[] optionValues = new Options.OptionValue[tagTypeList.size()];
int i = 0;
for (String tagTypeString : tagTypeList) {
Options.OptionValue value = new Options.OptionValue(tagTypeString, tagTypeString);
选项值[i] = 值;
if (tagTypeString.equalsIgnoreCase("tag"))
preselectedTag = optionValues[i];
我++;
}
options.addComboBoxOption("tagType", "选择标记的注释类型", optionValues, preselectedTag);
options.addIntegerOption("productSizeFromOption", "product size from", 1000);
options.addIntegerOption("productSizeToOption", "产品尺寸到", 3000);

退货选项;
}
}


我检查了我的项目设置,它们符合设置指南。

为了完整起见,我也发布了我的构建文件:


<?xml version="1.0" ?>

<project name="GefPrimerPlugin" default="distribute" basedir=".">

<property file="plugin.properties"/>
<property name="build" location="build"/>
<property name="classes" location="classes"/>
<property name="src" location="src"/>

<path id="classpath">
<fileset dir="../../geneiousPlugins/geneious-10.2.3-devkit/examples/GeneiousFiles/lib">
<include name="GeneiousPublicAPI.jar"/>
<include name="jdom.jar"/>
<include name="jebl.jar"/>
</fileset>
</path>

<target name= "distribute" depends="build">
<copy file="${build}/${short-plugin-name}.jar" tofile="${build}/${short-plugin-name}.gplugin"/>
<echo message="Created ${build}/${short-plugin-name}.gplugin"/>

<!--If your plugin consists of a folder you should build it into
一个扩展名为 gplugin 的 zip 文件。请参阅下面的评论示例。
删除上面的行并取消注释这些以使用-->
<!--
<zip zipfile="${build}/${short-plugin-name}.gplugin">
<fileset dir="${build}/${plugin-name}"/>
</zip>
-->
</target>

<target name="build" depends="compile">
<jar jarfile="${build}/${short-plugin-name}.jar">
<fileset dir="${classes}"/>
<fileset dir="">
<include name="plugin.properties"/>
</fileset>
</jar>

<!--build example for folder type plugin.删除上面
行并取消注释这些以使用-->
<!--
<jar jarfile="${build}/${short-plugin-name}.jar">
<fileset dir="${classes}"/>
</jar>
<mkdir dir="${build}/${plugin-name}"/>
<copy todir="${build}/${plugin-name}">
<fileset dir="${build}">
<include name="ExtraFiles"/>
<include name="ExtraFiles/*"/>
<include name="${short-plugin-name}.jar"/>
</fileset>
<fileset dir="docs">
<include name="readme.txt"/>
</fileset>
</copy>
-->
</target>

<target name="compile" depends="prepare">
<javac target="1.8" source="1.8" destdir="${classes}" debug="true">
<classpath refid="classpath"/>
<src path="${src}"/>
</javac>
</target>

<target name="prepare">
<mkdir dir="${build}"/>
<mkdir dir="${classes}"/>
</target>

<target name="clean">
<delete dir="${build}"/>
<delete dir="${classes}"/>
</target>
</project>

一头雾水,
斯蒂芬

 

 

斯蒂芬·雅诺施

2 条评论

0
头像

哈!我找到了罪魁祸首!在插件形式中,Geneious 没有正确设置选项。看看屏幕截图!

相同的代码产生不同的结果。然后我尝试了一些东西。删除断言。 

现在看起来像这样:

primerOperationOptions.setStringValue("taskOptions.chooser", "designNewOptions");
primerOperationOptions.setStringValue("taskOptions.designNewOptions.oligosToPickOptions.forwardOption", "true");
primerOperationOptions.setStringValue("taskOptions.designNewOptions.oligosToPickOptions.reverseOption", "true");
primerOperationOptions.setStringValue("taskOptions.designNewOptions.oligosToPickOptions.probeOption", "false");

primerOperationOptions.setStringValue("panelForRegionType.designRegionTypeOption", "genericOptionValue");
primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.enableIncludedRegionOption", "false");

primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.enableTargetRegionOption", "true");
primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.targetRegionFromOption", fromPosition);
primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.targetRegionToOption", toPosition);

primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.enableProductSizeOption", "true");
primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.productSizeFromOption", options.getValueAsString("productSizeFromOption"));
primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.productSizeToOption", options.getValueAsString("productSizeToOption"));

primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.enableOptimalProductSizeOption", "false");
primerOperationOptions.setStringValue("panelForRegionType.genericRegionOptions.numPairsOption", "1");

瞧,它有效! 

案件已结。我会尽快检查我的其他插件!

*快乐的*
斯蒂芬

BTW> 我现在不明白,为什么 assert 关键字在那里有所不同。我不是 Java 专家,无法理解有和没有 _assert_ 的区别。

 

 

斯蒂芬·雅诺施 0 票
评论动作 永久链接
0
头像

哦!这就解释了。  抱歉,我应该在查看您的其他插件时发现这一点。

您的断言中有实际的生产代码。  Java 中的断言仅在您为 JVM 提供标志 -ea 即启用断言时运行。  所以那些断言行根本没有运行。

我们在随开发工具包提供的 IDE 项目中执行此操作,因为这也是我们自己在内部设置项目的方式。  但是我们不会为分发启用断言以避免在断言错误的情况下导致我们的用户崩溃。  我们将它们视为在开发过程中使用的工具。

希望能解释清楚。

干杯,
马修

马修·张 0 票
评论动作 永久链接