/* =========================================================== * WFDB Java : Interface to WFDB Applications. * * =========================================================== * * (C) Copyright 2012, by Ikaro Silva * * Project Info: * Code: http://code.google.com/p/wfdb-java/ * WFDB: http://www.physionet.org/physiotools/wfdb.shtml * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * * * Original Author: Ikaro Silva * Contributor(s): -; * * Changes * ------- * Check: http://code.google.com/p/wfdb-java/list */ package org.physionet.wfdb.physiobank; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.logging.Logger; public class PhysioNetDB { private String name; private String info; private URL url; private static final String DB_URL="http://physionet.org/physiobank/database/pbi/"; private static final String DB_LIST="http://physionet.org/physiobank/database/DBS"; private ArrayList dbRecordList; private static Logger logger = Logger.getLogger(PhysioNetRecord.class.getName()); public PhysioNetDB(String Name){ name=Name; url=setDBURL(); info=setInfo(); dbRecordList = new ArrayList(); } private PhysioNetDB(String Name,String Info){ name=Name; info=Info; url=setDBURL(); dbRecordList = new ArrayList(); } public String getname() { return name; } public ArrayList getDBRecordList() throws Exception{ if(dbRecordList.isEmpty()){ this.setDBRecordList(); } return dbRecordList; } public String getinfo() { return info; } public URL getURL() { return url; } public static List getPhysioNetDBList(){ String inputLine; BufferedReader in = null; List physionetDBList = new ArrayList(); try { URL oracle = new URL(DB_LIST); in = new BufferedReader( new InputStreamReader(oracle.openStream())); String[] tmpStr; String tmpname; String tmpInfo; while ((inputLine = in.readLine()) != null){ logger.finest("\n\t***Reading URL: \n\t" + inputLine); tmpStr=inputLine.split("\\t"); tmpname=tmpStr[0]; tmpInfo=(inputLine.replaceFirst(tmpname,"")).replaceAll("\\t",""); physionetDBList.add(new PhysioNetDB(tmpname,tmpInfo)); } logger.fine("\n\t*** physionetDBList Size: \n\t" + physionetDBList.size()); in.close(); } catch (IOException e) { e.printStackTrace(); } return physionetDBList; } public static HashMap getPhysioNetDBMap(){ String inputLine; BufferedReader in = null; HashMap physionetDBMap= new HashMap(); try { URL oracle = new URL(DB_LIST); in = new BufferedReader( new InputStreamReader(oracle.openStream())); String[] tmpStr; String tmpname; String tmpInfo; while ((inputLine = in.readLine()) != null){ logger.finest("\n\t***Reading URL: \n\t" + inputLine); tmpStr=inputLine.split("\\t"); tmpname=tmpStr[0]; tmpInfo=(inputLine.replaceFirst(tmpname,"")).replaceAll("\\t",""); physionetDBMap.put(tmpname,new PhysioNetDB(tmpname,tmpInfo)); } in.close(); logger.fine("\n\t*** physionetDBMap Size: \n\t" + physionetDBMap.size()); } catch (IOException e) { e.printStackTrace(); } return physionetDBMap; } public void printDBInfo(){ System.out.println(name); System.out.println("\tDescription: "+ info); System.out.println("\tURL: "+ url); } public String getDBInfo(){ String str=name + "\n\tDescription: "+ info + "\n\tURL: "+ url; return str; } public void printDBRecordList() throws Exception{ this.getDBRecordList(); this.printDBInfo(); for(PhysioNetRecord rec : dbRecordList){ rec.printRecord(); } } public static void printDBList(List pnDB ) { // Prints information regarding all databases in pnDB List pnDBList = PhysioNetDB.getPhysioNetDBList(); for(PhysioNetDB db : pnDBList){ db.printDBInfo(); } } public static void printDBList() { // Prints information regarding all databases // Currently available at PhysioNet List pnDBList = PhysioNetDB.getPhysioNetDBList(); Collections.sort(pnDBList,PhysioNetDB.DBNameComparator); for(PhysioNetDB db : pnDBList){ db.printDBInfo(); } } private URL setDBURL() { logger.finer("\n\t***URL Input: \n\t" + name); try { URL url=new URL(DB_URL + name.replaceAll("/","_")); logger.finer("\n\t***Parsed URL: \n\t" + url.toString()); return url; } catch (MalformedURLException e) { e.printStackTrace(); return null; } } private String setInfo() { String inputLine; BufferedReader in = null; String desc=""; try { URL pnb = new URL(DB_LIST); in = new BufferedReader( new InputStreamReader(pnb.openStream())); String[] tmpStr; while ((inputLine = in.readLine()) != null){ tmpStr=inputLine.split("\\t"); if(tmpStr[0].compareTo(name)==0){ desc=(inputLine.replaceFirst(tmpStr[0],"")).replaceAll("\\t",""); break; } } in.close(); } catch (IOException e) { e.printStackTrace(); } return desc; } public void setDBRecordList() throws Exception{ String inputLine; BufferedReader in = null; String[] tmpStr; String recname=""; ArrayList recList = null; logger.finest("\n\t***Getting record list from: \n\t" + url); try { in = new BufferedReader( new InputStreamReader(url.openStream())); while ((inputLine = in.readLine()) != null){ tmpStr=inputLine.split("\\t"); logger.finest("\n\t***Reading record data: \n\t" + inputLine); if(tmpStr[0].compareTo(recname) != 0){ //New record, save the last one and if(!recname.isEmpty()){ dbRecordList.add(new PhysioNetRecord(tmpStr[0])); } recname=tmpStr[0]; recList=null; recList=new ArrayList(); } // Same, record, append to the signal list recList.add(new String(inputLine.replaceFirst(recname,""))); } in.close(); logger.fine("\n\t***Rec List Size: \n\t" + recList.size()); } catch (IOException e) { e.printStackTrace(); } } public static Comparator DBNameComparator = new Comparator() { public int compare(PhysioNetDB db, PhysioNetDB anotherDB) { String Name1 = db.getname().toUpperCase(); String Name2 = anotherDB.getname().toUpperCase(); if (!(Name1.equals(Name2))) return Name1.compareTo(Name2); else return Name1.compareTo(Name2); } }; public static List main() { // Prints information regarding all databases // Currently available at PhysioNet return PhysioNetDB.getPhysioNetDBList(); } }