package com.formulasearchengine.mathosphere.restd.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.formulasearchengine.mathosphere.basex.Client;
import com.formulasearchengine.mathmltools.xmlhelper.XMLHelper;
import com.formulasearchengine.mathosphere.basex.types.Results;
import org.w3c.dom.Document;
import javax.xml.xquery.XQException;
import java.io.IOException;
/**
* Created by Moritz on 14.03.2015.
*/
public class MathRequest {
private String type = "";
private String query = "";
@JsonSerialize(using = ResultsSerializer.class)
@JsonProperty("response")
private Results results = null;
private boolean success = false;
private String errorMessage = null;
@JsonIgnore
private boolean showTime = false;
public String getType () {
return type;
}
public String getQuery () {
return query;
}
public Results getResults() {
return results;
}
public MathRequest(String query){
this.query = query;
}
public MathRequest (String type, String query, Results results) {
this.type = type;
this.query = query;
this.results = results;
}
public MathRequest () {
}
public MathRequest setType (final String type) {
this.type = type;
return this;
}
public MathRequest setQuery (final String query) {
this.query = query;
return this;
}
public MathRequest setShowTime(final boolean showTime) {
this.showTime = showTime;
return this;
}
public MathRequest setResults( final Results results ) {
this.results = results;
return this;
}
@JsonIgnore
public MathRequest run () {
if (type == null || type == "" ){
type = "mws";
}
Client client = new Client();
client.setShowTime( showTime );
switch ( type ) {
case "tex":
try {
results = client.runTexQuery( query );
errorMessage = null;
success = true;
} catch ( final IOException | XQException e ) {
results = null;
errorMessage = "Tex Query failed, due to the following exception:\n" + e.getMessage();
success = false;
}
break;
case "xquery":
try {
results = client.runQueryNtcirWrap( query );
errorMessage = null;
success = true;
} catch ( final XQException e ) {
results = null;
errorMessage = "XQuery Query failed, due to the following exception:\n" + e.getMessage();
success = false;
}
break;
default:
Document doc = XMLHelper.String2Doc( query, true );
if ( doc != null ) {
try {
results = client.runMWSQuery( doc );
errorMessage = null;
success = true;
} catch ( final XQException e ) {
results = null;
errorMessage = "XQuery Query failed, due to the following exception:\n" + e.getMessage();
success = false;
}
} else {
results = null;
errorMessage = "XQuery Query failed. No valid XML Document could be retrieved.";
success = false;
}
}
return this;
}
public boolean isSuccess () {
return success;
}
public static class ResultsSerializer extends JsonSerializer<Results> {
@Override
public void serialize( Results results, JsonGenerator jGen, SerializerProvider provider ) throws IOException, JsonProcessingException {
if ( results != null ) {
jGen.writeString( Client.resultsToXML( results ) );
}
}
}
}
/* String result = "";
try {
Client client = new Client();
result = client.runQueryNtcirWrap( query );
} catch ( Exception e ) {
}
if ( result.length() == 0 ) {
result = "no data retrieved";
}
return result; */