[jboss-cvs] jbosside/hibernatetools/plugins/org.hibernate.eclipse.jdt.ui/src/org/hibernate/eclipse/jdt/ui/internal ...

Max Rydahl Andersen mandersen at jboss.com
Mon Nov 27 10:31:47 EST 2006


  User: mandersen
  Date: 06/11/27 10:31:47

  Modified:    hibernatetools/plugins/org.hibernate.eclipse.jdt.ui/src/org/hibernate/eclipse/jdt/ui/internal    
                        HQLJavaCompletionProposalComputer.java
  Added:       hibernatetools/plugins/org.hibernate.eclipse.jdt.ui/src/org/hibernate/eclipse/jdt/ui/internal    
                        HQLExpressionCompilerParticipant.java
                        HQLProblem.java HQLDetector.java
  Log:
  New and improved HQL verification (requires no setup besides enabling hibernate support)
  
  Revision  Changes    Path
  1.3       +1 -1      jbosside/hibernatetools/plugins/org.hibernate.eclipse.jdt.ui/src/org/hibernate/eclipse/jdt/ui/internal/HQLJavaCompletionProposalComputer.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: HQLJavaCompletionProposalComputer.java
  ===================================================================
  RCS file: /cvsroot/jboss/jbosside/hibernatetools/plugins/org.hibernate.eclipse.jdt.ui/src/org/hibernate/eclipse/jdt/ui/internal/HQLJavaCompletionProposalComputer.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -b -r1.2 -r1.3
  --- HQLJavaCompletionProposalComputer.java	7 Jul 2006 14:38:36 -0000	1.2
  +++ HQLJavaCompletionProposalComputer.java	27 Nov 2006 15:31:46 -0000	1.3
  @@ -145,7 +145,7 @@
   	}
   
   	public void sessionStarted() {
  -		
  +		System.out.println("...");
   	}
   
   }
  
  
  
  1.1      date: 2006/11/27 15:31:46;  author: mandersen;  state: Exp;jbosside/hibernatetools/plugins/org.hibernate.eclipse.jdt.ui/src/org/hibernate/eclipse/jdt/ui/internal/HQLExpressionCompilerParticipant.java
  
  Index: HQLExpressionCompilerParticipant.java
  ===================================================================
  package org.hibernate.eclipse.jdt.ui.internal;
  
  import org.eclipse.core.resources.IMarker;
  import org.eclipse.core.resources.IProject;
  import org.eclipse.core.resources.IResource;
  import org.eclipse.core.runtime.CoreException;
  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.HibernateConsolePlugin;
  import org.hibernate.eclipse.console.utils.ProjectUtils;
  import org.hibernate.eclipse.jdt.ui.Activator;
  import org.hibernate.eclipse.nature.HibernateNature;
  
  public class HQLExpressionCompilerParticipant extends CompilationParticipant {
  
  	public HQLExpressionCompilerParticipant() {
  		// TODO Auto-generated constructor stub
  	}
  
  	protected CompilationUnit parse(ICompilationUnit unit) {
  		ASTParser parser = ASTParser.newParser(AST.JLS3); 
  		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.JLS3 );
  				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 = (CategorizedProblem[]) 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 );
  	}
  
  	
  }
  
  
  
  1.1      date: 2006/11/27 15:31:46;  author: mandersen;  state: Exp;jbosside/hibernatetools/plugins/org.hibernate.eclipse.jdt.ui/src/org/hibernate/eclipse/jdt/ui/internal/HQLProblem.java
  
  Index: HQLProblem.java
  ===================================================================
  package org.hibernate.eclipse.jdt.ui.internal;
  
  import org.eclipse.core.resources.IFile;
  import org.eclipse.jdt.core.compiler.CategorizedProblem;
  import org.eclipse.jdt.core.compiler.IProblem;
  import org.hibernate.eclipse.jdt.ui.Activator;
  
  class HQLProblem extends CategorizedProblem implements IProblem 
  {	
  	private int startingOffset;
  	private int endingOffset;
  	private int line;
  	private IFile resource;
  	private final String msg;
  	private final boolean isError;
  	
  	HQLProblem(final String msg, 
  			   boolean isError, 
  			   final IFile resource, 
  			   final int startingOffset,
  			   final int endingOffset,
  			   final int line) {
  		this.msg = msg;
  		this.isError = isError;
  		this.startingOffset = startingOffset;
  		this.endingOffset = endingOffset;
  		this.line = line;
  		this.resource = resource;
  	}
  
  	public int getID() {
  		return IProblem.ExternalProblemNotFixable;
  	}
  	
  	public String[] getArguments() {	
  		return new String[0];
  	}
  	
  	public String getMessage() {	
  		return msg;
  	}
  	
  	public char[] getOriginatingFileName() {		
  		return resource.getName().toCharArray();
  	}
  	
  	public int getSourceStart() {
  		return startingOffset;
  	}
  	
  	public int getSourceEnd() {	
  		return endingOffset;
  	}
  	
  	public int getSourceLineNumber() {		
  		return line;
  	}
  	
  	public void setSourceStart(int sourceStart) {
  		startingOffset = sourceStart;
  	}	
  	
  	public void setSourceEnd(int sourceEnd) {
  		endingOffset = sourceEnd;
  	}
  	
  	public void setSourceLineNumber(int lineNumber) {
  		line = lineNumber;		
  	}
  	
  	public boolean isError() {
  		return isError;
  	}
  	
  	public boolean isWarning() {
  		return !isError();
  	}
  	
  	
  	public int getCategoryID() {		
  		return CAT_SYNTAX;
  	}
  	
  	public String getMarkerType() {
  		return Activator.HQL_SYNTAX_PROBLEM;
  	}
  }
  
  
  
  1.1      date: 2006/11/27 15:31:46;  author: mandersen;  state: Exp;jbosside/hibernatetools/plugins/org.hibernate.eclipse.jdt.ui/src/org/hibernate/eclipse/jdt/ui/internal/HQLDetector.java
  
  Index: HQLDetector.java
  ===================================================================
  package org.hibernate.eclipse.jdt.ui.internal;
  
  import java.util.ArrayList;
  import java.util.Collections;
  import java.util.Iterator;
  import java.util.List;
  
  import org.eclipse.core.resources.IFile;
  import org.eclipse.core.resources.IResource;
  import org.eclipse.jdt.core.dom.ASTVisitor;
  import org.eclipse.jdt.core.dom.CompilationUnit;
  import org.eclipse.jdt.core.dom.Expression;
  import org.eclipse.jdt.core.dom.MarkerAnnotation;
  import org.eclipse.jdt.core.dom.MemberValuePair;
  import org.eclipse.jdt.core.dom.MethodInvocation;
  import org.eclipse.jdt.core.dom.NormalAnnotation;
  import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
  import org.eclipse.jdt.core.dom.StringLiteral;
  import org.hibernate.console.ConsoleConfiguration;
  import org.hibernate.engine.query.HQLQueryPlan;
  import org.hibernate.impl.SessionFactoryImpl;
  
  public class HQLDetector extends ASTVisitor {
  
  	private final IFile resource;
  	List problems = new ArrayList();
  	private final ConsoleConfiguration consoleConfiguration;
  	private final CompilationUnit cu;
  	
  	public HQLDetector(CompilationUnit cu, ConsoleConfiguration consoleConfiguration, IResource resource) {
  		this.cu = cu;
  		this.consoleConfiguration = consoleConfiguration;
  		this.resource = (IFile) resource;
  	}
  
  	public boolean visit(NormalAnnotation node) {
  		if(node.getTypeName().getFullyQualifiedName().endsWith( "NamedQuery" )) {
  			Iterator iterator = node.values().iterator();
  			while ( iterator.hasNext() ) {
  				MemberValuePair element = (MemberValuePair) iterator.next();
  				if(element.getName().getIdentifier().equals("query")) {
  					Expression value = element.getValue();
  					if(value instanceof StringLiteral) {
  						StringLiteral sl = (StringLiteral)value;
  						try {
  							checkQuery( consoleConfiguration, sl.getLiteralValue() );
  						} catch(RuntimeException re) {
  							problems.add(new HQLProblem(re.getLocalizedMessage(), true, resource, sl.getStartPosition(), sl.getStartPosition()+sl.getLength()-1, getLineNumber(sl.getStartPosition())));
  						}
  					}
  				}
  				
  			}
  		} 
  		return super.visit( node );
  	}
  	
  	private int getLineNumber(int startPosition) {
  		if(cu!=null) {
  			return cu.getLineNumber( startPosition );
  		} else {
  			return 0;
  		}
  	}
  
  	public boolean visit(MarkerAnnotation node) {
  		// TODO Auto-generated method stub
  		return super.visit( node );
  	}
  	
  	public boolean visit(SingleMemberAnnotation node) {
  		// TODO Auto-generated method stub
  		return super.visit( node );
  	}	
  	
  	public boolean visit(MethodInvocation node) {	
  		if(node.getName().getIdentifier().equals( "createQuery" )) {
  			if(node.arguments().size()==1) {
  				Object object = node.arguments().get(0);
  				if(object instanceof StringLiteral) {
  					StringLiteral sl = (StringLiteral) object;
  					String literalValue = sl.getLiteralValue();
  					try {
  						checkQuery( consoleConfiguration, literalValue );
  					} catch(RuntimeException re) {
  						problems.add(new HQLProblem(re.getLocalizedMessage(), true, resource, sl.getStartPosition(), sl.getStartPosition()+sl.getLength()-1, getLineNumber( sl.getStartPosition() )));
  					}
  				}
  			}			
  			return false;
  		} else {
  			return false;
  		}		
  	}
  
  	private void checkQuery(ConsoleConfiguration cc, String query) {
  		if(cc!=null && cc.isSessionFactoryCreated()) {
  			new HQLQueryPlan(query, false, Collections.EMPTY_MAP, (SessionFactoryImpl)cc.getSessionFactory());
  		} else {											
  			//messager.printWarning( annoValue.getPosition(), "Could not verify syntax. SessionFactory not created." );
  		}		
  	}
  
  	public List getProblems() {
  		return problems;
  	}
  }
  
  
  



More information about the jboss-cvs-commits mailing list