package org.dodgybits.shuffle.android.synchronisation.tracks; import java.io.IOException; import java.io.StringWriter; import java.text.ParseException; import java.util.Map; import org.dodgybits.android.shuffle.R; import org.dodgybits.shuffle.android.core.model.Context; import org.dodgybits.shuffle.android.core.model.EntityBuilder; import org.dodgybits.shuffle.android.core.model.Id; import org.dodgybits.shuffle.android.core.model.Context.Builder; import org.dodgybits.shuffle.android.core.model.persistence.EntityPersister; import org.dodgybits.shuffle.android.core.util.DateUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import android.util.Xml; /** * @author Morten Nielsen */ public class ContextSynchronizer extends Synchronizer<Context> { private final String mTracksUrl; public ContextSynchronizer( EntityPersister<Context> persister, TracksSynchronizer tracksSynchronizer, WebClient client, android.content.Context context, int basePercent, String tracksUrl) { super(persister, tracksSynchronizer, client, context, basePercent); mTracksUrl = tracksUrl; } @Override protected void verifyLocalEntities(Map<Id, Context> localEntities) { } @Override protected String readingRemoteText() { return mContext.getString(R.string.readingRemoteContexts); } @Override protected String processingText() { return mContext.getString(R.string.processingContexts); } @Override protected String readingLocalText() { return mContext.getString(R.string.readingLocalContexts); } @Override protected String stageFinishedText() { return mContext.getString(R.string.doneWithContexts); } @Override protected EntityBuilder<Context> createBuilder() { return Context.newBuilder(); } @Override protected Context createMergedLocalEntity(Context localContext, Context newContext) { Builder builder = Context.newBuilder(); builder.mergeFrom(localContext); builder .setName(newContext.getName()) .setModifiedDate(newContext.getModifiedDate()) .setTracksId(newContext.getTracksId()); return builder.build(); } @Override protected String createDocumentForEntity(Context localContext) { XmlSerializer serializer = Xml.newSerializer(); StringWriter writer = new StringWriter(); try { serializer.setOutput(writer); //serializer.startDocument("UTF-8", true); String now = DateUtils.formatIso8601Date(System.currentTimeMillis()); serializer.startTag("", "context"); serializer.startTag("", "created-at").attribute("", "type", "datetime").text(now).endTag("", "created-at"); serializer.startTag("", "hide").attribute("", "type", "boolean").text("false").endTag("", "hide"); serializer.startTag("", "name").text(localContext.getName()).endTag("", "name"); serializer.startTag("", "position").attribute("", "type", "integer").text("12").endTag("", "position"); serializer.startTag("", "updated-at").attribute("", "type", "datetime").text(now).endTag("", "updated-at"); serializer.endTag("", "context"); // serializer.endDocument(); serializer.flush(); } catch (IOException ignored) { } return writer.toString(); } @Override protected Context parseSingleEntity(XmlPullParser parser) throws ParseException { // <context> //<created-at type="datetime">2009-12-29T21:14:19+00:00</created-at> //<hide type="boolean">false</hide> //<id type="integer">3486</id> //<name>beta</name> //<position type="integer">1</position> //<updated-at type="datetime">2009-12-29T21:14:19+00:00</updated-at> //</context> Context context = null; Builder builder = Context.newBuilder(); try { int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT && context == null) { String name = parser.getName(); switch (eventType) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.START_TAG: if (name.equalsIgnoreCase("name")) { builder.setName(parser.nextText()); } else if (name.equalsIgnoreCase("id")) { Id tracksId = Id.create(Long.parseLong(parser.nextText())); builder.setTracksId(tracksId); } else if (name.equalsIgnoreCase("updated-at")) { String dateStr = parser.nextText(); long date = DateUtils.parseIso8601Date(dateStr); builder.setModifiedDate(date); } break; case XmlPullParser.END_TAG: if (name.equalsIgnoreCase("context")) { context = builder.build(); } break; } eventType = parser.next(); } } catch (IOException e) { throw new ParseException("Unable to parse context:" + e.getMessage(), 0); } catch (XmlPullParserException e) { throw new ParseException("Unable to parse context:" + e.getMessage(), 0); } return context; } @Override protected String createEntityUrl(Context localContext) { return mTracksUrl + "/contexts/" + localContext.getTracksId().getId() + ".xml"; } @Override protected String endIndexTag() { return "contexts"; } @Override protected String entityIndexUrl() { return mTracksUrl+"/contexts.xml"; } }