/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ package org.apache.directory.studio.ldapbrowser.common.filtereditor; import org.apache.directory.api.ldap.model.constants.SchemaConstants; import org.apache.directory.api.ldap.model.schema.AttributeType; import org.apache.directory.api.ldap.model.schema.MatchingRule; import org.apache.directory.api.ldap.model.schema.ObjectClass; import org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilter; import org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterExtensibleComponent; import org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterItemComponent; import org.apache.directory.studio.ldapbrowser.core.model.filter.parser.LdapFilterParser; import org.apache.directory.studio.ldapbrowser.core.model.filter.parser.LdapFilterToken; import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema; import org.apache.directory.studio.ldapbrowser.core.model.schema.SchemaUtils; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextHover; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; /** * The FilterTextHover is used to display error messages in a tooltip. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class FilterTextHover implements ITextHover { /** The filter parser. */ private LdapFilterParser parser; /** The schema, used to retrieve attributeType and objectClass information. */ private Schema schema; /** * Creates a new instance of FilterTextHover. * * @param parser filter parser */ public FilterTextHover( LdapFilterParser parser ) { this.parser = parser; } /** * Sets the schema, used to retrieve attributeType and objectClass information. * * @param schema the schema */ public void setSchema( Schema schema ) { this.schema = schema; } /** * @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion) */ public String getHoverInfo( ITextViewer textViewer, IRegion hoverRegion ) { // check attribute type, object class or matching rule values if ( schema != null ) { LdapFilter filter = parser.getModel().getFilter( hoverRegion.getOffset() ); if ( filter.getFilterComponent() instanceof LdapFilterItemComponent ) { LdapFilterItemComponent fc = ( LdapFilterItemComponent ) filter.getFilterComponent(); if ( fc.getAttributeToken() != null && fc.getAttributeToken().getOffset() <= hoverRegion.getOffset() && hoverRegion.getOffset() <= fc.getAttributeToken().getOffset() + fc.getAttributeToken().getLength() ) { String attributeType = fc.getAttributeToken().getValue(); AttributeType attributeTypeDescription = schema .getAttributeTypeDescription( attributeType ); String ldifLine = SchemaUtils.getLdifLine( attributeTypeDescription ); return ldifLine; } if ( fc.getAttributeToken() != null && SchemaConstants.OBJECT_CLASS_AT.equalsIgnoreCase( fc.getAttributeToken().getValue() ) && fc.getValueToken() != null && fc.getValueToken().getOffset() <= hoverRegion.getOffset() && hoverRegion.getOffset() <= fc.getValueToken().getOffset() + fc.getValueToken().getLength() ) { String objectClass = fc.getValueToken().getValue(); ObjectClass objectClassDescription = schema.getObjectClassDescription( objectClass ); String ldifLine = SchemaUtils.getLdifLine( objectClassDescription ); return ldifLine; } } if ( filter.getFilterComponent() instanceof LdapFilterExtensibleComponent ) { LdapFilterExtensibleComponent fc = ( LdapFilterExtensibleComponent ) filter.getFilterComponent(); if ( fc.getAttributeToken() != null && fc.getAttributeToken().getOffset() <= hoverRegion.getOffset() && hoverRegion.getOffset() <= fc.getAttributeToken().getOffset() + fc.getAttributeToken().getLength() ) { String attributeType = fc.getAttributeToken().getValue(); AttributeType attributeTypeDescription = schema .getAttributeTypeDescription( attributeType ); String ldifLine = SchemaUtils.getLdifLine( attributeTypeDescription ); return ldifLine; } if ( fc.getMatchingRuleToken() != null && fc.getMatchingRuleToken().getOffset() <= hoverRegion.getOffset() && hoverRegion.getOffset() <= fc.getMatchingRuleToken().getOffset() + fc.getMatchingRuleToken().getLength() ) { String matchingRule = fc.getMatchingRuleToken().getValue(); MatchingRule matchingRuleDescription = schema.getMatchingRuleDescription( matchingRule ); String info = SchemaUtils.getLdifLine( matchingRuleDescription ); return info; } } } // check invalid tokens LdapFilter[] invalidFilters = parser.getModel().getInvalidFilters(); for ( int i = 0; i < invalidFilters.length; i++ ) { if ( invalidFilters[i].getStartToken() != null ) { int start = invalidFilters[i].getStartToken().getOffset(); int stop = invalidFilters[i].getStopToken() != null ? invalidFilters[i].getStopToken().getOffset() + invalidFilters[i].getStopToken().getLength() : start + invalidFilters[i].getStartToken().getLength(); if ( start <= hoverRegion.getOffset() && hoverRegion.getOffset() < stop ) { return invalidFilters[i].getInvalidCause(); } } } // check error tokens LdapFilterToken[] tokens = parser.getModel().getTokens(); for ( int i = 0; i < tokens.length; i++ ) { if ( tokens[i].getType() == LdapFilterToken.ERROR ) { int start = tokens[i].getOffset(); int stop = start + tokens[i].getLength(); if ( start <= hoverRegion.getOffset() && hoverRegion.getOffset() < stop ) { return Messages.getString( "FilterTextHover.InvalidCharacters" ); //$NON-NLS-1$ } } } return null; } /** * @see org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface.text.ITextViewer, int) */ public IRegion getHoverRegion( ITextViewer textViewer, int offset ) { return new Region( offset, 1 ); } }