/*
 * 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 org.apache.ranger.biz;

import org.apache.log4j.Logger;
import org.apache.ranger.common.MessageEnums;
import org.apache.ranger.common.RESTErrorUtil;
import org.apache.ranger.common.RangerConstants;
import org.apache.ranger.common.db.BaseDao;
import org.apache.ranger.db.RangerDaoManager;
import org.apache.ranger.entity.XXDBBase;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public abstract class BaseMgr {
    static final Logger logger = Logger.getLogger(BaseMgr.class);

    @Autowired
    RangerDaoManager daoManager;

    @Autowired
    RESTErrorUtil restErrorUtil;

    public RangerDaoManager getDaoManager() {
	return daoManager;
    }

    public void deleteEntity(BaseDao<? extends XXDBBase> baseDao, Long id,
	    String entityName) {
	XXDBBase entity = baseDao.getById(id);
	if (entity != null) {
	    try {
		baseDao.remove(id);
	    } catch (Exception e) {
		logger.error("Error deleting " + entityName + ". Id=" + id, e);
		throw restErrorUtil.createRESTException("This " + entityName
			+ " can't be deleted",
			MessageEnums.OPER_NOT_ALLOWED_FOR_STATE, id, null, ""
				+ id + ", error=" + e.getMessage());
	    }
	} else {
	    // Return without error
	    logger.info("Delete ignored for non-existent " + entityName
		    + " id=" + id);
	}
    }

    /**
     * @param objectClassType
     */
    protected void validateClassType(int objectClassType) {
	// objectClassType
	restErrorUtil.validateMinMax(objectClassType, 1,
		RangerConstants.ClassTypes_MAX, "Invalid classType", null,
		"objectClassType");
    }

}
