001 /* 002 * The contents of this file are subject to the Mozilla Public 003 * License Version 1.1 (the "License"); you may not use this file 004 * except in compliance with the License. You may obtain a copy of 005 * the License at http://www.mozilla.org/MPL/ 006 * 007 * Software distributed under the License is distributed on an "AS 008 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or 009 * implied. See the License for the specific language governing 010 * rights and limitations under the License. 011 * 012 * The Original Code is Knowtator. 013 * 014 * The Initial Developer of the Original Code is University of Colorado. 015 * Copyright (C) 2005 - 2008. All Rights Reserved. 016 * 017 * Knowtator was developed by the Center for Computational Pharmacology 018 * (http://compbio.uchcs.edu) at the University of Colorado Health 019 * Sciences Center School of Medicine with support from the National 020 * Library of Medicine. 021 * 022 * Current information about Knowtator can be obtained at 023 * http://knowtator.sourceforge.net/ 024 * 025 * Contributor(s): 026 * Philip V. Ogren <philip@ogren.info> (Original Author) 027 */ 028 029 package edu.uchsc.ccp.knowtator.textsource.filelines; 030 031 import java.awt.Component; 032 import java.io.File; 033 import java.io.FileInputStream; 034 import java.io.IOException; 035 import java.util.ArrayList; 036 import java.util.HashMap; 037 import java.util.List; 038 import java.util.Map; 039 import java.util.regex.Matcher; 040 import java.util.regex.Pattern; 041 042 import javax.swing.JFileChooser; 043 import javax.swing.JOptionPane; 044 045 import edu.stanford.smi.protege.model.Cls; 046 import edu.stanford.smi.protege.model.KnowledgeBase; 047 import edu.stanford.smi.protege.model.Project; 048 import edu.uchsc.ccp.knowtator.KnowtatorProjectUtil; 049 import edu.uchsc.ccp.knowtator.textsource.TextSource; 050 import edu.uchsc.ccp.knowtator.textsource.TextSourceAccessException; 051 import edu.uchsc.ccp.knowtator.textsource.TextSourceCollection; 052 import edu.uchsc.ccp.knowtator.textsource.TextSourceIterator; 053 import edu.uchsc.ccp.util.io.FileReadingUtil; 054 055 public class FileLinesTextSourceCollection extends TextSourceCollection { 056 057 public static final String DISPLAY_NAME = "Lines from file"; 058 059 public static final String CLS_NAME = "file line text source"; 060 061 public static final String PROJECT_SETTING_RECENT_FILE = new String("FileLinesTextSourceCollection_RECENT_FILE"); 062 063 File file; 064 065 char nameChar; 066 067 String name; 068 069 protected Map<String, TextSource> namesToTextSource; 070 071 protected Map<TextSource, Integer> textSourceToIndex; 072 073 List<TextSource> textSources; 074 075 List<String> textSourceNames; 076 077 public FileLinesTextSourceCollection(String fileName) throws IOException { 078 this(new File(fileName)); 079 } 080 081 public FileLinesTextSourceCollection(File file) throws IOException { 082 this.file = file; 083 name = file.getName(); 084 namesToTextSource = new HashMap<String, TextSource>(); 085 textSourceToIndex = new HashMap<TextSource, Integer>(); 086 087 String[] fileLines = FileReadingUtil.readFileLines(new FileInputStream(file)); 088 089 textSources = new ArrayList<TextSource>(fileLines.length); 090 textSourceNames = new ArrayList<String>(fileLines.length); 091 092 for (int i = 0; i < fileLines.length; i++) { 093 TextSource textSource = createTextSource(fileLines[i]); 094 String name = textSource.getName(); 095 namesToTextSource.put(name, textSource); 096 textSourceToIndex.put(textSource, i); 097 098 textSources.add(textSource); 099 textSourceNames.add(name); 100 } 101 // Collections.sort(textSourceNames); 102 } 103 104 protected TextSource createTextSource(String fileLine) { 105 String name = fileLine.substring(0, fileLine.indexOf("|")); 106 String text = fileLine.substring(name.length() + 1) + " "; 107 return new FileLineTextSource(name, text); 108 } 109 110 public File getFile() { 111 return this.file; 112 } 113 114 public TextSource get(int index) throws TextSourceAccessException { 115 TextSource textSource = textSources.get(index); 116 if (textSource != null) 117 return textSources.get(index); 118 throw new TextSourceAccessException("There is no text source at index=" + index 119 + " for text source collection = " + getName()); 120 } 121 122 public int size() { 123 return textSources.size(); 124 } 125 126 public String getName() { 127 return name; 128 } 129 130 public int getIndex(TextSource textSource) { 131 return textSourceToIndex.get(textSource); 132 } 133 134 public TextSource get(String name) throws TextSourceAccessException { 135 TextSource textSource = (TextSource) namesToTextSource.get(name); 136 if (textSource != null) 137 return textSource; 138 throw new TextSourceAccessException("There is no text source for name='" + name 139 + "' for text source collection = " + getName()); 140 } 141 142 public TextSource select(Component parent) { 143 Object selection = JOptionPane.showInputDialog(parent, "Select text source", "Select text source", 144 JOptionPane.INFORMATION_MESSAGE, null, textSourceNames.toArray(), textSourceNames.toArray()[0]); 145 try { 146 if (selection != null) 147 return get((String) selection); 148 } catch (TextSourceAccessException tsae) { 149 return null; 150 } 151 return null; 152 } 153 154 155 public TextSource find(Component parent) { 156 String searchString = JOptionPane.showInputDialog(parent, "Enter a regular expression for the name of a text source", "Find a text source", 157 JOptionPane.PLAIN_MESSAGE); 158 Pattern pattern = Pattern.compile(searchString); 159 Matcher matcher; 160 try { 161 162 for (String textSourceName : textSourceNames) { 163 matcher = pattern.matcher(textSourceName); 164 if (matcher.find()) 165 return get(textSourceName); 166 167 } 168 } catch (TextSourceAccessException tsae) { 169 tsae.printStackTrace(); 170 } 171 172 JOptionPane.showMessageDialog(parent, "No text source found with a name matching the search string you provided."); 173 return null; 174 } 175 176 public void save(Project project) { 177 String filePath = getFile().getPath(); 178 String projectPath = new File(project.getProjectDirectoryURI().getPath()).getPath(); 179 180 if (filePath.startsWith(projectPath)) { 181 filePath = filePath.substring(projectPath.length() + 1); 182 } 183 project.setClientInformation(PROJECT_SETTING_RECENT_FILE, filePath); 184 } 185 186 public static TextSourceCollection open(Project project) { 187 File recentFile = getRecentFile(project); 188 if (recentFile != null) { 189 try { 190 TextSourceCollection tsc = new FileLinesTextSourceCollection(recentFile); 191 return tsc; 192 } catch (IOException ioe) { 193 ioe.printStackTrace(); 194 } 195 } 196 return null; 197 } 198 199 private static File getRecentFile(Project project) { 200 String path = (String) project.getClientInformation(PROJECT_SETTING_RECENT_FILE); 201 if (path == null) 202 return null; 203 204 File recentFile = new File(path); 205 if (!recentFile.isAbsolute()) { 206 // the path of the annotation project files 207 String annotationProjectPath = new File(project.getProjectDirectoryURI()).getPath(); 208 String recentPath = annotationProjectPath + File.separator + path; 209 recentFile = new File(recentPath); 210 if (recentFile != null && recentFile.exists() && recentFile.isFile()) { 211 return recentFile; 212 } else 213 recentFile = new File(path); // set it back to what it was 214 // before trying to resolve to 215 // annotation project path. 216 } 217 if (recentFile != null && recentFile.exists() && recentFile.isFile()) { 218 return recentFile; 219 } 220 return null; 221 } 222 223 public static TextSourceCollection open(Project project, Component parent) { 224 JFileChooser chooser = new JFileChooser(); 225 File recentFile = getRecentFile(project); 226 if (recentFile != null) { 227 chooser.setSelectedFile(recentFile); 228 } 229 chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 230 int returnVal = chooser.showOpenDialog(parent); 231 if (returnVal == JFileChooser.APPROVE_OPTION) { 232 File file = chooser.getSelectedFile(); 233 if (file.exists()) { 234 try { 235 return new FileLinesTextSourceCollection(file); 236 } catch (IOException ioe) { 237 ioe.printStackTrace(); 238 JOptionPane.showMessageDialog(parent, "Unable to open file as a text source collection: " 239 + ioe.getMessage(), "", JOptionPane.ERROR_MESSAGE); 240 } 241 } else { 242 JOptionPane.showMessageDialog(parent, "The file: '" + file.getPath() + "' was not found."); 243 } 244 } 245 return null; 246 } 247 248 public TextSourceIterator iterator() { 249 return new FileLinesTextSourceIterator(); 250 } 251 252 class FileLinesTextSourceIterator implements TextSourceIterator { 253 int tsIndex = -1; 254 255 public TextSource next() throws TextSourceAccessException { 256 try { 257 return textSources.get(++tsIndex); 258 } catch (IndexOutOfBoundsException ioobe) { 259 throw new TextSourceAccessException(ioobe); 260 } 261 } 262 263 public boolean hasNext() { 264 return (tsIndex + 1) < textSources.size(); 265 } 266 267 } 268 269 public static void createCls(KnowledgeBase kb) { 270 271 if (kb.getCls(CLS_NAME) == null) { 272 Cls textSourceParent = kb.getCls(KnowtatorProjectUtil.TEXT_SOURCE_CLS_NAME); 273 ArrayList parents = new ArrayList(); 274 parents.add(textSourceParent); 275 kb.createCls(CLS_NAME, parents); 276 } 277 return; 278 } 279 280 }