Package com.jengine.orm

Source Code of com.jengine.orm.DB

/*
*  This file is part of JEngine.
*  *
*  * Copyright (C) 2013-2014 Cetus (http://cs1.com.ua/). All rights reserved.
*  *
*  * JEngine 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.
*  *
*  * JEngine 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 JEngine.  If not, see <http://www.gnu.org/licenses/>.
*/

package com.jengine.orm;


import com.jengine.orm.db.DBConnection;
import com.jengine.orm.db.DBException;
import com.jengine.orm.db.cache.CacheManager;
import com.jengine.orm.db.provider.Provider;
import com.jengine.orm.model.ModelClassBase;
import com.jengine.orm.model.field.Field;
import com.jengine.orm.model.field.reference.BaseReference;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import static com.jengine.utils.commons.CollectionUtil.map;

public class DB {
    protected String name;
    protected Provider provider;
    protected ConcurrentHashMap<String, ModelClassBase> models = new ConcurrentHashMap<String, ModelClassBase>();
    protected Map<String, Map<String, Field>> deferredFields = new ConcurrentHashMap<String, Map<String, Field>>();
    protected Map<String, Object> options = map("aliasEnabled", true);

    public DB(Provider provider) {
        this("default", provider);
    }

    public DB(Provider provider, Map<String, Object> options) {
        this("default", provider, options);
    }

    public DB(String name, Provider provider) {
        this(name, provider, new HashMap<String, Object>());
    }

    public DB(String name, Provider provider, Map<String, Object> options) {
        this.name = name;
        this.provider = provider;
        this.options.putAll(options);
    }

    public void register(ModelClassBase modelClass) {
        models.put(modelClass.getName(), modelClass);
        provider.register(modelClass.getManager().getTableName());

        // process references to create reverse fields
        for (Field field : modelClass.getManager().getFields()) {
            if (field instanceof BaseReference) {
                BaseReference reference = (BaseReference) field;
                String reverseFieldName = reference.getReverseFieldName();
                if (reverseFieldName != null) {
                    Field reverseField = reference.newReverseField();
                    ModelClassBase referenceModelClass = reference.getReferenceClass();
                    if (referenceModelClass != null &&
                            !referenceModelClass.getManager().getFieldMap().containsValue(reverseFieldName)) {
                        referenceModelClass.getManager().addField(reverseFieldName, reverseField);
                    } else {
                        if (!deferredFields.containsKey(reference.getReferenceModelName())) {
                            deferredFields.put(reference.getReferenceModelName(), new LinkedHashMap<String, Field>());
                        }
                        deferredFields.get(reference.getReferenceModelName()).put(reverseFieldName, reverseField);
                    }
                }
            }
        }
        if (!deferredFields.containsKey(modelClass.getName())) {
            deferredFields.put(modelClass.getName(), new LinkedHashMap<String, Field>());
        }
        Map<String, Field> fields = deferredFields.get(modelClass.getName());
        for (String fieldName: fields.keySet()) {
            if (!modelClass.getManager().getFieldMap().containsValue(fieldName)) {
                modelClass.getManager().addField(fieldName, fields.get(fieldName));
            }
        }
    }

    public ModelClassBase getModelClass(String name) {
        return models.get(name);
    }

    public DBConnection getConnection() throws DBException {
        return provider.getConnection();
    }

    public void closeConnection(DBConnection connection) throws DBException {
        provider.closeConnection(connection);
    }

    public Provider getProvider() {
        return provider;
    }

    public CacheManager getCacheManager() {
        return provider.getCacheManager();
    }

    public Map<String, Object> getOptions() {
        return options;
    }

    public void setOptions(Map<String, Object> options) {
        this.options = options;
    }

    @Override
    public String toString() {
        return "DB{" +
                "name='" + name + '\'' +
                '}';
    }
}
TOP

Related Classes of com.jengine.orm.DB

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.