This is an automated email from the ASF dual-hosted git repository.
samt pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push:
new dbfcd52fd5 Fix schema diffs when comments or security labels are
modified
dbfcd52fd5 is described below
commit dbfcd52fd52dd2053844244b53e563d9d7a67065
Author: Sam Tunnicliffe <[email protected]>
AuthorDate: Wed Nov 26 17:30:24 2025 +0000
Fix schema diffs when comments or security labels are modified
Patch by Sam Tunnicliffe; reviewed by Marcus Eriksson for
CASSANDRA-21045
---
.../apache/cassandra/cql3/ColumnSpecification.java | 15 +--
.../org/apache/cassandra/db/marshal/UserType.java | 11 +-
.../apache/cassandra/schema/ColumnMetadata.java | 19 ++-
.../apache/cassandra/schema/KeyspaceParams.java | 8 +-
.../cql3/CommentAndSecurityLabelClientTest.java | 132 +++++++++++++++++++
.../apache/cassandra/schema/SchemaChangesTest.java | 142 +++++++++++++++++++++
...tionsTest.java => ClientNotificationsTest.java} | 4 +-
7 files changed, 309 insertions(+), 22 deletions(-)
diff --git a/src/java/org/apache/cassandra/cql3/ColumnSpecification.java
b/src/java/org/apache/cassandra/cql3/ColumnSpecification.java
index 863f9eb5b8..8cf869bd38 100644
--- a/src/java/org/apache/cassandra/cql3/ColumnSpecification.java
+++ b/src/java/org/apache/cassandra/cql3/ColumnSpecification.java
@@ -28,28 +28,17 @@ import java.util.Iterator;
public class ColumnSpecification
{
- protected static final String EMPTY_COMMENT = "";
- protected static final String EMPTY_SECURITY_LABEL = "";
public final String ksName;
public final String cfName;
public final ColumnIdentifier name;
public final AbstractType<?> type;
- public final String comment;
- public final String securityLabel;
public ColumnSpecification(String ksName, String cfName, ColumnIdentifier
name, AbstractType<?> type)
- {
- this(ksName, cfName, name, type, EMPTY_COMMENT, EMPTY_SECURITY_LABEL);
- }
-
- public ColumnSpecification(String ksName, String cfName, ColumnIdentifier
name, AbstractType<?> type, String comment, String securityLabel)
{
this.ksName = ksName;
this.cfName = cfName;
this.name = name;
this.type = type;
- this.comment = comment == null ? EMPTY_COMMENT : comment;
- this.securityLabel = securityLabel == null ? EMPTY_SECURITY_LABEL :
securityLabel;
}
/**
@@ -60,7 +49,7 @@ public class ColumnSpecification
*/
public ColumnSpecification withAlias(ColumnIdentifier alias)
{
- return new ColumnSpecification(ksName, cfName, alias, type, comment,
securityLabel);
+ return new ColumnSpecification(ksName, cfName, alias, type);
}
public boolean isReversedType()
@@ -111,8 +100,6 @@ public class ColumnSpecification
return MoreObjects.toStringHelper(this)
.add("name", name)
.add("type", type)
- .add("comment", comment)
- .add("securityLabel", securityLabel)
.toString();
}
}
diff --git a/src/java/org/apache/cassandra/db/marshal/UserType.java
b/src/java/org/apache/cassandra/db/marshal/UserType.java
index 01d1d6a64e..23b172c816 100644
--- a/src/java/org/apache/cassandra/db/marshal/UserType.java
+++ b/src/java/org/apache/cassandra/db/marshal/UserType.java
@@ -366,7 +366,7 @@ public class UserType extends TupleType implements
SchemaElement
@Override
public int hashCode()
{
- return Objects.hashCode(keyspace, name, fieldNames, types,
isMultiCell);
+ return Objects.hashCode(keyspace, name, fieldNames, types,
isMultiCell, comment, securityLabel, fieldComments, fieldSecurityLabels);
}
@Override
@@ -413,11 +413,18 @@ public class UserType extends TupleType implements
SchemaElement
return name.equals(other.name)
&& fieldNames.equals(other.fieldNames)
&& keyspace.equals(other.keyspace)
- && isMultiCell == other.isMultiCell;
+ && isMultiCell == other.isMultiCell
+ && comment.equals(other.comment)
+ && securityLabel.equals(other.securityLabel)
+ && fieldComments.equals(other.fieldComments)
+ && fieldSecurityLabels.equals(other.fieldSecurityLabels);
}
public boolean equalsWithOutKs(UserType other)
{
+ // Doesn't consider comments or security labels at either the
+ // type or field level as this method is used to check compatibility of
+ // UserTypes in different keyspaces for validation in
CopyTableStatement
return name.equals(other.name)
&& fieldNames.equals(other.fieldNames)
&& types.equals(other.types)
diff --git a/src/java/org/apache/cassandra/schema/ColumnMetadata.java
b/src/java/org/apache/cassandra/schema/ColumnMetadata.java
index 69cb56bc59..d6ffa1c1ca 100644
--- a/src/java/org/apache/cassandra/schema/ColumnMetadata.java
+++ b/src/java/org/apache/cassandra/schema/ColumnMetadata.java
@@ -76,6 +76,8 @@ public final class ColumnMetadata extends ColumnSpecification
implements Selecta
public static final int NO_POSITION = -1;
public static final int NO_UNIQUE_ID = Integer.MIN_VALUE;
+ public static final String EMPTY_COMMENT = "";
+ public static final String EMPTY_SECURITY_LABEL = "";
public enum ClusteringOrder
{
@@ -118,6 +120,9 @@ public final class ColumnMetadata extends
ColumnSpecification implements Selecta
private final int position;
public final int uniqueId;
+ public final String comment;
+ public final String securityLabel;
+
private final Comparator<CellPath> cellPathComparator;
private final Comparator<Object> asymmetricCellPathComparator;
private final Comparator<? super Cell<?>> cellComparator;
@@ -266,7 +271,7 @@ public final class ColumnMetadata extends
ColumnSpecification implements Selecta
String comment,
String securityLabel)
{
- super(ksName, cfName, name, type, comment, securityLabel);
+ super(ksName, cfName, name, type);
this.uniqueId = uniqueId;
assert name != null && type != null && kind != null;
assert (position == NO_POSITION) == !kind.isPrimaryKeyKind(); // The
position really only make sense for partition and clustering columns (and those
must have one),
@@ -286,6 +291,8 @@ public final class ColumnMetadata extends
ColumnSpecification implements Selecta
this.mask = mask;
this.columnConstraints = columnConstraints;
this.columnConstraints.setColumnName(name);
+ this.comment = comment;
+ this.securityLabel = securityLabel;
}
private static Comparator<CellPath> makeCellPathComparator(Kind kind,
AbstractType<?> type)
@@ -458,7 +465,9 @@ public final class ColumnMetadata extends
ColumnSpecification implements Selecta
&& ksName.equals(other.ksName)
&& cfName.equals(other.cfName)
&& Objects.equals(mask, other.mask)
- && Objects.equals(columnConstraints, other.columnConstraints);
+ && Objects.equals(columnConstraints, other.columnConstraints)
+ && comment.equals(other.comment)
+ && securityLabel.equals(other.securityLabel);
}
Optional<Difference> compare(ColumnMetadata other)
@@ -490,6 +499,8 @@ public final class ColumnMetadata extends
ColumnSpecification implements Selecta
result = 31 * result + position;
result = 31 * result + (mask == null ? 0 : mask.hashCode());
result = 31 * result + (columnConstraints == null ? 0 :
columnConstraints.hashCode());
+ result = 31 * result + (comment == null ? 0 : comment.hashCode());
+ result = 31 * result + (securityLabel == null ? 0 :
securityLabel.hashCode());
hash = result;
}
return result;
@@ -508,6 +519,10 @@ public final class ColumnMetadata extends
ColumnSpecification implements Selecta
.add("type", type)
.add("kind", kind)
.add("position", position)
+ .add("mask", mask)
+ .add("columnConstraints", columnConstraints)
+ .add("comment", comment)
+ .add("securityLabel", securityLabel)
.toString();
}
diff --git a/src/java/org/apache/cassandra/schema/KeyspaceParams.java
b/src/java/org/apache/cassandra/schema/KeyspaceParams.java
index ffc3167358..35b68bbf3f 100644
--- a/src/java/org/apache/cassandra/schema/KeyspaceParams.java
+++ b/src/java/org/apache/cassandra/schema/KeyspaceParams.java
@@ -161,13 +161,17 @@ public final class KeyspaceParams
KeyspaceParams p = (KeyspaceParams) o;
- return durableWrites == p.durableWrites &&
replication.equals(p.replication) && fastPath.equals(p.fastPath);
+ return durableWrites == p.durableWrites
+ && replication.equals(p.replication)
+ && fastPath.equals(p.fastPath)
+ && comment.equals(p.comment)
+ && securityLabel.equals(p.securityLabel);
}
@Override
public int hashCode()
{
- return Objects.hashCode(durableWrites, replication, fastPath);
+ return Objects.hashCode(durableWrites, replication, fastPath, comment,
securityLabel);
}
@Override
diff --git
a/test/unit/org/apache/cassandra/cql3/CommentAndSecurityLabelClientTest.java
b/test/unit/org/apache/cassandra/cql3/CommentAndSecurityLabelClientTest.java
new file mode 100644
index 0000000000..07735b7cc6
--- /dev/null
+++ b/test/unit/org/apache/cassandra/cql3/CommentAndSecurityLabelClientTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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.cassandra.cql3;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.ServerTestUtils;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.transport.ClientNotificationsTest;
+import org.apache.cassandra.transport.Event;
+import org.apache.cassandra.transport.ProtocolVersion;
+import org.apache.cassandra.transport.SimpleClient;
+import org.apache.cassandra.transport.messages.RegisterMessage;
+import org.apache.cassandra.transport.messages.ResultMessage;
+
+import static java.lang.String.format;
+import static org.apache.cassandra.transport.Event.SchemaChange.Change.UPDATED;
+import static org.apache.cassandra.transport.Event.SchemaChange.Target.TABLE;
+import static org.apache.cassandra.transport.Event.SchemaChange.Target.TYPE;
+import static org.junit.Assert.assertEquals;
+
+public class CommentAndSecurityLabelClientTest extends CQLTester
+{
+ private static final String KEYSPACE_NAME = "ks_comment";
+ private static final String TABLE_NAME = "tbl_comment";
+ private static final String COLUMN_NAME = "name";
+ private static final String TYPE_NAME = "type_comment";
+ private static final String FIELD_NAME = "f1";
+
+ @BeforeClass
+ public static void setUpClass()
+ {
+ ServerTestUtils.daemonInitialization();
+ CQLTester.setUpClass();
+ }
+
+ @Before
+ public void setup()
+ {
+ requireNetwork();
+ }
+
+ @Test
+ public void testClientResponses() throws IOException
+ {
+ createSchema();
+ try (SimpleClient client = newSimpleClient(ProtocolVersion.CURRENT))
+ {
+ // Register to receive schema change notifications, the client
uses a simple event handler to
+ // record and inspect these.
+ client.execute(new
RegisterMessage(List.of(Event.Type.SCHEMA_CHANGE)));
+ ClientNotificationsTest.EventHandler handler = new
ClientNotificationsTest.EventHandler();
+ client.setEventHandler(handler);
+
+ // Comments
+ makeRequestAndVerify(client, handler,
+ format("COMMENT ON KEYSPACE %s IS 'test
comment'", KEYSPACE_NAME),
+ new Event.SchemaChange(UPDATED,
KEYSPACE_NAME));
+ makeRequestAndVerify(client, handler,
+ format("COMMENT ON TABLE %s.%s IS 'test
comment'", KEYSPACE_NAME, TABLE_NAME),
+ new Event.SchemaChange(UPDATED, TABLE,
KEYSPACE_NAME, TABLE_NAME));
+ makeRequestAndVerify(client, handler,
+ format("COMMENT ON COLUMN %s.%s.%s IS 'test
comment'", KEYSPACE_NAME, TABLE_NAME, COLUMN_NAME),
+ new Event.SchemaChange(UPDATED, TABLE,
KEYSPACE_NAME, TABLE_NAME));
+ makeRequestAndVerify(client, handler,
+ format("COMMENT ON TYPE %s.%s IS 'test
comment'", KEYSPACE_NAME, TYPE_NAME),
+ new Event.SchemaChange(UPDATED, TYPE,
KEYSPACE_NAME, TYPE_NAME));
+ makeRequestAndVerify(client, handler,
+ format("COMMENT ON FIELD %s.%s.%s IS 'test
comment'", KEYSPACE_NAME, TYPE_NAME, FIELD_NAME),
+ new Event.SchemaChange(UPDATED, TYPE,
KEYSPACE_NAME, TYPE_NAME));
+
+ // Security labels
+ makeRequestAndVerify(client, handler,
+ format("SECURITY LABEL ON KEYSPACE %s IS
'test label'", KEYSPACE_NAME),
+ new Event.SchemaChange(UPDATED,
KEYSPACE_NAME));
+ makeRequestAndVerify(client, handler,
+ format("SECURITY LABEL ON TABLE %s.%s IS
'test label'", KEYSPACE_NAME, TABLE_NAME),
+ new Event.SchemaChange(UPDATED, TABLE,
KEYSPACE_NAME, TABLE_NAME));
+ makeRequestAndVerify(client, handler,
+ format("SECURITY LABEL ON COLUMN %s.%s.%s IS
'test label'", KEYSPACE_NAME, TABLE_NAME, COLUMN_NAME),
+ new Event.SchemaChange(UPDATED, TABLE,
KEYSPACE_NAME, TABLE_NAME));
+ makeRequestAndVerify(client, handler,
+ format("SECURITY LABEL ON TYPE %s.%s IS 'test
label'", KEYSPACE_NAME, TYPE_NAME),
+ new Event.SchemaChange(UPDATED, TYPE,
KEYSPACE_NAME, TYPE_NAME));
+ makeRequestAndVerify(client, handler,
+ format("SECURITY LABEL ON FIELD %s.%s.%s IS
'test label'", KEYSPACE_NAME, TYPE_NAME, FIELD_NAME),
+ new Event.SchemaChange(UPDATED, TYPE,
KEYSPACE_NAME, TYPE_NAME));
+ }
+ }
+
+ private void makeRequestAndVerify(SimpleClient client,
+ ClientNotificationsTest.EventHandler
handler,
+ String cql,
+ Event.SchemaChange expected)
+ {
+ // Assert that the correct response type and content is received
+ ResultMessage result = client.execute(cql, ConsistencyLevel.ONE);
+ assertEquals(result.kind, ResultMessage.Kind.SCHEMA_CHANGE);
+ ResultMessage.SchemaChange message = (ResultMessage.SchemaChange)
result;
+ assertEquals(message.change, expected);
+ // Verify that the expected notification was received and passed to
the event handler
+ handler.assertNextEvent(expected);
+ }
+
+ private void createSchema()
+ {
+ createKeyspace(format("CREATE KEYSPACE %s WITH replication = {'class':
'SimpleStrategy', 'replication_factor': '1'}", KEYSPACE_NAME));
+ createTable(format("CREATE TABLE %s.%s (id int PRIMARY KEY, name
text)", KEYSPACE_NAME, TABLE_NAME));
+ execute(format("CREATE TYPE %s.%s (%s int)", KEYSPACE_NAME, TYPE_NAME,
FIELD_NAME));
+ }
+}
diff --git a/test/unit/org/apache/cassandra/schema/SchemaChangesTest.java
b/test/unit/org/apache/cassandra/schema/SchemaChangesTest.java
index c2d3796a35..9d3223aa73 100644
--- a/test/unit/org/apache/cassandra/schema/SchemaChangesTest.java
+++ b/test/unit/org/apache/cassandra/schema/SchemaChangesTest.java
@@ -20,11 +20,16 @@ package org.apache.cassandra.schema;
import java.nio.ByteBuffer;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.function.Supplier;
import com.google.common.collect.ImmutableMap;
+import org.apache.cassandra.cql3.FieldIdentifier;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.marshal.UserType;
import org.apache.cassandra.exceptions.InvalidRequestException;
import org.junit.BeforeClass;
import org.junit.Rule;
@@ -49,6 +54,7 @@ import org.apache.cassandra.io.sstable.Descriptor;
import org.apache.cassandra.io.sstable.format.SSTableFormat.Components;
import org.apache.cassandra.io.util.File;
import org.apache.cassandra.locator.NetworkTopologyStrategy;
+import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.FBUtilities;
import static org.apache.cassandra.Util.throwAssert;
@@ -582,6 +588,142 @@ public class SchemaChangesTest
assertEquals(keyspace1, diff.altered.get(0).after);
}
+ @Test
+ public void testColumnComment()
+ {
+ TableMetadata t1 = addTestTable("ks1", "t", "");
+ ColumnIdentifier col = new ColumnIdentifier("col", false);
+ assertNotNull(t1.getColumn(col));
+ TableMetadata t2 = t1.unbuild().alterColumnComment(col, "added
comment").build();
+ verifyTableDifferencesDetected(t1, t2);
+ }
+
+ @Test
+ public void testColumnSecurityLabel()
+ {
+ TableMetadata t1 = addTestTable("ks1", "t", "");
+ ColumnIdentifier col = new ColumnIdentifier("col", false);
+ assertNotNull(t1.getColumn(col));
+ TableMetadata t2 = t1.unbuild().alterColumnSecurityLabel(col, "added
security label").build();
+ verifyTableDifferencesDetected(t1, t2);
+ }
+
+ @Test
+ public void testTableComment()
+ {
+ TableMetadata t1 = addTestTable("ks1", "t", "");
+ assertEquals("", t1.params.comment);
+ TableMetadata t2 = t1.unbuild().comment("added comment").build();
+ verifyTableDifferencesDetected(t1, t2);
+ }
+
+ @Test
+ public void testTableSecurityLabel()
+ {
+ TableMetadata t1 = addTestTable("ks1", "t", "");
+ assertEquals("", t1.params.comment);
+ TableMetadata t2 = t1.unbuild().securityLabel("added security
label").build();
+ verifyTableDifferencesDetected(t1, t2);
+ }
+
+ @Test
+ public void testKeyspaceComment()
+ {
+ KeyspaceMetadata ks1 = KeyspaceMetadata.create("ks1",
KeyspaceParams.simple(1));
+ KeyspaceMetadata ks2 = ks1.withSwapped(ks1.params.withComment("added
comment"));
+ verifyKeyspaceDifferencesDetected(ks1, ks2);
+ }
+
+ @Test
+ public void testKeyspaceSecurityLabel()
+ {
+ KeyspaceMetadata ks1 = KeyspaceMetadata.create("ks1",
KeyspaceParams.simple(1));
+ KeyspaceMetadata ks2 =
ks1.withSwapped(ks1.params.withSecurityLabel("added security label"));
+ verifyKeyspaceDifferencesDetected(ks1, ks2);
+ }
+
+ @Test
+ public void testUserTypeComment()
+ {
+ UserType t1 = new UserType("ks1",
+ ByteBufferUtil.bytes("type_1"),
+ List.of(FieldIdentifier.forUnquoted("f1"),
FieldIdentifier.forUnquoted("f2")),
+ List.of(Int32Type.instance,
Int32Type.instance),
+ true);
+ UserType t2 = t1.withComment("added comment");
+ verifyUserTypeDifferencesDetected(t1, t2);
+ }
+
+ @Test
+ public void testUserTypeSecurityLabel()
+ {
+ UserType t1 = new UserType("ks1",
+ ByteBufferUtil.bytes("type_1"),
+ List.of(FieldIdentifier.forUnquoted("f1"),
FieldIdentifier.forUnquoted("f2")),
+ List.of(Int32Type.instance,
Int32Type.instance),
+ true);
+ UserType t2 = t1.withSecurityLabel("added comment");
+ verifyUserTypeDifferencesDetected(t1, t2);
+ }
+
+ @Test
+ public void testUserTypeFieldComment()
+ {
+ UserType t1 = new UserType("ks1",
+ ByteBufferUtil.bytes("type_1"),
+ List.of(FieldIdentifier.forUnquoted("f1"),
FieldIdentifier.forUnquoted("f2")),
+ List.of(Int32Type.instance,
Int32Type.instance),
+ true);
+ UserType t2 = t1.withFieldComment(FieldIdentifier.forUnquoted("f1"),
"added comment");
+ verifyUserTypeDifferencesDetected(t1, t2);
+ }
+
+ @Test
+ public void testUserTypeFieldSecurityLabel()
+ {
+ UserType t1 = new UserType("ks1",
+ ByteBufferUtil.bytes("type_1"),
+ List.of(FieldIdentifier.forUnquoted("f1"),
FieldIdentifier.forUnquoted("f2")),
+ List.of(Int32Type.instance,
Int32Type.instance),
+ true);
+ UserType t2 =
t1.withFieldSecurityLabel(FieldIdentifier.forUnquoted("f2"), "added comment");
+ verifyUserTypeDifferencesDetected(t1, t2);
+ }
+
+ private void verifyUserTypeDifferencesDetected(UserType t1, UserType t2)
+ {
+ assertFalse(t1.equals(t2));
+ Types types1 = Types.of(t1);
+ Types types2 = Types.of(t2);
+ Types.TypesDiff diff = Types.diff(types1, types2);
+ assertEquals(1, diff.altered.size());
+ Diff.Altered<UserType> altered = diff.altered.iterator().next();
+ assertEquals(t1, altered.before);
+ assertEquals(t2, altered.after);
+ }
+
+ private void verifyKeyspaceDifferencesDetected(KeyspaceMetadata ks1,
KeyspaceMetadata ks2)
+ {
+ assertFalse(ks1.equals(ks2));
+ Optional<KeyspaceMetadata.KeyspaceDiff> opt =
KeyspaceMetadata.diff(ks1, ks2);
+ assertTrue(opt.isPresent());
+ KeyspaceMetadata.KeyspaceDiff diff = opt.get();
+ assertEquals(ks1, diff.before);
+ assertEquals(ks2, diff.after);
+ }
+
+ private static void verifyTableDifferencesDetected(TableMetadata t1,
TableMetadata t2)
+ {
+ assertFalse(t1.equals(t2));
+ Tables tables1 = Tables.of(t1);
+ Tables tables2 = Tables.of(t2);
+ Tables.TablesDiff diff = Tables.diff(tables1, tables2);
+ assertEquals(1, diff.altered.size());
+ Diff.Altered<TableMetadata> altered = diff.altered.iterator().next();
+ assertEquals(altered.before, t1);
+ assertEquals(altered.after, t2);
+ }
+
private TableMetadata addTestTable(String ks, String cf, String comment)
{
return
diff --git
a/test/unit/org/apache/cassandra/transport/ClientNotificiationsTest.java
b/test/unit/org/apache/cassandra/transport/ClientNotificationsTest.java
similarity index 97%
rename from
test/unit/org/apache/cassandra/transport/ClientNotificiationsTest.java
rename to test/unit/org/apache/cassandra/transport/ClientNotificationsTest.java
index 9f95784e43..4c77444d48 100644
--- a/test/unit/org/apache/cassandra/transport/ClientNotificiationsTest.java
+++ b/test/unit/org/apache/cassandra/transport/ClientNotificationsTest.java
@@ -37,7 +37,7 @@ import org.apache.cassandra.utils.FBUtilities;
import static org.junit.Assert.assertEquals;
@RunWith(Parameterized.class)
-public class ClientNotificiationsTest extends CQLTester
+public class ClientNotificationsTest extends CQLTester
{
private static Server.EventNotifier notifier = new Server.EventNotifier();
@@ -101,7 +101,7 @@ public class ClientNotificiationsTest extends CQLTester
}
}
- static class EventHandler extends SimpleClient.SimpleEventHandler
+ public static class EventHandler extends SimpleClient.SimpleEventHandler
{
public void assertNextEvent(Event expected)
{
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]