/*
* JBoss, Home of Professional Open Source.
* Copyright 2013, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.test.integration.batch.common;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Date;
import java.util.Properties;
import javax.batch.runtime.BatchStatus;
import javax.batch.runtime.JobExecution;
import javax.json.Json;
import javax.json.stream.JsonGenerator;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParser.Event;
/**
* @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a>
*/
public class JobExecutionMarshaller {
static final String ID = "id";
static final String NAME = "name";
static final String STATUS = "status";
static final String EXIT_STATUS = "exitStatus";
static final String CREATE_TIME = "createTime";
static final String END_TIME = "endTime";
static final String LAST_UPDATE_TIME = "lastUpdateTime";
static final String START_TIME = "startTime";
static final String PROPERTIES = "properties";
public static String marshall(final JobExecution jobExecution) {
final StringWriter writer = new StringWriter();
final JsonGenerator generator = Json.createGenerator(writer);
generator.writeStartObject()
.write(ID, jobExecution.getExecutionId())
.write(NAME, jobExecution.getJobName())
.write(STATUS, jobExecution.getBatchStatus().toString())
.write(EXIT_STATUS, jobExecution.getExitStatus())
.write(CREATE_TIME, jobExecution.getCreateTime().getTime())
.write(END_TIME, jobExecution.getEndTime().getTime())
.write(LAST_UPDATE_TIME, jobExecution.getLastUpdatedTime().getTime())
.write(START_TIME, jobExecution.getStartTime().getTime());
// Write out properties
generator.writeStartObject(PROPERTIES);
final Properties params = jobExecution.getJobParameters();
for (String key : params.stringPropertyNames()) {
generator.write(key, params.getProperty(key));
}
generator.writeEnd();
// End main object
generator.writeEnd();
generator.close();
return writer.toString();
}
public static JobExecution unmarshall(final String json) {
final JsonParser parser = Json.createParser(new StringReader(json));
final JobExecutionBuilder builder = JobExecutionBuilder.create();
String key = null;
while (parser.hasNext()) {
final Event event = parser.next();
switch (event) {
case KEY_NAME:
key = parser.getString();
break;
case VALUE_FALSE:
case VALUE_NULL:
case VALUE_NUMBER:
case VALUE_STRING:
case VALUE_TRUE:
final String value = parser.getString();
if (key == null) {
throw new IllegalStateException(String.format("No key for value '%s'. Parsing position: %s%n\t%s", value, parser.getLocation(), json));
}
switch (key) {
case ID:
if (value != null) {
builder.setId(Long.parseLong(value));
}
break;
case NAME:
builder.setName(value);
break;
case STATUS:
if (value != null) {
builder.setStatus(BatchStatus.valueOf(value));
}
break;
case EXIT_STATUS:
builder.setExitStatus(value);
break;
case CREATE_TIME:
if (value != null) {
builder.setCreateTime(Long.parseLong(value));
}
break;
case END_TIME:
if (value != null) {
builder.setEndTime(Long.parseLong(value));
}
break;
case LAST_UPDATE_TIME:
if (value != null) {
builder.setLastUpdatedTime(Long.parseLong(value));
}
break;
case START_TIME:
if (value != null) {
builder.setStartTime(Long.parseLong(value));
}
break;
case PROPERTIES:
String k = null;
while (parser.hasNext()) {
final Event e = parser.next();
switch (e) {
case KEY_NAME:
k = parser.getString();
break;
case VALUE_FALSE:
case VALUE_NULL:
case VALUE_NUMBER:
case VALUE_STRING:
case VALUE_TRUE:
if (k != null) {
builder.addParameter(k, parser.getString());
}
break;
}
}
break;
}
break;
}
}
parser.close();
return builder.build();
}
static class JobExecutionBuilder {
private long id;
private String name;
private BatchStatus status;
private long startTime;
private long endTime;
private String exitStatus;
private long createTime;
private long lastUpdatedTime;
private final Properties params;
private JobExecutionBuilder() {
id = -1L;
name = null;
status = null;
startTime = 0L;
endTime = 0L;
exitStatus = null;
createTime = 0L;
lastUpdatedTime = 0L;
params = new Properties();
}
public static JobExecutionBuilder create() {
return new JobExecutionBuilder();
}
public JobExecutionBuilder setId(final long id) {
this.id = id;
return this;
}
public JobExecutionBuilder setName(final String name) {
this.name = name;
return this;
}
public JobExecutionBuilder setStatus(final BatchStatus status) {
this.status = status;
return this;
}
public JobExecutionBuilder setStartTime(final long startTime) {
this.startTime = startTime;
return this;
}
public JobExecutionBuilder setEndTime(final long endTime) {
this.endTime = endTime;
return this;
}
public JobExecutionBuilder setExitStatus(final String exitStatus) {
this.exitStatus = exitStatus;
return this;
}
public JobExecutionBuilder setCreateTime(final long createTime) {
this.createTime = createTime;
return this;
}
public JobExecutionBuilder setLastUpdatedTime(final long lastUpdatedTime) {
this.lastUpdatedTime = lastUpdatedTime;
return this;
}
public JobExecutionBuilder addParameter(final String key, final String value) {
params.setProperty(key, value);
return this;
}
public JobExecution build() {
final long id = this.id;
final String name = this.name;
final BatchStatus status = this.status;
final long startTime = this.startTime;
final long endTime = this.endTime;
final String exitStatus = this.exitStatus;
final long createTime = this.createTime;
final long lastUpdatedTime = this.lastUpdatedTime;
final Properties params = new Properties();
params.putAll(this.params);
return new JobExecution() {
@Override
public long getExecutionId() {
return id;
}
@Override
public String getJobName() {
return name;
}
@Override
public BatchStatus getBatchStatus() {
return status;
}
@Override
public Date getStartTime() {
return new Date(startTime);
}
@Override
public Date getEndTime() {
return new Date(endTime);
}
@Override
public String getExitStatus() {
return exitStatus;
}
@Override
public Date getCreateTime() {
return new Date(createTime);
}
@Override
public Date getLastUpdatedTime() {
return new Date(lastUpdatedTime);
}
@Override
public Properties getJobParameters() {
return params;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("JobExecutionBuilder{");
sb.append("id=").append(id);
sb.append(", name='").append(name).append('\'');
sb.append(", status=").append(status);
sb.append(", startTime=").append(startTime);
sb.append(", endTime=").append(endTime);
sb.append(", exitStatus='").append(exitStatus).append('\'');
sb.append(", createTime=").append(createTime);
sb.append(", lastUpdatedTime=").append(lastUpdatedTime);
sb.append(", params=").append(params);
sb.append('}');
return sb.toString();
}
};
}
}
}