blob: a76cb2a995b7b06fefa362ab303b9e7fcd80a390 [file] [log] [blame]
/*
* 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.service;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.ranger.authorization.utils.JsonUtils;
import org.apache.ranger.common.AppConstants;
import org.apache.ranger.common.GUIDUtil;
import org.apache.ranger.common.MessageEnums;
import org.apache.ranger.common.SearchField;
import org.apache.ranger.common.SortField;
import org.apache.ranger.common.view.VTrxLogAttr;
import org.apache.ranger.db.XXPortalUserDao;
import org.apache.ranger.entity.XXGdsDataShare;
import org.apache.ranger.entity.XXGdsDataShareInDataset;
import org.apache.ranger.entity.XXGdsDataset;
import org.apache.ranger.entity.XXPortalUser;
import org.apache.ranger.plugin.model.RangerGds.RangerDataShareInDataset;
import org.apache.ranger.plugin.model.RangerValiditySchedule;
import org.apache.ranger.plugin.util.SearchFilter;
import org.apache.ranger.view.RangerGdsVList.RangerDataShareInDatasetList;
import org.apache.ranger.view.VXMessage;
import org.apache.ranger.view.VXResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
@Service
@Scope("singleton")
public class RangerGdsDataShareInDatasetService extends RangerGdsBaseModelService<XXGdsDataShareInDataset, RangerDataShareInDataset> {
private static final Logger LOG = LoggerFactory.getLogger(RangerGdsDataShareInDatasetService.class);
@Autowired
GUIDUtil guidUtil;
@Autowired
XXPortalUserDao xxPortalUserDao;
public RangerGdsDataShareInDatasetService() {
super(AppConstants.CLASS_TYPE_GDS_DATA_SHARE_IN_DATASET);
searchFields.add(new SearchField(SearchFilter.DATA_SHARE_IN_DATASET_ID, "obj.id", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL));
searchFields.add(new SearchField(SearchFilter.DATA_SHARE_ID, "obj.dataShareId", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL));
searchFields.add(new SearchField(SearchFilter.DATA_SHARE_NAME, "dsh.name", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL, "XXGdsDataShare dsh", "obj.dataShareId = dsh.id"));
searchFields.add(new SearchField(SearchFilter.DATA_SHARE_NAME_PARTIAL, "dsh.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL, "XXGdsDataShare dsh", "obj.dataShareId = dsh.id"));
searchFields.add(new SearchField(SearchFilter.SERVICE_ID, "dsh.serviceId", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL, "XXGdsDataShare dsh", "obj.dataShareId = dsh.id"));
searchFields.add(new SearchField(SearchFilter.SERVICE_NAME, "s.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL, "XXGdsDataShare dsh, XXService s", "obj.dataShareId = dsh.id and dsh.serviceId = s.id"));
searchFields.add(new SearchField(SearchFilter.SERVICE_NAME_PARTIAL, "s.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL, "XXGdsDataShare dsh, XXService s", "obj.dataShareId = dsh.id and dsh.serviceId = s.id"));
searchFields.add(new SearchField(SearchFilter.ZONE_ID, "dsh.zoneId", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL, "XXGdsDataShare dsh, XXSecurityZone z", "obj.dataShareId = dsh.id"));
searchFields.add(new SearchField(SearchFilter.ZONE_NAME, "z.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL, "XXGdsDataShare dsh, XXSecurityZone z", "obj.dataShareId = dsh.id and dsh.zoneId = z.id"));
searchFields.add(new SearchField(SearchFilter.ZONE_NAME_PARTIAL, "z.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL, "XXGdsDataShare dsh, XXSecurityZone z", "obj.dataShareId = dsh.id and dsh.zoneId = z.id"));
searchFields.add(new SearchField(SearchFilter.DATASET_ID, "obj.datasetId", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL));
searchFields.add(new SearchField(SearchFilter.DATASET_NAME, "d.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL, "XXGdsDataset d", "obj.datasetId = d.id"));
searchFields.add(new SearchField(SearchFilter.DATASET_NAME_PARTIAL, "d.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL, "XXGdsDataset d", "obj.datasetId = d.id"));
searchFields.add(new SearchField(SearchFilter.PROJECT_ID, "dip.projectId", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL, "XXGdsDataset d, XXGdsDatasetInProject dip", "obj.datasetId = d.id and d.id = dip.datasetId"));
searchFields.add(new SearchField(SearchFilter.PROJECT_NAME, "p.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL, "XXGdsDataset d, XXGdsDatasetInProject dip, XXGdsProject p", "obj.datasetId = d.id and d.id = dip.datasetId and dip.projectId = p.id"));
searchFields.add(new SearchField(SearchFilter.PROJECT_NAME_PARTIAL, "p.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL, "XXGdsDataset d, XXGdsDatasetInProject dip, XXGdsProject p", "obj.datasetId = d.id and d.id = dip.datasetId and dip.projectId = p.id"));
searchFields.add(new SearchField(SearchFilter.APPROVER, "obj.approverId", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL));
searchFields.add(new SearchField(SearchFilter.CREATED_BY, "obj.addedByUserId",SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL));
searchFields.add(new SearchField(SearchFilter.SHARE_STATUS, "obj.status", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL));
sortFields.add(new SortField(SearchFilter.CREATE_TIME, "obj.createTime"));
sortFields.add(new SortField(SearchFilter.UPDATE_TIME, "obj.updateTime"));
sortFields.add(new SortField(SearchFilter.DATA_SHARE_IN_DATASET_ID, "obj.id", true, SortField.SORT_ORDER.ASC));
trxLogAttrs.put("dataShareId", new VTrxLogAttr("dataShareId", "DataShare ID", false));
trxLogAttrs.put("datasetId", new VTrxLogAttr("datasetId", "Dataset ID", false));
trxLogAttrs.put("status", new VTrxLogAttr("status", "Status", true));
trxLogAttrs.put("validitySchedule", new VTrxLogAttr("validitySchedule", "Validity Schedule", false));
trxLogAttrs.put("profiles", new VTrxLogAttr("profiles", "Profiles", false));
trxLogAttrs.put("approver", new VTrxLogAttr("approver", "Approver", false));
}
@Override
public RangerDataShareInDataset postCreate(XXGdsDataShareInDataset xObj) {
RangerDataShareInDataset ret = super.postCreate(xObj);
// TODO:
return ret;
}
@Override
public RangerDataShareInDataset postUpdate(XXGdsDataShareInDataset xObj) {
RangerDataShareInDataset ret = super.postUpdate(xObj);
// TODO:
return ret;
}
@Override
public XXGdsDataShareInDataset preDelete(Long id) {
// Update ServiceVersionInfo for each service in the zone
XXGdsDataShareInDataset ret = super.preDelete(id);
// TODO:
return ret;
}
@Override
protected void validateForCreate(RangerDataShareInDataset vObj) {
List<VXMessage> msgList = null;
if (vObj.getDataShareId() == null) {
msgList = getOrCreateMessageList(msgList);
msgList.add(MessageEnums.NO_INPUT_DATA.getMessage(null, "dataShareId"));
}
XXGdsDataShare xDataShare = daoMgr.getXXGdsDataShare().getById(vObj.getDataShareId());
if (xDataShare == null) {
msgList = getOrCreateMessageList(msgList);
msgList.add(MessageEnums.NO_INPUT_DATA.getMessage(null, "dataShareId"));
}
if (vObj.getDatasetId() == null) {
msgList = getOrCreateMessageList(msgList);
msgList.add(MessageEnums.NO_INPUT_DATA.getMessage(null, "datasetId"));
}
XXGdsDataset xDataset = daoMgr.getXXGdsDataset().getById(vObj.getDatasetId());
if (xDataset == null) {
msgList = getOrCreateMessageList(msgList);
msgList.add(MessageEnums.NO_INPUT_DATA.getMessage(null, "datasetId"));
}
if (CollectionUtils.isNotEmpty(msgList)) {
VXResponse gjResponse = new VXResponse();
gjResponse.setStatusCode(VXResponse.STATUS_ERROR);
gjResponse.setMsgDesc("Validation failure");
gjResponse.setMessageList(msgList);
LOG.debug("Validation failure in createDataShare({}): error={}", vObj, gjResponse);
throw restErrorUtil.createRESTException(gjResponse);
}
if (StringUtils.isBlank(vObj.getGuid())) {
vObj.setGuid(guidUtil.genGUID());
}
if (vObj.getIsEnabled() == null) {
vObj.setIsEnabled(Boolean.TRUE);
}
}
@Override
protected void validateForUpdate(RangerDataShareInDataset vObj, XXGdsDataShareInDataset xObj) {
List<VXMessage> msgList = null;
if (vObj.getDataShareId() == null) {
msgList = getOrCreateMessageList(msgList);
msgList.add(MessageEnums.NO_INPUT_DATA.getMessage(null, "dataShareId"));
}
XXGdsDataShare xDataShare = daoMgr.getXXGdsDataShare().getById(vObj.getDataShareId());
if (xDataShare == null || !Objects.equals(xDataShare.getId(), xObj.getDataShareId())) {
msgList = getOrCreateMessageList(msgList);
msgList.add(MessageEnums.NO_INPUT_DATA.getMessage(null, "dataShareId"));
}
if (vObj.getDatasetId() == null) {
msgList = getOrCreateMessageList(msgList);
msgList.add(MessageEnums.NO_INPUT_DATA.getMessage(null, "datasetId"));
}
XXGdsDataset xDataset = daoMgr.getXXGdsDataset().getById(vObj.getDatasetId());
if (xDataset == null || !Objects.equals(xDataset.getId(), xObj.getDatasetId())) {
msgList = getOrCreateMessageList(msgList);
msgList.add(MessageEnums.NO_INPUT_DATA.getMessage(null, "datasetId"));
}
if (CollectionUtils.isNotEmpty(msgList)) {
VXResponse gjResponse = new VXResponse();
gjResponse.setStatusCode(VXResponse.STATUS_ERROR);
gjResponse.setMsgDesc("Validation failure");
gjResponse.setMessageList(msgList);
LOG.debug("Validation failure in updateDataShare({}): error={}", vObj, gjResponse);
throw restErrorUtil.createRESTException(gjResponse);
}
if (vObj.getIsEnabled() == null) {
vObj.setIsEnabled(Boolean.TRUE);
}
}
@Override
protected XXGdsDataShareInDataset mapViewToEntityBean(RangerDataShareInDataset vObj, XXGdsDataShareInDataset xObj, int OPERATION_CONTEXT) {
XXGdsDataShare xDataShare = daoMgr.getXXGdsDataShare().getById(vObj.getDataShareId());
if (xDataShare == null) {
throw restErrorUtil.createRESTException("No data share found with ID: " + vObj.getDataShareId(), MessageEnums.INVALID_INPUT_DATA);
}
XXGdsDataset xDataset = daoMgr.getXXGdsDataset().getById(vObj.getDatasetId());
if (xDataset == null) {
throw restErrorUtil.createRESTException("No dataset found with ID: " + vObj.getDatasetId(), MessageEnums.INVALID_INPUT_DATA);
}
xObj.setGuid(vObj.getGuid());
xObj.setIsEnabled(vObj.getIsEnabled());
xObj.setDescription(vObj.getDescription());
xObj.setDataShareId(vObj.getDataShareId());
xObj.setDatasetId(vObj.getDatasetId());
xObj.setStatus((short) vObj.getStatus().ordinal());
xObj.setValidityPeriod(JsonUtils.objectToJson(vObj.getValiditySchedule()));
xObj.setProfiles(JsonUtils.objectToJson(vObj.getProfiles()));
xObj.setOptions(JsonUtils.mapToJson(vObj.getOptions()));
xObj.setAdditionalInfo(JsonUtils.mapToJson(vObj.getAdditionalInfo()));
final XXPortalUser user = xxPortalUserDao.findByLoginId(vObj.getApprover());
xObj.setApproverId(user == null? null : user.getId());
return xObj;
}
@Override
protected RangerDataShareInDataset mapEntityToViewBean(RangerDataShareInDataset vObj, XXGdsDataShareInDataset xObj) {
vObj.setGuid(xObj.getGuid());
vObj.setIsEnabled(xObj.getIsEnabled());
vObj.setVersion(xObj.getVersion());
vObj.setDescription(xObj.getDescription());
vObj.setDataShareId(xObj.getDataShareId());
vObj.setDatasetId(xObj.getDatasetId());
vObj.setStatus(toShareStatus(xObj.getStatus()));
vObj.setValiditySchedule(JsonUtils.jsonToObject(xObj.getValidityPeriod(), RangerValiditySchedule.class));
vObj.setProfiles(JsonUtils.jsonToSetString(xObj.getProfiles()));
vObj.setOptions(JsonUtils.jsonToMapStringString(xObj.getOptions()));
vObj.setAdditionalInfo(JsonUtils.jsonToMapStringString(xObj.getAdditionalInfo()));
vObj.setApprover(getUserName(xObj.getApproverId()));
return vObj;
}
public RangerDataShareInDataset getPopulatedViewObject(XXGdsDataShareInDataset xObj) {
return this.populateViewBean(xObj);
}
public RangerDataShareInDatasetList searchDataShareInDatasets(SearchFilter filter) {
LOG.debug("==> searchDataShareInDatasets({})", filter);
RangerDataShareInDatasetList ret = new RangerDataShareInDatasetList();
List<XXGdsDataShareInDataset> datasets = super.searchResources(filter, searchFields, sortFields, ret);
if (datasets != null) {
for (XXGdsDataShareInDataset dataset : datasets) {
ret.getList().add(getPopulatedViewObject(dataset));
}
}
LOG.debug("<== searchDataShareInDatasets({}): ret={}", filter, ret);
return ret;
}
}