diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..549e00a2a9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000000..e76d1f3241 --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000..2cc7d4a55c Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..a9f1ef87bb --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.3/apache-maven-3.8.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000..68f2a90fe7 --- /dev/null +++ b/pom.xml @@ -0,0 +1,97 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.2 + + + br.com.samaelSimoes + spring-boot + 0.0.1-SNAPSHOT + spring-boot + Demo project for Spring Boot + + + 1.8 + + + + + org.hibernate + hibernate-core + + + org.hibernate + hibernate-entitymanager + + + + + + org.springframework.boot + spring-boot-starter-web + + + + mysql + mysql-connector-java + runtime + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + org.apache.commons + commons-lang3 + + + + org.springframework.boot + spring-boot-starter-jersey + + + + org.springframework.boot + spring-boot-starter-jta-atomikos + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/src/main/java/br/com/samaelSimoes/springboot/Application.java b/src/main/java/br/com/samaelSimoes/springboot/Application.java new file mode 100644 index 0000000000..ecd85c4eea --- /dev/null +++ b/src/main/java/br/com/samaelSimoes/springboot/Application.java @@ -0,0 +1,11 @@ +package br.com.samaelSimoes.springboot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/src/main/java/br/com/samaelSimoes/springboot/controller/FileController.java b/src/main/java/br/com/samaelSimoes/springboot/controller/FileController.java new file mode 100644 index 0000000000..250a3f95ec --- /dev/null +++ b/src/main/java/br/com/samaelSimoes/springboot/controller/FileController.java @@ -0,0 +1,44 @@ +package br.com.samaelSimoes.springboot.controller; + +import br.com.samaelSimoes.springboot.services.FileService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping(path = "/files") +public class FileController { + + @Autowired + private FileService fileService; + + @PostMapping + public ResponseEntity upload(@RequestParam MultipartFile file) { + if (file == null) { + return ResponseEntity.notFound().build(); + } + try { + fileService.readFile(file.getInputStream()); + return ResponseEntity.ok("successfully imported"); + } catch (IOException e) { + return ResponseEntity.internalServerError().body("Error uploading"); + } + } + + @GetMapping + public ResponseEntity> get() { + final List list = fileService.getAll(); + return ResponseEntity.ok(list); + } + + @GetMapping(path = "/store/{store}") + public ResponseEntity> getByLoja(@PathVariable String store) { + final List list = fileService.getAllStore(store); + return ResponseEntity.ok(list); + } +} diff --git a/src/main/java/br/com/samaelSimoes/springboot/controller/FileIndexController.java b/src/main/java/br/com/samaelSimoes/springboot/controller/FileIndexController.java new file mode 100644 index 0000000000..d15ddf8894 --- /dev/null +++ b/src/main/java/br/com/samaelSimoes/springboot/controller/FileIndexController.java @@ -0,0 +1,13 @@ +package br.com.samaelSimoes.springboot.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class FileIndexController { + @GetMapping + public String get(Model model) { + return "index"; + } +} diff --git a/src/main/java/br/com/samaelSimoes/springboot/entities/File.java b/src/main/java/br/com/samaelSimoes/springboot/entities/File.java new file mode 100644 index 0000000000..a3ae5b98fe --- /dev/null +++ b/src/main/java/br/com/samaelSimoes/springboot/entities/File.java @@ -0,0 +1,124 @@ +package br.com.samaelSimoes.springboot.entities; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Entity +@Table(name = "File") +public class File { + + public File() { + super(); + } + + public File(final Integer type, final LocalDateTime dtTransaction, final Float value, final String cpf, + final String card, final String nmOwner, final String nmStore) { + super(); + this.type = type; + this.dtTransaction = dtTransaction; + this.value = value; + this.cpf = cpf; + this.card = card; + this.nmOwner = nmOwner; + this.nmStore = nmStore; + } + + public File(Integer id, Integer type, LocalDateTime dtTransaction, Float value, String cpf, String card, String nmOwner, String nmStore) { + super(); + this.id = id; + this.type = type; + this.dtTransaction = dtTransaction; + this.value = value; + this.cpf = cpf; + this.card = card; + this.nmOwner = nmOwner; + this.nmStore = nmStore; + } + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(length = 1) + private Integer type; + + private LocalDateTime dtTransaction; + + private Float value; + + @Column(length = 11) + private String cpf; + + @Column(length = 12) + private String card; + + @Column(length = 14) + private String nmOwner; + + @Column(length = 19) + private String nmStore; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public LocalDateTime getDtTransaction() { + return dtTransaction; + } + + public void setDtTransaction(LocalDateTime dtTransaction) { + this.dtTransaction = dtTransaction; + } + + public Float getValue() { + return value; + } + + public void setValue(Float value) { + this.value = value; + } + + public String getCpf() { + return cpf; + } + + public void setCpf(String cpf) { + this.cpf = cpf; + } + + public String getCard() { + return card; + } + + public void setCard(String card) { + this.card = card; + } + + public String getNmOwner() { + return nmOwner; + } + + public void setNmOwner(String nmOwner) { + this.nmOwner = nmOwner; + } + + public String getNmStore() { + return nmStore; + } + + public void setNmStore(String nmStore) { + this.nmStore = nmStore; + } +} diff --git a/src/main/java/br/com/samaelSimoes/springboot/repositories/FileRepository.java b/src/main/java/br/com/samaelSimoes/springboot/repositories/FileRepository.java new file mode 100644 index 0000000000..971f83b04f --- /dev/null +++ b/src/main/java/br/com/samaelSimoes/springboot/repositories/FileRepository.java @@ -0,0 +1,8 @@ +package br.com.samaelSimoes.springboot.repositories; + +import br.com.samaelSimoes.springboot.entities.File; +import org.springframework.data.repository.PagingAndSortingRepository; + +public interface FileRepository extends PagingAndSortingRepository { + public Iterable findByNmStoreContainingIgnoreCase(String Store); +} diff --git a/src/main/java/br/com/samaelSimoes/springboot/services/FileService.java b/src/main/java/br/com/samaelSimoes/springboot/services/FileService.java new file mode 100644 index 0000000000..690e0ce058 --- /dev/null +++ b/src/main/java/br/com/samaelSimoes/springboot/services/FileService.java @@ -0,0 +1,138 @@ +package br.com.samaelSimoes.springboot.services; + +import br.com.samaelSimoes.springboot.entities.File; +import br.com.samaelSimoes.springboot.repositories.FileRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.time.LocalDateTime; +import java.util.*; + +@Service +public class FileService { + + @Autowired + private FileRepository fileRepository; + + private List appetizer = Arrays.asList(new Integer[] {1, 4, 5, 6, 7, 8}); + + public void readFile(final InputStream is) throws IOException { + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + while( reader.ready() ) { + fileRepository.save(this.getDataFile(reader.readLine())); + } + } + + public List getAll() { + Iterable files = fileRepository.findAll(Sort.by("nmStore")); + return this.transationsGroup(files); + } + + private List transationsGroup(Iterable files) { + List lojas = new ArrayList<>(); + List transactions = new ArrayList<>(); + Map transaction = new HashMap<>(); + String nmStore = ""; + Map loja = new HashMap<>(); + Float balance = new Float(0); + boolean hasLoja = false; + + for ( File file : files ) { + hasLoja = true; + + if ( !nmStore.equalsIgnoreCase(file.getNmStore()) ) { + if ( !nmStore.isEmpty() ) { + loja.put("account_balance", balance); + loja.put("transactions", transactions); + lojas.add(loja); + transactions = new ArrayList<>(); + } + + nmStore = file.getNmStore(); + loja = new HashMap<>(); + loja.put("store_name", nmStore); + loja.put("cpf", file.getCpf()); + loja.put("owner_name", file.getNmOwner()); + balance = new Float(0); + } + + transaction = new HashMap<>(); + transaction.put("type", this.getTransaction(file.getType())); + transaction.put("operation", this.getTransaction(file.getType())); + + if ( appetizer.contains(file.getType()) ) { + transaction.put("value", file.getValue()); + transaction.put("date", file.getDtTransaction()); + transactions.add(transaction); + balance += file.getValue(); + } else { + transaction.put("value", file.getValue()); + transaction.put("date", file.getDtTransaction()); + transactions.add(transaction); + balance -= file.getValue(); + } + } + + if ( hasLoja ) { + loja.put("account_balance", balance); + loja.put("transactions", transactions); + lojas.add(loja); + } + + return lojas; + } + + private String getTransaction(final Integer type) { + String description; + switch ( type ) { + case 1 : description = "debt"; + break; + case 2 : description = "payment slip"; + break; + case 3 : description = "Financing"; + break; + case 4 : description = "Credit"; + break; + case 5 : description = "Loan Receipt"; + break; + case 6 : description = "Sales"; + break; + case 7 : description = "TED receipt"; + break; + case 8 : description = "DOC receipt"; + break; + default: description = "Rent"; + } + return description; + } + + private File getDataFile(final String line) { + String card = line.substring(30, 42); + String hour = line.substring(42,48); + String owner = line.substring(48, 62); + String store = line.substring(62, line.length()).trim(); + Integer type = Integer.parseInt(line.substring(0 ,1)); + String date = line.substring(1,9); + Float value = Float.parseFloat(line.substring(9,19)) / new Float(100.00); + String cpf = line.substring(19, 30); + + LocalDateTime datetime = LocalDateTime.now() + .withYear(Integer.parseInt(date.substring(0, 4))) + .withMonth(Integer.parseInt(date.substring(5, 6))) + .withDayOfMonth(Integer.parseInt(date.substring(7, 8))) + .withHour(Integer.parseInt(hour.substring(1 ,2))) + .withMinute(Integer.parseInt(hour.substring(3, 4))) + .withSecond(Integer.parseInt(hour.substring(5, 6))); + + return new File(type, datetime, value, cpf, card, owner, store); + } + + public List getAllStore(final String Store) { + Iterable files = fileRepository.findByNmStoreContainingIgnoreCase(Store); + return this.transationsGroup(files); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000000..d20e94af99 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,28 @@ + +spring.datasource.url=jdbc:mysql://localhost:3306/bycoder +spring.datasource.username=root +spring.datasource.password=S#$ma91087 + +spring.jpa.hibernate.ddl-auto=create + + + +spring.datasource.tomcat.test-while-idle=true +spring.datasource.tomcat.validation-query=SELECT 1 + +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5Dialect + +server.port=8081 + +#jpa +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect + +spring.servlet.multipart.enabled=true +spring.servlet.multipart.file-size-threshold=200KB +spring.servlet.multipart.max-file-size=800MB +spring.servlet.multipart.max-request-size=2000MB +spring.datasource.driver-class-name=org.h2.Driver +spring.h2.console.path=/h2-console + + diff --git a/src/main/resources/templates/css/css.css b/src/main/resources/templates/css/css.css new file mode 100644 index 0000000000..4dd2baa0fd --- /dev/null +++ b/src/main/resources/templates/css/css.css @@ -0,0 +1,659 @@ +/***************************************** + upload button styles + Samael Pereira Simões +******************************************/ +.file-upload { + position: relative; + display: inline-block; +} + +.file-upload__label { + display: block; + padding: 1em 2em; + color: #fff; + background: #222; + border-radius: .4em; + transition: background .3s; + + &:hover { + cursor: pointer; + background: #000; + } +} + +.file-upload__input { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + font-size: 1; + width:0; + height: 100%; + opacity: 0; +} + +/***************************************** + design styles +******************************************/ +.btn-padding { + margin: 20px; + margin-left: -113px; +} +html { + font-family: 'helvetica neue', 'arial', sans-serif; + font-size: 24px; + font-weight: bold; + padding-top: 5em; + -webkit-font-smoothing: antialiased; + text-align: center; + background: #EE4F47; +} +.btn .badge { + position: relative; + top: -1px; + } +.btn-close { + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: #000; + background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat; + border: 0; + border-radius: 0.25rem; + opacity: 0.5; +} +.btn-close:hover { + color: #000; + text-decoration: none; + opacity: 0.75; +} +.placeholder.btn::before { + display: inline-block; + content: ""; +} +.btn-close:focus { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + opacity: 1; +} +.btn-close:disabled, .btn-close.disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + opacity: 0.25; +} + +.btn-close-white { + filter: invert(1) grayscale(100%) brightness(200%); +} +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:nth-child(n+3), +.btn-group > :not(.btn-check) + .btn, +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn-check:checked + .btn, +.btn-group > .btn-check:focus + .btn, +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn-check:checked + .btn, +.btn-group-vertical > .btn-check:focus + .btn, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check[disabled] + .btn, .btn-check:disabled + .btn { + pointer-events: none; + filter: none; + opacity: 0.65; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 3; +} +.btn { + display: inline-block; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + } + @media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } + } + .btn:hover { + color: #212529; + } + .btn-check:focus + .btn, .btn:focus { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + } + .btn:disabled, .btn.disabled, fieldset:disabled .btn { + pointer-events: none; + opacity: 0.65; + } + + .btn-primary { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; + } + .btn-primary:hover { + color: #fff; + background-color: #0b5ed7; + border-color: #0a58ca; + } + .btn-check:focus + .btn-primary, .btn-primary:focus { + color: #fff; + background-color: #0b5ed7; + border-color: #0a58ca; + box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5); + } + .btn-check:checked + .btn-primary, .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active, .show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #0a58ca; + border-color: #0a53be; + } + .btn-check:checked + .btn-primary:focus, .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus, .show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5); + } + .btn-primary:disabled, .btn-primary.disabled { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; + } + + .btn-secondary { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; + } + .btn-secondary:hover { + color: #fff; + background-color: #5c636a; + border-color: #565e64; + } + .btn-check:focus + .btn-secondary, .btn-secondary:focus { + color: #fff; + background-color: #5c636a; + border-color: #565e64; + box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5); + } + .btn-check:checked + .btn-secondary, .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #565e64; + border-color: #51585e; + } + .btn-check:checked + .btn-secondary:focus, .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus, .show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5); + } + .btn-secondary:disabled, .btn-secondary.disabled { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; + } + + .btn-success { + color: #fff; + background-color: #198754; + border-color: #198754; + } + .btn-success:hover { + color: #fff; + background-color: #157347; + border-color: #146c43; + } + .btn-check:focus + .btn-success, .btn-success:focus { + color: #fff; + background-color: #157347; + border-color: #146c43; + box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5); + } + .btn-check:checked + .btn-success, .btn-check:active + .btn-success, .btn-success:active, .btn-success.active, .show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #146c43; + border-color: #13653f; + } + .btn-check:checked + .btn-success:focus, .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus, .show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5); + } + .btn-success:disabled, .btn-success.disabled { + color: #fff; + background-color: #198754; + border-color: #198754; + } + + .btn-info { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; + } + .btn-info:hover { + color: #000; + background-color: #31d2f2; + border-color: #25cff2; + } + .btn-check:focus + .btn-info, .btn-info:focus { + color: #000; + background-color: #31d2f2; + border-color: #25cff2; + box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5); + } + .btn-check:checked + .btn-info, .btn-check:active + .btn-info, .btn-info:active, .btn-info.active, .show > .btn-info.dropdown-toggle { + color: #000; + background-color: #3dd5f3; + border-color: #25cff2; + } + .btn-check:checked + .btn-info:focus, .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus, .show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5); + } + .btn-info:disabled, .btn-info.disabled { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; + } + + .btn-warning { + color: #000; + background-color: #ffc107; + border-color: #ffc107; + } + .btn-warning:hover { + color: #000; + background-color: #ffca2c; + border-color: #ffc720; + } + .btn-check:focus + .btn-warning, .btn-warning:focus { + color: #000; + background-color: #ffca2c; + border-color: #ffc720; + box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5); + } + .btn-check:checked + .btn-warning, .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active, .show > .btn-warning.dropdown-toggle { + color: #000; + background-color: #ffcd39; + border-color: #ffc720; + } + .btn-check:checked + .btn-warning:focus, .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus, .show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5); + } + .btn-warning:disabled, .btn-warning.disabled { + color: #000; + background-color: #ffc107; + border-color: #ffc107; + } + + .btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; + } + .btn-danger:hover { + color: #fff; + background-color: #bb2d3b; + border-color: #b02a37; + } + .btn-check:focus + .btn-danger, .btn-danger:focus { + color: #fff; + background-color: #bb2d3b; + border-color: #b02a37; + box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5); + } + .btn-check:checked + .btn-danger, .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active, .show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #b02a37; + border-color: #a52834; + } + .btn-check:checked + .btn-danger:focus, .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus, .show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5); + } + .btn-danger:disabled, .btn-danger.disabled { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; + } + + .btn-light { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; + } + .btn-light:hover { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; + } + .btn-check:focus + .btn-light, .btn-light:focus { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; + box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); + } + .btn-check:checked + .btn-light, .btn-check:active + .btn-light, .btn-light:active, .btn-light.active, .show > .btn-light.dropdown-toggle { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; + } + .btn-check:checked + .btn-light:focus, .btn-check:active + .btn-light:focus, .btn-light:active:focus, .btn-light.active:focus, .show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); + } + .btn-light:disabled, .btn-light.disabled { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; + } + + .btn-dark { + color: #fff; + background-color: #212529; + border-color: #212529; + } + .btn-dark:hover { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21; + } + .btn-check:focus + .btn-dark, .btn-dark:focus { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21; + box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5); + } + .btn-check:checked + .btn-dark, .btn-check:active + .btn-dark, .btn-dark:active, .btn-dark.active, .show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #1a1e21; + border-color: #191c1f; + } + .btn-check:checked + .btn-dark:focus, .btn-check:active + .btn-dark:focus, .btn-dark:active:focus, .btn-dark.active:focus, .show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5); + } + .btn-dark:disabled, .btn-dark.disabled { + color: #fff; + background-color: #212529; + border-color: #212529; + } + + .btn-outline-primary { + color: #0d6efd; + border-color: #0d6efd; + } + .btn-outline-primary:hover { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; + } + .btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5); + } + .btn-check:checked + .btn-outline-primary, .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; + } + .btn-check:checked + .btn-outline-primary:focus, .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5); + } + .btn-outline-primary:disabled, .btn-outline-primary.disabled { + color: #0d6efd; + background-color: transparent; + } + + .btn-outline-secondary { + color: #6c757d; + border-color: #6c757d; + } + .btn-outline-secondary:hover { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; + } + .btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus { + box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5); + } + .btn-check:checked + .btn-outline-secondary, .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; + } + .btn-check:checked + .btn-outline-secondary:focus, .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5); + } + .btn-outline-secondary:disabled, .btn-outline-secondary.disabled { + color: #6c757d; + background-color: transparent; + } + + .btn-outline-success { + color: #198754; + border-color: #198754; + } + .btn-outline-success:hover { + color: #fff; + background-color: #198754; + border-color: #198754; + } + .btn-check:focus + .btn-outline-success, .btn-outline-success:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5); + } + .btn-check:checked + .btn-outline-success, .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show { + color: #fff; + background-color: #198754; + border-color: #198754; + } + .btn-check:checked + .btn-outline-success:focus, .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5); + } + .btn-outline-success:disabled, .btn-outline-success.disabled { + color: #198754; + background-color: transparent; + } + + .btn-outline-info { + color: #0dcaf0; + border-color: #0dcaf0; + } + .btn-outline-info:hover { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; + } + .btn-check:focus + .btn-outline-info, .btn-outline-info:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5); + } + .btn-check:checked + .btn-outline-info, .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; + } + .btn-check:checked + .btn-outline-info:focus, .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5); + } + .btn-outline-info:disabled, .btn-outline-info.disabled { + color: #0dcaf0; + background-color: transparent; + } + + .btn-outline-warning { + color: #ffc107; + border-color: #ffc107; + } + .btn-outline-warning:hover { + color: #000; + background-color: #ffc107; + border-color: #ffc107; + } + .btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus { + box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5); + } + .btn-check:checked + .btn-outline-warning, .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show { + color: #000; + background-color: #ffc107; + border-color: #ffc107; + } + .btn-check:checked + .btn-outline-warning:focus, .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5); + } + .btn-outline-warning:disabled, .btn-outline-warning.disabled { + color: #ffc107; + background-color: transparent; + } + + .btn-outline-danger { + color: #dc3545; + border-color: #dc3545; + } + .btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; + } + .btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5); + } + .btn-check:checked + .btn-outline-danger, .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; + } + .btn-check:checked + .btn-outline-danger:focus, .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5); + } + .btn-outline-danger:disabled, .btn-outline-danger.disabled { + color: #dc3545; + background-color: transparent; + } + + .btn-outline-light { + color: #f8f9fa; + border-color: #f8f9fa; + } + .btn-outline-light:hover { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; + } + .btn-check:focus + .btn-outline-light, .btn-outline-light:focus { + box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); + } + .btn-check:checked + .btn-outline-light, .btn-check:active + .btn-outline-light, .btn-outline-light:active, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; + } + .btn-check:checked + .btn-outline-light:focus, .btn-check:active + .btn-outline-light:focus, .btn-outline-light:active:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); + } + .btn-outline-light:disabled, .btn-outline-light.disabled { + color: #f8f9fa; + background-color: transparent; + } + + .btn-outline-dark { + color: #212529; + border-color: #212529; + } + .btn-outline-dark:hover { + color: #fff; + background-color: #212529; + border-color: #212529; + } + .btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus { + box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5); + } + .btn-check:checked + .btn-outline-dark, .btn-check:active + .btn-outline-dark, .btn-outline-dark:active, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show { + color: #fff; + background-color: #212529; + border-color: #212529; + } + .btn-check:checked + .btn-outline-dark:focus, .btn-check:active + .btn-outline-dark:focus, .btn-outline-dark:active:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5); + } + .btn-outline-dark:disabled, .btn-outline-dark.disabled { + color: #212529; + background-color: transparent; + } + + .btn-link { + font-weight: 400; + color: #0d6efd; + text-decoration: underline; + } + .btn-link:hover { + color: #0a58ca; + } + .btn-link:disabled, .btn-link.disabled { + color: #6c757d; + } + + .btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; + } + + .btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; + } + + + \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html new file mode 100644 index 0000000000..2eeea1af22 --- /dev/null +++ b/src/main/resources/templates/index.html @@ -0,0 +1,677 @@ + + + + + + File Upload / Download + + + + + +
+ + + + + +
+ + \ No newline at end of file diff --git a/src/test/java/br/com/samaelSimoes/springboot/ApplicationTests.java b/src/test/java/br/com/samaelSimoes/springboot/ApplicationTests.java new file mode 100644 index 0000000000..a3367e053a --- /dev/null +++ b/src/test/java/br/com/samaelSimoes/springboot/ApplicationTests.java @@ -0,0 +1,13 @@ +package br.com.samaelSimoes.springboot; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/transaction-logs/tmlog.lck b/transaction-logs/tmlog.lck new file mode 100644 index 0000000000..e69de29bb2 diff --git a/transaction-logs/tmlog37.log b/transaction-logs/tmlog37.log new file mode 100644 index 0000000000..f0d871499b --- /dev/null +++ b/transaction-logs/tmlog37.log @@ -0,0 +1,43 @@ +{"id":"172.20.71.19.tm164121846106600003","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm3","state":"COMMITTING","expires":1641218471047,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062466300001","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm1","state":"COMMITTING","expires":1641220634732,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062466300001","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm1","state":"TERMINATED","expires":1641220634891,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062499300002","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm2","state":"COMMITTING","expires":1641220634906,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062499300002","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm2","state":"TERMINATED","expires":1641220634908,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062500900003","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm3","state":"COMMITTING","expires":1641220634922,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062500900003","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm3","state":"TERMINATED","expires":1641220634924,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062502500004","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm4","state":"COMMITTING","expires":1641220634941,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062502500004","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm4","state":"TERMINATED","expires":1641220634943,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062504400005","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm5","state":"COMMITTING","expires":1641220634960,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062504400005","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm5","state":"TERMINATED","expires":1641220634962,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062506300006","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm6","state":"COMMITTING","expires":1641220634983,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062506300006","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm6","state":"TERMINATED","expires":1641220634986,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062508700007","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm7","state":"COMMITTING","expires":1641220634998,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062508700007","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm7","state":"TERMINATED","expires":1641220635004,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062510500008","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm8","state":"COMMITTING","expires":1641220635021,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062510500008","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm8","state":"TERMINATED","expires":1641220635024,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062512400009","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm9","state":"COMMITTING","expires":1641220635038,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062512400009","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm9","state":"TERMINATED","expires":1641220635040,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062514100010","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm10","state":"COMMITTING","expires":1641220635057,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062514100010","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm10","state":"TERMINATED","expires":1641220635059,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062516000011","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm11","state":"COMMITTING","expires":1641220635076,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062516000011","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm11","state":"TERMINATED","expires":1641220635078,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062517900012","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm12","state":"COMMITTING","expires":1641220635093,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062517900012","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm12","state":"TERMINATED","expires":1641220635096,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062519600013","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm13","state":"COMMITTING","expires":1641220635108,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062519600013","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm13","state":"TERMINATED","expires":1641220635109,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062521000014","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm14","state":"COMMITTING","expires":1641220635129,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062521000014","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm14","state":"TERMINATED","expires":1641220635130,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062523100015","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm15","state":"COMMITTING","expires":1641220635145,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062523100015","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm15","state":"TERMINATED","expires":1641220635147,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062524800016","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm16","state":"COMMITTING","expires":1641220635172,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062524800016","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm16","state":"TERMINATED","expires":1641220635174,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062527500017","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm17","state":"COMMITTING","expires":1641220635196,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062527500017","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm17","state":"TERMINATED","expires":1641220635197,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062529800018","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm18","state":"COMMITTING","expires":1641220635213,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062529800018","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm18","state":"TERMINATED","expires":1641220635215,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062531600019","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm19","state":"COMMITTING","expires":1641220635231,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062531600019","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm19","state":"TERMINATED","expires":1641220635232,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062533800020","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm20","state":"COMMITTING","expires":1641220635255,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062533800020","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm20","state":"TERMINATED","expires":1641220635258,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062535900021","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm21","state":"COMMITTING","expires":1641220635280,"resourceName":"dataSource"}]} +{"id":"172.20.71.19.tm164122062535900021","wasCommitted":true,"participants":[{"uri":"172.20.71.19.tm21","state":"TERMINATED","expires":1641220635282,"resourceName":"dataSource"}]}