/*
* GeoSolutions - GeoCollect
* Copyright (C) 2014 - 2015 GeoSolutions (www.geo-solutions.it)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package it.geosolutions.geocollect.android.template;
import it.geosolutions.android.map.geostore.model.ResourceList;
import it.geosolutions.geocollect.android.app.BuildConfig;
import it.geosolutions.geocollect.android.core.Config;
import it.geosolutions.geocollect.android.core.utils.GsonUtil;
import it.geosolutions.geocollect.android.core.mission.utils.MissionUtils;
import it.geosolutions.geocollect.model.config.MissionTemplate;
import java.util.ArrayList;
import org.apache.http.HttpHeaders;
import retrofit.Callback;
import retrofit.RequestInterceptor;
import retrofit.RestAdapter;
import retrofit.RetrofitError;
import retrofit.client.Response;
import retrofit.converter.GsonConverter;
import android.os.AsyncTask;
import android.util.Log;
import com.google.gson.Gson;
/**
* Class which extends Asynctask to download remote MissionTemplates
*
* it makes 2 steps
*
* 1.downloads a (simple) list of available templates - does not need authentification
*
* 2.downloads the detailed templates, a login (authkey) is necessary
*
* if successful the callback will return with the list of downloaded templates
*
* otherwise error messages are logged
*
*
* @author Robert Oehler
*
*/
public abstract class TemplateDownloadTask extends AsyncTask<String, Void, Void>{
final static String TAG = TemplateDownloadTask.class.getSimpleName();
private final static String endPoint = Config.MAIN_SERVER_BASE_URL + Config.GEOSTORE_PATH;
private int arrived = 0;
private ArrayList<MissionTemplate> downloads = new ArrayList<MissionTemplate>();
public abstract void complete(ArrayList<MissionTemplate> downloaded);
@Override
protected Void doInBackground(final String... params) {
String authorizationString = "";
if(params.length > 1){
authorizationString = params[1];
}
getRemoteTemplates(authorizationString, new RemoteTemplatesFetchCallback() {
@Override
public void templatesReceived(String authorizationString, ResourceList list) {
if(list != null && list.list.size() > 0){
final int awaiting = list.list.size();
//list worked using a "geostore" resource
for(final it.geosolutions.android.map.geostore.model.Resource resource : list.list){
downloadRemoteTemplate(authorizationString, resource.id, new SingleRemoteTemplateFetchCallback (){
@Override
public void received(Resource res) {
//to download a single template, a slightly different Resource was needed
//TODO use geostore resource when server side has applied the according schema
String templateString = res.getData().getData();
downloads.add(MissionUtils.getTemplateFromJSON(templateString));
if(BuildConfig.DEBUG){
Log.v(TAG, "Received resource with id: "+res.getId());
}
arrived++;
if(arrived == awaiting){
complete(downloads);
}
}
@Override
public void error(RetrofitError error) {
if(BuildConfig.DEBUG){
Log.e(TAG, "error getting template "+resource.id+" : "+ error.getMessage());
}
arrived++;
if(arrived == awaiting){
complete(downloads);
}
}
});
}
}else{
Log.e(TAG, "none or empty list received, cannot download templates");
}
}
@Override
public void error(RetrofitError error) {
Log.e(TAG, "error getting template list : "+ error.getMessage());
}
});
return null;
}
/**
* downloads the list of available remote templates
* @param callback giving feedback of the result of the operation
*/
public static void getRemoteTemplates(final String authorizationString, final RemoteTemplatesFetchCallback callback){
Gson gson = GsonUtil.createFeatureGson();
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(endPoint)
.setConverter(new GsonConverter(gson))
.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader(HttpHeaders.ACCEPT, "application/json;");
request.addHeader(HttpHeaders.AUTHORIZATION, authorizationString);
}
})
//.setLogLevel(LogLevel.FULL)
.build();
GeoCollectTemplateDownloadServices services = restAdapter.create(GeoCollectTemplateDownloadServices.class);
services.getTemplates(new Callback<RemoteTemplateListResponse>() {
@Override
public void success(RemoteTemplateListResponse rl, Response response) {
callback.templatesReceived(authorizationString, rl.ResourceList);
}
@Override
public void failure(RetrofitError error) {
callback.error(error);
}
});
}
/**
* downloads a remote template
* @param authorizationString the key to authorize the operation
* @param id the id to identify the remote
* @param callback giving feedback of the result of the operation
*/
public static void downloadRemoteTemplate(final String authorizationString, final Long id, final SingleRemoteTemplateFetchCallback callback){
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(endPoint)
.setConverter(new GsonConverter(new Gson()))
.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader(HttpHeaders.ACCEPT, "application/json;");
request.addHeader(HttpHeaders.AUTHORIZATION, authorizationString);
}
})
//.setLogLevel(LogLevel.FULL)
.build();
GeoCollectTemplateDownloadServices services = restAdapter.create(GeoCollectTemplateDownloadServices.class);
services.getTemplate(id, new Callback<RemoteSingleResourceResponse>() {
@Override
public void success(RemoteSingleResourceResponse res, Response arg1) {
callback.received(res.Resource);
}
@Override
public void failure(RetrofitError error) {
callback.error(error);
}
});
}
public interface RemoteTemplatesFetchCallback
{
public void templatesReceived(String authorizationString, ResourceList list);
public void error(RetrofitError error);
}
public interface SingleRemoteTemplateFetchCallback
{
public void received(Resource res);
public void error(RetrofitError error);
}
}