package it.univpm.deit.semedia.musicuri.webservice.server; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.Set; import org.apache.axis.AxisProperties; import org.xml.sax.SAXException; import it.univpm.deit.database.datatypes.AudioLLDmeta; import it.univpm.deit.database.datatypes.Mp7ACT; import it.univpm.deit.semedia.musicuri.core.MusicURIDatabase; import it.univpm.deit.semedia.musicuri.core.MusicURIQuery; import it.univpm.deit.semedia.musicuri.core.MusicURIReference; import it.univpm.deit.semedia.musicuri.core.MusicURISearch; import it.univpm.deit.semedia.musicuri.core.Result; import it.univpm.deit.semedia.musicuri.core.ResultRankingList; import it.univpm.deit.semedia.musicuri.core.Toolset; import it.univpm.deit.semedia.musicuri.statistics.PerformanceStatistic; import it.univpm.deit.semedia.musicuri.utils.misc.MusicURILibraryDemo; public class MusicURIWebSearch { private static MusicURIDatabase db = new MusicURIDatabase (getWebServiceDatabaseDirectory(), "\\MusicURIReferences.db"); // C:\WINDOWS\SYSTEM32 private MusicURISearch engine = new MusicURISearch(db); public String performSearch(String xmlAudioSignature, String filename) { try { String returnString = ""; String tempXMLFile = Toolset.getCWD() + "/temp.xml"; BufferedWriter out = new BufferedWriter(new FileWriter(tempXMLFile)); out.write(xmlAudioSignature); out.close(); Mp7ACT act = new Mp7ACT(); act.fromXML(tempXMLFile); MusicURIQuery query = new MusicURIQuery(); query.setAudioCompactType(act); boolean usingPruningHeuristic; boolean usingCombinedDistance; boolean finalResortIsCombinedDistance; ResultRankingList finalDistanceRankingList; Result theBestResult = null; Result theSecondBestResult = null; float maximumThreshold = 0.9f; if (db == null) { returnString = "DB was not deserialized (null)"; return returnString; } else { // if a filename has been provided, use it as a heuristic in search, // if not, perform a blind search, based on the audio signature only if (filename != null) { usingPruningHeuristic = true; usingCombinedDistance = true; finalResortIsCombinedDistance = true; query.setLabel(filename); returnString += queryDB(query, new Boolean(true)); } else { usingPruningHeuristic = false; usingCombinedDistance = false; finalResortIsCombinedDistance = false; query.setLabel("unlabelled"); returnString += queryDB(query, new Boolean(false)); } return returnString; } } catch (Exception e) { e.printStackTrace(); return (e.getMessage()); } } public int getNumOfMusicURIReferences() { if (db == null) return (-1); else return db.getDbSize(); } public String getMusicURIReferenceList() { if (db == null || db.getDbSize() == 0) return ("Database object could not be deserialized from " + getWebServiceDatabaseDirectory() ); else return db.textFormattedSetOfMusicURIReferences(); } private static String getWebServiceDatabaseDirectory() { // Get the "." file representing the cwd File cwd = new File("."); // Get the absolute path to the current working directory return cwd.getAbsolutePath(); } private String queryDB(MusicURIQuery query, Boolean usefilenameValue) { String reply = ""; ResultRankingList finalDistanceRankingList = engine.identify(query, usefilenameValue.booleanValue(), usefilenameValue.booleanValue(), 0.9f, //90% acceptable similarity rating usefilenameValue.booleanValue()); if (finalDistanceRankingList.getSize() >= 1) { Result theBestResult = finalDistanceRankingList.getResultAtIndex(0); double bestMatchDistance = theBestResult.distance; reply += ("\nMatched with : " + (db.getMusicURIReference(theBestResult.md5)).getLabel()); reply += ("\nScore : " + (float) (100 - (100*(theBestResult.distance))) + "%"); } else { if (finalDistanceRankingList == null) reply += ("the ranking list was returned null"); else reply += ("the ranking list has " + finalDistanceRankingList.getSize() + " items"); } return reply; } }