// Source File Name: WSClient.java v. 1.5 with doUpdate function
package com.vtiger.vtwsclib;
import com.vtiger.vtwsclib.helpers.HTTP_Client;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.*;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
public class WSClient
{
public WSClient(String url)
{
_servicebase = "webservice.php";
_serviceurl = getWebServiceURL(url);
_client = new HTTP_Client(_serviceurl);
}
public void reinitailize()
{
_client = new HTTP_Client(_serviceurl);
}
protected String getWebServiceURL(String url)
{
if(!url.endsWith("/"))
url = (new StringBuilder(String.valueOf(url))).append("/").toString();
return (new StringBuilder(String.valueOf(url))).append(_servicebase).toString();
}
public Object getId(String id)
{
String splits[] = id.split("x");
return splits[1];
}
public boolean hasError(Object result)
{
boolean isError = false;
try
{
if(result == null)
isError = true;
else
if(result instanceof Exception)
{
_lasterror = ((Exception)result).getMessage();
isError = true;
} else
if(result instanceof JSONObject)
{
JSONObject resultObject = (JSONObject)result;
if(resultObject.get("success").toString() == "false")
{
_lasterror = resultObject.get("error");
isError = true;
}
}
}
catch(Exception exception) { }
return isError;
}
public Object lastError()
{
return _lasterror;
}
protected boolean __doChallenge(String username)
{
Map getdata = new HashMap();
getdata.put("operation", "getchallenge");
getdata.put("username", username);
Object response = _client.doGet(getdata, true);
if(hasError(response))
{
return false;
} else
{
JSONObject result = (JSONObject)((JSONObject)response).get("result");
_servertime = result.get("serverTime").toString();
_expiretime = result.get("expireTime").toString();
_servicetoken = result.get("token").toString();
return true;
}
}
protected void checkLogin()
{
}
protected String md5Hex(String input)
throws Exception
{
MessageDigest md = MessageDigest.getInstance("MD5");
byte hash[] = md.digest(input.getBytes());
return (new BigInteger(1, hash)).toString(16);
}
public Object toJSON(String input)
{
return _client.__jsondecode(input);
}
public String toJSONString(Object input)
{
return _client.__jsonencode(input);
}
public boolean doLogin(String username, String vtigerUserAccessKey)
{
if(!__doChallenge(username))
return false;
Object response;
Map postdata = new HashMap();
postdata.put("operation", "login");
postdata.put("username", username);
postdata.put("accessKey", md5Hex((new StringBuilder(String.valueOf(_servicetoken))).append(vtigerUserAccessKey).toString()));
response = _client.doPost(postdata, true);
if(hasError(response))
return false;
try
{
JSONObject result = (JSONObject)((JSONObject)response).get("result");
_serviceuser = username;
_servicekey = vtigerUserAccessKey;
_sessionid = result.get("sessionName").toString();
_userid = result.get("userId").toString();
}
catch(Exception ex)
{
hasError(ex);
return false;
}
return true;
}
public JSONArray doQuery(String query)
{
checkLogin();
if(!query.trim().endsWith(";"))
query = (new StringBuilder(String.valueOf(query))).append(";").toString();
Map getdata = new HashMap();
getdata.put("operation", "query");
getdata.put("sessionName", _sessionid);
getdata.put("query", query);
Object response = _client.doGet(getdata, true);
if(hasError(response))
{
return null;
} else
{
JSONArray result = (JSONArray)((JSONObject)response).get("result");
return result;
}
}
public List getResultColumns(JSONArray result)
{
List columns = new ArrayList();
if(!result.isEmpty())
{
JSONObject row = (JSONObject)result.get(0);
for(Iterator iterator = row.keySet().iterator(); iterator.hasNext(); columns.add(iterator.next().toString()));
}
return columns;
}
public Map doListTypes()
{
checkLogin();
Map getdata = new HashMap();
getdata.put("operation", "listtypes");
getdata.put("sessionName", _sessionid);
Object response = _client.doGet(getdata, true);
if(hasError(response))
return null;
JSONObject result = (JSONObject)((JSONObject)response).get("result");
JSONArray resultTypes = (JSONArray)result.get("types");
Map returnvalue = new HashMap();
Object value;
Map returnpart;
for(Iterator iterator = resultTypes.iterator(); iterator.hasNext(); returnvalue.put(value, returnpart))
{
value = iterator.next();
returnpart = new HashMap();
returnpart.put("name", value.toString());
}
return returnvalue;
}
public JSONObject doDescribe(String module)
{
checkLogin();
Map getdata = new HashMap();
getdata.put("operation", "describe");
getdata.put("sessionName", _sessionid);
getdata.put("elementType", module);
Object response = _client.doGet(getdata, true);
if(hasError(response))
{
return null;
} else
{
JSONObject result = (JSONObject)((JSONObject)response).get("result");
return result;
}
}
public JSONObject doRetrieve(Object record)
{
checkLogin();
Map getdata = new HashMap();
getdata.put("operation", "retrieve");
getdata.put("sessionName", _sessionid);
getdata.put("id", record);
Object response = _client.doGet(getdata, true);
if(hasError(response))
{
return null;
} else
{
JSONObject result = (JSONObject)((JSONObject)response).get("result");
return result;
}
}
public JSONObject doCreate(String module, Map valueMap)
{
checkLogin();
if(!valueMap.containsKey("assigned_user_id"))
valueMap.put("assigned_user_id", _userid);
Map postdata = new HashMap();
postdata.put("operation", "create");
postdata.put("sessionName", _sessionid);
postdata.put("elementType", module);
postdata.put("element", toJSONString(valueMap));
Object response = _client.doPost(postdata, true);
if(hasError(response))
{
return null;
} else
{
JSONObject result = (JSONObject)((JSONObject)response).get("result");
return result;
}
}
public JSONObject doUpdate(String module, Map valueMap)
{
checkLogin();
if(!valueMap.containsKey("assigned_user_id"))
valueMap.put("assigned_user_id", _userid);
Map postdata = new HashMap();
postdata.put("operation", "update");
postdata.put("sessionName", _sessionid);
postdata.put("elementType", module);
postdata.put("element", toJSONString(valueMap));
Object response = _client.doPost(postdata, true);
if(hasError(response))
{
return null;
} else
{
JSONObject result = (JSONObject)((JSONObject)response).get("result");
return result;
}
}
public Object doInvoke(String method, Object params)
{
return doInvoke(method, params, "GET");
}
public Object doInvoke(String method, Object params, String type)
{
checkLogin();
Map senddata = new HashMap();
senddata.put("operation", method);
senddata.put("sessionName", _sessionid);
if(params != null)
{
Map valueMap = (Map)params;
if(!valueMap.isEmpty())
{
for(Iterator iterator = valueMap.keySet().iterator(); iterator.hasNext();)
{
Object key = iterator.next();
if(!senddata.containsKey(key))
senddata.put(key, valueMap.get(key));
}
}
}
Object response = null;
if(type.toUpperCase() == "POST")
response = _client.doPost(senddata, true);
else
response = _client.doGet(senddata, true);
if(hasError(response))
{
return null;
} else
{
Object result = ((JSONObject)response).get("result");
return result;
}
}
String _servicebase;
HTTP_Client _client;
String _serviceurl;
String _serviceuser;
String _servicekey;
String _servertime;
String _expiretime;
String _servicetoken;
String _sessionid;
Object _userid;
Object _lasterror;
}