/* * This program is part of the OpenLMIS logistics management information * system platform software. * * Copyright © 2015 ThoughtWorks, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. This program 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 Affero General Public License for more details. You should * have received a copy of the GNU Affero General Public License along with * this program. If not, see http://www.gnu.org/licenses. For additional * information contact info@OpenLMIS.org */ package org.openlmis.core.model.repository; import android.content.Context; import com.google.inject.Inject; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.misc.TransactionManager; import org.openlmis.core.exceptions.LMISException; import org.openlmis.core.model.Product; import org.openlmis.core.model.Program; import org.openlmis.core.persistence.DbUtil; import org.openlmis.core.persistence.GenericDao; import org.openlmis.core.persistence.LmisSqliteOpenHelper; import org.roboguice.shaded.goole.common.base.Function; import org.roboguice.shaded.goole.common.collect.FluentIterable; import java.sql.SQLException; import java.util.List; import java.util.concurrent.Callable; public class ProgramRepository { GenericDao<Program> genericDao; @Inject ProductRepository productRepository; @Inject DbUtil dbUtil; private Context context; @Inject public ProgramRepository(Context context) { this.context = context; genericDao = new GenericDao<>(Program.class, context); } public List<Program> list() throws LMISException { return genericDao.queryForAll(); } public List<Program> listEmergencyPrograms() throws LMISException{ return dbUtil.withDao(Program.class, new DbUtil.Operation<Program, List<Program>>() { @Override public List<Program> operate(Dao<Program, String> dao) throws SQLException { return dao.queryBuilder().where().eq("isSupportEmergency", true).query(); } }); } public void createOrUpdate(Program program) throws LMISException { Program existingProgram = queryByCode(program.getProgramCode()); if (existingProgram != null) { program.setId(existingProgram.getId()); genericDao.update(program); } else { genericDao.create(program); } } public void createOrUpdateProgramWithProduct(final List<Program> programs) throws LMISException { try { TransactionManager.callInTransaction(LmisSqliteOpenHelper.getInstance(context).getConnectionSource(), new Callable<Object>() { @Override public Object call() throws Exception { for (Program program : programs) { createOrUpdate(program); for (Product product : program.getProducts()) { productRepository.createOrUpdate(product); } } return null; } }); } catch (SQLException e) { throw new LMISException(e); } } public void refresh(Program programsWithProducts) { try { genericDao.refresh(programsWithProducts); } catch (LMISException e) { e.reportToFabric(); } } public Program queryByCode(final String programCode) throws LMISException { return dbUtil.withDao(Program.class, new DbUtil.Operation<Program, Program>() { @Override public Program operate(Dao<Program, String> dao) throws SQLException { return dao.queryBuilder().where().eq("programCode", programCode).queryForFirst(); } }); } public List<Long> queryProgramIdsByProgramCodeOrParentCode(final String programCode) throws LMISException { List<Program> programs = queryProgramsByProgramCodeOrParentCode(programCode); List<Long> programIds = FluentIterable.from(programs).transform(new Function<Program, Long>() { @Override public Long apply(Program program) { return program.getId(); } }).toList(); return programIds; } public List<String> queryProgramCodesByProgramCodeOrParentCode(final String programCode) throws LMISException { List<Program> programs = queryProgramsByProgramCodeOrParentCode(programCode); List<String> programCodes = FluentIterable.from(programs).transform(new Function<Program, String>() { @Override public String apply(Program program) { return program.getProgramCode(); } }).toList(); return programCodes; } public List<Program> queryProgramsByProgramCodeOrParentCode(final String programCode) throws LMISException { return dbUtil.withDao(Program.class, new DbUtil.Operation<Program, List<Program>>() { @Override public List<Program> operate(Dao<Program, String> dao) throws SQLException, LMISException { return dao.queryBuilder().where().eq("parentCode", programCode) .or().eq("programCode", programCode).query(); } }); } }