package org.hibernate.eclipse.jdt.ui.internal; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.compiler.BuildContext; import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CompilationParticipant; import org.eclipse.jdt.core.compiler.ReconcileContext; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTParser; import org.eclipse.jdt.core.dom.CompilationUnit; import org.hibernate.console.ConsoleConfiguration; import org.hibernate.eclipse.console.utils.ProjectUtils; import org.hibernate.eclipse.nature.HibernateNature; public class HQLExpressionCompilerParticipant extends CompilationParticipant { public HQLExpressionCompilerParticipant() { } protected CompilationUnit parse(ICompilationUnit unit) { ASTParser parser = ASTParser.newParser(AST.JLS8); parser.setKind(ASTParser.K_COMPILATION_UNIT); parser.setSource(unit); parser.setResolveBindings(false); return (CompilationUnit) parser.createAST(null /* IProgressMonitor */); // parse } public void buildStarting(BuildContext[] files, boolean isBatch) { for (int i = 0; i < files.length; i++) { BuildContext context = files[i]; ConsoleConfiguration consoleConfiguration = getConsoleConfiguration( ProjectUtils.findJavaProject( context.getFile().getProject().getName() ) ); if(consoleConfiguration!=null && consoleConfiguration.isSessionFactoryCreated()) { ASTParser parser = ASTParser.newParser( AST.JLS8 ); parser.setKind( ASTParser.K_COMPILATION_UNIT ); parser.setSource( context.getContents() ); parser.setResolveBindings( false ); ASTNode node = parser.createAST( null ); CompilationUnit cu = null; if(node instanceof CompilationUnit) { cu = (CompilationUnit) node; } HQLDetector hqlDetector = new HQLDetector(cu, consoleConfiguration, context.getFile()); node.accept(hqlDetector); if(!hqlDetector.getProblems().isEmpty()) { CategorizedProblem[] toArray = hqlDetector.getProblems().toArray( new CategorizedProblem[0] ); context.recordNewProblems( toArray ); } } } } public boolean isActive(IJavaProject project) { return HibernateNature.getHibernateNature( project ) != null; } public void reconcile(ReconcileContext context) { // TODO: disabled reconilation for now to avoid too many parses/overhead. /* ICompilationUnit workingCopy = context.getWorkingCopy(); ConsoleConfiguration consoleConfiguration = getConsoleConfiguration( workingCopy.getJavaProject() ); if(consoleConfiguration==null || !consoleConfiguration.isSessionFactoryCreated()) { // TODO: complain it aint there. } else { CompilationUnit parse = parse( workingCopy ); HQLDetector hqlDetector = new HQLDetector(parse, consoleConfiguration, workingCopy.getResource()); parse.accept( hqlDetector ); if(!hqlDetector.getProblems().isEmpty()) { CategorizedProblem[] toArray = (CategorizedProblem[]) hqlDetector.getProblems().toArray( new CategorizedProblem[0] ); context.putProblems( Activator.HQL_SYNTAX_PROBLEM, toArray ); } }*/ } private ConsoleConfiguration getConsoleConfiguration(IJavaProject project) { return getConsoleConfiguration(HibernateNature.getHibernateNature( project )); } static ConsoleConfiguration getConsoleConfiguration(HibernateNature hibernateNature) { if(hibernateNature!=null) { return hibernateNature.getDefaultConsoleConfiguration(); } else { return null; } } public void cleanStarting(IJavaProject javaProject){ /* IProject p = javaProject.getProject(); //HibernateNature.getHibernateNature( javaProject); try{ // clear out all markers during a clean. IMarker[] markers = p.findMarkers(Activator.HQL_SYNTAX_PROBLEM, true, IResource.DEPTH_INFINITE); if( markers != null ){ for (int i = 0; i < markers.length; i++) { markers[i].delete(); } } } catch(CoreException e){ HibernateConsolePlugin.getDefault().logErrorMessage( "Unable to delete batch hql markers", e); }*/ super.cleanStarting( javaProject ); } }