package org.commcare.android.util;

import org.javarosa.core.util.externalizable.ExtUtil;
import org.javarosa.core.util.externalizable.Hasher;
import org.javarosa.core.util.externalizable.MD5Hasher;
import org.javarosa.core.util.externalizable.PrototypeFactory;

import java.util.Hashtable;

/**
 * A prototype factory that is configured to keep track of all of the
 * case->hash pairs that it creates in order to use them for deserializaiton in
 * the future.
 *
 * Will only work reliably if it is used synchronously to hash all values that
 * are read, and should really only be expected to function for 'in memory'
 * storage like mocks.
 *
 * TODO: unify with Android storage live factory mocker
 *
 * @author ctsims
 */
public class LivePrototypeFactory extends PrototypeFactory {
    private final Hashtable<String, Class> factoryTable = new Hashtable<>();
    private final LiveHasher mLiveHasher;

    public LivePrototypeFactory() {
        this(new MD5Hasher());
    }

    public LivePrototypeFactory(Hasher hasher) {
        this.mLiveHasher = new LiveHasher(this, hasher);
        PrototypeFactory.setStaticHasher(this.mLiveHasher);
    }

    @Override
    protected void lazyInit() {
    }

    @Override
    public void addClass(Class c) {
        byte[] hash = getLiveHasher().getHasher().getClassHashValue(c);
        factoryTable.put(ExtUtil.printBytes(hash), c);
    }

    @Override
    public Class getClass(byte[] hash) {
        String key = ExtUtil.printBytes(hash);
        return factoryTable.get(key);
    }

    @Override
    public Object getInstance(byte[] hash) {
        return PrototypeFactory.getInstance(getClass(hash));
    }

    public LiveHasher getLiveHasher() {
        return this.mLiveHasher;
    }

}
package org.commcare.android.util;

import org.javarosa.core.util.externalizable.ExtUtil;
import org.javarosa.core.util.externalizable.Hasher;
import org.javarosa.core.util.externalizable.PrototypeFactory;

import java.util.Hashtable;

/**
 * A prototype factory that is configured to keep track of all of the
 * case->hash pairs that it creates in order to use them for deserializaiton in
 * the future.
 *
 * Will only work reliably if it is used synchronously to hash all values that
 * are read, and should really only be expected to function for 'in memory'
 * storage like mocks.
 *
 * TODO: unify with Android storage live factory mocker
 *
 * @author ctsims
 */
public class LivePrototypeFactory extends PrototypeFactory {
    private final Hashtable<String, Class> factoryTable = new Hashtable<>();
    private final LiveHasher mLiveHasher;

    public LivePrototypeFactory(Hasher hasher) {
        this.mLiveHasher = new LiveHasher(this, hasher);
        PrototypeFactory.setStaticHasher(this.mLiveHasher);
    }

    @Override
    protected void lazyInit() {
    }

    @Override
    public void addClass(Class c) {
        byte[] hash = getLiveHasher().getHasher().getClassHashValue(c);
        factoryTable.put(ExtUtil.printBytes(hash), c);
    }

    @Override
    public Class getClass(byte[] hash) {
        String key = ExtUtil.printBytes(hash);
        return factoryTable.get(key);
    }

    @Override
    public Object getInstance(byte[] hash) {
        return PrototypeFactory.getInstance(getClass(hash));
    }

    public LiveHasher getLiveHasher() {
        return this.mLiveHasher;
    }

}
Remove MD5Hasher