Created
May 24, 2011 21:37
-
-
Save fractastical/989764 to your computer and use it in GitHub Desktop.
@dLog Restful JSON Controller
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public with sharing class RESTController { | |
public void processRequest(){ | |
validateRequest(); | |
if( HasError ) | |
return; | |
//Add support for other types of verbs here | |
processGetQuery(); | |
} | |
static final string ERROR_MISSING_SOQL_PARAM = 'Bad Request. Missing soql parameter'; | |
static final string ERROR_SOBJECT_MISSING = 'Bad Request. Could not parse SObject name from SOQL'; | |
static final string ERROR_FROM_MISSING = 'Bad request. SOQL missing FROM keyword'; | |
public void validateRequest(){ | |
if(Query == null){ | |
errorResponse(400, ERROR_MISSING_SOQL_PARAM); | |
} | |
else if(sObjectName == null){ | |
//Force a get of object name property. | |
//Detailed error response should already be logged by sObjectName parser | |
} | |
} | |
public boolean HasError = False; | |
private void errorResponse(integer errorCode, string errorMessage){ | |
JSONResponse.putOpt('status', new JSONObject.value(errorCode)); | |
JSONResponse.putOpt('error', new JSONObject.value(errorMessage)); | |
HasError = True; | |
} | |
public void processGetQuery(){ | |
Map<String, Schema.SObjectField> fieldMap = Schema.getGlobalDescribe().get(SObjectName).getDescribe().fields.getMap(); | |
List<JSONObject.value> objectValues = new List<JSONObject.value>(); | |
List<sObject> resultList = Database.query(Query); | |
for(sObject obj : resultList){ | |
JSONObject json = new JSONObject(); | |
json.putOpt('id', new JSONObject.value( obj.Id )); | |
for(SObjectField field : fieldMap.values() ){ | |
try{ | |
string f = field.getDescribe().getName(); | |
string v = String.valueOf( obj.get(field) ); | |
json.putOpt(f, new JSONObject.value( v )); | |
} | |
catch(Exception ex){ | |
//Ignore. Field not included in query | |
} | |
} | |
objectValues.add(new JSONObject.value(json)); | |
} | |
JSONResponse.putOpt('status', new JSONObject.value(200)); | |
JSONResponse.putOpt('records', new JSONObject.value(objectValues)); | |
} | |
private string m_query = null; | |
public string Query{ | |
get{ | |
if(m_query == null && ApexPages.currentPage().getParameters().get('soql') != null){ | |
m_query = ApexPages.currentPage().getParameters().get('soql'); | |
} | |
return m_query; | |
} | |
} | |
static final string SOQL_FROM_TOKEN = 'from '; | |
private string m_sObject = null; | |
public string sObjectName{ | |
get{ | |
if(m_sObject == null && Query != null){ | |
string soql = Query.toLowerCase(); | |
integer sObjectStartToken = soql.indexOf(SOQL_FROM_TOKEN); | |
if(sObjectStartToken == -1){ | |
errorResponse(400, ERROR_FROM_MISSING); | |
return null; | |
} | |
sObjectStartToken += SOQL_FROM_TOKEN.length(); | |
integer sObjectEndToken = soql.indexOf(' ', sObjectStartToken); | |
if(sObjectEndToken == -1) | |
sObjectEndToken = soql.length(); | |
m_sObject = Query.substring(sObjectStartToken, sObjectEndToken); | |
m_sObject = m_sObject.trim(); | |
system.debug('m_sObject = ' + m_sObject); | |
} | |
return m_sObject; | |
} | |
} | |
private JsonObject m_jsonResponse = null; | |
public JSONObject JSONResponse{ | |
get{ | |
if(m_jsonResponse == null) | |
m_jsonResponse = new JSONObject(); | |
return m_jsonResponse; | |
} | |
set{ m_jsonResponse = value;} | |
} | |
public String getJSONResult() { | |
return JSONResponse.valueToString(); | |
} | |
public static testMethod void unitTests(){ | |
RESTController controller = new RESTController(); | |
controller.processRequest(); | |
system.assertEquals(True, controller.HasError); | |
system.assertEquals(True, controller.JSONResponse.has('status')); | |
system.assertEquals(400, controller.JSONResponse.getValue('status').num); | |
system.assertEquals(True, controller.JSONResponse.has('error')); | |
system.assertEquals(ERROR_MISSING_SOQL_PARAM, controller.JSONResponse.getValue('error').str); | |
controller = new RESTController(); | |
ApexPages.currentPage().getParameters().put('soql', 'select Id fro Lead'); | |
controller.processRequest(); | |
system.assertEquals(True, controller.HasError); | |
system.assertEquals(True, controller.JSONResponse.has('status')); | |
system.assertEquals(400, controller.JSONResponse.getValue('status').num); | |
system.assertEquals(ERROR_FROM_MISSING, controller.JSONResponse.getValue('error').str); | |
controller = new RESTController(); | |
ApexPages.currentPage().getParameters().put('soql', 'select Id from Lead'); | |
controller.processRequest(); | |
system.assertEquals(False, controller.HasError); | |
system.assertEquals('Lead', controller.sObjectName); | |
Lead testLead = new Lead(FirstName = 'test', LastName = 'lead', Company='Bedrock', Email='fred@flintstone.com'); | |
insert testLead; | |
controller = new RESTController(); | |
ApexPages.currentPage().getParameters().put('soql', 'select Id from Lead where email=\'fred@flintstone.com\''); | |
controller.processRequest(); | |
system.assertEquals(False, controller.HasError); | |
system.assertEquals('Lead', controller.sObjectName); | |
system.assertEquals(True, controller.JSONResponse.has('records')); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment