package core.repositories.readme;
import android.util.Base64;
import com.alorma.github.sdk.bean.ReadmeInfo;
import com.alorma.github.sdk.bean.dto.response.Content;
import core.datasource.CloudDataSource;
import core.datasource.RestWrapper;
import core.datasource.SdkItem;
import java.io.IOException;
import retrofit2.Call;
import retrofit2.Response;
import rx.Observable;
public class ReadmeCloudDataSource extends CloudDataSource<ReadmeInfo, String> {
private final ReadmeRetrofitWrapper restWrapper;
public ReadmeCloudDataSource(ReadmeRetrofitWrapper restWrapper) {
super(restWrapper);
this.restWrapper = restWrapper;
}
@Override
protected Observable<SdkItem<String>> execute(SdkItem<ReadmeInfo> request, RestWrapper service) {
RepositoryReadmeService repositoryReadmeService = restWrapper.get();
ReadmeInfo readmeInfo = request.getK();
return Observable.defer(() -> {
Call<Content> call;
if (readmeInfo.getRepoInfo().branch == null) {
call = repositoryReadmeService.readme(readmeInfo.getRepoInfo().owner, readmeInfo.getRepoInfo().name);
} else {
call =
repositoryReadmeService.readme(readmeInfo.getRepoInfo().owner, readmeInfo.getRepoInfo().name, readmeInfo.getRepoInfo().branch);
}
try {
Response<Content> contentResponse = call.execute();
if (contentResponse.isSuccessful()) {
return Observable.just(contentResponse.body());
} else {
return Observable.error(new Exception(contentResponse.errorBody().string()));
}
} catch (IOException e) {
return Observable.error(e);
}
}).map(Content::getContent).flatMap(content -> Observable.fromCallable(() -> {
byte[] data = Base64.decode(content, Base64.DEFAULT);
return new String(data, "UTF-8");
})).map(s -> {
if (readmeInfo.isTruncate()) {
return trimString(s, 300, true);
} else {
return s;
}
}).map(SdkItem::new);
}
public static String trimString(String string, int length, boolean soft) {
if (string == null || string.trim().isEmpty()) {
return string;
}
StringBuilder sb = new StringBuilder(string);
if (sb.length() > length) {
// -3 because we add 3 dots at the end. Returned string length has to be length including the dots.
String substring = sb.substring(0, length);
if (!soft) {
return substring;
} else {
int endIndex = substring.lastIndexOf(" ");
return sb.substring(0, endIndex);
}
}
return string;
}
}