package org.dodgybits.shuffle.android.synchronisation.tracks; import java.io.IOException; import java.io.StringWriter; import java.util.Map; import org.dodgybits.android.shuffle.R; import org.dodgybits.shuffle.android.core.activity.flurry.Analytics; import org.dodgybits.shuffle.android.core.model.EntityBuilder; import org.dodgybits.shuffle.android.core.model.Id; import org.dodgybits.shuffle.android.core.model.Project; import org.dodgybits.shuffle.android.core.model.Project.Builder; import org.dodgybits.shuffle.android.core.model.persistence.EntityPersister; import org.dodgybits.shuffle.android.core.util.DateUtils; import org.dodgybits.shuffle.android.synchronisation.tracks.parsing.Parser; import org.dodgybits.shuffle.android.synchronisation.tracks.parsing.ProjectParser; import org.xmlpull.v1.XmlSerializer; import android.util.Log; import android.util.Xml; /** * @author Morten Nielsen */ public final class ProjectSynchronizer extends Synchronizer<Project> { private static final String cTag = "ProjectSynchronizer"; private final String mTracksUrl; private Parser<Project> mParser; public ProjectSynchronizer( EntityPersister<Project> persister, TracksSynchronizer tracksSynchronizer, WebClient client, android.content.Context context, Analytics analytics, int basePercent, String tracksUrl) { super(persister, tracksSynchronizer, client, context, basePercent); mParser = new ProjectParser(this, analytics); mTracksUrl = tracksUrl; } @Override protected void verifyEntitiesForSynchronization(Map<Id, Project> localEntities) { } @Override protected EntityBuilder<Project> createBuilder() { return Project.newBuilder(); } @Override protected String readingRemoteText() { return mContext.getString(R.string.readingRemoteProjects); } @Override protected String processingText() { return mContext.getString(R.string.processingProjects); } @Override protected String readingLocalText() { return mContext.getString(R.string.readingLocalProjects); } @Override protected String stageFinishedText() { return mContext.getString(R.string.doneWithProjects); } protected Project createMergedLocalEntity(Project localProject, Project remoteProject) { Builder builder = Project.newBuilder(); builder.mergeFrom(localProject); builder .setName(remoteProject.getName()) .setModifiedDate(remoteProject.getModifiedDate()) .setArchived(remoteProject.isArchived()) .setDefaultContextId(remoteProject.getDefaultContextId()) .setDeleted(remoteProject.isDeleted()) .setTracksId(remoteProject.getTracksId()); return builder.build(); } protected String createDocumentForEntity(Project project) { XmlSerializer serializer = Xml.newSerializer(); StringWriter writer = new StringWriter(); try { serializer.setOutput(writer); String now = DateUtils.formatIso8601Date(System.currentTimeMillis()); serializer.startTag("", "project"); serializer.startTag("", "created-at").attribute("", "type", "datetime").text(now).endTag("", "created-at"); Id contextId = findTracksIdByContextId(project.getDefaultContextId()); if(contextId.isInitialised()) { serializer.startTag("", "default-context-id").attribute("", "type", "integer").text(contextId.toString()).endTag("", "default-context-id"); } serializer.startTag("", "name").text(project.getName()).endTag("", "name"); serializer.startTag("", "state").text(project.isDeleted() ? "hidden": "active").endTag("", "state"); serializer.startTag("", "updated-at").attribute("", "type", "datetime").text(now).endTag("", "updated-at"); serializer.endTag("", "project"); serializer.flush(); } catch (IOException ignored) { Log.d(cTag, "Failed to serialize project", ignored); } return writer.toString(); } @Override protected String createEntityUrl(Project project) { return mTracksUrl+ "/projects/" + project.getTracksId().getId() + ".xml"; } @Override protected String entityIndexUrl() { return mTracksUrl+ "/projects.xml"; } @Override protected Parser<Project> getEntityParser() { return mParser; } }