Skip to content

Commit

Permalink
MONDRIAN-LAGUNITAS: Integrate from main @14996.
Browse files Browse the repository at this point in the history
[git-p4: depot-paths = "//open/mondrian-release/lagunitas/": change = 14999]
  • Loading branch information
julianhyde committed Mar 13, 2012
1 parent 61778c6 commit 5596c22
Show file tree
Hide file tree
Showing 16 changed files with 300 additions and 32 deletions.
24 changes: 20 additions & 4 deletions build.xml
Expand Up @@ -269,6 +269,15 @@ demo/access/MondrianFoodMart.mdb"/>
</not>
</condition>

<condition property="java.version.matches.requested">
<or>
<not>
<isset property="requested.java.version"/>
</not>
<matches pattern="^${requested.java.version}.*" string="jdk${java.runtime.version}" />
</or>
</condition>

<path id="project.test.classpath" refid="project.test.classpath-${jdk}"/>

<available classname="${mondrian.jdbcDrivers}"
Expand Down Expand Up @@ -537,7 +546,14 @@ compileJdk17"/>
fork="no"/>
</target>

<target name="compile.java">
<target name="apologise" unless="java.version.matches.requested">
<echo>Actual JVM Version (${java.runtime.version}) does not match
requested (${requested.java.version}); skipping compile for this JDK.
If you wish to build for this JDK, modify ${unix.script}.
</echo>
</target>

<target name="compile.java" depends="apologise" if="java.version.matches.requested">
<echo>Compiling on JVM Version: ${java.runtime.version}</echo>
<javac
srcdir="${java.dir}"
Expand All @@ -550,7 +566,7 @@ compileJdk17"/>
<exclude name="mondrian/olap4j/FactoryJdbc4Impl.java" if="jdk16.not.present"/>
<exclude name="mondrian/olap4j/FactoryJdbc4Plus.java" if="jdk16.not.present"/>
<exclude name="mondrian/olap4j/FactoryJdbc41Impl.java" if="jdk17.not.present"/>
<exclude name="mondrian/util/UtilCompatibleJdk16.java" if="jdk16.not.present"/>
<exclude name="mondrian/util/UtilCompatibleJdk16.java" if="jdk15.present"/>
<exclude name="mondrian/rolap/RolapSchemaUpgrader.java"/>
<exclude name="mondrian/rolap/PhysSchemaConverter.java"/>
<exclude name="mondrian/rolap/HierarchyUsage.java"/>
Expand Down Expand Up @@ -1708,7 +1724,7 @@ xalan.jar"/>
lib/javacup.jar,
lib/jlfgr.jar,
lib/olap4j.jar,
lib/launcher.jar,
lib/pentaho-application-launcher.jar,
lib/*.dtd,
lib/*.xsd,
demo/FoodMart.xml,
Expand Down Expand Up @@ -1741,7 +1757,7 @@ xalan.jar"/>
lib/javacup.jar,
lib/jlfgr.jar,
lib/olap4j.jar,
lib/launcher.jar,
lib/pentaho-application-launcher.jar,
lib/*.dtd,
lib/*.xsd,
demo/FoodMart.xml,
Expand Down
5 changes: 2 additions & 3 deletions buildOnJdk.bat
Expand Up @@ -45,7 +45,7 @@ if %1==jdk1.7 (
set JAVA_HOME=%JAVA_HOME_17%
)

set ANT_ARGUMENTS=
set ANT_ARGUMENTS=-Drequested.java.version=%1
for %%A in (%*) do (
set ANT_ARGUMENTS=%ANT_ARGUMENTS% %%A
)
Expand All @@ -61,5 +61,4 @@ echo Using Ant arguments: %ANT_ARGUMENTS%

ant %ANT_ARGUMENTS%

rem End buildJdk16.bat

rem End buildOnJdk.bat
85 changes: 79 additions & 6 deletions buildOnJdk.sh
@@ -1,3 +1,4 @@
#!/bin/bash
# $Id$
# Called recursively from 'ant release' to build the files which can only be
# built under a particular JDK version.
Expand All @@ -11,10 +12,82 @@
jdkVersion=$1
shift

# Change the following line to point each JDK's home.
case "$jdkVersion" in
(*) export JAVA_HOME=/usr/lib/jvm/${jdkVersion};;
esac
# Version number without jdk prefix. E.g. '1.6'.
versionSansJdk=`echo "${jdkVersion}" | sed 's/jdk\([0-9]\.[0-9]\)/\1/'`

# Chooses a JAVA_HOME to match the required JDK version.
#
# If you are building Mondrian for a single JDK (most likely the case), it
# doesn't matter if this method cannot find a valid JAVA_HOME for the JDK
# version. It will keep the existing JAVA_HOME, ant will report that the JDK
# version is not the one required, and will not compile any files. You will
# still end up with a valid build for all the classes needed by your JDK
# version.
#
# If you are building a release, you must compile different parts of Mondrian's
# source code under different JDKs. You will need to do one of the following:
#
# 1. Specify environment variables JAVA_HOME_15, JAVA_HOME_16 and JAVA_HOME_17
# before invoking 'ant'.
#
# 2. Install a JDK in (or create a symbolic link as) one of the standard
# locations: /usr/lib/jvm/jdk1.x on Linux/Unix/Cygwin; or
# /System/Library/Frameworks/JavaVM.framework/Versions/1.x/Home on MacOS.
#
# 3. Customize this method with the correct JDK location.
#
chooseJavaHome() {
# If JAVA_HOME_xx is specified in the environment, use it.
case "$jdkVersion" in
(jdk1.5)
if [ -d "$JAVA_HOME_15" ]; then
export JAVA_HOME="$JAVA_HOME_15"
return
fi
;;
(jdk1.6)
if [ -d "$JAVA_HOME_16" ]; then
export JAVA_HOME="$JAVA_HOME_16"
return
fi
;;
(jdk1.7)
if [ -d "$JAVA_HOME_17" ]; then
export JAVA_HOME="$JAVA_HOME_17"
return
fi
;;
esac

# 2. Look in default location based on the operating system and JDK
# version. If the directory exists, we presume that it is a valid JDK, and
# override JAVA_HOME.
defaultJavaHome=
case $(uname) in
(Darwin)
defaultJavaHome=/System/Library/Frameworks/JavaVM.framework/Versions/${versionSansJdk}/Home;;
(*)
defaultJavaHome=`readlink -f /usr/lib/jvm/${jdkVersion}`;;
esac

if [ -d "$defaultJavaHome" ]; then
export JAVA_HOME="$defaultJavaHome"
return
fi

# 3. If JDK is installed in a non-standard location, customize here.
#
#case ${jdkVersion} in
#(jdk1.5) export JAVA_HOME=...; return ;;
#(jdk1.6) export JAVA_HOME=...; return ;;
#(jdk1.7) export JAVA_HOME=...; return ;;
#esac

# 4. Leave JAVA_HOME unchanged. If it does not match the required version,
# ant will no-op.
}

chooseJavaHome

if [ ! -d "$JAVA_HOME" ]; then
echo "$0: Invalid JAVA_HOME $JAVA_HOME; skipping compile."
Expand All @@ -24,8 +97,8 @@ fi
export PATH=$JAVA_HOME/bin:$PATH

echo Using JAVA_HOME: $JAVA_HOME
echo Using Ant arguments: $@
echo Using Ant arguments: -Drequested.java.version="$jdkVersion" $@

ant "$@"
ant -Drequested.java.version="$jdkVersion" "$@"

# End buildOnJdk.sh
2 changes: 1 addition & 1 deletion ivy.xml
Expand Up @@ -57,7 +57,7 @@
<dependency org="sun" name="jlfgr" rev="1.0"/>
<dependency org="javax.servlet" name="jsp-api" rev="2.0"/>
<dependency org="javax.servlet" name="servlet-api" rev="2.4"/>
<dependency org="log4j" name="log4j" rev="1.2.9"/>
<dependency org="log4j" name="log4j" rev="1.2.14"/>
<dependency org="org.olap4j" name="olap4j" rev="${dependency.olap4j-core.revision}">
<artifact name="olap4j"/>
</dependency>
Expand Down
2 changes: 1 addition & 1 deletion src/main/mondrian/gui/validate/ValidationUtils.java
Expand Up @@ -443,7 +443,7 @@ && isEmpty(((MondrianGuiDef.View) cubeVal.fact).alias)))
}
if (!(agIndex == -1
|| (colType >= 2 && colType <= 8)
|| colType == -5))
|| colType == -5 || colType == -6))
{
return messages.getFormattedString(
"schemaTreeCellRenderer.aggregatorNotValidForColumn.alert",
Expand Down
4 changes: 1 addition & 3 deletions src/main/mondrian/olap/Connection.java
Expand Up @@ -16,8 +16,6 @@
import java.util.Locale;
import javax.sql.DataSource;

import javax.validation.constraints.*;

/**
* Connection to a multi-dimensional database.
*
Expand Down Expand Up @@ -128,7 +126,7 @@ public interface Connection {
*
* @param pw Writer to which to write logging information; may be null
*/
CacheControl getCacheControl(@Null PrintWriter pw);
CacheControl getCacheControl(PrintWriter pw);

/**
* Returns the data source this connection uses to create connections
Expand Down
10 changes: 10 additions & 0 deletions src/main/mondrian/olap/MondrianProperties.xml
Expand Up @@ -784,6 +784,16 @@ unrecognized action is specified)</li>
<Type>String</Type>
<Default>OFF</Default>
</PropertyDefinition>
<PropertyDefinition>
<Name>EnableDrillThrough</Name>
<Path>mondrian.drillthrough.enable</Path>
<Description>
If disabled, Mondrian will throw an exception if someone attempts to
perform a drillthrough of any kind.
</Description>
<Type>boolean</Type>
<Default>true</Default>
</PropertyDefinition>
<PropertyDefinition>
<Name>EnableTotalCount</Name>
<Path>mondrian.xmla.drillthroughTotalCount.enable</Path>
Expand Down
2 changes: 2 additions & 0 deletions src/main/mondrian/olap/fun/FilterFunDef.java
Expand Up @@ -13,6 +13,7 @@
import mondrian.calc.impl.*;
import mondrian.mdx.ResolvedFunCall;
import mondrian.olap.*;
import mondrian.server.Locus;

import java.util.List;

Expand Down Expand Up @@ -225,6 +226,7 @@ public TupleCursor tupleCursor() {

public boolean forward() {
while (cursor.forward()) {
Locus.peek().execution.checkCancelOrTimeout();
cursor.setContext(evaluator2);
if (bcalc.evaluateBoolean(evaluator2)) {
return true;
Expand Down
4 changes: 4 additions & 0 deletions src/main/mondrian/resource/MondrianResource.xml
Expand Up @@ -280,6 +280,10 @@
<text>Don''t know how to rollup aggregator ''avg'' because the cube doesn''t contain at least one ''count'' and one ''sum'' measures based on the same column.</text>
</exception>

<exception id="350650" name="DrillthroughDisabled">
<text>Can''t perform drillthrough operations because ''{0}'' is set to false.</text>
</exception>bacon

<!-- ====================================================================== -->
<!-- Connectivity errors -->

Expand Down
14 changes: 14 additions & 0 deletions src/main/mondrian/rolap/RolapCell.java
Expand Up @@ -13,6 +13,7 @@
import mondrian.olap.*;
import mondrian.olap.fun.AggregateFunDef;
import mondrian.olap.fun.SetFunDef;
import mondrian.resource.MondrianResource;
import mondrian.rolap.agg.*;
import mondrian.server.*;
import mondrian.server.monitor.SqlStatementEvent;
Expand Down Expand Up @@ -103,6 +104,14 @@ public String getDrillThroughSQL(
List<Exp> fields,
boolean extendedContext)
{
if (!MondrianProperties.instance()
.EnableDrillThrough.get())
{
throw MondrianResource.instance()
.DrillthroughDisabled.ex(
MondrianProperties.instance()
.EnableDrillThrough.getPath());
}
final Member[] currentMembers = getMembersForDrillThrough();
// Create a StarPredicate to represent the compound slicer
// (if necessary)
Expand Down Expand Up @@ -307,6 +316,11 @@ private StarPredicate buildDrillthroughSlicerPredicate(
* @return true if can drill through
*/
public boolean canDrillThrough() {
if (!MondrianProperties.instance()
.EnableDrillThrough.get())
{
return false;
}
// get current members
final Member[] currentMembers = getMembersForDrillThrough();
if (containsCalcMembers(currentMembers)) {
Expand Down
61 changes: 55 additions & 6 deletions src/main/mondrian/rolap/RolapHierarchy.java
Expand Up @@ -22,6 +22,7 @@
import mondrian.olap.Level;
import mondrian.olap.Member;
import mondrian.olap.Property;
import mondrian.olap.Role.HierarchyAccess;
import mondrian.olap.fun.*;
import mondrian.olap.type.*;
import mondrian.resource.MondrianResource;
Expand Down Expand Up @@ -425,7 +426,7 @@ MemberReader createMemberReader(Role role) {
}

protected static MemberReader createMemberReader(
RolapHierarchy hierarchy,
final RolapHierarchy hierarchy,
Role role)
{
final Access access = role.getAccess(hierarchy);
Expand Down Expand Up @@ -463,11 +464,10 @@ protected static MemberReader createMemberReader(
public TupleList evaluateList(
Evaluator evaluator)
{
return new UnaryTupleList(
FunUtil.getNonEmptyMemberChildren(
evaluator,
((RolapEvaluator) evaluator)
.getExpanding()));
return
new UnaryTupleList(
hierarchy.getLowestMembersForAccess(
evaluator, hierarchyAccess, null));
}

public boolean dependsOn(Hierarchy hierarchy) {
Expand Down Expand Up @@ -530,6 +530,55 @@ public void unparse(Exp[] args, PrintWriter pw) {
}
}

/**
* Goes recursively down a hierarchy and builds a list of the
* members that should be constrained on because of access controls.
* It isn't sufficient to constrain on the current level in the
* evaluator because the actual constraint could be even more limited
* <p>Example. If we only give access to Seattle but the query is on
* the country level, we have to constrain at the city level, not state,
* or else all the values of all cities in the state will be returned.
*/
private List<Member> getLowestMembersForAccess(
Evaluator evaluator,
HierarchyAccess hAccess,
List<Member> currentList)
{
if (currentList == null) {
currentList =
FunUtil.getNonEmptyMemberChildren(
evaluator,
((RolapEvaluator) evaluator)
.getExpanding());
}
boolean goesLower = false;
for (Member member : currentList) {
if (hAccess.getAccess(member) != Access.ALL) {
goesLower = true;
break;
}
}
if (goesLower) {
// We still have to go one more level down.
List<Member> newList = new ArrayList<Member>();
for (Member member : currentList) {
int savepoint = evaluator.savepoint();
try {
evaluator.setContext(member);
newList.addAll(
FunUtil.getNonEmptyMemberChildren(
evaluator,
member));
} finally {
evaluator.restore(savepoint);
}
// Now pass it recursively to this method.
return getLowestMembersForAccess(evaluator, hAccess, newList);
}
}
return currentList;
}

/**
* A hierarchy is ragged if it contains one or more levels with hidden
* members.
Expand Down

0 comments on commit 5596c22

Please sign in to comment.