Interfacing to DictionaryForMids

Started by njp, 14. April 2008, 18:02:19

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

njp

Hello there,

I've downloaded the DictionaryForMIDs_engdeu_DTS.jar from the dicts.info site and added it to my project in netbeans.

I have a basic Form

public class LwlPlay extends Form implements CommandListener, ItemStateListener, TranslationExecutionCallback{
}


with this line in the constructor...

TranslationExecution.setTranslationExecutionCallback(this);

with the following implementations for the TranslationExecutionCallback interface...

    public void newTranslationResult(TranslationResult resultOfTranslation)
    {
        if (resultOfTranslation.translationFound)
        {
            Enumeration temp = resultOfTranslation.translations.elements();
           
            while(temp.hasMoreElements())
            {
                SingleTranslation t = (SingleTranslation)temp.nextElement();
                append(new StringItem(t.fromText.toString(), t.toText.toString()));
            }
        }
    }

    public void deletePreviousTranslationResult()
    {

    }

during an event when a button is clicked I execute this...

                try
                {
                    TranslationExecution.executeTranslation("hello", false);
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }

if executeInBackground is false, I get the following exception...

java.lang.NullPointerException
        at de.kugihan.dictionaryformids.general.Util.memCheck(+3)
        at de.kugihan.dictionaryformids.translation.Translation.getTranslationResult(+20)
        at de.kugihan.dictionaryformids.translation.TranslationThread.doTranslation(+220)
        at de.kugihan.dictionaryformids.translation.TranslationThread.runInForeground(+4)
        at de.kugihan.dictionaryformids.translation.TranslationExecution.executeTranslation(+46)
        at LwlPlay.commandAction(LwlPlay.java:92)
        at javax.microedition.lcdui.Display$DisplayAccessor.commandAction(Display.java:2093)
        at javax.microedition.lcdui.Display$DisplayManagerImpl.commandAction(Display.java:2929)
        at com.sun.midp.lcdui.DefaultEventHandler.commandEvent(DefaultEventHandler.java:297)
        at com.sun.midp.lcdui.AutomatedEventHandler.commandEvent(AutomatedEventHandler.java:667)
        at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.handleVmEvent(DefaultEventHandler.java:711)
        at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.run(DefaultEventHandler.java:608)

if its set to true, I get an unhandeled java.lang.NullPointerException

If anyone can help me out I'd greatly appriciate it!

Cheers

John


Gert

Util.memCheck is a static debugging function that uses the static Util.utilObj. You need first to create an object of type UtilMid and then call Util.setUtil() with that object.

Such as in

UtilMid utilObj = new UtilMid();
utilObj.setLogForm(yourFormObject);
Util.setUtil(utilObj);


That should help !

Gert

P.S.: Well, I have to admit that Util.memCheck probably should not be a static method. I should change this some time in the future (hope I do not forget ;) )

njp

Thanks for the response Gert.

However, I'm only one step closer to the solution.


Having added the additional code you suggested I now have this error when the getTranslationResult function is called from within the Translation class.



java.lang.NullPointerException
        at de.kugihan.dictionaryformids.translation.Translation.getTranslationResult(+26)
        at de.kugihan.dictionaryformids.translation.TranslationThread.doTranslation(+220)
        at de.kugihan.dictionaryformids.translation.TranslationThread.runInForeground(+4)
        at de.kugihan.dictionaryformids.translation.TranslationExecution.executeTranslation(+46)
        at LwlPlay.commandAction(LwlPlay.java:99)



I'm confident the exception is being reported from within this block of code within the Translation.java file in the getTranslationResults function.



try {
Normation normationObj =      DictionaryDataFile.supportedLanguages[DictionarySettings.getInputLanguage()].normationObj;
// determine search words from the to be translated word
Vector searchWords = normationObj.searchWord(toBeTranslatedWord);
// get translation for each searchWord
for (int wordCount = 0; wordCount < searchWords.size(); ++wordCount) {
SearchedWord searchWord = (SearchedWord) searchWords.elementAt(wordCount);
String nonNormatedWord = searchWord.word;
String toBeTranslatedWordNormated = normationObj.normateWord(new StringBuffer(nonNormatedWord), true).toString();
if (toBeTranslatedWordNormated.length() > 0) {
searchTranslationForNormatedWord(toBeTranslatedWordNormated);
}
}
}
catch (Throwable t) {
Util.getUtil().log(t);
}




I'm affraid I dont know enough about the architechture to solve this problem easily though.

Again, any help appreciated  :)

Gert

In general: you need to make sure that all initializations are done before you use the Translation class. Please have a look at the class DictionaryForMIDs to see about the initialisation.

Specifically, you need to call

DictionaryDataFile.initValues(false);

Ok, I realize that from your postings I get very useful hints for improving the documentation !! I plan to enhance this 'as soon as I find time'.

Please do continue asking until everything runs fine for you !!

Gert

P.S.: from the byte position of the Exception, e.g. 26 in getTranslationResult(+26), with the help of a Java class decompiler you can exactly locate where the Exception was thrown in the source code. This is very helpful for debugging.

njp


QuotePlease do continue asking until everything runs fine for you !!

OK then, in the interest of improving your documentation.  Having added



DictionaryDataFile.initValues(false);



I now get the following error.  The line in the code represents the call to DictionaryDataFile.initValues(false);



java.lang.NullPointerException
        at de.kugihan.dictionaryformids.general.UtilMid.openProperties(+38)
        at de.kugihan.dictionaryformids.dataaccess.DictionaryDataFile.initValues(+8)
        at LwlPlay.<init>(LwlPlay.java:58)


Gert

You need to do all the initializations from the constructor of class DictionaryForMIDs.

also:

FileAccessHandler.setDictionaryDataFileISAccess(dfmInputStreamObj);

Probably the files will be read from a resource that is packaged in the JAR file, right ? Then you need to set the file access to an object of class ResourceDfMInputStreamAccess.

Gert

Gert

I expect everything works perfectly now ;) ?

Gert