class PartitionEvent {

    private final String graph;
    private final int partitionId;
    private final ChangeType changeType;

    public PartitionEvent(String graph, int partitionId, ChangeType changeType) {
        this.graph = graph;
        this.partitionId = partitionId;
        this.changeType = changeType;
    }

    public String getGraph() {
        return this.graph;
    }

    public int getPartitionId() {
        return this.partitionId;
    }

    public ChangeType getChangeType() {
        return this.changeType;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        PartitionEvent that = (PartitionEvent) o;
        return partitionId == that.partitionId && Objects.equals(graph, that.graph) &&
               changeType == that.changeType;
    }

    @Override
    public int hashCode() {
        return Objects.hash(graph, partitionId, changeType);
    }

    @Override
    public String toString() {
        return "PartitionEvent{" +
               "graph='" + graph + '\'' +
               ", partitionId=" + partitionId +
               ", changeType=" + changeType +
               '}';
    }

    public enum ChangeType {
        UNKNOWN,
        ADD,
        ALTER,
        DEL;

        public static ChangeType grpcTypeOf(WatchChangeType grpcType) {<FILL_FUNCTION_BODY>}
    }
}

            switch (grpcType) {
                case WATCH_CHANGE_TYPE_ADD:
                    return ADD;
                case WATCH_CHANGE_TYPE_ALTER:
                    return ALTER;
                case WATCH_CHANGE_TYPE_DEL:
                    return DEL;
                default:
                    return UNKNOWN;
            }
        
<no_super_class>