Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * This program is free software; you can redistribute it and/or modify it under the 
   * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software 
   * Foundation.
   *
   * You should have received a copy of the GNU Lesser General Public License along with this 
   * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html 
   * or from the Free Software Foundation, Inc., 
   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
  * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  * See the GNU Lesser General Public License for more details.
  *
  * Copyright 2007 - 2009 Pentaho Corporation.  All rights reserved.
  *
  */
 package org.pentaho.platform.plugin.action.pentahometadata;
 
 import java.util.Date;
 
 import  org.pentaho.di.core.database.DatabaseInterface;
 import  org.pentaho.di.core.database.DatabaseMeta;
 import  org.pentaho.platform.engine.core.audit.MessageTypes;
 import  org.pentaho.platform.engine.core.system.PentahoSystem;
 import  org.pentaho.platform.engine.services.connection.PentahoConnectionFactory;
 import  org.pentaho.platform.engine.services.metadata.MetadataPublisher;
 import  org.pentaho.platform.engine.services.solution.ComponentBase;
 import  org.pentaho.platform.util.messages.LocaleHelper;
 import  org.pentaho.pms.core.exception.PentahoMetadataException;
 import  org.pentaho.pms.factory.CwmSchemaFactoryInterface;
 import  org.pentaho.pms.mql.MQLQuery;
 import  org.pentaho.pms.mql.MQLQueryFactory;
 import  org.pentaho.pms.mql.MappedQuery;
 import  org.pentaho.pms.schema.BusinessModel;
 import  org.pentaho.pms.schema.concept.ConceptPropertyInterface;
 
 public class MQLRelationalDataComponent extends SQLLookupRule {
 
   private static final long serialVersionUID = -6376955619869902045L;
 
   private MQLQuery mqlQuery;
 
   private MappedQuery mappedQuery;
 
   // if true, skip the attempt to load the metadata source within the 
   // getConnection() method.  This is used as part of the detection 
   // and overriding of the metadata.xmi database dialect.
   private boolean skipMetadataDatasource = false;
 
   public MQLQuery getMqlQuery() {
     return ;
   }
 
   @Override
   public Log getLogger() {
     return LogFactory.getLog(MQLRelationalDataComponent.class);
   }
 
   private boolean initialize() {
     return true;
   }
 
   @Override
   public boolean validateAction() {
 
     boolean result = true;
     if (!(getActionDefinition() instanceof MQLAction)) {
       error(Messages.getErrorString(
           "ComponentBase.ERROR_0001_UNKNOWN_ACTION_TYPE"getActionDefinition().getElement().asXML())); //$NON-NLS-1$
       result = false;
     } else if (!initialize()) {
       result = false;
     } else {
       MQLAction mqlAction = (MQLActiongetActionDefinition();
       IActionInput query = mqlAction.getQuery();
       result = (query != .);
     }
 
     return result;
   }

  
makes the necessary calls to generate the SQL query based on the MQL XML provided.

Returns:
sql
  public String getQuery() {
    MQLAction mqlAction = (MQLActiongetActionDefinition();
    String mql = mqlAction.getQuery().getStringValue();
    String mqlQueryClassName = mqlAction.getMqlQueryClassName().getStringValue();
    if (mql != null) {
      if (ComponentBase.debug) {
        debug(Messages.getString("MQLRelationalDataComponent.DEBUG_DISPLAY_MQL"mql)); //$NON-NLS-1$
      }
      //GEM PMD-175 Display names no longer a legit param for this ocmponent
      // boolean displayNames = this.getInputBooleanValue("display-names", true); //$NON-NLS-1$
      MetadataPublisher.loadMetadata(getSolutionName(), getSession(), false);
      CwmSchemaFactoryInterface cwmSchemaFactory = PentahoSystem.get(CwmSchemaFactoryInterface.class,
          "ICwmSchemaFactory"getSession()); 
      try {
        if (mqlQueryClassName != null) {
           = MQLQueryFactory.getMQLQuery(mqlQueryClassNamemqlnull, LocaleHelper.getLocale().toString(),
              cwmSchemaFactory);
        } else {
           = MQLQueryFactory.getMQLQuery(mqlnull, LocaleHelper.getLocale().toString(), cwmSchemaFactory);
        }
        BusinessModel model = .getModel();
        // Read metadata for new timeout/max_rows and set in superclass
        // Can still be overridden in the action sequence
        ConceptPropertyInterface timeoutInterface = model.getConcept().getProperty("timeout"); //$NON-NLS-1$
        if (timeoutInterface != null) {
          Object tmp = timeoutInterface.getValue();
          if (tmp instanceof Number) {
            int timeout = ((Number)tmp).intValue();
            this.setQueryTimeout(timeout);
          }
        }
        ConceptPropertyInterface maxRowsInterface = model.getConcept().getProperty("max_rows"); //$NON-NLS-1$
        if (maxRowsInterface != null) {
          Object tmp = maxRowsInterface.getValue();
          if (tmp instanceof Number) {
            int maxRows = ((Number)tmp).intValue();
            this.setMaxRows(maxRows);
          }
        }
        
        // detect the actual db dialect and apply it to the MQLQuery if different from the XMI dialect
        if (!mqlAction.getForceDbDialect().getBooleanValue(false)) {
          // retrieve a temporary connection to determine if a dialect change is necessary
          // for generating the MQL Query.
          SQLConnection tempConnection = (SQLConnectiongetConnection();
          try {
            // if the connection type is not of the current dialect, regenerate the query
            DatabaseInterface di = getDatabaseInterface(tempConnection);
            if ((di != null) && (.getDatabaseMeta().getDatabaseType() != di.getDatabaseType())) {
              // we need to reinitialize our mqlQuery object and reset the query.
              // note that using this di object wipes out connection info
              DatabaseMeta meta = (DatabaseMeta) .getDatabaseMeta().clone();
              DatabaseInterface di2 = (DatabaseInterface) di.clone();
              di2.setAccessType(.getDatabaseMeta().getAccessType());
              di2.setDatabaseName(.getDatabaseMeta().getDatabaseName());
              meta.setDatabaseInterface(di2);
              if (mqlQueryClassName != null) {
                 = MQLQueryFactory.getMQLQuery(mqlQueryClassNamemqlmeta, LocaleHelper.getLocale()
                    .toString(), cwmSchemaFactory);
              } else {
                 = MQLQueryFactory
                    .getMQLQuery(mqlmeta, LocaleHelper.getLocale().toString(), cwmSchemaFactory);
              }
              // don't attempt to use the metadata's connection info when retrieving a connection in the
              // future. because of the dialect change, the connection info is now invalid.
               = true;
            }
          } finally {
            if (tempConnection != null) {
              tempConnection.close();
            }
          }
        }
        if (mqlAction.getDisableDistinct() != .) {
          .setDisableDistinct(mqlAction.getDisableDistinct().getBooleanValue().booleanValue());
        }
         = .getQuery();
        String sqlQuery = .getQuery();
        if (ComponentBase.debug) {
          debug(Messages.getString("MQLRelationalDataComponent.DEBUG_DISPLAY_SQL"sqlQuery)); //$NON-NLS-1$
        }
        return sqlQuery;
      } catch (PentahoMetadataException e) {
        error(Messages.getErrorString("SQLBaseComponent.ERROR_0006_EXECUTE_FAILED"getActionName()), e); //$NON-NLS-1$
      }
    } else {
      error(Messages.getErrorString("MQLRelationalDataComponent.ERROR_0001_QUERY_XML_EMPTY"getActionName())); //$NON-NLS-1$
    }
    return null;
  }
  public boolean executeAction() {
    long start = new Date().getTime();
    boolean result = super.executeAction();
    MQLAction actionDefinition = (MQLActiongetActionDefinition();
    long end = new Date().getTime();
    // Fix for BISERVER-459 - MQL can be too large for the audit message column.
    // audit(MessageTypes.INSTANCE_ATTRIBUTE, "metadata query", mql, (int) (end - start)); //$NON-NLS-1$
    //
    audit(MessageTypes.INSTANCE_ATTRIBUTE, "metadata query action sequence"this.getActionName(), (int) (end - start)); //$NON-NLS-1$
    // Use debug logging instead
    trace(actionDefinition.getQuery().getStringValue());
    return result;
  }
    // use the connection specified in the query.
    IPentahoConnection localConnection = null;
    if ( != null) {
      try {
        DatabaseMeta databaseMeta = .getDatabaseMeta();
        if (databaseMeta.getAccessType() == DatabaseMeta.TYPE_ACCESS_JNDI) {
          String jndiName = databaseMeta.getDatabaseName();
          if (jndiName != null) {
            localConnection = PentahoConnectionFactory.getConnection(.jndiName,
                getSession(), this);
          }
        }
        if ((localConnection == null) && !) {
          String driver = databaseMeta.getDriverClass();
          String userId = databaseMeta.getUsername();
          String password = databaseMeta.getPassword();
          String connectionInfo = databaseMeta.getURL();
          if ((driver == null) && (connectionInfo == null)) {
            // TODO raise an error
          }
          localConnection = PentahoConnectionFactory.getConnection(.driver,
              connectionInfouserIdpasswordgetSession(), this);
        }
        // try the parent to allow the connection to be overridden
        localConnection = getConnection(localConnection);
        return localConnection;
      } catch (Exception e) {
        error(Messages.getErrorString("SQLBaseComponent.ERROR_0006_EXECUTE_FAILED"getActionName()), e); //$NON-NLS-1$
      }
    }
    return null;
  }

  
determines the PDI database interface of a given connection object

Parameters:
conn
Returns:
  protected DatabaseInterface getDatabaseInterface(final SQLConnection conn) {
    String prod = null;
    try {
      if (prod == null) {
        return null;
      }
      prod = prod.toLowerCase();
      // special case to map hsql to hypersonic
      if (prod.indexOf("hsql") >= 0) { //$NON-NLS-1$
        prod = "hypersonic"//$NON-NLS-1$
      }
      // look through all available database dialects for a match
      for (int i = 0; i < DatabaseMeta.getDatabaseInterfaces().length; i++) {
        String typeDesc = DatabaseMeta.getDatabaseInterfaces()[i].getDatabaseTypeDesc().toLowerCase();
        if (prod.indexOf(typeDesc) >= 0) {
          return DatabaseMeta.getDatabaseInterfaces()[i];
        }
      }
      warn(Messages.getString("MQLRelationalDataComponent.WARN_0001_NO_DIALECT_DETECTED"prod)); //$NON-NLS-1$
    } catch (SQLException e) {
      warn(Messages.getString("MQLRelationalDataComponent.WARN_0002_DIALECT_EXCEPTION"prod), e); //$NON-NLS-1$
    }
    return null;
  }
  protected IPentahoMetaData getMetadata(final IPentahoResultSet resultSetfinal boolean live) {
    IPentahoMetaData metadata = .generateMetadata(resultSet.getMetaData());
    ((SQLResultSetresultSet).setMetaData(metadata);
    return metadata;
  }
  
New to GrepCode? Check out our FAQ X