/* * 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 java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ranger.common.AppConstants; import org.apache.ranger.common.MessageEnums; import org.apache.ranger.common.PropertiesUtil; import org.apache.ranger.common.SearchField; import org.apache.ranger.common.SortField; import org.apache.ranger.common.StringUtil; import org.apache.ranger.common.view.VTrxLogAttr; import org.apache.ranger.db.RangerDaoManager; import org.apache.ranger.entity.XXAsset; import org.apache.ranger.entity.XXGroup; import org.apache.ranger.entity.XXPortalUser; import org.apache.ranger.entity.XXTrxLog; import org.apache.ranger.util.RangerEnumUtil; import org.apache.ranger.view.VXGroup; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @Service @Scope("singleton") public class XGroupService extends XGroupServiceBase<XXGroup, VXGroup> { private final Long createdByUserId; @Autowired RangerDaoManager rangerDaoManager; @Autowired RangerEnumUtil xaEnumUtil; @Autowired StringUtil stringUtil; static HashMap<String, VTrxLogAttr> trxLogAttrs = new HashMap<String, VTrxLogAttr>(); static { trxLogAttrs.put("name", new VTrxLogAttr("name", "Group Name", false)); trxLogAttrs.put("description", new VTrxLogAttr("description", "Group Description", false)); } public XGroupService() { searchFields.add(new SearchField("name", "obj.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL)); searchFields.add(new SearchField("groupSource", "obj.groupSource", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL)); searchFields.add(new SearchField("isVisible", "obj.isVisible", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL )); createdByUserId = PropertiesUtil.getLongProperty("ranger.xuser.createdByUserId", 1); sortFields.add(new SortField("name", "obj.name",true,SortField.SORT_ORDER.ASC)); } @Override protected void validateForCreate(VXGroup vObj) { XXGroup xxGroup = rangerDaoManager.getXXGroup().findByGroupName( vObj.getName()); if (xxGroup != null) { throw restErrorUtil.createRESTException("XGroup already exists", MessageEnums.ERROR_DUPLICATE_OBJECT); } } @Override protected void validateForUpdate(VXGroup vObj, XXGroup mObj) { if (!vObj.getName().equalsIgnoreCase(mObj.getName())) { validateForCreate(vObj); } } public VXGroup getGroupByGroupName(String groupName) { XXGroup xxGroup = rangerDaoManager.getXXGroup().findByGroupName(groupName); if (xxGroup == null) { throw restErrorUtil.createRESTException( groupName + " is Not Found", MessageEnums.DATA_NOT_FOUND); } return super.populateViewBean(xxGroup); } public VXGroup createXGroupWithOutLogin(VXGroup vxGroup) { XXGroup xxGroup = rangerDaoManager.getXXGroup().findByGroupName( vxGroup.getName()); boolean groupExists = true; if (xxGroup == null) { xxGroup = new XXGroup(); groupExists = false; } xxGroup = mapViewToEntityBean(vxGroup, xxGroup, 0); XXPortalUser xXPortalUser = rangerDaoManager.getXXPortalUser().getById(createdByUserId); if (xXPortalUser != null) { xxGroup.setAddedByUserId(createdByUserId); xxGroup.setUpdatedByUserId(createdByUserId); } if (groupExists) { xxGroup = getDao().update(xxGroup); } else { xxGroup = getDao().create(xxGroup); } vxGroup = postCreate(xxGroup); return vxGroup; } public VXGroup readResourceWithOutLogin(Long id) { XXGroup resource = getDao().getById(id); if (resource == null) { // Returns code 400 with DATA_NOT_FOUND as the error message throw restErrorUtil.createRESTException(getResourceName() + " not found", MessageEnums.DATA_NOT_FOUND, id, null, "preRead: " + id + " not found."); } VXGroup view = populateViewBean(resource); if(view!=null){ view.setGroupSource(resource.getGroupSource()); } return view; } public List<XXTrxLog> getTransactionLog(VXGroup vResource, String action){ return getTransactionLog(vResource, null, action); } public List<XXTrxLog> getTransactionLog(VXGroup vObj, XXGroup mObj, String action){ if(vObj == null || action == null || ("update".equalsIgnoreCase(action) && mObj == null)){ return null; } List<XXTrxLog> trxLogList = new ArrayList<XXTrxLog>(); try { Field nameField = vObj.getClass().getDeclaredField("name"); nameField.setAccessible(true); String objectName = ""+nameField.get(vObj); Field[] fields = vObj.getClass().getDeclaredFields(); for(Field field : fields){ field.setAccessible(true); String fieldName = field.getName(); if(!trxLogAttrs.containsKey(fieldName)){ continue; } VTrxLogAttr vTrxLogAttr = trxLogAttrs.get(fieldName); XXTrxLog xTrxLog = new XXTrxLog(); xTrxLog.setAttributeName(vTrxLogAttr.getAttribUserFriendlyName()); String value = null; boolean isEnum = vTrxLogAttr.isEnum(); if(isEnum){ String enumName = XXGroup.getEnumName(fieldName); int enumValue = field.get(vObj) == null ? 0 : Integer.parseInt(""+field.get(vObj)); value = xaEnumUtil.getLabel(enumName, enumValue); } else { value = ""+field.get(vObj); } if("create".equalsIgnoreCase(action)){ if(stringUtil.isEmpty(value)){ continue; } xTrxLog.setNewValue(value); } else if("delete".equalsIgnoreCase(action)){ xTrxLog.setPreviousValue(value); } else if("update".equalsIgnoreCase(action)){ String oldValue = null; Field[] mFields = mObj.getClass().getDeclaredFields(); for(Field mField : mFields){ mField.setAccessible(true); String mFieldName = mField.getName(); if(fieldName.equalsIgnoreCase(mFieldName)){ if(isEnum){ String enumName = XXAsset.getEnumName(mFieldName); int enumValue = mField.get(mObj) == null ? 0 : Integer.parseInt(""+mField.get(mObj)); oldValue = xaEnumUtil.getLabel(enumName, enumValue); } else { oldValue = mField.get(mObj)+""; } break; } } if(value.equalsIgnoreCase(oldValue)){ continue; } xTrxLog.setPreviousValue(oldValue); xTrxLog.setNewValue(value); } xTrxLog.setAction(action); xTrxLog.setObjectClassType(AppConstants.CLASS_TYPE_XA_GROUP); xTrxLog.setObjectId(vObj.getId()); xTrxLog.setObjectName(objectName); trxLogList.add(xTrxLog); } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } return trxLogList; } @Override public VXGroup populateViewBean(XXGroup xGroup) { VXGroup vObj = super.populateViewBean(xGroup); vObj.setIsVisible(xGroup.getIsVisible()); return vObj; } @Override protected XXGroup mapViewToEntityBean(VXGroup vObj, XXGroup mObj, int OPERATION_CONTEXT) { super.mapViewToEntityBean(vObj, mObj, OPERATION_CONTEXT); return mObj; } @Override protected VXGroup mapEntityToViewBean(VXGroup vObj, XXGroup mObj) { super.mapEntityToViewBean(vObj, mObj); return vObj; } public Map<Long, XXGroup> getXXGroupIdXXGroupMap(){ Map<Long, XXGroup> xXGroupMap=new HashMap<Long, XXGroup>(); try{ List<XXGroup> xXGroupList=rangerDaoManager.getXXGroup().getAll(); if(!CollectionUtils.isEmpty(xXGroupList)){ for(XXGroup xXGroup:xXGroupList){ xXGroupMap.put(xXGroup.getId(), xXGroup); } } }catch(Exception ex){} return xXGroupMap; } }