/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.gecko.sync.repositories.domain; import org.mozilla.gecko.sync.ExtendedJSONObject; import org.mozilla.gecko.sync.Logger; import org.mozilla.gecko.sync.Utils; import org.mozilla.gecko.sync.repositories.android.RepoUtils; /** * A FormHistoryRecord represents a saved form element. * * I map a <code>fieldName</code> string to a <code>value</code> string. * * @see "<a href='http://mxr.mozilla.org/services-central/source/services-central/services/sync/modules/engines/forms.js'>http://mxr.mozilla.org/services-central/source/services-central/services/sync/modules/engines/forms.js</a>." */ public class FormHistoryRecord extends Record { private static final String LOG_TAG = "FormHistoryRecord"; public static final String COLLECTION_NAME = "forms"; private static final String PAYLOAD_NAME = "name"; private static final String PAYLOAD_VALUE = "value"; public static final long FORMS_TTL = 60 * 24 * 60 * 60; // 60 days in seconds. /** * The name of the saved form field. */ public String fieldName; /** * The value of the saved form field. */ public String fieldValue; public FormHistoryRecord(String guid, String collection, long lastModified, boolean deleted) { super(guid, collection, lastModified, deleted); this.ttl = FORMS_TTL; } public FormHistoryRecord(String guid, String collection, long lastModified) { this(guid, collection, lastModified, false); } public FormHistoryRecord(String guid, String collection) { this(guid, collection, 0, false); } public FormHistoryRecord(String guid) { this(guid, COLLECTION_NAME, 0, false); } public FormHistoryRecord() { this(Utils.generateGuid(), COLLECTION_NAME, 0, false); } @Override public Record copyWithIDs(String guid, long androidID) { FormHistoryRecord out = new FormHistoryRecord(guid, this.collection, this.lastModified, this.deleted); out.androidID = androidID; out.sortIndex = this.sortIndex; // Copy FormHistoryRecord fields. out.fieldName = this.fieldName; out.fieldValue = this.fieldValue; return out; } @Override public void populatePayload(ExtendedJSONObject payload) { putPayload(payload, PAYLOAD_NAME, this.fieldName); putPayload(payload, PAYLOAD_VALUE, this.fieldValue); } @Override public void initFromPayload(ExtendedJSONObject payload) { this.fieldName = payload.getString(PAYLOAD_NAME); this.fieldValue = payload.getString(PAYLOAD_VALUE); } /** * We consider two form history records to be congruent if they represent the * same form element regardless of times used. */ @Override public boolean congruentWith(Object o) { if (o == null || !(o instanceof FormHistoryRecord)) { return false; } FormHistoryRecord other = (FormHistoryRecord) o; if (!super.congruentWith(other)) { return false; } return RepoUtils.stringsEqual(this.fieldName, other.fieldName) && RepoUtils.stringsEqual(this.fieldValue, other.fieldValue); } @Override public boolean equalPayloads(Object o) { if (o == null || !(o instanceof FormHistoryRecord)) { Logger.debug(LOG_TAG, "Not a FormHistoryRecord: " + o.getClass()); return false; } FormHistoryRecord other = (FormHistoryRecord) o; if (!super.equalPayloads(other)) { Logger.debug(LOG_TAG, "super.equalPayloads returned false."); return false; } if (this.deleted) { // FormHistoryRecords are equal if they are both deleted (which // they are, since super.equalPayloads is true) and have the // same GUID. if (other.deleted) { return RepoUtils.stringsEqual(this.guid, other.guid); } return false; } return RepoUtils.stringsEqual(this.fieldName, other.fieldName) && RepoUtils.stringsEqual(this.fieldValue, other.fieldValue); } public FormHistoryRecord log(String logTag) { try { Logger.debug(logTag, "Returning form history record " + guid + " (" + androidID + ")"); Logger.debug(logTag, "> Last modified: " + lastModified); if (Logger.LOG_PERSONAL_INFORMATION) { Logger.pii(logTag, "> Field name: " + fieldName); Logger.pii(logTag, "> Field value: " + fieldValue); } } catch (Exception e) { Logger.debug(logTag, "Exception logging form history record " + this, e); } return this; } }