1 12 package mondrian.rolap; 13 14 import java.util.ArrayList ; 15 import java.util.Collections ; 16 import java.util.List ; 17 18 import mondrian.olap.*; 19 import mondrian.rolap.sql.TupleConstraint; 20 import mondrian.rolap.sql.MemberChildrenConstraint; 21 22 30 class RestrictedMemberReader extends DelegatingMemberReader { 31 32 private final Role.HierarchyAccess hierarchyAccess; 33 private final boolean ragged; 34 private final SqlConstraintFactory sqlConstraintFactory = SqlConstraintFactory.instance(); 35 36 49 RestrictedMemberReader(MemberReader memberReader, Role role) { 50 super(memberReader); 51 RolapHierarchy hierarchy = memberReader.getHierarchy(); 52 hierarchyAccess = role.getAccessDetails(hierarchy); 53 ragged = hierarchy.isRagged(); 54 Util.assertPrecondition(hierarchyAccess != null || ragged, 55 "role.getAccessDetails(memberReader.getHierarchy()) != " + 56 "null || hierarchy.isRagged()"); 57 } 58 59 public boolean setCache(MemberCache cache) { 60 return false; 62 } 63 64 public RolapMember getLeadMember(RolapMember member, int n) { 65 int i = 0; 66 int increment = 1; 67 if (n < 0) { 68 increment = -1; 69 n = -n; 70 } 71 while (i < n) { 72 member = memberReader.getLeadMember(member, increment); 73 if (member.isNull()) { 74 return member; 75 } 76 if (canSee(member)) { 77 ++i; 78 } 79 } 80 return member; 81 } 82 83 public void getMemberChildren( 84 RolapMember parentMember, 85 List <RolapMember> children) 86 { 87 MemberChildrenConstraint constraint = 88 sqlConstraintFactory.getMemberChildrenConstraint(null); 89 getMemberChildren(parentMember, children, constraint); 90 } 91 92 public void getMemberChildren( 93 RolapMember parentMember, 94 List <RolapMember> children, 95 MemberChildrenConstraint constraint) 96 { 97 List <RolapMember> fullChildren = new ArrayList <RolapMember>(); 98 memberReader.getMemberChildren(parentMember, fullChildren, constraint); 99 processMemberChildren(fullChildren, children, constraint); 100 } 101 102 private void processMemberChildren( 103 List <RolapMember> fullChildren, 104 List <RolapMember> children, 105 MemberChildrenConstraint constraint) 106 { 107 List <RolapMember> grandChildren = null; 109 for (int i = 0; i < fullChildren.size(); i++) { 110 RolapMember member = fullChildren.get(i); 111 if (ragged) { 114 if (member.isHidden()) { 115 fullChildren.remove(i); 120 if (grandChildren == null) { 121 grandChildren = new ArrayList <RolapMember>(); 122 } else { 123 grandChildren.clear(); 124 } 125 memberReader.getMemberChildren(member, grandChildren, constraint); 126 fullChildren.addAll(i, grandChildren); 127 --i; 130 continue; 131 } 132 } 133 if (hierarchyAccess != null) { 136 final Access access = hierarchyAccess.getAccess(member); 137 if (access == Access.NONE) { 138 continue; 139 } 140 } 141 children.add(member); 142 } 143 } 144 145 150 private void filterMembers( 151 List <RolapMember> members, 152 List <RolapMember> filteredMembers) 153 { 154 for (RolapMember member : members) { 155 if (canSee(member)) { 156 filteredMembers.add(member); 157 } 158 } 159 } 160 161 private boolean canSee(final RolapMember member) { 162 if (ragged && member.isHidden()) { 163 return false; 164 } 165 if (hierarchyAccess != null) { 166 final Access access = hierarchyAccess.getAccess(member); 167 return access != Access.NONE; 168 } 169 return true; 170 } 171 172 public void getMemberChildren(List <RolapMember> parentMembers, List <RolapMember> children) { 173 MemberChildrenConstraint constraint = sqlConstraintFactory.getMemberChildrenConstraint(null); 174 getMemberChildren(parentMembers, children, constraint); 175 } 176 177 public synchronized void getMemberChildren(List <RolapMember> parentMembers, List <RolapMember> children, MemberChildrenConstraint constraint) { 178 List <RolapMember> fullChildren = new ArrayList <RolapMember>(); 183 super.getMemberChildren(parentMembers, fullChildren, constraint); 184 processMemberChildren(fullChildren, children, constraint); 185 } 186 187 public List <RolapMember> getMembersInLevel(RolapLevel level, 188 int startOrdinal, 189 int endOrdinal) { 190 TupleConstraint constraint = sqlConstraintFactory.getLevelMembersConstraint(null); 191 return getMembersInLevel(level, startOrdinal, endOrdinal, constraint); 192 } 193 194 public List <RolapMember> getMembersInLevel(RolapLevel level, 195 int startOrdinal, 196 int endOrdinal, 197 TupleConstraint constraint) { 198 if (hierarchyAccess != null) { 199 final int depth = level.getDepth(); 200 if (hierarchyAccess.getTopLevel() != null && 201 depth < hierarchyAccess.getTopLevel().getDepth()) { 202 return Collections.emptyList(); 203 } 204 if (hierarchyAccess.getBottomLevel() != null && 205 depth > hierarchyAccess.getBottomLevel().getDepth()) { 206 return Collections.emptyList(); 207 } 208 } 209 final List <RolapMember> membersInLevel = super.getMembersInLevel(level, 210 startOrdinal, endOrdinal, constraint); 211 List <RolapMember> filteredMembers = new ArrayList <RolapMember>(); 212 filterMembers(membersInLevel, filteredMembers); 213 return filteredMembers; 214 } 215 216 } 217 218 | Popular Tags |