rolapschemareader.java

来自「数据仓库展示程序」· Java 代码 · 共 323 行

JAVA
323
字号
/*
// $Id: //open/mondrian/src/main/mondrian/rolap/RolapSchemaReader.java#21 $
// This software is subject to the terms of the Common Public License
// Agreement, available at the following URL:
// http://www.opensource.org/licenses/cpl.html.
// (C) Copyright 2003-2005 Julian Hyde
// All Rights Reserved.
// You must accept the terms of that agreement to use this software.
//
// jhyde, Feb 24, 2003
*/
package mondrian.rolap;

import mondrian.olap.*;

import java.util.*;

/**
 * A <code>RolapSchemaReader</code> allows you to read schema objects while
 * observing the access-control profile specified by a given role.
 *
 * @author jhyde
 * @since Feb 24, 2003
 * @version $Id: //open/mondrian/src/main/mondrian/rolap/RolapSchemaReader.java#21 $
 **/
public abstract class RolapSchemaReader implements SchemaReader {
    private final Role role;
    private final Map hierarchyReaders;
    private final RolapSchema schema;

    RolapSchemaReader(Role role, RolapSchema schema) {
        assert role != null : "precondition: role != null";

        this.role = role;
        this.schema = schema;
        this.hierarchyReaders = new HashMap();
    }

    public Role getRole() {
        return role;
    }

    public Member[] getHierarchyRootMembers(Hierarchy hierarchy) {
        final Role.HierarchyAccess hierarchyAccess = role.getAccessDetails(hierarchy);
        Level firstLevel;
        if (hierarchyAccess == null) {
            firstLevel = hierarchy.getLevels()[0];
        } else {
            firstLevel = hierarchyAccess.getTopLevel();
            if (firstLevel == null) {
                firstLevel = hierarchy.getLevels()[0];
            }
        }
        return getLevelMembers(firstLevel);
    }

    private synchronized MemberReader getMemberReader(Hierarchy hierarchy) {
        MemberReader memberReader = (MemberReader) hierarchyReaders.get(hierarchy);
        if (memberReader == null) {
            memberReader = ((RolapHierarchy) hierarchy).getMemberReader(role);
            hierarchyReaders.put(hierarchy, memberReader);
        }
        return memberReader;
    }

    public void getMemberRange(Level level, Member startMember, Member endMember, List list) {
        getMemberReader(level.getHierarchy()).getMemberRange(
                (RolapLevel) level, (RolapMember) startMember,
                (RolapMember) endMember, list);
    }

    public int compareMembersHierarchically(Member m1, Member m2) {
        final RolapHierarchy hierarchy = (RolapHierarchy) m1.getHierarchy();
        Util.assertPrecondition(hierarchy == m2.getHierarchy());
        return getMemberReader(hierarchy).compare((RolapMember) m1, (RolapMember) m2, true);
    }

    public Member getMemberParent(Member member) {
        Member parentMember = member.getParentMember();
        // Skip over hidden parents.
        while (parentMember != null && parentMember.isHidden()) {
            parentMember = parentMember.getParentMember();
        }
        // Skip over non-accessible parents.
        if (parentMember != null) {
            final Role.HierarchyAccess hierarchyAccess =
                    role.getAccessDetails(member.getHierarchy());
            if (hierarchyAccess != null &&
                    hierarchyAccess.getAccess(parentMember) == Access.NONE) {
                return null;
            }
        }
        return parentMember;
    }

    public int getMemberDepth(Member member) {
        final Role.HierarchyAccess hierarchyAccess = role.getAccessDetails(member.getHierarchy());
        if (hierarchyAccess != null) {
            int memberDepth = member.getLevel().getDepth();
            final Level topLevel = hierarchyAccess.getTopLevel();
            if (topLevel != null) {
                memberDepth -= topLevel.getDepth();
            }
            return memberDepth;
        } else if (((RolapLevel) member.getLevel()).getParentExp() != null) {
            // For members of parent-child hierarchy, members in the same level may have
            // different depths.
            int depth = 0;
            for (Member m = member.getParentMember(); m != null; m = m.getParentMember()) {
                depth++;
            }
            return depth;
        } else {
            return member.getLevel().getDepth();
        }
    }

    public Member[] getMemberChildren(Member member) {
        List children = new ArrayList();
        final Hierarchy hierarchy = member.getHierarchy();
        final MemberReader memberReader = getMemberReader(hierarchy);
        memberReader.getMemberChildren((RolapMember) member, children);
        return RolapUtil.toArray(children);
    }

    /**
     * check, whether members children are cached, and
     * if yes - return children count
     * if no  - return -1
     */
    public int getChildrenCountFromCache(Member member) {
        final Hierarchy hierarchy = member.getHierarchy();
        final MemberReader memberReader = getMemberReader(hierarchy);
        if( !(memberReader instanceof MemberCache)) {
            return -1;
        }
        if (!((MemberCache)memberReader).hasChildren((RolapMember)member)) {
            return -1;
        }
        List children = new ArrayList();
        memberReader.getMemberChildren((RolapMember) member, children);
        return children.size();
    }

    /**
     * check, whether member reader is caching
     * if yes - return level member count
     * if no  - return -1
     */
    public int getLevelCardinalityFromCache(Level level) {
        final Hierarchy hierarchy = level.getHierarchy();
        final MemberReader memberReader = getMemberReader(hierarchy);
        if( !(memberReader instanceof MemberCache)) {
            return -1;
        }
        if (!((MemberCache)memberReader).hasLevelMembers((RolapLevel)level)) {
            return -1;
        }
        List mlist = memberReader.getMembersInLevel((RolapLevel)level, 0, Integer.MAX_VALUE);
        return mlist.size();
    }

    public Member[] getMemberChildren(Member[] members) {
        if (members.length == 0) {
            return RolapUtil.emptyMemberArray;
        } else {
            final Hierarchy hierarchy = members[0].getHierarchy();
            final MemberReader memberReader = getMemberReader(hierarchy);
            List children = new ArrayList();
            for (int i = 0; i < members.length; i++) {
                memberReader.getMemberChildren((RolapMember) members[i], children);
            }
            return RolapUtil.toArray(children);
        }
    }

    public void getMemberDescendants(Member member, List result, Level level,
            boolean before, boolean self, boolean after) {
        Util.assertPrecondition(level != null, "level != null");

        final Hierarchy hierarchy = member.getHierarchy();
        final MemberReader memberReader = getMemberReader(hierarchy);
        memberReader.getMemberDescendants((RolapMember) member, result,
                (RolapLevel) level, before, self, after);
    }

    public abstract Cube getCube();

    public OlapElement getElementChild(OlapElement parent, String name) {
        return parent.lookupChild(this, name);
    }

    public Member getMemberByUniqueName(String[] uniqueNameParts,
                                        boolean failIfNotFound) {
        // In general, this schema reader doesn't have a cube, so we cannot
        // start looking up members.
        return null;
    }

    public OlapElement lookupCompound(
            OlapElement parent,
            String[] names,
            boolean failIfNotFound,
            int category) {
        return Util.lookupCompound(
                this, parent, names, failIfNotFound, category);
    }

    public Member getCalculatedMember(String[] nameParts) {
        // There are no calculated members defined against a schema.
        return null;
    }

    public NamedSet getNamedSet(String[] nameParts) {
        if (nameParts.length != 1) {
            return null;
        }
        final String name = nameParts[0];
        return schema.getNamedSet(name);
    }

    public Member getLeadMember(Member member, int n) {
        return getMemberReader(member.getHierarchy()).getLeadMember((RolapMember) member, n);
    }

    public Member[] getLevelMembers(Level level) {
        final MemberReader memberReader = getMemberReader(level.getHierarchy());
        final List membersInLevel = memberReader.getMembersInLevel(
                    (RolapLevel) level, 0, Integer.MAX_VALUE);
        return RolapUtil.toArray(membersInLevel);
    }

    public Level[] getHierarchyLevels(Hierarchy hierarchy) {
        Util.assertPrecondition(hierarchy != null, "hierarchy != null");
        final Role.HierarchyAccess hierarchyAccess = role.getAccessDetails(hierarchy);
        final Level[] levels = hierarchy.getLevels();
        if (hierarchyAccess == null) {
            return levels;
        }
        Level topLevel = hierarchyAccess.getTopLevel();
        Level bottomLevel = hierarchyAccess.getBottomLevel();
        if ((topLevel == null) && (bottomLevel == null)) {
            return levels;
        }
        if (topLevel == null) {
            topLevel = levels[0];
        }
        if (bottomLevel == null) {
            bottomLevel = levels[levels.length - 1];
        }
        final int levelCount = bottomLevel.getDepth() - topLevel.getDepth() + 1;
        Level[] restrictedLevels = new Level[levelCount];
        System.arraycopy(levels, topLevel.getDepth(), restrictedLevels, 0, levelCount);
        Util.assertPostcondition(restrictedLevels.length >= 1, "return.length >= 1");
        return restrictedLevels;
    }

    public Member getHierarchyDefaultMember(Hierarchy hierarchy) {
        Util.assertPrecondition(hierarchy != null, "hierarchy != null");
        // if we have no access to this hierarchy at all, we return
        // the unrestricted default member (e.g. All member)
        if (role.getAccess(hierarchy) == Access.NONE) {
            return hierarchy.getDefaultMember();
        }
        Member[] rootMembers = this.getHierarchyRootMembers(hierarchy);
        return (rootMembers.length > 0)
            ? rootMembers[0]
            : null;
    }

    public boolean isDrillable(Member member) {
        final RolapLevel level = (RolapLevel) member.getLevel();
        if (level.getParentExp() != null) {
            // This is a parent-child level, so its children, if any, come from
            // the same level.
            //
            // todo: More efficient implementation
            return getMemberChildren(member).length > 0;
        } else {
            // This is a regular level. It has children iff there is a lower
            // level.
            final Level childLevel = level.getChildLevel();
            return (childLevel != null) &&
                    (role.getAccess(childLevel) != Access.NONE);
        }
    }

    public boolean isVisible(Member member) {
        return !member.isHidden() && role.canAccess(member);
    }

    public Cube[] getCubes() {
        Cube[] cubes = schema.getCubes();
        List visibleCubes = new ArrayList(cubes.length);

        for (int idx = 0; idx < cubes.length; idx++) {
            if (role.canAccess(cubes[idx])) {
                visibleCubes.add(cubes[idx]);
            }
        }

        Cube[] result = new Cube[visibleCubes.size()];

        visibleCubes.toArray(result);

        return result;
    }

    public List getCalculatedMembers(Hierarchy hierarchy) {
        return Collections.EMPTY_LIST;
    }

    public List getCalculatedMembers(Level level) {
        return Collections.EMPTY_LIST;
    }

    public List getCalculatedMembers() {
        return Collections.EMPTY_LIST;
    }
}

// End RolapSchemaReader.java

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?