/* * This software is subject to the terms of the Eclipse Public License v1.0 * Agreement, available at the following URL: * http://www.eclipse.org/legal/epl-v10.html. * You must accept the terms of that agreement to use this software. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package mondrian.olap4j; import mondrian.olap.Util; import mondrian.tui.XmlaSupport; import org.apache.commons.collections.map.ReferenceMap; import org.olap4j.driver.xmla.XmlaOlap4jServerInfos; import org.olap4j.driver.xmla.proxy.XmlaOlap4jProxy; import java.util.*; import java.util.concurrent.*; /** * Proxy which implements XMLA requests by talking to mondrian * in-process. This is more convenient to debug than an inter-process * request using HTTP. * * @author jhyde */ public class MondrianInprocProxy implements XmlaOlap4jProxy { private final ExecutorService executor = Util.getExecutorService( 1, 1, 1, "MondrianInprocProxy$executor", new ThreadPoolExecutor.CallerRunsPolicy()); private final Map<String, String> catalogNameUrls; private final String urlString; private final Map servletCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.WEAK); /** * Creates and initializes a MondrianInprocProxy. * * @param catalogNameUrls Collection of catalog names and the URL where * their catalog is to be found. For testing purposes, this should contain * a catalog called "FoodMart". * * @param urlString JDBC connect string; must begin with "jdbc:mondrian:" */ public MondrianInprocProxy( Map<String, String> catalogNameUrls, String urlString) { this.catalogNameUrls = catalogNameUrls; if (!urlString.startsWith("jdbc:mondrian:")) { throw new IllegalArgumentException(); } this.urlString = urlString.substring("jdbc:mondrian:".length()); } public byte[] get( XmlaOlap4jServerInfos infos, String request) { try { return XmlaSupport.processSoapXmla( request, urlString, catalogNameUrls, null, null, servletCache); } catch (Exception e) { throw new RuntimeException( "Error while reading '" + infos.getUrl() + "'", e); } } public Future<byte[]> submit( final XmlaOlap4jServerInfos infos, final String request) { return this.executor.submit( new Callable<byte[]>() { public byte[] call() throws Exception { return get(infos, request); } }); } public String getEncodingCharsetName() { return "UTF-8"; } } // End MondrianInprocProxy.java