/** * Copyright (C) 2005 David Lopes , Fernando Branquinho This program is free * software; you can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation; either * version 2 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 General Public License for more details. You * should have received a copy of the GNU General Public License along with this * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - * Suite 330, Boston, MA 02111-1307, USA. Contacts perolaproject@gmail.com *//* * Created on 15/02/2008 */package perola.core.drivers;import java.util.List;import java.util.Set;import java.util.TreeSet;import perola.core.PerolaDriver;import com.db4o.DatabaseClosedException;import com.db4o.DatabaseFileLockedException;import com.db4o.Db4o;import com.db4o.ObjectContainer;import com.db4o.query.Predicate;/** * @author Allan Taborda dos Santos * @since 15/02/2008 * @version 1.0.0 */public class DriverPerolaForDb4o extends PerolaDriver { private String nameFile; private ObjectContainer objects; public DriverPerolaForDb4o() { nameFile="database.yap"; } public DriverPerolaForDb4o(String file) { nameFile = file; } @Override public boolean existRoot() { objects = Db4o.openFile(nameFile); List <XmlToStore> objs = objects.query(new Predicate <XmlToStore>(){ private static final long serialVersionUID = 1L; public boolean match(XmlToStore obj){ return obj.getUID().equals("root"); } }); boolean retorno = (objs.size() > 0); objects.close(); return retorno; } @Override public String getRoot() throws Exception { return readObject("root"); } @Override public String readObject(final String objectUID) throws Exception { objects = Db4o.openFile(nameFile); List <XmlToStore> objs = objects.query(new Predicate <XmlToStore>(){ private static final long serialVersionUID = 1L; public boolean match(XmlToStore obj){ return obj.getUID().equals(objectUID); } }); String contents = objs.get(0).getContents(); objects.close(); return contents; } @Override public void removeObject(final String objectUID) throws Exception { try { objects = Db4o.openFile(nameFile); } catch (DatabaseFileLockedException e) { //Se isto ocorrer, é que o banco de dados já está aberto, não há nada a fazer! } try { List <XmlToStore> objs = objects.query(new Predicate <XmlToStore>(){ private static final long serialVersionUID = 1L; public boolean match(XmlToStore obj){ return obj.getUID().equals(objectUID); } }); if (objs.size() != 0) objects.delete(objs.get(0)); objects.commit(); objects.close(); } catch (DatabaseClosedException y) { removeObject(objectUID); //Se o banco de dados for fechado, repetir o método para que seja aberto novamente! } } @Override public void saveObject(final String objectUID, String contents) throws Exception { objects = Db4o.openFile(nameFile); List <XmlToStore> objs = objects.query(new Predicate <XmlToStore>(){ private static final long serialVersionUID = 1L; public boolean match(XmlToStore obj){ return obj.getUID().equals(objectUID); } }); if (objs.size() == 0) objects.set(new XmlToStore(objectUID,contents)); else { objs.get(0).setContents(contents); objects.set(objs.get(0)); } objects.commit(); objects.close(); } @Override public void saveRoot(String contents) throws Exception { objects = Db4o.openFile(nameFile); objects.set(new XmlToStore("root",contents)); objects.commit(); objects.close(); } @Override public Set<String> listPersistedUIDs() throws Exception { objects = Db4o.openFile(nameFile); List <XmlToStore> objs = objects.query(new Predicate <XmlToStore>(){ private static final long serialVersionUID = 1L; public boolean match(XmlToStore obj){ return !obj.getUID().equals("root"); } }); Set<String> list=new TreeSet<String>(); for(int c=0;c<objs.size();c++) list.add(objs.get(c).getUID()); objects.close(); return list; } private class XmlToStore { private String uid, contents; public XmlToStore(String uidx, String contentsx){ uid = uidx; contents = contentsx; } public String getUID(){ return uid; } public String getContents(){ return contents; } public void setContents(String contentsx){ contents = contentsx; } }}