package com.picdiary.rdf;

import net.didion.jwnl.dictionary.*;
import net.didion.jwnl.dictionary.Dictionary;
import net.didion.jwnl.*;
import net.didion.jwnl.data.*;
import net.didion.jwnl.data.list.*;
import net.didion.jwnl.util.*;

import java.io.*;
import java.util.*;

public class WordnetNamespace {
    Dictionary _dict;
    public WordnetNamespace(String configFile) throws JWNLException,FileNotFoundException {
        JWNL.initialize(new FileInputStream(configFile));
        _dict = Dictionary.getInstance();
    }
    public Synset[] senses(String word) throws JWNLException {
        IndexWord iWord = _dict.getIndexWord(POS.NOUN,word);
        if(iWord != null) {
            return iWord.getSenses();
        } else {
            return new Synset[0];
        }
    }
    public Set hypernyms(Synset syn) throws JWNLException {
        Set hypernyms = new HashSet();
        PointerTargetTree tree = PointerUtils.getHypernymTree(syn);
        List nodeLists = tree.toList();
        for(Iterator i = nodeLists.iterator(); i.hasNext(); ) {
            PointerTargetNodeList nodeList = (PointerTargetNodeList)i.next();
            for(Iterator j = nodeList.iterator(); j.hasNext(); ) {
                PointerTargetNode node = (PointerTargetNode)j.next();
                Synset nodeSyn = node.getSynset();
                hypernyms.add(nodeSyn);
            }
        }
        return hypernyms;
    }
    public String uri(Synset syn) throws JWNLException {
        String word = syn.getWord(0).getLemma();
        IndexWord iWord = _dict.lookupIndexWord(POS.NOUN,word);
        Synset[] synsets = iWord.getSenses();
        int sense = 999;
        for(int i = 0; i<synsets.length; i++) {
            if(synsets[i] == syn) {
                sense = i+1;
            }
        }

        word = word.substring(0,1).toUpperCase()+word.substring(1);
        if(sense>1) {
            return "http://xmlns.com/wordnet/1.6/"+word+"-"+sense;
        } else {
            return "http://xmlns.com/wordnet/1.6/"+word;
        }
    }
    public Synset lookup(String uri) throws JWNLException {
        if(uri.startsWith("http://xmlns.com/wordnet/1.6/")) {
            String searchWord = uri.substring(29);
            int sense = 1;
            if(searchWord.indexOf("-") != -1) {
                String senseStr = searchWord.substring(searchWord.indexOf("-")+1);
                searchWord = searchWord.substring(0,searchWord.indexOf("-"));
                try {
                    sense = Integer.parseInt(senseStr);
                } catch(NumberFormatException e) {}
            }
            //System.out.println("Word: "+searchWord+"\nSense: "+sense);

            IndexWord word = _dict.lookupIndexWord(POS.NOUN,searchWord);
            if(word == null) {
                return null;
            }

            if(sense>word.getSenseCount()) {
                return null;
            } else {
                return word.getSense(sense);
            }
        }
        return null;
    }
}
