package org.societies.android.privacytrust.data.accessor; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.societies.android.api.identity.util.DataIdentifierUtils; import org.societies.android.api.identity.util.RequestorUtils; import org.societies.android.api.privacytrust.privacy.model.PrivacyException; import org.societies.android.api.privacytrust.privacy.util.privacypolicy.ResourceUtils; import org.societies.android.api.privacytrust.privacy.util.privacypolicy.ActionUtils; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Action; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ActionConstants; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Decision; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.PrivacyPermission; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.RequestItem; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Resource; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ResponseItem; import org.societies.api.schema.identity.DataIdentifier; import org.societies.api.schema.identity.RequestorBean; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; public class PrivacyPermissionDao { private final static String TAG = PrivacyPermissionDao.class.getSimpleName(); /** * Date base accessor instance */ private SQLiteDatabase db; /** * Date formatter */ private SimpleDateFormat dateFormat; /** * Default number of seconds for validity duration */ private long defaultValidityDuration; public PrivacyPermissionDao(SQLiteDatabase db) { this.db = db; dateFormat = new SimpleDateFormat("yyyy-MM-dd H:m:s"); defaultValidityDuration = 24*60*60; // 1 day } public int addPrivacyPermission(RequestorBean requestor, ResponseItem permission) throws PrivacyException { ContentValues values = privacyPermissionToContentValues(requestor, permission); int id = (int) db.insert(Constants.TABLE_PRIVACY_PERMISSION, null, values); if (-1 == id) { throw new PrivacyException("Error during storage of privacy permission"); } return id; } public int delAllPrivacyPermission() throws PrivacyException { db.delete(Constants.TABLE_PRIVACY_PERMISSION, null, null); try { db.execSQL("REINDEX "+Constants.TABLE_PRIVACY_PERMISSION); } catch(SQLException e) { throw new PrivacyException("Error during delete of privacy permission"); } return 1; } public ResponseItem findPermissionById(int id) { Cursor c = db.query(Constants.TABLE_PRIVACY_PERMISSION, Constants.TABLE_PRIVACY_PERMISSION_FIELDS, " rowid=? ", new String[] {id+""}, null, null, null); ResponseItem permission = cursorToPermission(c); c.close(); return permission; } public ResponseItem findPermission(RequestorBean requestor, DataIdentifier dataId, List<Action> actions) { Cursor c = db.query(Constants.TABLE_PRIVACY_PERMISSION, Constants.TABLE_PRIVACY_PERMISSION_FIELDS, " requestor=? ", new String[] {RequestorUtils.toFormattedString(requestor), DataIdentifierUtils.toUriString(dataId), ActionUtils.toFormattedString(actions)}, null, null, null); ResponseItem permission = cursorToPermission(c); c.close(); return permission; } public List<ResponseItem> findPermissions() { Cursor c = db.query(Constants.TABLE_PRIVACY_PERMISSION, Constants.TABLE_PRIVACY_PERMISSION_FIELDS, null, null, null, null, null); List<ResponseItem> permissionList = cursorToPermissionList(c); c.close(); return permissionList; } public ContentValues privacyPermissionToContentValues(RequestorBean requestor, ResponseItem permission) { if (null == permission) { return null; } ContentValues values = new ContentValues(); values.put("requestor", RequestorUtils.toFormattedString(requestor)); values.put("data_id_uri", ResourceUtils.getDataIdUri(permission.getRequestItem().getResource())); values.put("actions", ActionUtils.toFormattedString(permission.getRequestItem().getActions())); values.put("decision", permission.getDecision().name()); values.put("conditions", "");//permission.getRequestItem().getConditions()); if (permission instanceof PrivacyPermission) { PrivacyPermission permission2 = (PrivacyPermission) permission; values.put("obfuscation_level", permission2.getObfuscationLevel()); values.put("creation_date", permission2.getCreationDate().toString()); values.put("validity_duration", permission2.getValidityDuration()); } else { values.put("obfuscation_level", -1); values.put("creation_date", dateFormat.format(new Date())); values.put("validity_duration", defaultValidityDuration); } return values; } public List<ResponseItem> cursorToPermissionList(Cursor c) { if (null == c || c.getCount() == 0) { return null; } List<ResponseItem> permissionList = new ArrayList<ResponseItem>(); int length = c.getCount(); for(int i=0; i<length; i++) { c.moveToPosition(i); PrivacyPermission permission = new PrivacyPermission(); // permission.setId(c.getInt(c.getColumnIndex("rowid"))); // - Requestor permission.setRequestor(RequestorUtils.fromFormattedString(c.getString(c.getColumnIndex("requestor")))); // - Decision permission.setDecision(Decision.fromValue(c.getString(c.getColumnIndex("decision")))); // - Request Item RequestItem requestItem = new RequestItem(); // Resource Resource resource = new Resource(); resource.setDataIdUri(c.getString(c.getColumnIndex("data_id_uri"))); requestItem.setResource(resource); // Actions requestItem.setActions(ActionUtils.fromFormattedString(c.getString(c.getColumnIndex("actions")))); // Conditions // requestItem.setConditions(getConditionsFromString(c.getString(c.getColumnIndex("conditions")))); permission.setRequestItem(requestItem); // - Obfuscation level permission.setObfuscationLevel(c.getDouble(c.getColumnIndex("obfuscation_level"))); // - Creation data String dateString = c.getString(c.getColumnIndex("creation_date")); try { permission.setCreationDate(dateFormat.parse(dateString)); } catch (ParseException e) { permission.setCreationDate(new Date()); } // - Validity duration permission.setValidityDuration(c.getLong(c.getColumnIndex("validity_duration"))); permissionList.add(permission); } return permissionList; } public ResponseItem cursorToPermission(Cursor c) { if (null == c || c.getCount() == 0) { return null; } return cursorToPermissionList(c).get(0); } /** * Getter of the property <tt>db</tt> * @return Returns the db. * @uml.property name="db" */ public SQLiteDatabase getDb() { return db; } /** * Setter of the property <tt>db</tt> * @param db The db to set. * @uml.property name="db" */ public void setDb(SQLiteDatabase db) { this.db = db; } }