diff --git a/pom.xml b/pom.xml index 3b2dd0d..71f144e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.perales sepomex-api - 1.0-SNAPSHOT + 1.1.0-SNAPSHOT jar @@ -38,6 +38,16 @@ + + commons-fileupload + commons-fileupload + 1.4 + + + commons-io + commons-io + 2.11.0 + org.springframework.boot spring-boot-starter-web diff --git a/src/main/java/com/perales/sepomex/service/ArchivoService.java b/src/main/java/com/perales/sepomex/service/ArchivoService.java index 62dccd8..81ddb35 100644 --- a/src/main/java/com/perales/sepomex/service/ArchivoService.java +++ b/src/main/java/com/perales/sepomex/service/ArchivoService.java @@ -4,26 +4,40 @@ import com.perales.sepomex.model.Archivo; import com.perales.sepomex.model.Archivo; import com.perales.sepomex.repository.ArchivoRepository; +import io.undertow.server.handlers.form.FormData; +import org.apache.commons.fileupload.disk.DiskFileItem; +import org.apache.commons.io.IOUtils; import org.apache.lucene.search.Query; import org.hibernate.search.jpa.FullTextEntityManager; import org.hibernate.search.jpa.Search; import org.hibernate.search.query.dsl.QueryBuilder; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ByteArrayResource; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.file.Files; import java.util.List; import java.util.concurrent.TimeUnit; +import org.apache.commons.fileupload.FileItem; @Service public class ArchivoService implements ServiceGeneric { @Autowired private ArchivoRepository ArchivoRepository; + + @Autowired + private ColoniaService coloniaService; @PersistenceContext private EntityManager em; @@ -55,4 +69,44 @@ public Archivo borrar(Integer id) { ArchivoRepository.deleteById(id); return Archivo; } + + private void descargarArchivo(String fileUrl, String destinationPath) throws Exception { + URL url = new URL(fileUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + + try (InputStream inputStream = connection.getInputStream(); + FileOutputStream outputStream = new FileOutputStream(destinationPath)) { + + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + } + } + + public Boolean procesarArchivo() { + try { + String fileUrl = "https://www.correosdemexico.gob.mx/datosabiertos/cp/cpdescarga.txt"; + String tempFilePath = "/tmp/tempFile" + System.currentTimeMillis() + ".txt"; + descargarArchivo(fileUrl, tempFilePath); + File file = new File(tempFilePath); + FileItem fileItem = new DiskFileItem("file", Files.probeContentType(file.toPath()), + false, file.getName(), (int) file.length(), file.getParentFile()); + + // Leer el contenido del archivo y copiarlo al FileItem + try (InputStream input = new FileInputStream(file); + OutputStream outputStream = fileItem.getOutputStream()) { + IOUtils.copy(input, outputStream); + } + + MultipartFile multipartFile = new CommonsMultipartFile(fileItem); + return coloniaService.actualizacionMasiva(multipartFile); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + } diff --git a/src/main/java/com/perales/sepomex/service/ColoniaService.java b/src/main/java/com/perales/sepomex/service/ColoniaService.java index d8c740e..425525f 100644 --- a/src/main/java/com/perales/sepomex/service/ColoniaService.java +++ b/src/main/java/com/perales/sepomex/service/ColoniaService.java @@ -60,6 +60,9 @@ public class ColoniaService implements ServiceGeneric { @Autowired private ColoniaRepository coloniaRepository; + @Autowired + private ArchivoService archivoService; + @Autowired private CiudadRepository ciudadRepository; @@ -132,9 +135,6 @@ public Colonia borrar(Long id) { return colonia; } - @Autowired - private ArchivoService archivoService; - public Boolean cargaMasiva(MultipartFile file) throws IOException { EntityManager em = emf.createEntityManager(); try (BufferedReader br = new BufferedReader( new InputStreamReader( file.getInputStream() , "UTF-8") )) { diff --git a/src/test/java/com/perales/sepomex/service/ArchivoServiceTest.java b/src/test/java/com/perales/sepomex/service/ArchivoServiceTest.java index d8b6942..790fbf6 100644 --- a/src/test/java/com/perales/sepomex/service/ArchivoServiceTest.java +++ b/src/test/java/com/perales/sepomex/service/ArchivoServiceTest.java @@ -22,6 +22,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.hamcrest.core.IsNull.notNullValue; +import static org.junit.Assert.assertTrue; @SpringBootTest(classes = AppTestConfig.class) @WebAppConfiguration @@ -109,4 +110,11 @@ void borrar() { NoSuchElementException exception = Assertions.assertThrows( NoSuchElementException.class, () -> archivoService.buscarPorId( archivoId ) ); assertThat("Debe lanzar la un NoSuchElementException ", exception, is( notNullValue() ) ); } + + @Test + void procesarArchivo() { + boolean result = archivoService.procesarArchivo(); + assertTrue(result); + } + } \ No newline at end of file