package org.adaptlab.chpir.android.activerecordcloudsync;
import java.io.InputStream;
import java.util.List;
import org.adaptlab.chpir.android.survey.AppUtil;
import org.apache.commons.codec.CharEncoding;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.protocol.HTTP;
import android.content.Context;
import android.util.Log;
import com.activeandroid.query.Select;
public class HttpPushr {
private static final String TAG = "HttpPushr";
private Class<? extends SendModel> mSendTableClass;
private String mRemoteTableName;
private Context mContext;
public HttpPushr(String remoteTableName,
Class<? extends SendModel> sendTableClass,
Context context) {
mSendTableClass = sendTableClass;
mRemoteTableName = remoteTableName;
mContext = context;
}
public void push() {
if (ActiveRecordCloudSync.getEndPoint() == null) {
Log.i(TAG, "ActiveRecordCloudSync end point is not set!");
return;
}
List<? extends SendModel> allElements = getElements();
try {
if (isPersistent()) {
for (SendModel element : allElements)
sendData(element);
} else {
sendData(mSendTableClass.newInstance());
}
} catch (InstantiationException ie) {
Log.e(TAG, "InstantiationException: " + ie);
} catch (IllegalAccessException ie) {
Log.e(TAG, "IllegalAccessException: " + ie);
}
}
public List<? extends SendModel> getElements() {
return new Select().from(mSendTableClass).orderBy("Id ASC").execute();
}
private void sendData(SendModel element) {
HttpClient client = new DefaultHttpClient();
HttpConnectionParams
.setConnectionTimeout(client.getParams(), 10000); // Timeout limit
HttpResponse response;
if (!element.isSent() && element.readyToSend()) {
try {
HttpPost post = new HttpPost(
ActiveRecordCloudSync.getEndPoint()
+ mRemoteTableName + ActiveRecordCloudSync.getParams());
StringEntity se = new StringEntity(element.toJSON().toString(), CharEncoding.UTF_8);
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,
"application/json"));
post.setEntity(se);
if (AppUtil.DEBUG) Log.i(TAG, "Sending post request: "
+ element.toJSON().toString());
response = client.execute(post);
/* Checking for successful response */
if (response.getStatusLine().getStatusCode() >= 200
&& response.getStatusLine().getStatusCode() < 300) {
if (AppUtil.DEBUG) Log.i(TAG,
"Received OK HTTP status for "
+ element.toJSON());
InputStream in = response.getEntity().getContent();
element.setAsSent(mContext);
} else {
Log.e(TAG, "Received BAD HTTP status code " + response.getStatusLine().getStatusCode()
+ " for " + element.toJSON());
}
} catch (Exception e) {
Log.e(TAG, "Cannot establish connection", e);
}
}
}
private boolean isPersistent() throws InstantiationException, IllegalAccessException {
SendModel sendModel = mSendTableClass.newInstance();
return sendModel.isPersistent();
}
}