# Exemplo JAVA

**Pré requisitos:**

* Java instalado.
* Maven instalado.

Com tudo preparado, adicione ao seu projeto as dependências Maven que iremos usar, da seguinte forma:

```xml
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.68</version>
</dependency>

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcpkix-jdk15on</artifactId>
    <version>1.68</version>
</dependency>
```

Após incluir as dependências do BouncyCastle ao seu projeto, crie um arquivo JAVA e adicione o seguinte código de exemplo:

```javascript

import org.bouncycastle.asn1.*;
import org.bouncycastle.tsp.*;
import org.bouncycastle.util.encoders.Base64;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

public class ACTIntegrationSample {

    public static void main(String[] args) {
        
        // URL do servidor de carimbo de tempo (SCT)
        String timestampServerURL = "https://gateway-act.hom.vaultid.com.br/api/act";

        // Dados que serão carimbados
        byte[] dataToTimestamp = "Dados a serem carimbados".getBytes();
        
        // Credenciais de autenticação enviados pela equipe de integração
        String username = "usuario";
        String password = "senha";
        String basicAuth = "Basic " + Base64.toBase64String((username + ":" + password).getBytes());

        try {
            
            // Criando a solicitação TSQ (Timestamp Query)
            TimeStampRequestGenerator tsqGenerator = new TimeStampRequestGenerator();
            TimeStampRequest tsq = tsqGenerator.generate(TSPAlgorithms.SHA256, dataToTimestamp);

            // Convertendo a solicitação TSQ para bytes
            byte[] tsqBytes = tsq.getEncoded();

            // Enviando a solicitação TSQ para o servidor
            HttpURLConnection connection = (HttpURLConnection) new URL(timestampServerURL).openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/timestamp-query");
            connection.setRequestProperty("Authorization", basicAuth); // Adicionando a autenticação Basic
            connection.setDoOutput(true);
            connection.getOutputStream().write(tsqBytes);

            // Lendo a resposta do servidor
            TimeStampResponse tsr = new TimeStampResponse(connection.getInputStream());

            // Exibindo a resposta TSR (Timestamp Response) recebida
            System.out.println("Timestamp Response:");
            System.out.println(new String(Base64.encode(tsr.getEncoded())));

            // Verificando a resposta
            tsr.validate(tsq);

            // Extraindo a tempo exato do carimbo de tempo
            TimeStampToken timeStampToken = tsr.getTimeStampToken();
            System.out.println("Timestamp: " + timeStampToken.getTimeStampInfo().getGenTime());

            // Fechando a conexão
            connection.disconnect();
            
        } catch (IOException | TSPException e) {
            e.printStackTrace();
        }
    }
}
```

Compile o projeto com as dependencias, e execute o código de exemplo, será exibido a resposta da ACT que é o carimbo de tempo em si (TSR), codificado em Base64, logo abaixo será mostrado o tempo exato do carimbo.

É feito uma validação simples do carimbo de tempo (TSR) no exemplo acima, mas é importante fazer todas as validações necessárias após receber o carimbo, conforme o **DOC-ICP-12**, sessão 4.3.

**Referencia:**

<https://www.gov.br/iti/pt-br/assuntos/legislacao/resolucoes/resolucoes-old/DOCICP12v2.1CompiladaRes_188.pdf>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.vaultid.com.br/act/integracao/exemplo-java.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
