package org.activityinfo.server.command.handler;
import com.google.common.base.Charsets;
import com.google.common.io.CharStreams;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.inject.Inject;
import org.activityinfo.legacy.shared.adapter.ActivityFormClassBuilder;
import org.activityinfo.legacy.shared.command.GetActivityForm;
import org.activityinfo.legacy.shared.command.GetFormClass;
import org.activityinfo.legacy.shared.command.result.CommandResult;
import org.activityinfo.legacy.shared.command.result.FormClassResult;
import org.activityinfo.legacy.shared.exception.CommandException;
import org.activityinfo.legacy.shared.exception.UnexpectedCommandException;
import org.activityinfo.legacy.shared.impl.CommandHandlerAsync;
import org.activityinfo.legacy.shared.model.ActivityDTO;
import org.activityinfo.legacy.shared.model.ActivityFormDTO;
import org.activityinfo.model.form.FormClass;
import org.activityinfo.model.legacy.CuidAdapter;
import org.activityinfo.model.resource.Resource;
import org.activityinfo.model.resource.Resources;
import org.activityinfo.server.command.DispatcherSync;
import org.activityinfo.server.database.hibernate.entity.Activity;
import org.activityinfo.server.database.hibernate.entity.User;
import javax.inject.Provider;
import javax.persistence.EntityManager;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.zip.GZIPInputStream;
public class GetFormClassHandler implements CommandHandler<GetFormClass> {
private PermissionOracle permissionOracle;
private Provider<EntityManager> entityManager;
private DispatcherSync dispatcherSync;
@Inject
public GetFormClassHandler(PermissionOracle permissionOracle, Provider<EntityManager> entityManager, DispatcherSync dispatcherSync) {
this.permissionOracle = permissionOracle;
this.entityManager = entityManager;
this.dispatcherSync = dispatcherSync;
}
@Override
public CommandResult execute(GetFormClass cmd, User user) throws CommandException {
Activity activity = entityManager.get().find(Activity.class, CuidAdapter.getLegacyIdFromCuid(cmd.getResourceId()));
String json = readJson(activity);
return new FormClassResult(json);
}
private String readJson(Activity activity) {
if(activity.getGzFormClass() != null) {
try(Reader reader = new InputStreamReader(
new GZIPInputStream(
new ByteArrayInputStream(activity.getGzFormClass())), Charsets.UTF_8)) {
return CharStreams.toString(reader);
} catch (IOException e) {
throw new UnexpectedCommandException(e);
}
} else if(activity.getFormClass() != null) {
return activity.getFormClass();
} else {
return constructFromLegacy(activity.getId());
}
}
private String constructFromLegacy(final int activityId) {
ActivityFormDTO activityDTO = dispatcherSync.execute(new GetActivityForm(activityId));
ActivityFormClassBuilder builder = new ActivityFormClassBuilder(activityDTO);
FormClass formClass = builder.build();
return Resources.toJson(formClass.asResource());
}
}