001package org.maltparser.core.lw.helper;
002
003import java.io.FileNotFoundException;
004import java.io.IOException;
005import java.io.InputStream;
006import java.io.InputStreamReader;
007import java.io.UnsupportedEncodingException;
008import java.net.JarURLConnection;
009import java.net.MalformedURLException;
010import java.net.URL;
011import java.util.Iterator;
012import java.util.jar.JarEntry;
013import java.util.jar.JarFile;
014import java.util.jar.JarInputStream;
015
016import org.maltparser.core.exception.MaltChainedException;
017import org.maltparser.core.io.dataformat.ColumnDescription;
018import org.maltparser.core.io.dataformat.DataFormatInstance;
019import org.maltparser.core.symbol.SymbolTableHandler;
020import org.maltparser.core.syntaxgraph.DependencyGraph;
021import org.maltparser.core.syntaxgraph.node.TokenNode;
022
023/**
024 * @author Johan Hall
025 *
026 */
027public final class Utils {
028        public static JarFile getConfigJarfile(URL url)  {
029                JarFile mcoFile = null;
030                try {
031                        JarURLConnection conn = (JarURLConnection)new URL("jar:" + url.toString() + "!/").openConnection();
032                        mcoFile = conn.getJarFile();
033                } catch (IOException e) {
034                        e.printStackTrace();
035                }
036
037                return mcoFile;
038        }
039        
040        public static JarEntry getConfigFileEntry(JarFile mcoJarFile, String mcoName, String fileName)  {
041
042                JarEntry entry = mcoJarFile.getJarEntry(mcoName+'/'+fileName);
043                if (entry == null) {
044                        entry = mcoJarFile.getJarEntry(mcoName+'\\'+fileName);
045                }
046                return entry;
047        }
048        
049        public static InputStream getInputStreamFromConfigFileEntry(URL mcoURL, String mcoName, String fileName) {
050                JarFile mcoJarFile = getConfigJarfile(mcoURL);
051                JarEntry entry = getConfigFileEntry(mcoJarFile, mcoName, fileName);
052                
053                try {
054          if (entry == null) {
055                  throw new FileNotFoundException();
056                  }
057                  return mcoJarFile.getInputStream(entry);
058                } catch (FileNotFoundException e) {
059                        e.printStackTrace();
060            } catch (IOException e) {
061                e.printStackTrace();
062            }
063                return null;
064        }
065        
066        public static InputStreamReader getInputStreamReaderFromConfigFileEntry(URL mcoURL, String mcoName, String fileName, String charSet)  {
067                try {
068                                return new InputStreamReader(getInputStreamFromConfigFileEntry(mcoURL, mcoName, fileName),  charSet);   
069                } catch (UnsupportedEncodingException e) {
070                        e.printStackTrace();    
071                }
072                return null;
073        }
074        
075        public static URL getConfigFileEntryURL(URL mcoURL, String mcoName, String fileName)  {
076                try {
077                        URL url = new URL("jar:"+mcoURL.toString()+"!/"+mcoName+'/'+fileName + "\n");
078                        try { 
079                                InputStream is = url.openStream();
080                                is.close();
081                        } catch (IOException e) {
082                                url = new URL("jar:"+mcoURL.toString()+"!/"+mcoName+'\\'+fileName + "\n");
083                        }
084                        return url;
085                } catch (MalformedURLException e) {
086                        e.printStackTrace();
087                }
088                return null;
089        }
090        
091        public static String getInternalParserModelName(URL mcoUrl) {
092                String internalParserModelName = null;
093                try {
094                        JarEntry je;
095                        JarInputStream jis = new JarInputStream(mcoUrl.openConnection().getInputStream());
096        
097                        while ((je = jis.getNextJarEntry()) != null) {
098                                String fileName = je.getName();
099                                jis.closeEntry();
100                                int index = fileName.indexOf('/');
101                                if (index == -1) {
102                                        index = fileName.indexOf('\\');
103                                }
104                                if (internalParserModelName == null) {
105                                        internalParserModelName = fileName.substring(0, index);
106                                        break;
107                                }
108                        }
109                        jis.close();
110                } catch (IOException e) {
111                        e.printStackTrace();
112                }
113                return internalParserModelName;
114        }
115        
116    public static String[] toStringArray(DependencyGraph graph, DataFormatInstance dataFormatInstance, SymbolTableHandler symbolTables) throws MaltChainedException {
117        String[] tokens = new String[graph.nTokenNode()];
118            StringBuilder sb = new StringBuilder();
119            Iterator<ColumnDescription> columns = dataFormatInstance.iterator();
120            for (Integer index : graph.getTokenIndices()) {
121                sb.setLength(0);
122                if (index <= tokens.length) {
123                    ColumnDescription column = null;
124                    TokenNode node = graph.getTokenNode(index);
125                    while (columns.hasNext()) {
126                        column = columns.next();
127                        if (column.getCategory() == ColumnDescription.INPUT) {
128                            if (!column.getName().equals("ID")) {                       
129                                if (node.hasLabel(symbolTables.getSymbolTable(column.getName())) && node.getLabelSymbol(symbolTables.getSymbolTable(column.getName())).length() > 0) {
130                                    sb.append(node.getLabelSymbol(symbolTables.getSymbolTable(column.getName())));
131                                } else {
132                                    sb.append('_');
133                                }
134                            } else {
135                                sb.append(index.toString());
136                            }
137                            sb.append('\t');
138                        }
139                    }
140                    sb.setLength(sb.length()-1);
141                    tokens[index-1] = sb.toString();
142                    columns = dataFormatInstance.iterator();
143                }
144            }
145            return tokens;
146        }
147}