/* * Copyright (c) 2011. iCarto * * This file is part of extNavTableForms * * extNavTableForms 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 3 of the License, or any later version. * * extNavTableForms 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 extNavTableForms. * If not, see <http://www.gnu.org/licenses/>. */ package es.udc.cartolab.gvsig.navtable.dataacces; import java.util.HashMap; import java.util.Set; import sun.reflect.generics.reflectiveObjects.NotImplementedException; import com.hardcode.gdbms.driver.exceptions.ReadDriverException; import com.iver.cit.gvsig.exceptions.visitors.StopWriterVisitorException; import com.iver.cit.gvsig.fmap.layers.FLyrVect; import com.iver.cit.gvsig.fmap.layers.SelectableDataSource; import es.udc.cartolab.gvsig.navtable.AbstractNavTable; import es.udc.cartolab.gvsig.navtable.ToggleEditing; import es.udc.cartolab.gvsig.navtable.format.ValueFormatNT; /** * Class to manage CRUD (Create, Read, Update, Delete) operations on a Layer. * * @author Andr�s Maneiro <amaneiro@icarto.es> * @author Francisco Puga <fpuga@cartolab.es> * */ public class LayerController implements IController { private FLyrVect layer; private HashMap<String, Integer> indexes; private HashMap<String, Integer> types; private HashMap<String, String> values; private HashMap<String, String> valuesChanged; public LayerController(FLyrVect layer) { this.layer = layer; this.indexes = new HashMap<String, Integer>(); this.types = new HashMap<String, Integer>(); this.values = new HashMap<String, String>(); this.valuesChanged = new HashMap<String, String>(); } @Override /** * Not implemented jet * the field with "geom" identifier will contain the WKT representation * of the geometry */ public long create(HashMap<String, String> newValues) throws Exception { throw new NotImplementedException(); } @Override public void read(long position) throws ReadDriverException { SelectableDataSource sds = layer.getSource().getRecordset(); if(position != AbstractNavTable.EMPTY_REGISTER) { clearAll(); for (int i = 0; i < sds.getFieldCount(); i++) { String name = sds.getFieldName(i); values.put( name, sds.getFieldValue(position, i).getStringValue( new ValueFormatNT())); indexes.put(name, i); types.put(name, sds.getFieldType(i)); } } } @Deprecated public void save(long position) throws ReadDriverException, StopWriterVisitorException { update(position); } @Override public void update(long position) throws ReadDriverException, StopWriterVisitorException { ToggleEditing te = new ToggleEditing(); boolean wasEditing = layer.isEditing(); if (!wasEditing) { te.startEditing(layer); } te.modifyValues(layer, (int) position, this.getIndexesOfValuesChanged(), this.getValuesChanged().values().toArray(new String[0])); if (!wasEditing) { te.stopEditing(layer, false); } this.read((int) position); } @Override public void delete(long position) throws ReadDriverException, StopWriterVisitorException { if (position > AbstractNavTable.EMPTY_REGISTER) { ToggleEditing te = new ToggleEditing(); boolean wasEditing = layer.isEditing(); if (!wasEditing) { te.startEditing(layer); } te.deleteRow(layer, (int) position); if (!wasEditing) { te.stopEditing(layer, false); } } } @Override public void clearAll() { indexes.clear(); types.clear(); values.clear(); valuesChanged.clear(); } @Override public int getIndex(String fieldName) { return indexes.get(fieldName); } @Override public int[] getIndexesOfValuesChanged() { int[] idxs = new int[valuesChanged.size()]; Set<String> names = valuesChanged.keySet(); int i = 0; for (String name : names) { idxs[i] = indexes.get(name); i++; } return idxs; } @Override public String getValue(String fieldName) { if (valuesChanged.containsKey(fieldName)) { return valuesChanged.get(fieldName); } return values.get(fieldName); } @Override public HashMap<String, String> getValues() { HashMap<String, String> val = values; for (String k : valuesChanged.keySet()) { val.put(k, valuesChanged.get(k)); } return val; } @Override public String getValueInLayer(String fieldName) { return values.get(fieldName); } @Override public HashMap<String, String> getValuesOriginal() { return values; } @Override public HashMap<String, String> getValuesChanged() { return valuesChanged; } @Override public void setValue(String fieldName, String value) { valuesChanged.put(fieldName, value); } @Override public int getType(String fieldName) { return types.get(fieldName); } @Override public long getRowCount() throws ReadDriverException { return layer.getRecordset().getRowCount(); } @Override public LayerController clone() { return new LayerController(layer); } }