Package com.forgeessentials.data

Source Code of com.forgeessentials.data.AbstractDataDriver

package com.forgeessentials.data;

import java.util.ArrayList;
import java.util.Map.Entry;

import net.minecraftforge.common.config.Configuration;

import com.forgeessentials.data.api.ClassContainer;
import com.forgeessentials.data.api.DataStorageManager;
import com.forgeessentials.data.api.IDataDriver;
import com.forgeessentials.data.api.ITypeInfo;
import com.forgeessentials.data.api.TypeData;
import com.google.common.collect.HashMultimap;

@SuppressWarnings({ "rawtypes", "unchecked" })
public abstract class AbstractDataDriver implements IDataDriver {
    private HashMultimap<String, String> classRegister = HashMultimap.create();
    private boolean hasLoaded;

    @Override
    public void onClassRegistered(ITypeInfo tagger)
    {
    }

    @Override
    public final String getName()
    {
        return this.getClass().getSimpleName().replaceAll("DataDriver", "");
    }

    @Override
    public boolean saveObject(ClassContainer type, Object o)
    {
        boolean flag = false;

        if (!classRegister.containsEntry(getName(), type.getName()))
        {
            onClassRegistered(DataStorageManager.getInfoForType(type));
            classRegister.put(getName(), type.getName());
        }

        ITypeInfo t = DataStorageManager.getInfoForType(type);
        if (t != null)
        {
            flag = true;
            saveData(type, t.getTypeDataFromObject(o));
        }

        return flag;
    }

    @Override
    public Object loadObject(ClassContainer type, String loadingKey)
    {
        Object newObject = null;
        TypeData data = loadData(type, loadingKey);
        ITypeInfo info = DataStorageManager.getInfoForType(type);

        if (data != null && data.getAllFields().size() > 0)
        {
            newObject = createFromFields(data, info);
        }

        return newObject;
    }

    @Override
    public Object[] loadAllObjects(ClassContainer type)
    {
        ArrayList<Object> list = new ArrayList<Object>();
        TypeData[] objectData = loadAll(type);
        ITypeInfo info = DataStorageManager.getInfoForType(type);

        // Each element of the field array represents an object, stored as an
        // array of fields.
        Object tmp;
        if (objectData != null && objectData.length > 0)
        {
            for (TypeData data : objectData)
            {
                tmp = createFromFields(data, info);
                list.add(tmp);
            }
        }

        return list.toArray(new Object[list.size()]);
    }

    @Override
    public boolean deleteObject(ClassContainer type, String loadingKey)
    {
        return deleteData(type, loadingKey);
    }

    private Object createFromFields(TypeData data, ITypeInfo info)
    {
        Object val;
        // loops through all fields of this class.
        for (Entry<String, Object> entry : data.getAllFields())
        {
            // if it needs reconstructing before this class...
            if (entry.getValue() instanceof TypeData)
            {
                // reconstruct the class...
                val = createFromFields((TypeData) entry.getValue(), info.getInfoForField(entry.getKey()));

                // re-add it to the map.
                data.putField(entry.getKey(), val);
            }
        }

        // actually reconstruct this class
        val = info.reconstruct(data);

        // return the reconstructed value.
        return val;
    }

    @Override
    public void parseConfigs(Configuration config, String category) throws Exception
    {
        loadFromConfigs(config, category);
        hasLoaded = true;
    }

    @Override
    public boolean hasLoaded()
    {
        return hasLoaded;
    }

    abstract public void loadFromConfigs(Configuration config, String category) throws Exception;

    abstract protected boolean saveData(ClassContainer type, TypeData fieldList);

    abstract protected TypeData loadData(ClassContainer type, String uniqueKey);

    abstract protected TypeData[] loadAll(ClassContainer type);

    abstract protected boolean deleteData(ClassContainer type, String uniqueObjectKey);
}
TOP

Related Classes of com.forgeessentials.data.AbstractDataDriver

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.