Search Mailing List Archives


Limit search to: Subject & Body Subject Author
Sort by: Reverse Sort
Limit to: All This Week Last Week This Month Last Month
Select Date Range     through    

[protege-dev] [protege-discussion] Problem with events and database backing

clemens utschig clemens.utschig at gmail.com
Mon Feb 17 09:42:13 PST 2014


start of the protege app

       Application.main(new String[] {});

ProjectManager.getProjectManager().setExitVMOnApplicationExit(false);

ProjectManager.getProjectManager().setCurrentProject(p1.getProject(),
false, false);


later ...

            new Thread(new Runnable() {
                public void run() {
                   boolean dispatchEnabled =
p1.setDispatchEventsEnabled(false);
                   try
                   {
                       bean1.getKnowledgeBundleOntologyFactory().
                           createEntity("bean1Entity" +
System.currentTimeMillis());
                   } finally {
                      if (dispatchEnabled)
                      {
                         p1.setDispatchEventsEnabled(true);
                      }
                      SwingUtilities.invokeLater(new Runnable() {
                         public void run() {
                            p1.flushEvents();
                         }
                       });
                   }
                 }
              }).start();

meanwhile I am clicking in the protege app - and once on an instance, (any
instance) - I get the deadlock ... :-(

anything I am missing here?



On Mon, Feb 17, 2014 at 6:29 PM, clemens utschig
<clemens.utschig at gmail.com>wrote:

> I cant change the protege app ... the problem is that instances are
> updated underneath - via API and if i then use the protege application I
> get the deadlock ...
>
>         at
> edu.stanford.smi.protege.model.DefaultCls.createDirectInstance(DefaultCls.java:49)
> ************************************************** this is the api creating
> the thing
>          at
> org.soacommunity.platform.a2x.ontology.A2XOntologyFactory.createEntity(A2XOntologyFactory.java:445)
>         at
> TestConcurrentBundles.testBundleEvents(TestConcurrentBundles.java:90)
>
> I tried to use the swing utilities (as in the wiki) to do the above update
> (in its own thread) - but unfortunately no luck ...
>
> I cant' turn off events as I have a few listeners myself ...
>
> Cheers
>
>
>
> On Mon, Feb 17, 2014 at 4:32 PM, clemens utschig <
> clemens.utschig at gmail.com> wrote:
>
>> ok next step, a deadlock if I try to update an instance directly in the
>> knowledgebase with the protege app sitting on the same project instance
>>
>> Base)
>>         at
>> edu.stanford.smi.protege.model.DefaultKnowledgeBase.createInstance(De
>> faultKnowledgeBase.java:412)
>>         - locked <0x286513c8> (a
>> edu.stanford.smi.protege.model.DefaultKnowledge
>> Base)
>>         at
>> edu.stanford.smi.protege.model.DefaultKnowledgeBase.createInstance(De
>> faultKnowledgeBase.java:407)
>>         - locked <0x286513c8> (a
>> edu.stanford.smi.protege.model.DefaultKnowledge
>> Base)
>>         at
>> edu.stanford.smi.protege.model.DefaultKnowledgeBase.createInstance(De
>> faultKnowledgeBase.java:399)
>>         - locked <0x286513c8> (a
>> edu.stanford.smi.protege.model.DefaultKnowledge
>> Base)
>>         at
>> edu.stanford.smi.protege.model.DefaultCls.createDirectInstance(Defaul
>> tCls.java:49)
>>         at
>> org.soacommunity.platform.a2x.ontology.A2XOntologyFactory.createEntit
>> y(A2XOntologyFactory.java:445)
>>         at
>> TestConcurrentBundles.testBundleEvents(TestConcurrentBundles.java:90)
>>
>>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>         at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
>> java:39)
>>         at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
>> sorImpl.java:25)
>>         at java.lang.reflect.Method.invoke(Method.java:597)
>>         at
>> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(Framework
>> Method.java:45)
>>         at
>> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCal
>> lable.java:15)
>>         at
>> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMe
>> thod.java:42)
>>         at
>> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMet
>> hod.java:20)
>>         at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
>>         at
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRun
>> ner.java:68)
>>         at
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRun
>> ner.java:47)
>>         at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
>>         at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
>>         at
>> org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
>>         at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
>>         at
>> org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
>>         at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
>>         at
>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4
>> TestReference.java:46)
>>         at
>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution
>> .java:38)
>>         at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Remot
>> eTestRunner.java:467)
>>         at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Remot
>> eTestRunner.java:683)
>>         at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTest
>> Runner.java:390)
>>         at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTes
>> tRunner.java:197)
>>
>> "VM Thread" prio=10 tid=0x02b3c800 nid=0x1b70 runnable
>>
>> "VM Periodic Task Thread" prio=10 tid=0x02b96000 nid=0x232c waiting on
>> condition
>>
>>
>> JNI global references: 2250
>>
>>
>> Found one Java-level deadlock:
>> =============================
>> "AWT-EventQueue-0":
>>   waiting to lock monitor 0x02b7bf24 (object 0x286513c8, a
>> edu.stanford.smi.prot
>> ege.model.DefaultKnowledgeBase),
>>   which is held by "main"
>> "main":
>>   waiting to lock monitor 0x0329a604 (object 0x27f7d4d0, a
>> java.awt.Component$AW
>> TTreeLock),
>>   which is held by "AWT-EventQueue-0"
>>
>> Java stack information for the threads listed above:
>> ===================================================
>> "AWT-EventQueue-0":
>>         at
>> edu.stanford.smi.protege.model.DefaultKnowledgeBase.getSystemFrames(D
>> efaultKnowledgeBase.java:127)
>>         - waiting to lock <0x286513c8> (a
>> edu.stanford.smi.protege.model.Default
>> KnowledgeBase)
>>         at
>> edu.stanford.smi.protege.model.DefaultFrame.isSystem(DefaultFrame.jav
>> a:334)
>>         at
>> edu.stanford.smi.protege.model.DefaultFrame.isIncluded(DefaultFrame.j
>> ava:330)
>>         at
>> edu.stanford.smi.protege.model.DefaultFrame.isEditable(DefaultFrame.j
>> ava:322)
>>         at
>> edu.stanford.smi.protege.ui.FrameRenderer.load(FrameRenderer.java:107
>> )
>>         at
>> edu.stanford.smi.protege.util.DefaultRenderer.setup(DefaultRenderer.j
>> ava:464)
>>         at
>> edu.stanford.smi.protege.util.DefaultRenderer.getTreeCellRendererComp
>> onent(DefaultRenderer.java:230)
>>         at
>> javax.swing.plaf.basic.BasicTreeUI$NodeDimensionsHandler.getNodeDimen
>> sions(BasicTreeUI.java:2712)
>>         at
>> javax.swing.tree.AbstractLayoutCache.getNodeDimensions(AbstractLayout
>> Cache.java:475)
>>         at
>> javax.swing.tree.FixedHeightLayoutCache.getBounds(FixedHeightLayoutCa
>> che.java:535)
>>         at
>> javax.swing.tree.FixedHeightLayoutCache.getBounds(FixedHeightLayoutCa
>> che.java:169)
>>         at
>> javax.swing.tree.AbstractLayoutCache.getPreferredWidth(AbstractLayout
>> Cache.java:215)
>>         at
>> javax.swing.plaf.basic.BasicTreeUI.updateCachedPreferredSize(BasicTre
>> eUI.java:1820)
>>         at
>> javax.swing.plaf.basic.BasicTreeUI.getPreferredSize(BasicTreeUI.java:
>> 1921)
>>         at
>> javax.swing.plaf.basic.BasicTreeUI.getPreferredSize(BasicTreeUI.java:
>> 1909)
>>         at javax.swing.JComponent.getPreferredSize(JComponent.java:1634)
>>         at
>> javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:76
>> 9)
>>         at java.awt.Container.layout(Container.java:1421)
>>         at java.awt.Container.doLayout(Container.java:1410)
>>         at java.awt.Container.validateTree(Container.java:1507)
>>         at java.awt.Container.validate(Container.java:1480)
>>         - locked <0x27f7d4d0> (a java.awt.Component$AWTTreeLock)
>>         at
>> javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.j
>> ava:669)
>>         at
>> javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(System
>> EventQueueUtilities.java:124)
>>         at
>> java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
>>         at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
>>         at java.awt.EventQueue.access$000(EventQueue.java:84)
>>         at java.awt.EventQueue$1.run(EventQueue.java:602)
>>         at java.awt.EventQueue$1.run(EventQueue.java:600)
>>         at java.security.AccessController.doPrivileged(Native Method)
>>         at
>> java.security.AccessControlContext$1.doIntersectionPrivilege(AccessCo
>> ntrolContext.java:87)
>>         at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
>>         at
>> java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
>> ad.java:269)
>>         at
>> java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
>> java:184)
>>         at
>> java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
>> ad.java:174)
>>         at
>> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
>>
>>         at
>> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
>>
>>         at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
>> "main":
>>         at java.awt.Component.setFont(Component.java:1798)
>>         - waiting to lock <0x27f7d4d0> (a java.awt.Component$AWTTreeLock)
>>         at java.awt.Container.setFont(Container.java:1554)
>>         at javax.swing.JComponent.setFont(JComponent.java:2723)
>>         at
>> edu.stanford.smi.protege.util.DefaultRenderer.setup(DefaultRenderer.j
>> ava:451)
>>         at
>> edu.stanford.smi.protege.util.DefaultRenderer.getTreeCellRendererComp
>> onent(DefaultRenderer.java:230)
>>         at
>> javax.swing.plaf.basic.BasicTreeUI$NodeDimensionsHandler.getNodeDimen
>> sions(BasicTreeUI.java:2712)
>>         at
>> javax.swing.tree.AbstractLayoutCache.getNodeDimensions(AbstractLayout
>> Cache.java:475)
>>         at
>> javax.swing.tree.FixedHeightLayoutCache.getBounds(FixedHeightLayoutCa
>> che.java:535)
>>         at
>> javax.swing.tree.FixedHeightLayoutCache.getBounds(FixedHeightLayoutCa
>> che.java:181)
>>         at
>> javax.swing.plaf.basic.BasicTreeUI.getPathBounds(BasicTreeUI.java:510
>> )
>>         at
>> javax.swing.plaf.basic.BasicTreeUI.getPathBounds(BasicTreeUI.java:503
>> )
>>         at javax.swing.JTree.getPathBounds(JTree.java:2063)
>>         at javax.swing.JTree.getRowBounds(JTree.java:2076)
>>         at
>> edu.stanford.smi.protege.util.DefaultRenderer.getPreferredSize(Defaul
>> tRenderer.java:138)
>>         at
>> javax.swing.plaf.basic.BasicTreeUI$NodeDimensionsHandler.getNodeDimen
>> sions(BasicTreeUI.java:2721)
>>         at
>> javax.swing.tree.AbstractLayoutCache.getNodeDimensions(AbstractLayout
>> Cache.java:475)
>>         at
>> javax.swing.tree.FixedHeightLayoutCache.getBounds(FixedHeightLayoutCa
>> che.java:535)
>>         at
>> javax.swing.tree.FixedHeightLayoutCache.getBounds(FixedHeightLayoutCa
>> che.java:181)
>>         at
>> javax.swing.plaf.basic.BasicTreeUI.getPathBounds(BasicTreeUI.java:510
>> )
>>         at
>> javax.swing.plaf.basic.BasicTreeUI.getPathBounds(BasicTreeUI.java:503
>> )
>>         at
>> javax.swing.plaf.basic.BasicTreeUI$Handler.treeNodesChanged(BasicTree
>> UI.java:3765)
>>         at
>> javax.swing.tree.DefaultTreeModel.fireTreeNodesChanged(DefaultTreeMod
>> el.java:468)
>>         at
>> javax.swing.tree.DefaultTreeModel.nodesChanged(DefaultTreeModel.java:
>> 330)
>>         at
>> javax.swing.tree.DefaultTreeModel.nodeChanged(DefaultTreeModel.java:2
>> 61)
>>         at
>> edu.stanford.smi.protege.util.LazyTreeRoot.notifyNodeChanged(LazyTree
>> Root.java:84)
>>         at
>> edu.stanford.smi.protege.util.LazyTreeNode.notifyNodeChanged(LazyTree
>> Node.java:368)
>>         at
>> edu.stanford.smi.protege.util.LazyTreeNode.notifyNodeChanged(LazyTree
>> Node.java:368)
>>         at
>> edu.stanford.smi.protege.util.LazyTreeNode.notifyNodeChanged(LazyTree
>> Node.java:368)
>>         at
>> edu.stanford.smi.protege.ui.ParentChildNode.notifyNodeChanged(ParentC
>> hildNode.java:130)
>>         at
>> edu.stanford.smi.protege.ui.ParentChildNode$1.directInstanceAdded(ParentChildNode.java:42)
>> ****************************************************** UI Listener?
>>         at
>> edu.stanford.smi.protege.model.framestore.EventDispatchFrameStore.dispatchClsEvent(EventDispatchFrameStore.java:425)
>>         at
>> edu.stanford.smi.protege.model.framestore.EventDispatchFrameStore.dis
>> patchEvent(EventDispatchFrameStore.java:296)
>>         at
>> edu.stanford.smi.protege.model.framestore.EventDispatchFrameStore.dis
>> patchEvents(EventDispatchFrameStore.java:269)
>>         at
>> edu.stanford.smi.protege.model.framestore.EventDispatchFrameStore.dis
>> patchEvents(EventDispatchFrameStore.java:241)
>>         - locked <0x286513c8> (a
>> edu.stanford.smi.protege.model.DefaultKnowledge
>> Base)
>>         at
>> edu.stanford.smi.protege.model.framestore.EventDispatchFrameStore.dis
>> patchEvents(EventDispatchFrameStore.java:232)
>>         at
>> edu.stanford.smi.protege.model.framestore.EventDispatchFrameStore.cre
>> ateSimpleInstance(EventDispatchFrameStore.java:814)
>>         at
>> edu.stanford.smi.protege.model.framestore.undo.CreateSimpleInstanceCo
>> mmand.doIt(CreateSimpleInstanceCommand.java:22)
>>         at
>> edu.stanford.smi.protege.model.framestore.undo.UndoFrameStore.simpleC
>> ommandExecute(UndoFrameStore.java:90)
>>         at
>> edu.stanford.smi.protege.model.framestore.undo.UndoFrameStore.execute
>> (UndoFrameStore.java:84)
>>         at
>> edu.stanford.smi.protege.model.framestore.undo.UndoFrameStore.createS
>> impleInstance(UndoFrameStore.java:171)
>>         at
>> edu.stanford.smi.protege.model.framestore.ArgumentCheckingFrameStore.
>> createSimpleInstance(ArgumentCheckingFrameStore.java:137)
>>         at
>> edu.stanford.smi.protege.model.framestore.ChangeMonitorFrameStore.cre
>> ateSimpleInstance(ChangeMonitorFrameStore.java:46)
>>         at
>> edu.stanford.smi.protege.model.framestore.FrameStoreAdapter.createSim
>> pleInstance(FrameStoreAdapter.java:306)
>>         at
>> edu.stanford.smi.protege.model.framestore.FrameStoreAdapter.createSim
>> pleInstance(FrameStoreAdapter.java:306)
>>         at
>> edu.stanford.smi.protege.model.framestore.ImmutableNamesFrameStore.cr
>> eateSimpleInstance(ImmutableNamesFrameStore.java:89)
>>         at
>> edu.stanford.smi.protege.model.DefaultKnowledgeBase.createSimpleInsta
>> nce(DefaultKnowledgeBase.java:230)
>>         - locked <0x286513c8> (a
>> edu.stanford.smi.protege.model.DefaultKnowledge
>> Base)
>>         at
>> edu.stanford.smi.protege.model.DefaultKnowledgeBase.createInstance(De
>> faultKnowledgeBase.java:430)
>>         - locked <0x286513c8> (a
>> edu.stanford.smi.protege.model.DefaultKnowledge
>> Base)
>>         at
>> edu.stanford.smi.protege.model.DefaultKnowledgeBase.createInstance(De
>> faultKnowledgeBase.java:412)
>>         - locked <0x286513c8> (a
>> edu.stanford.smi.protege.model.DefaultKnowledge
>> Base)
>>         at
>> edu.stanford.smi.protege.model.DefaultKnowledgeBase.createInstance(De
>> faultKnowledgeBase.java:407)
>>         - locked <0x286513c8> (a
>> edu.stanford.smi.protege.model.DefaultKnowledge
>> Base)
>>         at
>> edu.stanford.smi.protege.model.DefaultKnowledgeBase.createInstance(De
>> faultKnowledgeBase.java:399)
>>         - locked <0x286513c8> (a
>> edu.stanford.smi.protege.model.DefaultKnowledge
>> Base)
>>         at
>> edu.stanford.smi.protege.model.DefaultCls.createDirectInstance(DefaultCls.java:49)
>> ************************************************** this is the api creating
>> the thing
>>         at
>> org.soacommunity.platform.a2x.ontology.A2XOntologyFactory.createEntit
>> y(A2XOntologyFactory.java:445)
>>         at
>> TestConcurrentBundles.testBundleEvents(TestConcurrentBundles.java:90)
>>
>>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>         at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
>> java:39)
>>         at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
>> sorImpl.java:25)
>>         at java.lang.reflect.Method.invoke(Method.java:597)
>>         at
>> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(Framework
>> Method.java:45)
>>         at
>> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCal
>> lable.java:15)
>>         at
>> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMe
>> thod.java:42)
>>         at
>> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMet
>> hod.java:20)
>>         at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
>>         at
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRun
>> ner.java:68)
>>         at
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRun
>> ner.java:47)
>>         at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
>>         at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
>>         at
>> org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
>>         at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
>>         at
>> org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
>>         at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
>>         at
>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4
>> TestReference.java:46)
>>         at
>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution
>> .java:38)
>>         at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Remot
>> eTestRunner.java:467)
>>         at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Remot
>> eTestRunner.java:683)
>>         at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTest
>> Runner.java:390)
>>         at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTes
>> tRunner.java:197)
>>
>> Found 1 deadlock.
>>
>> -------------------------
>> Arg ...
>>
>>
>> On Mon, Feb 17, 2014 at 12:56 PM, clemens utschig <
>> clemens.utschig at gmail.com> wrote:
>>
>>> So, i got to the point of sneaking a kb object under the protege app at
>>> runtime -
>>> pretty much a new constructor in project (using the code from the one
>>> with uri, and calling all the methods) and then projectmanager.getpm.
>>> setcurrentproject...
>>>
>>>     public Project(KnowledgeBase base, Collection errors, URI
>>> projectUri)
>>>     {
>>>         if (log.isLoggable(Level.FINE)) {
>>>           log.fine("Creating Project " + "HACK" + " multiserver = " +
>>> isMultiUserServer);
>>>         }
>>>         setProjectURI(projectUri);
>>>         _projectKB = base; // loadProjectKB(uri, factory, errors);
>>>
>>>         ProjectFixupsPluginManager.fixProject(_projectKB);
>>>         removeUnreferencedInstances(_projectKB);
>>>
>>>         if (_projectKB != null) {
>>>             _projectInstance = getProjectInstance(_projectKB);
>>>         }
>>>
>>>         createDomainKnowledgeBase(base.getKnowledgeBaseFactory(),
>>> errors, true);
>>>         setupJournaling();
>>>         updateKBNames();
>>>     }
>>>
>>> Seriously - almost there, but now i really need your help - all the
>>> default widgets are working - but when i click on an instance within the
>>> instances tab the instance form does not show? no error whatsoever
>>>
>>> If i use the default project constructor (with a string) and do the same
>>> thing - the instance form does show up.. Unfortunately i cant debug into
>>> this with all the threads running around, so i really need some advice here
>>> - is there some other magic? some flag needed to be set...
>>>
>>> On Sunday, February 16, 2014, clemens utschig <clemens.utschig at gmail.com>
>>> wrote:
>>> > Hey timothy - first of all thanks a ton for the reply.
>>> >
>>> > Yes i am on version 3.5.. The problem is that i cant create a server
>>> project first as i use the ontology to configure a (remote) application on
>>> the fly - and want to use the protege app to do configuration on top of
>>> that - think of the ontology as a graph within a deployable server app. And
>>> i dont want to start messing with two servers (my own and its lifecyle and
>>> the protege one ;-)
>>> >
>>> > I'll try to tweak the protege app tmrw a little - and see if i can
>>> sneak a project instance underneath it on the fly (rather than it *owning*
>>> and opening a uri..)..
>>> >
>>> > If you have some other super smart idea, any help is appreciated...
>>> >
>>> > Cheers from germany, i actually studied at stanford during my time in
>>> san francisco ;-)
>>> >
>>> > On Saturday, February 15, 2014, Timothy Redmond <tredmond at stanford.edu>
>>> wrote:
>>> >>
>>> >> Just in case you didn't see my reply.
>>> >>
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.stanford.edu/pipermail/protege-dev/attachments/20140217/314d7e66/attachment-0001.html>


More information about the protege-dev mailing list