/*
* Geopaparazzi - Digital field mapping on Android based devices
* Copyright (C) 2016 HydroloGIS (www.hydrologis.com)
*
* 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 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package eu.geopaparazzi.core.database;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import eu.geopaparazzi.library.database.GPLog;
import eu.geopaparazzi.library.util.TimeUtilities;
import eu.geopaparazzi.core.GeopaparazziApplication;
import eu.geopaparazzi.core.database.objects.Metadata;
import static eu.geopaparazzi.core.database.TableDescriptions.MetadataTableFields;
import static eu.geopaparazzi.core.database.TableDescriptions.MetadataTableDefaultValues;
import static eu.geopaparazzi.core.database.TableDescriptions.TABLE_METADATA;
/**
* @author Andrea Antonello (www.hydrologis.com)
*/
@SuppressWarnings("nls")
public class DaoMetadata {
private static SimpleDateFormat datesFormatter = TimeUtilities.INSTANCE.TIME_FORMATTER_LOCAL;
public static final String EMPTY_VALUE = " - ";
/**
* Create the notes tables.
*
* @throws java.io.IOException if something goes wrong.
*/
public static void createTables() throws IOException {
StringBuilder sB = new StringBuilder();
sB.append("CREATE TABLE ");
sB.append(TABLE_METADATA);
sB.append(" (");
sB.append(MetadataTableFields.COLUMN_KEY.getFieldName()).append(" TEXT NOT NULL, ");
sB.append(MetadataTableFields.COLUMN_LABEL.getFieldName()).append(" TEXT , ");
sB.append(MetadataTableFields.COLUMN_VALUE.getFieldName()).append(" TEXT NOT NULL ");
sB.append(");");
String CREATE_TABLE_PROJECT = sB.toString();
SQLiteDatabase sqliteDatabase = GeopaparazziApplication.getInstance().getDatabase();
if (GPLog.LOG_HEAVY)
Log.i("DaoProject", "Create the project table with: \n" + CREATE_TABLE_PROJECT);
sqliteDatabase.beginTransaction();
try {
sqliteDatabase.execSQL(CREATE_TABLE_PROJECT);
sqliteDatabase.setTransactionSuccessful();
} catch (Exception e) {
Log.e("DaoProject", e.getLocalizedMessage(), e);
throw new IOException(e.getLocalizedMessage());
} finally {
sqliteDatabase.endTransaction();
}
}
/**
* Populate the project metadata table.
*
* @param name the project name
* @param description an optional description.
* @param notes optional notes.
* @param creationUser the user creating the project.
* @throws java.io.IOException if something goes wrong.
*/
public static void initProjectMetadata(String name, String description, String notes, String creationUser) throws IOException {
Date creationDate = new Date();
if (name == null) {
name = "";
}
if (description == null) {
description = EMPTY_VALUE;
}
if (notes == null) {
notes = EMPTY_VALUE;
}
if (creationUser == null) {
creationUser = "dummy user";
}
SQLiteDatabase sqliteDatabase = GeopaparazziApplication.getInstance().getDatabase();
sqliteDatabase.beginTransaction();
try {
ContentValues values = new ContentValues();
values.put(MetadataTableFields.COLUMN_KEY.getFieldName(), MetadataTableDefaultValues.KEY_NAME.getFieldName());
values.put(MetadataTableFields.COLUMN_LABEL.getFieldName(), MetadataTableDefaultValues.KEY_NAME.getFieldLabel());
values.put(MetadataTableFields.COLUMN_VALUE.getFieldName(), name);
sqliteDatabase.insertOrThrow(TABLE_METADATA, null, values);
values = new ContentValues();
values.put(MetadataTableFields.COLUMN_KEY.getFieldName(), MetadataTableDefaultValues.KEY_DESCRIPTION.getFieldName());
values.put(MetadataTableFields.COLUMN_LABEL.getFieldName(), MetadataTableDefaultValues.KEY_DESCRIPTION.getFieldLabel());
values.put(MetadataTableFields.COLUMN_VALUE.getFieldName(), description);
sqliteDatabase.insertOrThrow(TABLE_METADATA, null, values);
values = new ContentValues();
values.put(MetadataTableFields.COLUMN_KEY.getFieldName(), MetadataTableDefaultValues.KEY_NOTES.getFieldName());
values.put(MetadataTableFields.COLUMN_LABEL.getFieldName(), MetadataTableDefaultValues.KEY_NOTES.getFieldLabel());
values.put(MetadataTableFields.COLUMN_VALUE.getFieldName(), notes);
sqliteDatabase.insertOrThrow(TABLE_METADATA, null, values);
values = new ContentValues();
values.put(MetadataTableFields.COLUMN_KEY.getFieldName(), MetadataTableDefaultValues.KEY_CREATIONTS.getFieldName());
values.put(MetadataTableFields.COLUMN_LABEL.getFieldName(), MetadataTableDefaultValues.KEY_CREATIONTS.getFieldLabel());
values.put(MetadataTableFields.COLUMN_VALUE.getFieldName(), datesFormatter.format(creationDate));
sqliteDatabase.insertOrThrow(TABLE_METADATA, null, values);
values = new ContentValues();
values.put(MetadataTableFields.COLUMN_KEY.getFieldName(), MetadataTableDefaultValues.KEY_LASTTS.getFieldName());
values.put(MetadataTableFields.COLUMN_LABEL.getFieldName(), MetadataTableDefaultValues.KEY_LASTTS.getFieldLabel());
values.put(MetadataTableFields.COLUMN_VALUE.getFieldName(), EMPTY_VALUE);
sqliteDatabase.insertOrThrow(TABLE_METADATA, null, values);
values = new ContentValues();
values.put(MetadataTableFields.COLUMN_KEY.getFieldName(), MetadataTableDefaultValues.KEY_CREATIONUSER.getFieldName());
values.put(MetadataTableFields.COLUMN_LABEL.getFieldName(), MetadataTableDefaultValues.KEY_CREATIONUSER.getFieldLabel());
values.put(MetadataTableFields.COLUMN_VALUE.getFieldName(), creationUser);
sqliteDatabase.insertOrThrow(TABLE_METADATA, null, values);
values = new ContentValues();
values.put(MetadataTableFields.COLUMN_KEY.getFieldName(), MetadataTableDefaultValues.KEY_LASTUSER.getFieldName());
values.put(MetadataTableFields.COLUMN_LABEL.getFieldName(), MetadataTableDefaultValues.KEY_LASTUSER.getFieldLabel());
values.put(MetadataTableFields.COLUMN_VALUE.getFieldName(), EMPTY_VALUE);
sqliteDatabase.insertOrThrow(TABLE_METADATA, null, values);
sqliteDatabase.setTransactionSuccessful();
} catch (Exception e) {
GPLog.error("DaoMetadata", e.getLocalizedMessage(), e);
throw new IOException(e.getLocalizedMessage());
} finally {
sqliteDatabase.endTransaction();
}
}
/**
* Insert a new metadata item.
*
* @param key the key to use.
* @param label a readable label for the item. if null, the key is used.
* @param value a value of the item. It can be "" but not null.
* @throws IOException
*/
public static void insertNewItem(String key, String label, String value) throws IOException {
SQLiteDatabase sqliteDatabase = GeopaparazziApplication.getInstance().getDatabase();
sqliteDatabase.beginTransaction();
try {
if (label == null) label = key;
ContentValues values = new ContentValues();
values.put(MetadataTableFields.COLUMN_KEY.getFieldName(), key);
values.put(MetadataTableFields.COLUMN_LABEL.getFieldName(), label);
values.put(MetadataTableFields.COLUMN_VALUE.getFieldName(), value);
sqliteDatabase.insertOrThrow(TABLE_METADATA, null, values);
sqliteDatabase.setTransactionSuccessful();
} catch (Exception e) {
sqliteDatabase.endTransaction();
GPLog.error("DaoMetadata", e.getLocalizedMessage(), e);
// try the old way
oldInsertNewItem(key, value);
}
}
/**
* Old insert a new metadata item.
*
* @param key the key to use.
* @param value a value of the item. It can be "" but not null.
* @throws IOException
* @deprecated only for backwards compatibility.
*/
private static void oldInsertNewItem(String key, String value) throws IOException {
SQLiteDatabase sqliteDatabase = GeopaparazziApplication.getInstance().getDatabase();
sqliteDatabase.beginTransaction();
try {
ContentValues values = new ContentValues();
values.put(MetadataTableFields.COLUMN_KEY.getFieldName(), key);
values.put(MetadataTableFields.COLUMN_VALUE.getFieldName(), value);
sqliteDatabase.insertOrThrow(TABLE_METADATA, null, values);
sqliteDatabase.setTransactionSuccessful();
} catch (Exception e) {
GPLog.error("DaoMetadata", e.getLocalizedMessage(), e);
throw new IOException(e.getLocalizedMessage());
} finally {
sqliteDatabase.endTransaction();
}
}
/**
* Delete a metadata item.
*
* @param key the key to use.
* @throws IOException
*/
public static void deleteItem(String key) throws IOException {
SQLiteDatabase sqliteDatabase = GeopaparazziApplication.getInstance().getDatabase();
sqliteDatabase.beginTransaction();
try {
String where = MetadataTableFields.COLUMN_KEY.getFieldName() + "='" + key + "'";
sqliteDatabase.delete(TABLE_METADATA, where, null);
sqliteDatabase.setTransactionSuccessful();
} catch (Exception e) {
GPLog.error("DaoMetadata", e.getLocalizedMessage(), e);
throw new IOException(e.getLocalizedMessage());
} finally {
sqliteDatabase.endTransaction();
}
}
/**
* Set a value of the metadata.
*
* @param key the key to use (from {@link eu.geopaparazzi.core.database.TableDescriptions.MetadataTableFields}).
* @param value the value to set.
* @throws java.io.IOException if something goes wrong.
*/
public static void setValue(String key, String value) throws IOException {
ContentValues updatedValues = new ContentValues();
updatedValues.put(MetadataTableFields.COLUMN_VALUE.getFieldName(), value);
String where = MetadataTableFields.COLUMN_KEY.getFieldName() + "='" + key + "'";
SQLiteDatabase sqliteDatabase = GeopaparazziApplication.getInstance().getDatabase();
sqliteDatabase.update(TABLE_METADATA, updatedValues, where, null);
}
/**
* Get the metadata.
*
* @return the map of metadata.
* @throws java.io.IOException if something goes wrong.
*/
public static List<Metadata> getProjectMetadata() throws IOException {
SQLiteDatabase sqliteDatabase = GeopaparazziApplication.getInstance().getDatabase();
List<Metadata> metadataList = new ArrayList<>();
try {
String asColumnsToReturn[] = { //
MetadataTableFields.COLUMN_KEY.getFieldName(), //
MetadataTableFields.COLUMN_LABEL.getFieldName(), //
MetadataTableFields.COLUMN_VALUE.getFieldName()
};// ,
Cursor c = sqliteDatabase.query(TABLE_METADATA, asColumnsToReturn, null, null, null, null, null);
c.moveToFirst();
while (!c.isAfterLast()) {
String key = c.getString(0);
String label = c.getString(1);
String value = c.getString(2);
Metadata m = new Metadata();
m.key = key;
m.label = label;
m.value = value;
metadataList.add(m);
c.moveToNext();
}
c.close();
} catch (Exception e) {
// try the old way
return oldGetProjectMetadata();
}
return metadataList;
}
/**
* Old get the metadata.
*
* @return the map of metadata.
* @throws java.io.IOException if something goes wrong.
* @deprecated only for backwards compatibility.
*/
private static List<Metadata> oldGetProjectMetadata() throws IOException {
SQLiteDatabase sqliteDatabase = GeopaparazziApplication.getInstance().getDatabase();
List<Metadata> metadataList = new ArrayList<>();
String asColumnsToReturn[] = { //
MetadataTableFields.COLUMN_KEY.getFieldName(), //
MetadataTableFields.COLUMN_VALUE.getFieldName()
};// ,
Cursor c = sqliteDatabase.query(TABLE_METADATA, asColumnsToReturn, null, null, null, null, null);
c.moveToFirst();
while (!c.isAfterLast()) {
String key = c.getString(0);
String value = c.getString(1);
Metadata m = new Metadata();
m.key = key;
m.label = key;
m.value = value;
metadataList.add(m);
c.moveToNext();
}
c.close();
return metadataList;
}
}