package org.consea.backend;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.net.URI;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
import org.consea.gui.DialogWindow;
import org.eclipse.core.resources.IProject;
import org.eclipse.ui.PlatformUI;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import com.sap.adt.communication.message.IResponse;
import com.sap.adt.communication.resources.AdtRestResourceFactory;
import com.sap.adt.communication.resources.IQueryParameter;
import com.sap.adt.communication.resources.IRestResource;
import com.sap.adt.communication.resources.IRestResourceFactory;
import com.sap.adt.communication.resources.ResourceNotFoundException;
import com.sap.adt.destinations.ui.logon.AdtLogonServiceUIFactory;
import com.sap.adt.tools.core.project.AdtProjectServiceFactory;
import com.sap.adt.tools.core.project.IAbapProject;
public class SapServerConnection {
private static final String SAMPLE_FLIGHT_RESOURCE_URI = "/consea/restconstants/constants";
private DialogWindow dialogWindow;
private IRestResource restResource;
public SapServerConnection(DialogWindow dialogWindow) {
this.dialogWindow = dialogWindow;
}
public ArrayList<ConseaSearchResonse> conseaSearch(String conseaSearch) {
InputStream response = sendSearchToServer(conseaSearch);
return parseJson(response);
}
@SuppressWarnings("resource")
ArrayList<ConseaSearchResonse> parseJson(InputStream response) {
Object obj = null;
Scanner scanner = null;
ArrayList<ConseaSearchResonse> results = new ArrayList<>();
try {
scanner = new Scanner(response, "UTF-8");
scanner = scanner.useDelimiter("\\A");
String inputStreamString = scanner.next();
response.close();
JSONParser jsonParser = new JSONParser();
obj = jsonParser.parse(new StringReader(inputStreamString));
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if(scanner != null) {
scanner.close();
}
}
JSONArray jsonArray = (JSONArray) obj;
if(jsonArray!= null && jsonArray.isEmpty() == true) {
return null;
}
for (@SuppressWarnings("unchecked")Iterator<JSONObject> iterator = jsonArray.iterator(); iterator.hasNext();) {
JSONObject jsonObject = iterator.next();
ConseaSearchResonse conseaSearchResponse = new ConseaSearchResonse(jsonObject.get("attvalue").toString(),
jsonObject.get("author").toString(),
jsonObject.get("changedby").toString(),
jsonObject.get("changedon").toString(),
jsonObject.get("clsname").toString(),
jsonObject.get("cmpname").toString(),
jsonObject.get("createdon").toString(),
jsonObject.get("descript").toString(),
jsonObject.get("type").toString());
results.add(conseaSearchResponse);
}
return results;
}
public InputStream sendSearchToServer(final String conseaSearch) {
if(this.restResource == null) {
restResource = createConnectionToABAPServer();
}
try {
IResponse response = restResource.get(null, IResponse.class,
new IQueryParameter() {
@Override
public String getKey() {
return "search_pattern"; //TODO Use constant
}
@Override
public String getValue() {
return conseaSearch;
}
});
return response.getBody().getContent();
} catch (ResourceNotFoundException e) {
dialogWindow.displayError("No flight data found" + e.getExceptionLongtext());
} catch (RuntimeException e) {
dialogWindow.displayError(e.getMessage());
} catch (IOException e) {
dialogWindow.displayError(e.getMessage());
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
// TODO Exception handling
return null;
}
private IRestResource createConnectionToABAPServer() {
IRestResourceFactory restResourceFactory = AdtRestResourceFactory.createRestResourceFactory();
IProject[] abapProjects = AdtProjectServiceFactory.createProjectService().getAvailableAbapProjects();
IAbapProject abapProject = (IAbapProject) abapProjects[0].getAdapter(IAbapProject.class);
AdtLogonServiceUIFactory.createLogonServiceUI().ensureLoggedOn(
abapProject.getDestinationData(),
PlatformUI.getWorkbench().getProgressService());
String destination = abapProject.getDestinationId();
URI uri = URI.create(SAMPLE_FLIGHT_RESOURCE_URI);
IRestResource restResource = restResourceFactory.createResourceWithStatelessSession(uri, destination);
return restResource;
}
}