/* * Copyright � 2016 TIBCO Software,Inc.All rights reserved. * http://community.jaspersoft.com/project/jaspermobile-android * * Unless you have purchased a commercial license agreement from TIBCO Jaspersoft, * the following license terms apply: * * This program is part of TIBCO Jaspersoft Mobile for Android. * * TIBCO Jaspersoft Mobile is free software:you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation,either version 3of the License,or * (at your option)any later version. * * TIBCO Jaspersoft Mobile is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY;without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with TIBCO Jaspersoft Mobile for Android.If not,see * <http://www.gnu.org/licenses/lgpl>. */ package com.jaspersoft.android.jaspermobile.data.repository.report; import android.content.Context; import com.jaspersoft.android.jaspermobile.data.cache.profile.JasperServerCache; import com.jaspersoft.android.jaspermobile.data.cache.report.VisualizeTemplateCache; import com.jaspersoft.android.jaspermobile.domain.JasperServer; import com.jaspersoft.android.jaspermobile.domain.Profile; import com.jaspersoft.android.jaspermobile.domain.VisualizeTemplate; import com.jaspersoft.android.jaspermobile.domain.repository.report.VisualizeTemplateRepository; import com.jaspersoft.android.jaspermobile.internal.di.ApplicationContext; import com.jaspersoft.android.jaspermobile.util.VisualizeEndpoint; import com.jaspersoft.android.sdk.service.data.server.ServerVersion; import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Template; import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import javax.inject.Singleton; import rx.Observable; import rx.functions.Action1; import rx.functions.Func0; /** * @author Tom Koptel * @since 2.3 */ @Singleton public final class InMemoryVisualizeTemplateRepository implements VisualizeTemplateRepository { private static final int RETRY_COUNT = 5; private final Context mContext; private final VisualizeTemplateCache mCache; private final JasperServerCache mJasperServerCache; @Inject public InMemoryVisualizeTemplateRepository(@ApplicationContext Context context, VisualizeTemplateCache cache, JasperServerCache jasperServerCache) { mContext = context; mCache = cache; mJasperServerCache = jasperServerCache; } @Override public Observable<VisualizeTemplate> get(final Profile profile, final Map<String, ?> clientParams) { Observable<VisualizeTemplate> diskSource = Observable.defer(new Func0<Observable<VisualizeTemplate>>() { @Override public Observable<VisualizeTemplate> call() { JasperServer server = mJasperServerCache.get(profile); String versionName = server.getVersion(); if (versionName == null) { throw new IllegalStateException("Server version missing impossible to load server"); } ServerVersion version = ServerVersion.valueOf(versionName); boolean optimized = !(version.greaterThanOrEquals(ServerVersion.v6) && version.lessThan(ServerVersion.v6_1)); InputStream stream = null; try { stream = mContext.getAssets().open("report.html"); StringWriter writer = new StringWriter(); IOUtils.copy(stream, writer, "UTF-8"); String baseUrl = server.getBaseUrl(); VisualizeEndpoint visualizeEndpoint = VisualizeEndpoint.forBaseUrl(baseUrl) .setOptimized(optimized) .build(); String visualizeUrl = visualizeEndpoint.createUri(); Map<String, Object> data = new HashMap<>(); data.put("visualize_url", visualizeUrl); data.put("optimized", optimized); data.putAll(clientParams); Template tmpl = Mustache.compiler().compile(writer.toString()); String html = tmpl.execute(data); return Observable.just(new VisualizeTemplate(html, baseUrl)); } catch (IOException e) { return Observable.error(e); } finally { if (stream != null) { IOUtils.closeQuietly(stream); } } } }) .retry(RETRY_COUNT) .doOnNext(new Action1<VisualizeTemplate>() { @Override public void call(VisualizeTemplate template) { mCache.put(profile, template); } }); return diskSource; } }