Refactor: Improve data recovery in MainFragment

- Replaced the previous data recovery mechanism with an ExecutorService-based approach.
- This allows for concurrent recovery operations, improving overall efficiency.
- Improved error handling by removing unnecessary callbacks and handling exceptions directly.
- Replaced cyclic recursion with a simpler iterative loop for session recovery.
This commit is contained in:
Giuseppe Scorrano 2025-02-26 19:10:30 +01:00
parent 0312f972bc
commit e75121b0bd

View File

@ -21,8 +21,8 @@ import androidx.recyclerview.widget.GridLayoutManager;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutorService;
import javax.inject.Inject; import javax.inject.Inject;
@ -32,8 +32,6 @@ import it.integry.integrywmsnative.core.class_router.configs.BaseMenuConfigurati
import it.integry.integrywmsnative.core.class_router.configs.MenuConfiguration; import it.integry.integrywmsnative.core.class_router.configs.MenuConfiguration;
import it.integry.integrywmsnative.core.data_recover.ColliDataRecoverDTO; import it.integry.integrywmsnative.core.data_recover.ColliDataRecoverDTO;
import it.integry.integrywmsnative.core.data_recover.ColliDataRecoverService; import it.integry.integrywmsnative.core.data_recover.ColliDataRecoverService;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.expansion.RunnableArgss;
import it.integry.integrywmsnative.core.interfaces.IScrollableFragment; import it.integry.integrywmsnative.core.interfaces.IScrollableFragment;
import it.integry.integrywmsnative.core.interfaces.ITitledFragment; import it.integry.integrywmsnative.core.interfaces.ITitledFragment;
import it.integry.integrywmsnative.core.menu.MenuService; import it.integry.integrywmsnative.core.menu.MenuService;
@ -44,7 +42,6 @@ import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsume
import it.integry.integrywmsnative.core.rest.consumers.ColliSpedizioneRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.ColliSpedizioneRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.AvailableCodMdepsDTO; import it.integry.integrywmsnative.core.rest.model.AvailableCodMdepsDTO;
import it.integry.integrywmsnative.core.rest.model.uds.CloseUDSRequestDTO; import it.integry.integrywmsnative.core.rest.model.uds.CloseUDSRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.CloseUDSResponseDTO;
import it.integry.integrywmsnative.core.rest.watcher.ServerStatusChecker; import it.integry.integrywmsnative.core.rest.watcher.ServerStatusChecker;
import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityDimension; import it.integry.integrywmsnative.core.utility.UtilityDimension;
@ -71,6 +68,9 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab
@Inject @Inject
ColliLavorazioneRESTConsumer colliLavorazioneRESTConsumer; ColliLavorazioneRESTConsumer colliLavorazioneRESTConsumer;
@Inject
ExecutorService executorService;
@Inject @Inject
Handler handler; Handler handler;
@ -173,46 +173,31 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab
private void initRecuperoCollo() { private void initRecuperoCollo() {
if (colliDataRecoverService.thereIsAnExistantSession()) { if (colliDataRecoverService.thereIsAnExistantSession()) {
startRecoverMode(); startRecoverMode();
executorService.execute(() -> {
List<Exception> generatedErrors = new ArrayList<>(); List<Exception> generatedErrors = new ArrayList<>();
for (var sessionIds : colliDataRecoverService.getAllSessionIDs()) {
Iterator<Integer> sessionsIterator = colliDataRecoverService.getAllSessionIDs().iterator(); try {
recoverUL(sessionIds);
cyclicRecover(sessionsIterator, () -> { } catch (Exception ex) {
generatedErrors.add(ex);
}
}
for (Exception ex : generatedErrors) { for (Exception ex : generatedErrors) {
UtilityExceptions.defaultException(getActivity(), ex); UtilityExceptions.defaultException(getActivity(), ex);
} }
endRecoverMode(); endRecoverMode();
}, generatedErrors::add); });
} }
} }
private void cyclicRecover(Iterator<Integer> sessionsIterator, Runnable onComplete, RunnableArgs<Exception> onFailed) { private void recoverUL(Integer recoveredMtbColtID) throws Exception {
RunnableArgss<Exception, Integer> tmpOnFailed = (ex, recoveredMtbColtID) -> {
if (ex.getMessage().contains("Dati entity mtb_colt non trovati") ||
ex.getMessage().contains("Dati collo non corretti") ||
(ex.getMessage().contains("Il collo numero") && ex.getMessage().contains("non esiste")) ||
ex.getMessage().contains("Impossibile eliminare un collo agganciato a documento")) {
colliDataRecoverService.closeSession(recoveredMtbColtID);
onFailed.run(ex);
} else {
onFailed.run(ex);
}
cyclicRecover(sessionsIterator, onComplete, onFailed);
};
if (!sessionsIterator.hasNext()) {
onComplete.run();
return;
}
Integer recoveredMtbColtID = sessionsIterator.next();
ColliDataRecoverDTO recoveredMtbColtDto = colliDataRecoverService.getSession(recoveredMtbColtID); ColliDataRecoverDTO recoveredMtbColtDto = colliDataRecoverService.getSession(recoveredMtbColtID);
MtbColt recoveredMtbColt = recoveredMtbColtDto.getMtbColt(); MtbColt recoveredMtbColt = recoveredMtbColtDto.getMtbColt();
@ -221,8 +206,8 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab
recoveredMtbColt.getGestioneEnum() == GestioneEnum.LAVORAZIONE)) { recoveredMtbColt.getGestioneEnum() == GestioneEnum.LAVORAZIONE)) {
String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep(); String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep();
if(recoveredMtbColtDto.getTestateOrdini() != null && if (recoveredMtbColtDto.getTestateOrdini() != null &&
!recoveredMtbColtDto.getTestateOrdini().isEmpty()){ !recoveredMtbColtDto.getTestateOrdini().isEmpty()) {
codMdep = recoveredMtbColtDto.getTestateOrdini().get(0).getCodMdep(); codMdep = recoveredMtbColtDto.getTestateOrdini().get(0).getCodMdep();
} }
@ -231,26 +216,29 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab
//.setPrintSSCC(shouldPrint) //.setPrintSSCC(shouldPrint)
.setOrderCodMdep(codMdep); .setOrderCodMdep(codMdep);
RunnableArgs<CloseUDSResponseDTO> onRequestComplete = closeUDSResponseDto -> { try {
colliDataRecoverService.closeSession(recoveredMtbColtID);
cyclicRecover(sessionsIterator, onComplete, onFailed);
};
switch (recoveredMtbColt.getGestioneEnum()) { switch (recoveredMtbColt.getGestioneEnum()) {
case LAVORAZIONE: case LAVORAZIONE:
colliLavorazioneRESTConsumer.closeUDS(closeUDSRequestDto, onRequestComplete, ex -> { colliLavorazioneRESTConsumer.closeUDSSynchronized(closeUDSRequestDto);
tmpOnFailed.run(ex, recoveredMtbColtID);
});
break; break;
case VENDITA: case VENDITA:
colliSpedizioneRESTConsumer.closeUDS(closeUDSRequestDto, onRequestComplete, ex -> { colliSpedizioneRESTConsumer.closeUDSSynchronized(closeUDSRequestDto);
tmpOnFailed.run(ex, recoveredMtbColtID);
});
break; break;
} }
colliDataRecoverService.closeSession(recoveredMtbColtID);
} catch (Exception ex) {
if (ex.getMessage().contains("Dati entity mtb_colt non trovati") ||
ex.getMessage().contains("Dati collo non corretti") ||
(ex.getMessage().contains("Il collo numero") && ex.getMessage().contains("non esiste")) ||
ex.getMessage().contains("Impossibile eliminare un collo agganciato a documento")) {
colliDataRecoverService.closeSession(recoveredMtbColtID);
}
throw ex;
}
} else { } else {
colliDataRecoverService.closeSession(recoveredMtbColtID); colliDataRecoverService.closeSession(recoveredMtbColtID);
cyclicRecover(sessionsIterator, onComplete, onFailed);
} }
} }