blob: ccc69a302d7c827161fbaece6251c25aef4c399e [file] [log] [blame]
/*
* 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.toree.kernel.protocol.v5
import java.util.Calendar
import org.apache.toree.kernel.protocol.v5.MessageType.MessageType
/**
* A class for building KernelMessages.
* Upon creation, holds a KernelMessage with empty parameters.
* A new KMBuilder holding a KernelMessage with modified
* parameters can be generated using the withXYZ() methods.
* The KernelMessage held by the KMBuilder can be obtained with build().
* All metadata returned by metadataDefaults() is added
* to the KernelMessage's metadata when build() is called.
*
* e.g.
* val base = KMBuilder().withParent(parentMessage)
*
* val km1 = base.withHeader(MessageType.ExecuteReply).build
*
* val km2 = base.withHeader(MessageType.ExecuteRequest)
* .withContentString("content").build
**/
case class KMBuilder(km: KernelMessage = KernelMessage(
ids = Seq(),
signature = "",
header = HeaderBuilder.empty,
parentHeader = HeaderBuilder.empty,
metadata = Metadata(),
contentString = ""
)) {
require(km != null)
def withIds(newVal: Seq[Array[Byte]]) : KMBuilder =
KMBuilder(this.km.copy(ids = newVal))
def withSignature(newVal: String) : KMBuilder =
KMBuilder(this.km.copy(signature = newVal))
def withHeader(newVal: Header) : KMBuilder =
KMBuilder(this.km.copy(header = newVal))
def withHeader(msgType: MessageType) : KMBuilder = {
val header = HeaderBuilder.create(msgType.toString)
KMBuilder(this.km.copy(header = header))
}
def withHeader(msgTypeString: String) : KMBuilder = {
val header = HeaderBuilder.create(msgTypeString)
KMBuilder(this.km.copy(header = header))
}
def withParent(parent: KernelMessage) : KMBuilder =
KMBuilder(this.km.copy(parentHeader = parent.header))
def withParentHeader(newVal: Header) : KMBuilder =
KMBuilder(this.km.copy(parentHeader = newVal))
def withMetadata(newVal: Metadata) : KMBuilder =
KMBuilder(this.km.copy(metadata = newVal))
def withContentString(newVal: String) : KMBuilder =
KMBuilder(this.km.copy(contentString = newVal))
def withContentString[T <: KernelMessageContent](contentMsg: T) : KMBuilder =
KMBuilder(this.km.copy(contentString = contentMsg.content))
/**
* Default information (e.g. timestamp) to add to the
* KernelMessage's metadata upon calling build().
*/
protected def metadataDefaults : Metadata = {
val timestamp = Calendar.getInstance().getTimeInMillis.toString
Metadata("timestamp" -> timestamp)
}
/**
* Builds a KernelMessage using the KernelMessage held by this builder.
* @param includeDefaultMetadata appends default metadata (e.g. timestamp)
* to the KernelMessage's metadata when true.
* @return KernelMessage held by this builder with default metadata.
*/
def build(implicit includeDefaultMetadata: Boolean = true) : KernelMessage = {
if (includeDefaultMetadata)
this.km.copy(metadata = km.metadata ++ metadataDefaults)
else
this.km.copy(metadata = km.metadata)
}
}