package com.doumee.lib_coremodel.data; 
 | 
  
 | 
import android.app.Application; 
 | 
import android.content.Context; 
 | 
import android.text.TextUtils; 
 | 
  
 | 
import androidx.annotation.NonNull; 
 | 
import androidx.annotation.Nullable; 
 | 
import androidx.collection.LruCache; 
 | 
import androidx.room.Room; 
 | 
import androidx.room.RoomDatabase; 
 | 
  
 | 
import com.doumee.lib_coremodel.config.AppliesOptions; 
 | 
import com.doumee.lib_coremodel.config.Constants; 
 | 
import com.doumee.lib_coremodel.util.Preconditions; 
 | 
  
 | 
import javax.inject.Inject; 
 | 
import javax.inject.Singleton; 
 | 
  
 | 
import dagger.Lazy; 
 | 
import retrofit2.Retrofit; 
 | 
  
 | 
/** 
 | 
 * 统一管理数据业务层 
 | 
 * @author <a href="mailto:jenly1314@gmail.com">Jenly</a> 
 | 
 */ 
 | 
@Singleton 
 | 
public class DataRepository implements IDataRepository { 
 | 
  
 | 
    @Inject 
 | 
    Lazy<Retrofit> mRetrofit; 
 | 
  
 | 
    @Inject 
 | 
    Application mApplication; 
 | 
  
 | 
    @Inject 
 | 
    AppliesOptions.RoomDatabaseOptions mRoomDatabaseOptions; 
 | 
  
 | 
    /** 
 | 
     * 缓存 Retrofit Service 
 | 
     */ 
 | 
    private LruCache<String, Object> mRetrofitServiceCache; 
 | 
    /** 
 | 
     * 缓存 RoomDatabase 
 | 
     */ 
 | 
    private LruCache<String, Object> mRoomDatabaseCache; 
 | 
  
 | 
    @Inject 
 | 
    public DataRepository(){ 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 提供上下文{@link Context} 
 | 
     * @return {@link #mApplication} 
 | 
     */ 
 | 
    @Override 
 | 
    public Context getContext() { 
 | 
        return mApplication; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 传入Class 通过{@link Retrofit#create(Class)} 获得对应的Class 
 | 
     * @param service 
 | 
     * @param <T> 
 | 
     * @return {@link Retrofit#create(Class)} 
 | 
     */ 
 | 
    @Override 
 | 
    public <T> T getRetrofitService(@NonNull Class<T> service) { 
 | 
        if(mRetrofitServiceCache == null){ 
 | 
            mRetrofitServiceCache = new LruCache<>(Constants.DEFAULT_RETROFIT_SERVICE_MAX_SIZE); 
 | 
        } 
 | 
        Preconditions.checkNotNull(mRetrofitServiceCache); 
 | 
  
 | 
        T retrofitService = (T)mRetrofitServiceCache.get(service.getCanonicalName()); 
 | 
        if(retrofitService == null){ 
 | 
            synchronized (mRetrofitServiceCache) { 
 | 
                if(retrofitService == null){ 
 | 
                    retrofitService = mRetrofit.get().create(service); 
 | 
                    //缓存 
 | 
                    mRetrofitServiceCache.put(service.getCanonicalName(),retrofitService); 
 | 
                } 
 | 
  
 | 
            } 
 | 
        } 
 | 
  
 | 
        return retrofitService; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 传入Class 通过{@link Room#databaseBuilder},{@link RoomDatabase.Builder<T>#build()}获得对应的Class 
 | 
     * @param database 
 | 
     * @param dbName 为{@code null}时,默认为{@link Constants#DEFAULT_DATABASE_NAME} 
 | 
     * @param <T> 
 | 
     * @return {@link RoomDatabase.Builder<T>#build()} 
 | 
     */ 
 | 
    @Override 
 | 
    public <T extends RoomDatabase> T getRoomDatabase(@NonNull Class<T> database, @Nullable String dbName) { 
 | 
        if(mRoomDatabaseCache == null){ 
 | 
            mRoomDatabaseCache = new LruCache<>(Constants.DEFAULT_ROOM_DATABASE_MAX_SIZE); 
 | 
        } 
 | 
        Preconditions.checkNotNull(mRoomDatabaseCache); 
 | 
  
 | 
        T roomDatabase = (T)mRoomDatabaseCache.get(database.getCanonicalName()); 
 | 
        if(roomDatabase == null) { 
 | 
            synchronized (mRoomDatabaseCache) { 
 | 
                if (roomDatabase == null) { 
 | 
                    RoomDatabase.Builder<T> builder = Room.databaseBuilder(getContext().getApplicationContext(), database, TextUtils.isEmpty(dbName) ? Constants.DEFAULT_DATABASE_NAME : dbName); 
 | 
                    if(mRoomDatabaseOptions != null){ 
 | 
                        mRoomDatabaseOptions.applyOptions(builder); 
 | 
                    } 
 | 
                    roomDatabase = builder.build(); 
 | 
                    //缓存 
 | 
                    mRoomDatabaseCache.put(database.getCanonicalName(), roomDatabase); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return roomDatabase; 
 | 
    } 
 | 
  
 | 
} 
 |