/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.hibernate.eclipse.hqleditor;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITypedRegion;
import org.eclipse.jface.text.TextUtilities;
import org.eclipse.jface.text.rules.EndOfLineRule;
import org.eclipse.jface.text.rules.IPredicateRule;
import org.eclipse.jface.text.rules.RuleBasedPartitionScanner;
import org.eclipse.jface.text.rules.SingleLineRule;
import org.eclipse.jface.text.rules.Token;
/**
* The HQLPartitionScanner is a RulesBasedPartitionScanner. The HQL document
* partitions are computed dynamically as events signal that the document has
* changed. The document partitions are based on tokens that represent comments
* and HQL code sections.
*/
public class HQLPartitionScanner extends RuleBasedPartitionScanner {
// Define constants for HQL comments, literals, and identifiers.
public final static String HQL_DEFAULT = "__default_hql_block__"; //$NON-NLS-1$
public final static String HQL_COMMENT = "__hql_comment__"; //$NON-NLS-1$
public final static String HQL_QUOTED_LITERAL = "__hql_quoted_literal__"; //$NON-NLS-1$
public final static String HQL_DELIMITED_IDENTIFIER = "__hql_delimited_identifier__"; //$NON-NLS-1$
// Define constants for HQL DML Statements.
public final static String HQL_SELECT = "__hql_select_statement__"; //$NON-NLS-1$
public final static String HQL_INSERT = "__hql_insert_statement__"; //$NON-NLS-1$
public final static String HQL_UPDATE = "__hql_update_statement__"; //$NON-NLS-1$
public final static String HQL_DELETE = "__hql_delete_statement__"; //$NON-NLS-1$
public final static String HQL_MERGE = "__hql_merge_statement__"; //$NON-NLS-1$
// Define constants for HQL DDL Statements.
public final static String HQL_CREATE = "__hql_create_statement__"; //$NON-NLS-1$
public final static String HQL_DROP = "__hql_drop_statement__"; //$NON-NLS-1$
public final static String HQL_ALTER = "__hql_alter_statement__"; //$NON-NLS-1$
// Define constants for HQL access control statements.
public final static String HQL_GRANT = "__hql_grant_statement__"; //$NON-NLS-1$
public final static String HQL_REVOKE = "__hql_revoke_statement__"; //$NON-NLS-1$
// Define constants for HQL transaction control statements.
public final static String HQL_COMMIT = "__hql_commit_statement__"; //$NON-NLS-1$
public final static String HQL_ROLLBACK = "__hql_rollback_statement__"; //$NON-NLS-1$
public final static String HQL_SET = "__hql_set_statement__"; //$NON-NLS-1$
// Define constants for HQL connection statements.
public final static String HQL_CONNECT = "__hql_connect_statement__"; //$NON-NLS-1$
public final static String HQL_DISCONNECT = "__hql_disconnect_statement__"; //$NON-NLS-1$
// Define constants for HQL miscellaneous statements.
public final static String HQL_COMMENT_ON = "__hql_comment_on_statement__"; //$NON-NLS-1$
public final static String HQL_TERMINATE = "__hql_terminate_statement__"; //$NON-NLS-1$
public final static String HQL_CATALOG = "__hql_catalog_statement__"; //$NON-NLS-1$
public final static String HQL_UNCATALOG = "__hql_uncatalog_statement__"; //$NON-NLS-1$
public final static String HQL_SIGNAL = "__hql_signal_statement__"; //$NON-NLS-1$
// Define a constant for HQL not otherwise covered.
public final static String HQL_UNKNOWNHQL = "__hql__unknownhql_statement__"; //$NON-NLS-1$
public final static String[] HQL_PARTITION_TYPES= new String[] {
HQL_COMMENT,
HQL_QUOTED_LITERAL,
HQL_DELIMITED_IDENTIFIER,
};
/**
* Gets the partitions of the given document as an array of
* <code>ITypedRegion</code> objects. There is a distinct non-overlapping partition
* for each comment line, string literal, delimited identifier, and "everything else"
* (that is, HQL code other than a string literal or delimited identifier).
*
* @param doc the document to parse into partitions
* @return an array containing the document partion regions
*/
public static ITypedRegion[] getDocumentRegions( IDocument doc ) {
ITypedRegion[] regions = null;
try {
regions = TextUtilities.computePartitioning( doc, HQLSourceViewerConfiguration.HQL_PARTITIONING, 0, doc.getLength(), false );
}
catch ( BadLocationException e ) {
// ignore
}
return regions;
}
/**
* Constructs an instance of this class. Creates rules to parse comment
* partitions in an HQL document. This is the default constructor.
*/
public HQLPartitionScanner() {
super();
List<IPredicateRule> rules= new ArrayList<IPredicateRule>();
// Add rules for comments, quoted literals, and delimited identifiers.
rules.add( new EndOfLineRule( "--", new Token( HQL_COMMENT ))); //$NON-NLS-1$
rules.add( new SingleLineRule( "'", "'", new Token( HQL_QUOTED_LITERAL ), '\\' )); //$NON-NLS-1$//$NON-NLS-2$
rules.add( new SingleLineRule( "\"", "\"", new Token( HQL_DELIMITED_IDENTIFIER ), '\\' )); //$NON-NLS-1$//$NON-NLS-2$
IPredicateRule[] result= new IPredicateRule[ rules.size() ];
rules.toArray( result );
setPredicateRules( result );
}
} // end class