/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.service; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import android.util.Log; import android.view.View; import com.galaxy.meetup.client.util.EsLog; /** * * @author sihai * */ public abstract class Resource { private ResourceConsumer mConsumer; private List mConsumerList; protected boolean mDebugLogEnabled; protected volatile int mHttpStatusCode; protected final ResourceIdentifier mId; protected final ResourceManager mManager; protected volatile Object mResource; protected volatile int mResourceType; protected volatile int mStatus; private Object mTag; public Resource(ResourceManager resourcemanager, ResourceIdentifier resourceidentifier) { mManager = resourcemanager; mId = resourceidentifier; mDebugLogEnabled = EsLog.isLoggable("EsResource", 3); } public abstract void deliverData(byte abyte0[], boolean flag); public abstract void load(); public final void deliverDownloadError(int i) { if(mStatus != 2 && mStatus != 3) { if(mDebugLogEnabled) logDebug((new StringBuilder("Request no longer needed, not delivering status change: ")).append(mId).append(", current status: ").append(statusToString(mStatus)).append(", ignored new status: ").append(statusToString(i)).toString()); } else { if(mDebugLogEnabled) logDebug((new StringBuilder("Delivering error code to consumers: ")).append(mId).append(" status: ").append(statusToString(i)).toString()); mManager.deliverResourceStatus(this, i); } } public final void deliverHttpError(int i) { if(i == 404) mManager.deliverResourceStatus(this, 4); else mManager.deliverHttpError(this, 6, i); } public final void deliverResource(Object obj) { mManager.deliverResourceContent(this, 1, obj); } public final void deliverResourceType(int i) { if(mDebugLogEnabled) logDebug((new StringBuilder("Delivering resource type to consumers: ")).append(mId).append(" resource type: 2").toString()); mManager.deliverResourceType(this, 2); } public File getCacheFileName() { return null; } public final ResourceIdentifier getIdentifier() { return mId; } public final Object getResource() { return mResource; } public final int getResourceType() { return mResourceType; } public final int getStatus() { return mStatus; } public final String getStatusAsString() { return statusToString(mStatus); } public final boolean isDebugLogEnabled() { return mDebugLogEnabled; } public final void logDebug(String s) { if(mDebugLogEnabled) if(EsLog.isLoggable("EsResource", 3)) Log.d("EsResource", s); else Log.i("EsResource", s); } public final void notifyConsumers() { if(mConsumerList != null) { int i = mConsumerList.size(); for(int j = 0; j < i; j++) { ResourceConsumerHolder resourceconsumerholder = (ResourceConsumerHolder)mConsumerList.get(j); ResourceConsumer resourceconsumer1 = resourceconsumerholder.consumer; Object _tmp = resourceconsumerholder.tag; resourceconsumer1.onResourceStatusChange(this); } } else if(mConsumer != null) { ResourceConsumer resourceconsumer = mConsumer; Object _tmp1 = mTag; resourceconsumer.onResourceStatusChange(this); } } public void recycle() { mStatus = 0; mResource = null; } public final void register(ResourceConsumer resourceconsumer) { boolean flag = true; if(mConsumer != resourceconsumer || (mTag != null || false) && (mTag == null || !mTag.equals(null))) { flag = false; if(null != mConsumerList) { int size = mConsumerList.size(); for(int i = 0; i < size; i++) { if(((ResourceConsumerHolder)mConsumerList.get(i)).matches(resourceconsumer, null)) { flag = true; } break; } } } if(!flag) { boolean flag1; if(mConsumerList != null) { flag1 = mConsumerList.isEmpty(); mConsumerList.add(new ResourceConsumerHolder(resourceconsumer, null)); } else if(mConsumer != null) { mConsumerList = new ArrayList(); mConsumerList.add(new ResourceConsumerHolder(mConsumer, mTag)); mConsumer = null; mTag = null; mConsumerList.add(new ResourceConsumerHolder(resourceconsumer, null)); flag1 = false; } else { mConsumer = resourceconsumer; mTag = null; flag1 = true; } if(flag1) mManager.onFirstConsumerRegistered(this); resourceconsumer.onResourceStatusChange(this); } } public String toString() { StringBuilder stringbuilder = new StringBuilder(); stringbuilder.append(getClass().getSimpleName()).append('@').append(System.identityHashCode(this)).append("\n ID: ").append(mId).append("\n Status: ").append(statusToString(mStatus)); stringbuilder.append("\n Consumers:"); if(mConsumerList != null) { int i = mConsumerList.size(); for(int j = 0; j < i; j++) { ResourceConsumerHolder resourceconsumerholder = (ResourceConsumerHolder)mConsumerList.get(j); stringbuilder.append("\n "); appendConsumer(stringbuilder, resourceconsumerholder.consumer, resourceconsumerholder.tag); } } else if(mConsumer != null) { stringbuilder.append("\n "); appendConsumer(stringbuilder, mConsumer, mTag); } else { stringbuilder.append("\n none"); } return stringbuilder.toString(); } public final void unregister(ResourceConsumer resourceconsumer) { if(mConsumer != resourceconsumer || mTag != null && (mTag == null || !mTag.equals(null))) { if(null != mConsumerList) { for(Iterator iterator = mConsumerList.iterator(); iterator.hasNext();) { if(((ResourceConsumerHolder)iterator.next()).matches(resourceconsumer, null)) { iterator.remove(); } } if(mConsumerList.isEmpty()) mManager.onLastConsumerUnregistered(this); } } else { mConsumer = null; mTag = null; mManager.onLastConsumerUnregistered(this); } } private static void appendConsumer(StringBuilder stringbuilder, ResourceConsumer resourceconsumer, Object obj) { stringbuilder.append(resourceconsumer); if(resourceconsumer instanceof View) stringbuilder.append(" context: ").append(((View)resourceconsumer).getContext()); if(obj != null) stringbuilder.append(" tag: ").append(obj); } private static String statusToString(int i) { String s = null; switch(i) { case 0: s = "canceled"; break; case 1: s = "downloading"; break; case 2: s = "loading"; break; case 3: s = "not found"; break; case 4: s = "out of memory"; break; case 5: s = "packed"; break; case 6: s = "permanent error"; break; case 7: s = "ready"; break; case 8: s = "transient error"; break; case 9: s = "undefined"; break; default: s = String.valueOf(i); break; } return s; } public static abstract class ResourceIdentifier { public ResourceIdentifier() { } } private static final class ResourceConsumerHolder { ResourceConsumer consumer; Object tag; public ResourceConsumerHolder(ResourceConsumer resourceconsumer, Object obj) { consumer = resourceconsumer; tag = obj; } public final boolean matches(ResourceConsumer resourceconsumer, Object obj) { if (consumer != resourceconsumer) { return false; } boolean flag = false; if (tag == null) { flag = false; if (obj == null) flag = true; } else { flag = tag.equals(obj); } return flag; } } }