[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