com.glaf.core.service.impl.DatabaseServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.glaf.core.service.impl.DatabaseServiceImpl.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.glaf.core.service.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.session.RowBounds;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.glaf.core.cache.CacheFactory;
import com.glaf.core.dao.EntityDAO;
import com.glaf.core.id.IdGenerator;
import com.glaf.core.security.SecurityUtils;
import com.glaf.core.domain.Database;
import com.glaf.core.domain.DatabaseAccess;
import com.glaf.core.mapper.DatabaseAccessMapper;
import com.glaf.core.mapper.DatabaseMapper;
import com.glaf.core.query.DatabaseQuery;
import com.glaf.core.service.IDatabaseService;
import com.glaf.core.domain.util.DatabaseAccessJsonFactory;
import com.glaf.core.domain.util.DatabaseJsonFactory;

@Service("databaseService")
@Transactional(readOnly = true)
public class DatabaseServiceImpl implements IDatabaseService {
    protected final Logger logger = LoggerFactory.getLogger(getClass());

    protected EntityDAO entityDAO;

    protected IdGenerator idGenerator;

    protected SqlSessionTemplate sqlSessionTemplate;

    protected DatabaseMapper databaseMapper;

    protected DatabaseAccessMapper databaseAccessMapper;

    public DatabaseServiceImpl() {

    }

    public int count(DatabaseQuery query) {
        return databaseMapper.getDatabaseCount(query);
    }

    @Transactional
    public void createAccessor(long databaseId, String actorId) {
        String cacheKey = "sys_db_" + databaseId;
        CacheFactory.remove(cacheKey);
        cacheKey = "sys_dbaccess_" + databaseId;
        CacheFactory.remove(cacheKey);
        cacheKey = "sys_db_actor_" + actorId;
        CacheFactory.remove(cacheKey);
        DatabaseAccess model = new DatabaseAccess();
        model.setId(idGenerator.nextId("SYS_DATABASE_ACCESS"));
        model.setActorId(actorId);
        model.setDatabaseId(databaseId);
        databaseAccessMapper.insertDatabaseAccess(model);
    }

    @Transactional
    public void deleteAccessor(long databaseId, String actorId) {
        String cacheKey = "sys_db_" + databaseId;
        CacheFactory.remove(cacheKey);
        cacheKey = "sys_dbaccess_" + databaseId;
        CacheFactory.remove(cacheKey);
        cacheKey = "sys_db_actor_" + actorId;
        CacheFactory.remove(cacheKey);
        DatabaseAccess model = new DatabaseAccess();
        model.setActorId(actorId);
        model.setDatabaseId(databaseId);
        databaseAccessMapper.deleteAccessor(model);
    }

    @Transactional
    public void deleteById(Long databaseId) {
        if (databaseId != null) {
            String cacheKey = "sys_db_" + databaseId;
            CacheFactory.remove(cacheKey);
            cacheKey = "sys_dbaccess_" + databaseId;
            CacheFactory.remove(cacheKey);
            databaseMapper.deleteDatabaseById(databaseId);
            databaseAccessMapper.deleteDatabaseAccessByDatabaseId(databaseId);
        }
    }

    @Transactional
    public void deleteByIds(List<Long> ids) {
        if (ids != null && !ids.isEmpty()) {
            for (Long databaseId : ids) {
                String cacheKey = "sys_db_" + databaseId;
                CacheFactory.remove(cacheKey);
                cacheKey = "sys_dbaccess_" + databaseId;
                CacheFactory.remove(cacheKey);
                databaseMapper.deleteDatabaseById(databaseId);
                databaseAccessMapper.deleteDatabaseAccessByDatabaseId(databaseId);
            }
        }
    }

    public List<DatabaseAccess> getAllDatabaseAccesses() {
        return databaseAccessMapper.getAllDatabaseAccesses();
    }

    public Database getDatabase(Long databaseId) {
        if (databaseId == null || databaseId == 0) {
            return null;
        }
        Database database = databaseMapper.getDatabaseById(databaseId);
        return database;
    }

    public Database getDatabaseById(Long databaseId) {
        if (databaseId == null || databaseId == 0) {
            return null;
        }
        String cacheKey = "sys_db_" + databaseId;
        String text = CacheFactory.getString(cacheKey);
        if (StringUtils.isNotEmpty(text)) {
            try {
                JSONObject json = JSON.parseObject(text);
                return DatabaseJsonFactory.jsonToObject(json);
            } catch (Exception ex) {
            }
        }
        Database database = databaseMapper.getDatabaseById(databaseId);
        if (database != null) {
            List<DatabaseAccess> accesses = databaseAccessMapper.getDatabaseAccessesByDatabaseId(databaseId);
            if (accesses != null && !accesses.isEmpty()) {
                for (DatabaseAccess access : accesses) {
                    database.addAccessor(access.getActorId());
                }
            }
            CacheFactory.put(cacheKey, database.toJsonObject().toJSONString());
        }
        return database;
    }

    private List<DatabaseAccess> getDatabaseAccesses(long databaseId) {
        String cacheKey = "sys_dbaccess_" + databaseId;
        String text = CacheFactory.getString(cacheKey);
        if (StringUtils.isNotEmpty(text)) {
            try {
                JSONArray array = JSON.parseArray(text);
                return DatabaseAccessJsonFactory.arrayToList(array);
            } catch (Exception ex) {
            }
        }
        List<DatabaseAccess> accesses = databaseAccessMapper.getDatabaseAccessesByDatabaseId(databaseId);
        if (accesses != null && !accesses.isEmpty()) {
            JSONArray array = DatabaseAccessJsonFactory.listToArray(accesses);
            CacheFactory.put(cacheKey, array.toJSONString());
        }
        return accesses;
    }

    /**
     * ????
     * 
     * @return
     */
    public Database getDatabaseByCode(String code) {
        DatabaseQuery query = new DatabaseQuery();
        List<Database> list = databaseMapper.getDatabases(query);
        if (list != null && !list.isEmpty()) {
            for (Database database : list) {
                if (StringUtils.equals(database.getActive(), "1")) {
                    List<DatabaseAccess> accesses = this.getDatabaseAccesses(database.getId());
                    database.setAccesses(accesses);
                    return database;
                }
            }
        }
        return null;
    }

    /**
     * ???
     * 
     * @return
     */
    public int getDatabaseCountByQueryCriteria(DatabaseQuery query) {
        return databaseMapper.getDatabaseCount(query);
    }

    public List<Database> getDatabases() {
        List<Database> databases = new ArrayList<Database>();
        DatabaseQuery query = new DatabaseQuery();
        List<Database> list = databaseMapper.getDatabases(query);
        if (list != null && !list.isEmpty()) {
            for (Database database : list) {
                if (StringUtils.equals(database.getActive(), "1")) {
                    List<DatabaseAccess> accesses = this.getDatabaseAccesses(database.getId());
                    database.setAccesses(accesses);
                    if (accesses != null && !accesses.isEmpty()) {
                        for (DatabaseAccess access : accesses) {
                            database.addAccessor(access.getActorId());
                        }
                    }
                    databases.add(database);
                }
            }
        }
        logger.debug("repos size:" + databases.size());
        if (!databases.isEmpty()) {
            Collections.sort(databases);
        }
        return databases;
    }

    /**
     * ???
     * 
     * @return
     */
    public List<Database> getDatabases(String actorId) {
        List<Database> databases = new ArrayList<Database>();
        DatabaseQuery query = new DatabaseQuery();
        query.setCreateBy(actorId);
        List<Database> list = databaseMapper.getDatabases(query);
        if (list != null && !list.isEmpty()) {
            for (Database database : list) {
                if (StringUtils.equals(database.getActive(), "1")) {
                    List<DatabaseAccess> accesses = this.getDatabaseAccesses(database.getId());
                    database.setAccesses(accesses);
                    if (accesses != null && !accesses.isEmpty()) {
                        for (DatabaseAccess access : accesses) {
                            database.addAccessor(access.getActorId());
                        }
                    }
                    databases.add(database);
                }
            }
        }

        List<DatabaseAccess> accesses = databaseAccessMapper.getDatabaseAccessesByActorId(actorId);
        if (accesses != null && !accesses.isEmpty()) {
            for (DatabaseAccess access : accesses) {
                Database database = this.getDatabaseById(access.getDatabaseId());
                if (StringUtils.equals(database.getActive(), "1")) {
                    databases.add(database);
                }
            }
        }

        return databases;
    }

    /**
     * ????
     * 
     * @return
     */
    public List<Database> getDatabasesByQueryCriteria(int start, int pageSize, DatabaseQuery query) {
        RowBounds rowBounds = new RowBounds(start, pageSize);
        List<Database> rows = sqlSessionTemplate.selectList("getDatabases", query, rowBounds);
        return rows;
    }

    public List<Database> list(DatabaseQuery query) {
        List<Database> list = databaseMapper.getDatabases(query);
        for (Database database : list) {
            if (StringUtils.equals(database.getActive(), "1")) {
                List<DatabaseAccess> accesses = this.getDatabaseAccesses(database.getId());
                database.setAccesses(accesses);
                if (accesses != null && !accesses.isEmpty()) {
                    for (DatabaseAccess access : accesses) {
                        database.addAccessor(access.getActorId());
                    }
                }
            }
        }
        return list;
    }

    @Transactional
    public void save(Database database) {
        String password = database.getPassword();
        if (database.getId() == 0) {
            if (!"88888888".equals(password)) {
                String key = SecurityUtils.genKey();
                String pass = SecurityUtils.encode(key, password);
                database.setKey(key);
                database.setPassword(pass);
            }
            database.setId(idGenerator.nextId("SYS_DATABASE"));
            database.setName("repo_db_" + database.getId());
            database.setCode("repo_db_" + database.getId());
            database.setCreateTime(new Date());
            databaseMapper.insertDatabase(database);
        } else {
            Database model = this.getDatabase(database.getId());
            model.setId(database.getId());
            model.setTitle(database.getTitle());
            model.setProviderClass(database.getProviderClass());
            model.setLevel(database.getLevel());
            model.setPriority(database.getPriority());
            model.setOperation(database.getOperation());
            model.setHost(database.getHost());
            model.setPort(database.getPort());
            model.setActive(database.getActive());
            model.setNodeId(database.getNodeId());
            model.setUpdateTime(new Date());

            if (!"88888888".equals(password)) {
                String key = SecurityUtils.genKey();
                String pass = SecurityUtils.encode(key, password);
                model.setKey(key);
                model.setPassword(pass);
            }
            /**
             * ????????
             */
            if (!StringUtils.equals(model.getInitFlag(), "Y")) {
                model.setDbname(database.getDbname());
            }
            databaseMapper.updateDatabase(model);
            String cacheKey = "sys_db_" + model.getId();
            CacheFactory.remove(cacheKey);
            cacheKey = "sys_dbaccess_" + model.getId();
            CacheFactory.remove(cacheKey);
        }

        databaseAccessMapper.deleteDatabaseAccessByDatabaseId(database.getId());
        if (database.getActorIds() != null && database.getActorIds().isEmpty()) {
            for (String actorId : database.getActorIds()) {
                DatabaseAccess access = new DatabaseAccess();
                access.setId(idGenerator.nextId("SYS_DATABASE_ACCESS"));
                access.setActorId(actorId);
                access.setDatabaseId(database.getId());
                databaseAccessMapper.insertDatabaseAccess(access);
            }
        }
    }

    /**
     * ??
     * 
     * @return
     */
    @Transactional
    public void saveAccessors(long databaseId, Collection<String> accessors) {
        databaseAccessMapper.deleteDatabaseAccessByDatabaseId(databaseId);
        for (String actorId : accessors) {
            String cacheKey = "sys_db_" + databaseId;
            CacheFactory.remove(cacheKey);
            cacheKey = "sys_dbaccess_" + databaseId;
            CacheFactory.remove(cacheKey);
            cacheKey = "sys_db_actor_" + actorId;
            CacheFactory.remove(cacheKey);
            DatabaseAccess access = new DatabaseAccess();
            access.setId(idGenerator.nextId("SYS_DATABASE_ACCESS"));
            access.setActorId(actorId);
            access.setDatabaseId(databaseId);
            databaseAccessMapper.insertDatabaseAccess(access);
        }
    }

    /**
     * ??
     * 
     * @return
     */
    @Transactional
    public void saveAccessors(String accessor, Collection<Long> databaseIds) {
        databaseAccessMapper.deleteDatabaseAccessByActorId(accessor);
        for (Long databaseId : databaseIds) {
            String cacheKey = "sys_db_" + databaseId;
            CacheFactory.remove(cacheKey);
            cacheKey = "sys_dbaccess_" + databaseId;
            CacheFactory.remove(cacheKey);
            cacheKey = "sys_db_actor_" + accessor;
            CacheFactory.remove(cacheKey);
            DatabaseAccess access = new DatabaseAccess();
            access.setId(idGenerator.nextId("SYS_DATABASE_ACCESS"));
            access.setActorId(accessor);
            access.setDatabaseId(databaseId);
            databaseAccessMapper.insertDatabaseAccess(access);
        }
    }

    @javax.annotation.Resource
    public void setDatabaseAccessMapper(DatabaseAccessMapper databaseAccessMapper) {
        this.databaseAccessMapper = databaseAccessMapper;
    }

    @javax.annotation.Resource
    public void setDatabaseMapper(DatabaseMapper databaseMapper) {
        this.databaseMapper = databaseMapper;
    }

    @javax.annotation.Resource
    public void setEntityDAO(EntityDAO entityDAO) {
        this.entityDAO = entityDAO;
    }

    @javax.annotation.Resource
    public void setIdGenerator(IdGenerator idGenerator) {
        this.idGenerator = idGenerator;
    }

    @javax.annotation.Resource
    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }

    @Transactional
    public void update(Database database) {
        String cacheKey = "sys_db_" + database.getId();
        CacheFactory.remove(cacheKey);
        cacheKey = "sys_dbaccess_" + database.getId();
        CacheFactory.remove(cacheKey);
        Database model = this.getDatabase(database.getId());
        model.setActive(database.getActive());
        model.setVerify(database.getVerify());
        model.setInitFlag(database.getInitFlag());
        databaseMapper.updateDatabase(model);
    }

}