【发布时间】:2012-04-28 10:37:24
【问题描述】:
我想使用小程序来更改存储库。为此,我编写了以下代码:
加载本体:
package owlapi.loader;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.io.*;
import org.semanticweb.owlapi.model.*;
import org.semanticweb.owlapi.util.DefaultPrefixManager;
import org.semanticweb.owlapi.util.OWLEntityRenamer;
import java.io.File;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class LoadOntology {
private static String ontologyDir = "./owlapi/loader/featurepool.owl";
private static OWLOntology localOntology;
private static OWLOntologyManager manager;
private static OWLDataFactory factory;
private static PrefixManager pm = new DefaultPrefixManager("http://wise.vub.ac.be/Members/lamia/variability/Feature_Assembly/FAM.owl#");
public LoadOntology() {
manager = OWLManager.createOWLOntologyManager();
File file = new File(ontologyDir);
try {
localOntology = manager.loadOntologyFromOntologyDocument(file);
System.out.println("Loaded ontology: " + localOntology);
factory = manager.getOWLDataFactory();
}
catch (UnparsableOntologyException e) {
System.out.println("Could not parse the ontology: " + e.getMessage());
Map<OWLParser, OWLParserException> exceptions = e.getExceptions();
for (OWLParser parser : exceptions.keySet()) {
System.out.println("Tried to parse the ontology with the " + parser.getClass().getSimpleName() + " parser");
System.out.println("Failed because: " + exceptions.get(parser).getMessage());
}
}
catch (UnloadableImportException e) {
System.out.println("Could not load import: " + e.getImportsDeclaration());
OWLOntologyCreationException cause = e.getOntologyCreationException();
System.out.println("Reason: " + cause.getMessage());
}
catch (OWLOntologyCreationException e) {
System.out.println("Could not load ontology: " + e.getMessage());
}
}
public void addInstance(String Class, String individual) {
OWLClass owlClass = factory.getOWLClass(Class, pm);
OWLClass superClass = factory.getOWLThing();
OWLIndividual instance = factory.getOWLNamedIndividual(individual, pm);
OWLClassAssertionAxiom classAssertion1 = factory.getOWLClassAssertionAxiom(superClass, instance);
manager.addAxiom(localOntology, classAssertion1);
OWLClassAssertionAxiom classAssertion2 = factory.getOWLClassAssertionAxiom(owlClass, instance);
manager.addAxiom(localOntology, classAssertion2);
System.out.println("Instance added");
}
}
InJava(用 javascript 加载的小程序):
public class InJava extends Applet{
private static LoadOntology loadedOntology;
public void addInstance(String Class, String individual) {
Graphics g = getGraphics();
g.drawString("Test", 10, 10);
loadedOntology = new LoadOntology();
loadedOntology.addInstance(Class, individual);
}
}
当我加载小程序时,完全没有错误,但是当我尝试调用方法addInstance时:
<input type="button" value="call Java Applet method" onClick = 'document.owlapi.addInstance("Abstract_Feature", "New_Test")'>
<APPLET CODE="owlapi/InJava.class" NAME="owlapi" HEIGHT=100 WIDTH=100> </APPLET>
浏览器抛出错误Uncaught Error: Error calling method on NPObject. 在stackoverflow上阅读了一些关于此的问题后,我得出的结论是插件一定有问题。
我在有效的方法(drawString("Test", 10, 10))中添加了一些测试代码,所以我建议构造 LoadOntology 类会产生一些问题(这个类在完美作品中单独测试过在其自己的)。有人看到我做错了吗?
更新: 我添加了小程序使用的 java 类的一部分:存储库加载器。所有提供的代码都应该编译。
更新:我没有使用MASCRIPT/SCRIPTABLE,因为代码基于this 示例,该示例适用于我当前的浏览器(chrome)
更新:您必须将 owlapi jars 包含到构建路径中,可以下载 here
【问题讨论】:
-
“有人知道我做错了什么吗?” 如果您链接到损坏的小程序并发布失败代码的SSCCE,我们可能会有更好的主意。顺便说一句 - 如果该小程序与 JavaScript 交互,为什么它不声明
MAYSCRIPT/SCRIPTABLE? JS 是做什么的? -
我添加了一些额外的信息,感谢您的回复
-
1) “所有提供的代码都应该编译。” 只有当你下载了
owlapi并且它在编译类路径中。这两种情况都不是。 2) 如果小程序确实需要owlapi,则需要将其添加到小程序的运行时类路径中。 3)那个链接呢? 4)File file = new File(ontologyDir);这在沙盒小程序中不起作用。如果该资源在您的服务器上,它甚至不适用于受信任的小程序。在后一种情况下,通过 URL 访问它。 5) 就 HTML、类和 API Jars 的位置而言,服务器的结构是什么? -
顺便说一句 - 我认为你正处于这样一个阶段,你应该在没有任何 JS 参与的情况下让这一切都在纯 HTML 中工作,我认为这会引发问题。但发射还有问题,应该先排序。
-
对。这将是另一个传奇。 1)我的观点是我不会那样做(这次不那么微妙)我会比大多数人更进一步试图提供帮助,但是下载一个 API 只是为了解决这样的问题?没有。2)它们需要添加到存档属性中。 3) 我指的不是Real's HowTo 上的链接。我说的是互联网上小程序的链接。你说你只有在本地磁盘上。加载它。您显然可以访问某个站点。 4)'..只用本地文件解决(?)'不是真的。 URL 将在本地文件系统(或 WWW 或类路径)上工作..
标签: java javascript html applet