Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package couchdb; import application.state.ApplicationState; import application.state.ParseJSON; import com.fourspaces.couchdb.Database; import com.fourspaces.couchdb.Document; import com.fourspaces.couchdb.Session; import com.fourspaces.couchdb.ViewResults; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import weka.WekaService; import weka.core.Instance; /** * Klasa do obsugi bazy CouchDB. * * @author Mateusz lzak & Marcin Chya */ public class CouchDBService { /** * Pole, ktre przechowuje adres URL serwera bazy CouchDB. */ private String URL; /** * Pole, ktre przechowuje numer portu serwera bazy CouchDB. */ private int port; /** * Pole, ktre przechowuje sesj aplikacji z serwerem bazy CouchDB. */ private Session session; /** * Konstruktor klasy. Pobiera dane do poczenia si z baz CouchDB z bazy * SQLite i zapisuje je do odpowiednich pl klasy. Tworzy now sesj serwera * CouchDB. */ public CouchDBService() { ApplicationState as = new ApplicationState(); String[] tab = as.sendTabToApplication(); URL = tab[0]; port = Integer.parseInt(tab[1]); session = new Session(URL, port); } /** * Metoda, ktra sprawdza czy serwer CouchDB jest dostpny. * * @throws UnknownHostException Wyjtek jest wyrzucany w przypadku, gdy * serwer jest niedostpny. */ public void checkServer() throws UnknownHostException { try { List<String> list = session.getDatabaseNames(); } catch (NullPointerException ex) { throw new UnknownHostException(); } } /** * Metoda, ktra tworzy now baz na serwerze CouchDB. * * @param name nazwa bazy * @return True, jeli baza zostaa utworzona, false w przypadku gdy baza o * podanej nazwie ju istnieje. */ public boolean createDataBase(String name) { List<String> list = session.getDatabaseNames(); for (String s : list) { if (s.equals(name)) { return false; } } session.createDatabase(name); return true; } /** * Metoda do zapisywania danych do bazy. * * @param fileName nazwa pliku z danymi, akceptowalny format to pliki ARFF * @param dataBaseName nazwa bazy danych */ public void importData(String fileName, String dataBaseName) { WekaService ws = new WekaService(fileName); ArrayList<String> listOfAttributesNames = ws.getAttributesName(); ArrayList<Instance> listOfInstances = ws.getInstances(); Database db = session.getDatabase(dataBaseName); for (int i = 0; i < listOfInstances.size(); i++) { Instance instance = listOfInstances.get(i); Document doc = new Document(); doc.setId(String.valueOf(i)); for (int j = 0; j < instance.numAttributes(); j++) { doc.put(listOfAttributesNames.get(j), instance.toString(j)); } db.saveDocument(doc); } } /** * Metoda, ktra tworzy list nazw baz danych na serwerze. * * @return List zawierajca nazwy wszystkich baz z serwera. */ public List<String> getDataBasesNames() { List<String> list = session.getDatabaseNames(); list.remove("_replicator"); list.remove("_users"); return list; } /** * Metoda do pobierania dokumentw JSON z bazy. * * @param name nazwa bazy * @return ArrayList zawierajca wszystkie dokumenty w bazie. Dokumenty * przechowywane w licie jako typ String. */ public ArrayList<String> getSimpleDocuments(String name) { Database db = session.getDatabase(name); ViewResults result = db.getAllDocuments(); List<Document> list = result.getResults(); ArrayList<String> listOfDocuments = new ArrayList<>(); for (Document d : list) { String id = d.getJSONObject().getString("id"); Document doc = db.getDocument(id); listOfDocuments.add(doc.toString()); } return listOfDocuments; } /** * Metoda, do pobierania wartoci z bazy. * * @param listOfDocuments lista dokumentw z bazy skonwertowanych do typu * String * @return ArrayList przechowywujca wartoci pobrane z dokumentw podanych * jako parametr. Wartoci przechowywane s jako typ String. */ public ArrayList<String> getValues(ArrayList<String> listOfDocuments) { ParseJSON p = new ParseJSON(); ArrayList<String> listOfValues = new ArrayList<>(); for (String s : listOfDocuments) { listOfValues.addAll(p.getValues(s)); } return listOfValues; } /** * Metoda, do pobierania atrybutw z listy dokumentw JSON skonwertowanych * do typu String podanej jako parametr. * * @param simpleDocuments lista dokumentw * @return ArrayList zawierajca nazwy atrybutw, wystpujcych w * dokumentach podanych jako parametr. */ public ArrayList<String> getAttributes(ArrayList<String> simpleDocuments) { ArrayList<String> listOfValues = getValues(simpleDocuments); ParseJSON p = new ParseJSON(); ArrayList<String> listOfSimpleAttributes = p.getAttributes(simpleDocuments.get(0)); ArrayList<String> listOfComplexAttributes = new ArrayList<>(); int i = 0; String type = ""; for (String s : listOfSimpleAttributes) { String attribut = "@ATTRIBUTE\t" + s + "\t"; try { float tmp = Float.parseFloat(listOfValues.get(i)); type = "REAL"; } catch (NumberFormatException ex) { ArrayList<String> list = new ArrayList<>(); list = isNominal(i, listOfValues, simpleDocuments); if (list == null) { type = "STRING"; } else { type = "\t{"; for (String ss : list) { if (list.indexOf(ss) == list.size() - 1) { type = type + ss + "}"; } else { type = type + ss + ","; } } } } attribut = attribut + type; listOfComplexAttributes.add(attribut); i++; } return listOfComplexAttributes; } /** * Metoda do sprawdzania czy atrybut, ktrego pozycja zostaa podana jako * parametr, przechowuje wartoci nominalne. * * @param positionOfAttribute pozycja (numer) sprawdzanego atrybutu * @param listOfValues lista wartoci * @param simpleDocuments lista dokumentw JSON skonwertowanych do typu * String * @return Null jeli atrybyt nie posiada wartoci ze skali nominalnej, w * przeciwnym wypadku ArrayList z moliwymi wartociami atrybutu. */ public ArrayList<String> isNominal(int positionOfAttribute, ArrayList<String> listOfValues, ArrayList<String> simpleDocuments) { ArrayList<String> listOfNominal = new ArrayList<>(); ParseJSON p = new ParseJSON(); String attribute = p.getAttributes(simpleDocuments.get(0)).get(positionOfAttribute); ArrayList<HashMap<String, String>> simple = new ArrayList<>(); for (String s : simpleDocuments) { simple.add(p.getSimpleAttributesHashMap(s)); } for (HashMap<String, String> s : simple) { for (String ss : s.keySet()) { if (ss.equals(attribute) && !listOfNominal.contains(s.get(ss))) { listOfNominal.add(s.get(ss)); } } } float countNominal = listOfNominal.size(); float countValues = listOfValues.size(); float div = countNominal / countValues; if (div < 0.1) { return listOfNominal; } else { return null; } } /** * Metoda do usuwania bazy. * * @param name nazwa bazy do usunicia * @return True jeli baza zostaa usunita, false w przeciwnym wypadku. */ public boolean deleteDataBase(String name) { return session.deleteDatabase(name); } }