Skip to content

Commit

Permalink
Provide nice error messages on constraint failure
Browse files Browse the repository at this point in the history
Also add testing to ensure that Community Edition fails to start
when the database contains a PEC.
  • Loading branch information
thobe authored and systay committed Aug 27, 2015
1 parent 2d3a705 commit aabd3f0
Show file tree
Hide file tree
Showing 14 changed files with 133 additions and 32 deletions.
Expand Up @@ -26,6 +26,7 @@
import org.neo4j.kernel.api.ReadOperations; import org.neo4j.kernel.api.ReadOperations;
import org.neo4j.kernel.api.StatementTokenNameLookup; import org.neo4j.kernel.api.StatementTokenNameLookup;
import org.neo4j.kernel.api.TokenNameLookup; import org.neo4j.kernel.api.TokenNameLookup;
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;
import org.neo4j.kernel.impl.coreapi.schema.InternalSchemaActions; import org.neo4j.kernel.impl.coreapi.schema.InternalSchemaActions;
import org.neo4j.kernel.impl.coreapi.schema.NodePropertyExistenceConstraintDefinition; import org.neo4j.kernel.impl.coreapi.schema.NodePropertyExistenceConstraintDefinition;


Expand All @@ -37,7 +38,7 @@ public NodePropertyExistenceConstraint( int labelId, int propertyKeyId )
} }


@Override @Override
public void added( ChangeVisitor visitor ) public void added( ChangeVisitor visitor ) throws CreateConstraintFailureException
{ {
visitor.visitAddedNodePropertyExistenceConstraint( this ); visitor.visitAddedNodePropertyExistenceConstraint( this );
} }
Expand Down
Expand Up @@ -23,6 +23,7 @@
import org.neo4j.graphdb.schema.ConstraintType; import org.neo4j.graphdb.schema.ConstraintType;
import org.neo4j.kernel.api.ReadOperations; import org.neo4j.kernel.api.ReadOperations;
import org.neo4j.kernel.api.TokenNameLookup; import org.neo4j.kernel.api.TokenNameLookup;
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;
import org.neo4j.kernel.impl.coreapi.schema.InternalSchemaActions; import org.neo4j.kernel.impl.coreapi.schema.InternalSchemaActions;


public abstract class PropertyConstraint public abstract class PropertyConstraint
Expand All @@ -33,11 +34,13 @@ public interface ChangeVisitor


void visitRemovedUniquePropertyConstraint( UniquenessConstraint constraint ); void visitRemovedUniquePropertyConstraint( UniquenessConstraint constraint );


void visitAddedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint constraint ); void visitAddedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint constraint )
throws CreateConstraintFailureException;


void visitRemovedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint constraint ); void visitRemovedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint constraint );


void visitAddedRelationshipPropertyExistenceConstraint( RelationshipPropertyExistenceConstraint constraint ); void visitAddedRelationshipPropertyExistenceConstraint( RelationshipPropertyExistenceConstraint constraint )
throws CreateConstraintFailureException;


void visitRemovedRelationshipPropertyExistenceConstraint( RelationshipPropertyExistenceConstraint constraint ); void visitRemovedRelationshipPropertyExistenceConstraint( RelationshipPropertyExistenceConstraint constraint );
} }
Expand All @@ -49,7 +52,7 @@ public PropertyConstraint( int propertyKeyId )
this.propertyKeyId = propertyKeyId; this.propertyKeyId = propertyKeyId;
} }


public abstract void added( ChangeVisitor visitor ); public abstract void added( ChangeVisitor visitor ) throws CreateConstraintFailureException;


public abstract void removed( ChangeVisitor visitor ); public abstract void removed( ChangeVisitor visitor );


Expand Down
Expand Up @@ -25,6 +25,7 @@
import org.neo4j.kernel.api.ReadOperations; import org.neo4j.kernel.api.ReadOperations;
import org.neo4j.kernel.api.StatementTokenNameLookup; import org.neo4j.kernel.api.StatementTokenNameLookup;
import org.neo4j.kernel.api.TokenNameLookup; import org.neo4j.kernel.api.TokenNameLookup;
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;
import org.neo4j.kernel.impl.coreapi.schema.InternalSchemaActions; import org.neo4j.kernel.impl.coreapi.schema.InternalSchemaActions;
import org.neo4j.kernel.impl.coreapi.schema.RelationshipPropertyExistenceConstraintDefinition; import org.neo4j.kernel.impl.coreapi.schema.RelationshipPropertyExistenceConstraintDefinition;


Expand All @@ -36,7 +37,7 @@ public RelationshipPropertyExistenceConstraint( int relTypeId, int propertyKeyId
} }


@Override @Override
public void added( ChangeVisitor visitor ) public void added( ChangeVisitor visitor ) throws CreateConstraintFailureException
{ {
visitor.visitAddedRelationshipPropertyExistenceConstraint( this ); visitor.visitAddedRelationshipPropertyExistenceConstraint( this );
} }
Expand Down
Expand Up @@ -25,7 +25,7 @@
* *
* @see ConstraintVerificationFailedKernelException * @see ConstraintVerificationFailedKernelException
*/ */
public class ConstraintViolationKernelException extends ConstraintValidationKernelException public abstract class ConstraintViolationKernelException extends ConstraintValidationKernelException
{ {
public ConstraintViolationKernelException( String message, Object... parameters ) public ConstraintViolationKernelException( String message, Object... parameters )
{ {
Expand Down
Expand Up @@ -34,6 +34,7 @@
import org.neo4j.kernel.api.cursor.PropertyItem; import org.neo4j.kernel.api.cursor.PropertyItem;
import org.neo4j.kernel.api.cursor.RelationshipItem; import org.neo4j.kernel.api.cursor.RelationshipItem;
import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException; import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException;
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;
import org.neo4j.kernel.api.index.IndexDescriptor; import org.neo4j.kernel.api.index.IndexDescriptor;
import org.neo4j.kernel.api.properties.DefinedProperty; import org.neo4j.kernel.api.properties.DefinedProperty;
import org.neo4j.kernel.impl.api.RelationshipVisitor; import org.neo4j.kernel.impl.api.RelationshipVisitor;
Expand All @@ -53,7 +54,7 @@
*/ */
public interface ReadableTxState public interface ReadableTxState
{ {
void accept( TxStateVisitor visitor ) throws ConstraintValidationKernelException; void accept( TxStateVisitor visitor ) throws ConstraintValidationKernelException, CreateConstraintFailureException;


boolean hasChanges(); boolean hasChanges();


Expand Down
Expand Up @@ -27,6 +27,7 @@
import org.neo4j.kernel.api.constraints.RelationshipPropertyExistenceConstraint; import org.neo4j.kernel.api.constraints.RelationshipPropertyExistenceConstraint;
import org.neo4j.kernel.api.constraints.UniquenessConstraint; import org.neo4j.kernel.api.constraints.UniquenessConstraint;
import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException; import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException;
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;
import org.neo4j.kernel.api.index.IndexDescriptor; import org.neo4j.kernel.api.index.IndexDescriptor;
import org.neo4j.kernel.api.properties.DefinedProperty; import org.neo4j.kernel.api.properties.DefinedProperty;
import org.neo4j.kernel.impl.api.state.RelationshipChangesForNode; import org.neo4j.kernel.impl.api.state.RelationshipChangesForNode;
Expand Down Expand Up @@ -68,11 +69,13 @@ void visitNodeLabelChanges( long id, Set<Integer> added, Set<Integer> removed )


void visitRemovedUniquePropertyConstraint( UniquenessConstraint element ); void visitRemovedUniquePropertyConstraint( UniquenessConstraint element );


void visitAddedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint element ); void visitAddedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint element )
throws CreateConstraintFailureException;


void visitRemovedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint element ); void visitRemovedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint element );


void visitAddedRelationshipPropertyExistenceConstraint( RelationshipPropertyExistenceConstraint element ); void visitAddedRelationshipPropertyExistenceConstraint( RelationshipPropertyExistenceConstraint element )
throws CreateConstraintFailureException;


void visitRemovedRelationshipPropertyExistenceConstraint( RelationshipPropertyExistenceConstraint element ); void visitRemovedRelationshipPropertyExistenceConstraint( RelationshipPropertyExistenceConstraint element );


Expand Down Expand Up @@ -227,6 +230,7 @@ public void visitRemovedUniquePropertyConstraint( UniquenessConstraint element )


@Override @Override
public void visitAddedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint element ) public void visitAddedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint element )
throws CreateConstraintFailureException
{ {
if ( next != null ) if ( next != null )
{ {
Expand All @@ -245,6 +249,7 @@ public void visitRemovedNodePropertyExistenceConstraint( NodePropertyExistenceCo


@Override @Override
public void visitAddedRelationshipPropertyExistenceConstraint( RelationshipPropertyExistenceConstraint element ) public void visitAddedRelationshipPropertyExistenceConstraint( RelationshipPropertyExistenceConstraint element )
throws CreateConstraintFailureException
{ {
if ( next != null ) if ( next != null )
{ {
Expand Down
Expand Up @@ -30,6 +30,7 @@
import org.neo4j.cursor.Cursor; import org.neo4j.cursor.Cursor;
import org.neo4j.helpers.Clock; import org.neo4j.helpers.Clock;
import org.neo4j.helpers.ThisShouldNotHappenError; import org.neo4j.helpers.ThisShouldNotHappenError;
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;
import org.neo4j.kernel.impl.constraints.ConstraintSemantics; import org.neo4j.kernel.impl.constraints.ConstraintSemantics;
import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.api.KeyReadTokenNameLookup; import org.neo4j.kernel.api.KeyReadTokenNameLookup;
Expand Down Expand Up @@ -382,7 +383,8 @@ private void assertTransactionNotClosing()
} }
} }


private void prepareRecordChangesFromTransactionState() throws ConstraintValidationKernelException private void prepareRecordChangesFromTransactionState()
throws ConstraintValidationKernelException, CreateConstraintFailureException
{ {
if ( hasTxStateWithChanges() ) if ( hasTxStateWithChanges() )
{ {
Expand Down Expand Up @@ -554,7 +556,7 @@ private void commit() throws TransactionFailureException
} }
success = true; success = true;
} }
catch ( ConstraintValidationKernelException e ) catch ( ConstraintValidationKernelException | CreateConstraintFailureException e )
{ {
throw new ConstraintViolationTransactionFailureException( throw new ConstraintViolationTransactionFailureException(
e.getUserMessage( new KeyReadTokenNameLookup( operations.keyReadOperations() ) ), e ); e.getUserMessage( new KeyReadTokenNameLookup( operations.keyReadOperations() ) ), e );
Expand Down Expand Up @@ -606,7 +608,7 @@ public void visitCreatedRelationship( long id, int type, long startNode, long en
} }
} ); } );
} }
catch ( ConstraintValidationKernelException e ) catch ( ConstraintValidationKernelException | CreateConstraintFailureException e )
{ {
throw new IllegalStateException( throw new IllegalStateException(
"Releasing locks during rollback should perform no constraints checking.", e ); "Releasing locks during rollback should perform no constraints checking.", e );
Expand Down Expand Up @@ -953,6 +955,7 @@ public void visitRemovedUniquePropertyConstraint( UniquenessConstraint element )


@Override @Override
public void visitAddedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint element ) public void visitAddedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint element )
throws CreateConstraintFailureException
{ {
clearState = true; clearState = true;
recordState.createSchemaRule( constraintSemantics.writeNodePropertyExistenceConstraint( recordState.createSchemaRule( constraintSemantics.writeNodePropertyExistenceConstraint(
Expand Down Expand Up @@ -983,6 +986,7 @@ public void visitRemovedNodePropertyExistenceConstraint( NodePropertyExistenceCo


@Override @Override
public void visitAddedRelationshipPropertyExistenceConstraint( RelationshipPropertyExistenceConstraint element ) public void visitAddedRelationshipPropertyExistenceConstraint( RelationshipPropertyExistenceConstraint element )
throws CreateConstraintFailureException
{ {
clearState = true; clearState = true;
recordState.createSchemaRule( constraintSemantics.writeRelationshipPropertyExistenceConstraint( recordState.createSchemaRule( constraintSemantics.writeRelationshipPropertyExistenceConstraint(
Expand Down
Expand Up @@ -47,6 +47,7 @@
import org.neo4j.kernel.api.cursor.PropertyItem; import org.neo4j.kernel.api.cursor.PropertyItem;
import org.neo4j.kernel.api.cursor.RelationshipItem; import org.neo4j.kernel.api.cursor.RelationshipItem;
import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException; import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException;
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;
import org.neo4j.kernel.api.index.IndexDescriptor; import org.neo4j.kernel.api.index.IndexDescriptor;
import org.neo4j.kernel.api.properties.DefinedProperty; import org.neo4j.kernel.api.properties.DefinedProperty;
import org.neo4j.kernel.api.properties.Property; import org.neo4j.kernel.api.properties.Property;
Expand Down Expand Up @@ -250,7 +251,8 @@ protected TxIteratorRelationshipCursor create()
} }


@Override @Override
public void accept( final TxStateVisitor visitor ) throws ConstraintValidationKernelException public void accept( final TxStateVisitor visitor )
throws ConstraintValidationKernelException, CreateConstraintFailureException
{ {
// Created nodes // Created nodes
if ( nodes != null ) if ( nodes != null )
Expand Down Expand Up @@ -409,7 +411,7 @@ static class ConstraintDiffSetsVisitor implements PropertyConstraint.ChangeVisit
} }


@Override @Override
public void visitAdded( PropertyConstraint element ) public void visitAdded( PropertyConstraint element ) throws CreateConstraintFailureException
{ {
element.added( this ); element.added( this );
} }
Expand All @@ -434,6 +436,7 @@ public void visitRemovedUniquePropertyConstraint( UniquenessConstraint constrain


@Override @Override
public void visitAddedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint constraint ) public void visitAddedNodePropertyExistenceConstraint( NodePropertyExistenceConstraint constraint )
throws CreateConstraintFailureException
{ {
visitor.visitAddedNodePropertyExistenceConstraint( constraint ); visitor.visitAddedNodePropertyExistenceConstraint( constraint );
} }
Expand All @@ -446,7 +449,7 @@ public void visitRemovedNodePropertyExistenceConstraint( NodePropertyExistenceCo


@Override @Override
public void visitAddedRelationshipPropertyExistenceConstraint( public void visitAddedRelationshipPropertyExistenceConstraint(
RelationshipPropertyExistenceConstraint constraint ) RelationshipPropertyExistenceConstraint constraint ) throws CreateConstraintFailureException
{ {
visitor.visitAddedRelationshipPropertyExistenceConstraint( constraint ); visitor.visitAddedRelationshipPropertyExistenceConstraint( constraint );
} }
Expand Down
Expand Up @@ -46,9 +46,11 @@ void validateRelationshipPropertyExistenceConstraint( Cursor<RelationshipItem> a


PropertyConstraintRule writeUniquePropertyConstraint( long ruleId, int label, int propertyKey, long indexId ); PropertyConstraintRule writeUniquePropertyConstraint( long ruleId, int label, int propertyKey, long indexId );


PropertyConstraintRule writeNodePropertyExistenceConstraint( long ruleId, int label, int propertyKey ); PropertyConstraintRule writeNodePropertyExistenceConstraint( long ruleId, int label, int propertyKey )
throws CreateConstraintFailureException;


PropertyConstraintRule writeRelationshipPropertyExistenceConstraint( long ruleId, int type, int propertyKey ); PropertyConstraintRule writeRelationshipPropertyExistenceConstraint( long ruleId, int type, int propertyKey )
throws CreateConstraintFailureException;


TxStateVisitor decorateTxStateVisitor( StatementOperationParts operations, StoreStatement storeStatement, TxStateVisitor decorateTxStateVisitor( StatementOperationParts operations, StoreStatement storeStatement,
StoreReadLayer storeLayer, TxStateHolder holder, TxStateVisitor visitor ); StoreReadLayer storeLayer, TxStateHolder holder, TxStateVisitor visitor );
Expand Down
Expand Up @@ -20,7 +20,9 @@
package org.neo4j.kernel.impl.constraints; package org.neo4j.kernel.impl.constraints;


import org.neo4j.cursor.Cursor; import org.neo4j.cursor.Cursor;
import org.neo4j.kernel.api.constraints.NodePropertyExistenceConstraint;
import org.neo4j.kernel.api.constraints.PropertyConstraint; import org.neo4j.kernel.api.constraints.PropertyConstraint;
import org.neo4j.kernel.api.constraints.RelationshipPropertyExistenceConstraint;
import org.neo4j.kernel.api.cursor.NodeItem; import org.neo4j.kernel.api.cursor.NodeItem;
import org.neo4j.kernel.api.cursor.RelationshipItem; import org.neo4j.kernel.api.cursor.RelationshipItem;
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException; import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;
Expand All @@ -38,14 +40,14 @@ public class StandardConstraintSemantics implements ConstraintSemantics
public void validateNodePropertyExistenceConstraint( Cursor<NodeItem> allNodes, int label, int propertyKey ) public void validateNodePropertyExistenceConstraint( Cursor<NodeItem> allNodes, int label, int propertyKey )
throws CreateConstraintFailureException throws CreateConstraintFailureException
{ {
throw propertyExistenceConstraintsNotAllowed(); throw propertyExistenceConstraintsNotAllowed( new NodePropertyExistenceConstraint( label, propertyKey ) );
} }


@Override @Override
public void validateRelationshipPropertyExistenceConstraint( Cursor<RelationshipItem> allRels, int type, public void validateRelationshipPropertyExistenceConstraint( Cursor<RelationshipItem> allRels, int type,
int propertyKey ) throws CreateConstraintFailureException int key ) throws CreateConstraintFailureException
{ {
throw propertyExistenceConstraintsNotAllowed(); throw propertyExistenceConstraintsNotAllowed( new RelationshipPropertyExistenceConstraint( type, key ) );
} }


@Override @Override
Expand All @@ -60,14 +62,15 @@ public PropertyConstraint readConstraint( PropertyConstraintRule rule )


protected PropertyConstraint readNonStandardConstraint( PropertyConstraintRule rule ) protected PropertyConstraint readNonStandardConstraint( PropertyConstraintRule rule )
{ {
// todo: message and new exception type // When opening a store in Community Edition that contains a Property Existence Constraint
throw new IllegalStateException( "Property existence constraints can only be used on Neo4j enterprise" ); throw new IllegalStateException( "Property existence constraint requires Neo4j Enterprise Edition");
} }


private IllegalStateException propertyExistenceConstraintsNotAllowed() private CreateConstraintFailureException propertyExistenceConstraintsNotAllowed( PropertyConstraint constraint )
{ {
// todo: message and new exception type // When creating a Property Existence Constraint in Community Edition
return new IllegalStateException( "Property existence constraints can only be used on Neo4j enterprise" ); return new CreateConstraintFailureException( constraint, new IllegalStateException(
"Property existence constraint requires Neo4j Enterprise Edition" ) );
} }


@Override @Override
Expand All @@ -77,15 +80,17 @@ public PropertyConstraintRule writeUniquePropertyConstraint( long ruleId, int la
} }


@Override @Override
public PropertyConstraintRule writeNodePropertyExistenceConstraint( long ruleId, int type, int propertyKey ) public PropertyConstraintRule writeNodePropertyExistenceConstraint( long ruleId, int label, int propertyKey )
throws CreateConstraintFailureException
{ {
throw propertyExistenceConstraintsNotAllowed(); throw propertyExistenceConstraintsNotAllowed( new NodePropertyExistenceConstraint( label, propertyKey ) );
} }


@Override @Override
public PropertyConstraintRule writeRelationshipPropertyExistenceConstraint( long ruleId, int type, int propertyKey ) public PropertyConstraintRule writeRelationshipPropertyExistenceConstraint( long ruleId, int type, int key )
throws CreateConstraintFailureException
{ {
throw propertyExistenceConstraintsNotAllowed(); throw propertyExistenceConstraintsNotAllowed( new RelationshipPropertyExistenceConstraint( type, key ) );
} }


@Override @Override
Expand Down
Expand Up @@ -20,10 +20,11 @@
package org.neo4j.kernel.impl.util.diffsets; package org.neo4j.kernel.impl.util.diffsets;


import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException; import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException;
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;


public interface DiffSetsVisitor<T> public interface DiffSetsVisitor<T>
{ {
void visitAdded( T element ) throws ConstraintValidationKernelException; void visitAdded( T element ) throws ConstraintValidationKernelException, CreateConstraintFailureException;


void visitRemoved( T element ) throws ConstraintValidationKernelException; void visitRemoved( T element ) throws ConstraintValidationKernelException;


Expand Down
Expand Up @@ -27,6 +27,7 @@
import org.neo4j.function.Predicate; import org.neo4j.function.Predicate;
import org.neo4j.helpers.collection.Iterables; import org.neo4j.helpers.collection.Iterables;
import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException; import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException;
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;
import org.neo4j.kernel.impl.util.VersionedHashMap; import org.neo4j.kernel.impl.util.VersionedHashMap;


import static java.lang.String.format; import static java.lang.String.format;
Expand Down Expand Up @@ -56,7 +57,8 @@ public SuperDiffSets( Set<T> addedElements, Set<T> removedElements )
} }


@Override @Override
public void accept( DiffSetsVisitor<T> visitor ) throws ConstraintValidationKernelException public void accept( DiffSetsVisitor<T> visitor )
throws ConstraintValidationKernelException, CreateConstraintFailureException
{ {
for ( T element : added( false ) ) for ( T element : added( false ) )
{ {
Expand Down
Expand Up @@ -26,6 +26,7 @@
import org.neo4j.collection.primitive.PrimitiveLongIterator; import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.function.Predicate; import org.neo4j.function.Predicate;
import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException; import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationKernelException;
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;


/** /**
* Super class of diff sets where use of {@link PrimitiveLongIterator} can be parameterized * Super class of diff sets where use of {@link PrimitiveLongIterator} can be parameterized
Expand Down Expand Up @@ -55,5 +56,6 @@ public interface SuperReadableDiffSets<T,LONGITERATOR extends PrimitiveLongItera


SuperReadableDiffSets<T,LONGITERATOR> filterAdded( Predicate<T> addedFilter ); SuperReadableDiffSets<T,LONGITERATOR> filterAdded( Predicate<T> addedFilter );


void accept( DiffSetsVisitor<T> visitor ) throws ConstraintValidationKernelException; void accept( DiffSetsVisitor<T> visitor )
throws ConstraintValidationKernelException, CreateConstraintFailureException;
} }

0 comments on commit aabd3f0

Please sign in to comment.