/******************************************************************************* * Copyright (c) 2011 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributor: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.hibernate.eclipse.console.common; import java.util.Iterator; import org.hibernate.console.ConsoleMessages; import org.hibernate.console.execution.ExecutionContext; import org.hibernate.eclipse.console.utils.QLFormatHelper; import org.hibernate.util.xpl.StringHelper; import org.jboss.tools.hibernate.runtime.spi.IHQLQueryPlan; import org.jboss.tools.hibernate.runtime.spi.IQueryTranslator; import org.jboss.tools.hibernate.runtime.spi.IService; import org.jboss.tools.hibernate.runtime.spi.ISessionFactory; import org.jboss.tools.hibernate.runtime.spi.IType; /** * @author Dmitry Geraskov * */ public class QueryHelper { public static String generateSQL(ExecutionContext executionContext, final ISessionFactory sessionFactory, final String query, final IService service) { if(StringHelper.isEmpty(query)) return ""; //$NON-NLS-1$ String result = (String) executionContext.execute(new ExecutionContext.Command() { public Object execute() { try { StringBuffer str = new StringBuffer(256); IHQLQueryPlan plan = service.newHQLQueryPlan(query, false, sessionFactory); IQueryTranslator[] translators = plan.getTranslators(); for (int i = 0; i < translators.length; i++) { IQueryTranslator translator = translators[i]; if(translator.isManipulationStatement()) { str.append(ConsoleMessages.DynamicSQLPreviewView_manipulation_of + i + ":"); //$NON-NLS-1$ Iterator<?> iterator = translator.getQuerySpaces().iterator(); while ( iterator.hasNext() ) { Object qspace = iterator.next(); str.append(qspace); if(iterator.hasNext()) { str.append(", "); } //$NON-NLS-1$ } } else { IType[] returnTypes = translator.getReturnTypes(); str.append(i +": "); //$NON-NLS-1$ for (int j = 0; j < returnTypes.length; j++) { IType returnType = returnTypes[j]; str.append(returnType.getName()); if(j<returnTypes.length-1) { str.append(", "); } //$NON-NLS-1$ } } str.append("\n-----------------\n"); //$NON-NLS-1$ Iterator<?> sqls = translator.collectSqlStrings().iterator(); while ( sqls.hasNext() ) { String sql = (String) sqls.next(); str.append(QLFormatHelper.formatForScreen(sql)); str.append("\n\n"); //$NON-NLS-1$ } } return str.toString(); } catch(Throwable t) { StringBuffer msgs = new StringBuffer(); Throwable cause = t; while(cause!=null) { msgs.append(t); if(cause.getCause()==cause) { cause=null; } else { cause = cause.getCause(); if(cause!=null) msgs.append(ConsoleMessages.DynamicSQLPreviewView_caused_by); } } return msgs.toString(); } } }); return result; } }