saiku2 OpenBI OpenSource    2017-07-19 23:40:52    121

工具:

  1. MyEclipse 10
  2. saiku2.5源码
  3. saiku-server-foodmart-2.5.zip

操作步骤:

  1. 在MyEclipse中新建一个web项目,名为saiku(必须名为saiku,因为saiku的UI会默认找saiku项目)
  2. 在saiku-server-foodmart-2.5.zip的tomcat中,找到saiku项目,并复制saiku目录下的所有文件到saiku项目的WebRoot目录中
  3. 到saiku-2.5.x\saiku-core\目录下分别找到saiku-service和saiku-web目录,并找到其中的java源代码,copy到saiku中,作为源码(建议分开两个resource文件夹存放,便于区分)
  4. 然后在saiku项目中创建source文件夹resource(命名自定),并在其目录下创建文件夹saiku-datasources和saiku-repository(前者是存储saiku的datasource的文件夹,后者则是存储生成的saiku模板的文件夹)
  5. 然后将saiku项目放到tomcat中,启动,看是否正常(如果没配置错误的话,应该正常了)
  6. 配置一个自己的测试库:
    在saiku-datasources目录下创建file并命名为testdatasource,文件内容为如下
  1. type=OLAP
  2. name=testdatasource
  3. driver=mondrian.olap4j.MondrianOlap4jDriver
  4. location=jdbc:mondrian:Jdbc=jdbc:mysql://localhost:3306/testdatasource;Catalog=res:testdatasource/testdatasource.xml;
  5. username=root
  6. password=111111

解释下上面一条的的参数

  1. type=OLAP就不多说了,先按固定的来
  2. name=testdatasource 数据源名称
  3. driver=mondrian.olap4j.MondrianOlap4jDriver 可以理解为固定的,Mondrian
java jetty web容器    2017-07-19 23:32:47    84
1、准备好一个非常简单点的web项目(maven项目)
2、准备好maven环境,并配置pom文件,关于jetty内容如下:
<!-- jetty dependecies begin -->
  <dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-server</artifactId>
   <version>9.1.4.v20140401</version>
  </dependency>

  <dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-webapp</artifactId>
   <version>9.1.4.v20140401</version>
  </dependency>

  <dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-continuation</artifactId>
   <version>9.1.4.v20140401</version>
  </dependency>

  <dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-jsp</artifactId>
   <version>9.1.4.v20140401</version>
  </dependency>
  <!-- jetty dependecies end -->

3、使用eclipse对maven项目进行build,获取build后的项目目录(或者将项目达成war包)

4、创建运行配置jetty的Server类
    运行war包的类
public class WebAppWarServer {
 public static void main(String[] args) throws Exception {
  Server server = new Server(8080);

  WebAppContext context = new WebAppContext();
  contex
jetty servlet java    2017-07-19 23:31:53    471
错误原因:jetty 的版本和servlet—api版本不同,加载时的顺序不同,先加载servlet-api,而造成的错误。
解决方案:
1、如果是使用的是maven的话,在pom文件中,将jetty的jar包的依赖放在servlet-api的依赖前面
2、如果没有使用maven的话,可以在java build bath->order and export 将jetty的包上移                


完整报错日志:

2014-09-15 01:49:15.572:WARN:oejs.ServletHandler:qtp968838231-22: Error for /myapp/index.jsp
java.lang.NoSuchMethodError: javax.servlet.ServletContext.getJspConfigDescriptor()Ljavax/servlet/descriptor/JspConfigDescriptor;
 at org.apache.jasper.compiler.JspConfig.processWebDotXml(JspConfig.java:106)
 at org.apache.jasper.compiler.JspConfig.init(JspConfig.java:196)
 at org.apache.jasper.compiler.JspConfig.findJspProperty(JspConfig.java:259)
 at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:166)
 at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
 at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
 at org.apache.jasper.servlet.JspServlet.serviceJ
saiku2 mondrian3 OpenSource OpenBI    2017-07-19 23:28:23    107
首先需要下载mondrian-3.6.5.jar的源码或者使用反编译软件看到源码,我在网上没找到这个版本(由于我用反编译工具弄的,放到文件中会报错,所以就下载了源码,反正也好找),于是我拿了mondrian-3.7.0.0-752的源码下来,用着也正常

1、从中找到文件mondrian.olap.Util,找到方法readVirtualFileAsString
修改内容为如下(重点是红色内容):
        InputStream in = readVirtualFile(catalogUrl);
        try {
            return IOUtils.toString(in,"utf-8");    //-----------------此行为红色行
        } finally {
            IOUtils.closeQuietly(in);
        }
或者按照网上说的另外一种方式,整体替换为如下内容,也可以,不过下面的编码必须写你的schema文件的编码:
        try {
            final byte[] bytes = Util. readFully(in, 1024);
            final char[] chars = new char[bytes. length];
            for ( int i = 0; i < chars. length; i++) {
                chars[i] = ( char) bytes[i];
            }
            String str = new String(bytes,"utf-8").replace("\ufeff" , "" );//加replace("\ufeff", "")是为了过滤"UTF-8无BOM格式文件"的开头
            return str;
        } finally {
            if (in != null) {
                in.close();
            }
        }

2、再找到文件    mondrian.rolap.RolapSchema.lo

mondrian3 OpenSource OpenBI    2017-07-19 23:22:56    90

1、根据文档中,比较费解,没有看太懂(并且部分文档的方法无法使用):http://mondrian.pentaho.com/documentation/cache_control.php

 

2、本来打算使用文档中的另一个方法

但是最终发现我完全从外部调用,哪里获取RolapConnection呢,于是,此方法宣告失败

public boolean clearCache() throws Exception {
    if ( olapConnection.isWrapperFor( RolapConnection.class ) ) {
      System.out.println( "Clearing cache" );
      RolapConnection rcon = olapConnection.unwrap( RolapConnection.class );
      rcon.getCacheControl( null ).flushSchemaCache();
    }
    return true;
  }

 

3、经过努力,找到别人的方法,此方法可行,原文是

java.util.Iterator<mondrian.rolap.RolapSchema> schemaIterator =  mondrian.rolap.RolapSchema.getRolapSchemas();
while(schemaIterator.hasNext()){
    mondrian.rolap.RolapSchema schema = schemaIterator.next();
    mondrian.olap.CacheControl cacheControl = schema.getInternalConnection().getCacheControl(null);
   
    for (mondrian.olap.Cube cube : schema.getCubes()) {
        cacheControl.flush(cacheControl.createMeasuresRegion(cube));
    }
}

但是对于我用的版本不对应,会报无法转换为Iterator,然后做了稍微修改,如下

List<mondrian.rola
12/46