blob: 2245eb982b0bde69660fa0f7746728e02ac012c3 [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.livy.client.common;
import java.util.List;
import java.util.Map;
import org.apache.livy.JobHandle.State;
import org.apache.livy.annotations.Private;
/**
* There are the Java representations of the JSON messages used by the client protocol.
*
* Note that Jackson requires an empty constructor (or annotations) to be able to instantiate
* types, so the extra noise is necessary here.
*/
@Private
public class HttpMessages {
public static interface ClientMessage {
}
public static class CreateClientRequest implements ClientMessage {
public final Map<String, String> conf;
public CreateClientRequest(Map<String, String> conf) {
this.conf = conf;
}
private CreateClientRequest() {
this(null);
}
}
public static class SessionInfo implements ClientMessage {
public final int id;
public final String name;
public final String appId;
public final String owner;
public final String proxyUser;
public final String state;
public final String kind;
public final Map<String, String> appInfo;
public final List<String> log;
public SessionInfo(int id, String name, String appId, String owner, String proxyUser,
String state, String kind, Map<String, String> appInfo, List<String> log) {
this.id = id;
this.name = name;
this.appId = appId;
this.owner = owner;
this.proxyUser = proxyUser;
this.state = state;
this.kind = kind;
this.appInfo = appInfo;
this.log = log;
}
private SessionInfo() {
this(-1, null, null, null, null, null, null, null, null);
}
}
public static class SerializedJob implements ClientMessage {
public final byte[] job;
public final String jobType;
public SerializedJob(byte[] job, String jobType) {
this.job = job;
this.jobType = jobType;
}
private SerializedJob() {
this(null, null);
}
}
public static class AddResource implements ClientMessage {
public final String uri;
public AddResource(String uri) {
this.uri = uri;
}
private AddResource() {
this(null);
}
}
public static class JobStatus implements ClientMessage {
public final long id;
public final State state;
public final byte[] result;
public final String error;
public JobStatus(long id, State state, byte[] result, String error) {
this.id = id;
this.state = state;
this.error = error;
// json4s, at least, seems confused about whether a "null" in the JSON payload should
// become a null array or a byte array with length 0. Since there shouldn't be any
// valid serialized object in a byte array of size 0, translate that to null.
this.result = (result != null && result.length > 0) ? result : null;
if (this.result != null && state != State.SUCCEEDED) {
throw new IllegalArgumentException("Result cannot be set unless job succeeded.");
}
// The check for "result" is not completely correct, but is here to make the unit tests work.
if (this.result == null && error != null && state != State.FAILED) {
throw new IllegalArgumentException("Error cannot be set unless job failed.");
}
}
private JobStatus() {
this(-1, null, null, null);
}
}
}