package org.activityinfo.server.endpoint.odk;
import com.google.inject.Inject;
import org.activityinfo.legacy.shared.command.GetSchema;
import org.activityinfo.legacy.shared.model.ActivityDTO;
import org.activityinfo.legacy.shared.model.SchemaDTO;
import org.activityinfo.legacy.shared.model.UserDatabaseDTO;
import org.activityinfo.model.auth.AuthenticatedUser;
import org.activityinfo.server.command.DispatcherSync;
import org.activityinfo.io.xform.formList.XFormList;
import org.activityinfo.io.xform.formList.XFormListItem;
import javax.inject.Provider;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import java.util.logging.Logger;
@Path("/formList")
public class FormListResource {
private static final Logger LOGGER = Logger.getLogger(FormListResource.class.getName());
private Provider<AuthenticatedUser> authProvider;
private DispatcherSync dispatcher;
@Inject
public FormListResource(OdkAuthProvider authProvider, DispatcherSync dispatcher) {
this.authProvider = authProvider;
this.dispatcher = dispatcher;
}
@GET
@Produces(MediaType.TEXT_XML)
public Response formList(@Context UriInfo uri) throws Exception {
AuthenticatedUser user = authProvider.get();
LOGGER.finer("ODK form list requested by " + user.getEmail() + " (" + user.getId() + ")");
SchemaDTO schema = dispatcher.execute(new GetSchema());
XFormList formList = new XFormList();
for (UserDatabaseDTO db : schema.getDatabases()) {
if (db.isEditAllowed()) {
for (ActivityDTO activity : db.getActivities()) {
XFormListItem form = new XFormListItem();
form.setName(db.getName() + " / " + activity.getName());
form.setFormId("activityinfo.org:" + activity.getId());
form.setVersion(getVersion());
form.setDownloadUrl(uri.getBaseUriBuilder()
.path(FormResource.class)
.path(Integer.toString(activity.getId()))
.path("xform")
.build());
// skip itemset for LCCA form: earlier versions triggered
// a bug in ODK and have corrupted the sqlite database on those
// devices.
if(activity.getId() != 11218) {
form.setManifestUrl(uri.getBaseUriBuilder()
.path(FormResource.class)
.path(Integer.toString(activity.getId()))
.path("manifest")
.build());
}
formList.getItems().add(form);
}
}
}
return OpenRosaResponse.build(formList);
}
private String getVersion() {
return Long.toString(System.currentTimeMillis() / 1000);
}
}