Bases de Dades
2.3.2.3 CF-Java: Tot l'exemple
Anem a posar tot l'exemple del xat complet, això sí, amb algunes modificacions i millores:
- Tindrem la classe Missatge amb les propietat nom i contingut (expressament diferents dels noms utilitzats en l'exemple anterior per poder comprovar que aquestes modificacions funcionen i milloren l'exemple). Posarem també la data (com un long) per a poder ordenar els missatges cronològicament
- Llevem les coses que no s'utilitzen estrictament en aquest exemple
- No definirem la referència a la Base de Dades en cada utilització. Únicament una vegada al principi, després de la connexió.
- Posem un JComboBox per a poder triar entre més d'un xat. Per a no modificar les coses ja fetes, posarem la creació dels listeners en un mètode anomenat inicialitzar(), ja que ara els listeners dependran del xat triat. I haurem d'anar amb compte també de parar els listeners, ja creats. És a dir, si primer triem un xat, tindrem els listeners que apunten a ell. Si després triem un altre xat i creem els listeners una altra vegada per a que apunten al lloc correcte, els tindrem per duplicat. Hauríem de parar els primers listeners
Aquest és la classe Missatge
public class Missatge{
public String nom;
public long data;
public String contingut;
public Missatge(){
}
public Missatge(String nom,String cont){
this.nom=nom;
this.contingut=cont;
}
public Missatge(String nom, long data, String contingut) {
super();
this.nom = nom;
this.data = data;
this.contingut = contingut;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public long getData() {
return data;
}
public void setData(long data) {
this.data = data;
}
public String getContingut() {
return contingut;
}
public void setContingut(String contingut) {
this.contingut = contingut;
}
}
Aquest és el programa
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import com.google.api.core.ApiFuture;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.firestore.DocumentChange;
import com.google.cloud.firestore.DocumentReference;
import com.google.cloud.firestore.DocumentSnapshot;
import com.google.cloud.firestore.EventListener;
import com.google.cloud.firestore.Firestore;
import com.google.cloud.firestore.FirestoreException;
import com.google.cloud.firestore.ListenerRegistration;
import com.google.cloud.firestore.QueryDocumentSnapshot;
import com.google.cloud.firestore.QuerySnapshot;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.cloud.FirestoreClient;
import com.google.firebase.database.annotations.Nullable;
public class Pantalla_CrearXatCloud extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
JLabel etComboXats = new JLabel("Llista de tots els xats disponibles:");
JComboBox comboXats = new JComboBox();
JLabel etUsuari = new JLabel("Nom Usuari:");
JTextField usuari = new JTextField(25);
JLabel etUltimMissatge = new JLabel("Últim missatge: ");
JLabel ultimMissatge = new JLabel();
JLabel etiqueta = new JLabel("Missatges:");
JTextArea area = new JTextArea();
JLabel etIntroduccioMissatge = new JLabel("Introdueix missatge:");
JButton enviar = new JButton("Enviar");
JTextField missatge = new JTextField(15);
Firestore database = null;
DocumentReference docRef = null;
ListenerRegistration listenerUltimMissatge = null;
ListenerRegistration listenerMissatges = null;
// en iniciar posem un contenidor per als elements anteriors
public void iniciar() throws IOException, InterruptedException, ExecutionException {
JFrame pantPrincipal = this;
this.setBounds(100, 100, 450, 400);
this.setLayout(new BorderLayout());
// contenidor per als elements
// Hi haurà títol. Panell de dalt: últim missatge. Panell de baix per a introduir missatge. Panell central: tot el xat
JPanel panell10 = new JPanel(new FlowLayout());
panell10.add(etComboXats);
panell10.add(comboXats);
JPanel panell11 = new JPanel(new FlowLayout());
panell11.add(etUsuari);
panell11.add(usuari);
JPanel panell12 = new JPanel(new FlowLayout());
panell12.add(etUltimMissatge);
panell12.add(ultimMissatge);
JPanel panell1 = new JPanel(new GridLayout(3, 1));
panell1.add(panell10);
panell1.add(panell11);
panell1.add(panell12);
getContentPane().add(panell1, BorderLayout.NORTH);
JPanel panell2 = new JPanel(new BorderLayout());
panell2.add(etiqueta, BorderLayout.NORTH);
area.setForeground(Color.blue);
JScrollPane scroll = new JScrollPane(area);
panell2.add(scroll, BorderLayout.CENTER);
getContentPane().add(panell2, BorderLayout.CENTER);
JPanel panell3 = new JPanel(new FlowLayout());
panell3.add(etIntroduccioMissatge);
panell3.add(missatge);
panell3.add(enviar);
getContentPane().add(panell3, BorderLayout.SOUTH);
setVisible(true);
comboXats.addActionListener(this);
enviar.addActionListener(this);
FileInputStream serviceAccount = new FileInputStream(
"acces-a-dades-6e5a6-firebase-adminsdk-ei7uc-8f5d926921.json");
GoogleCredentials credentials = GoogleCredentials.fromStream(serviceAccount);
FirebaseOptions options = new FirebaseOptions.Builder().setCredentials(credentials).build();
FirebaseApp.initializeApp(options);
database = FirestoreClient.getFirestore();
// Exemple de llegir tots els documents d'una col·lecció
// Per a triar el xat
List<QueryDocumentSnapshot> documents = database.collection("Xats").get().get().getDocuments();
for (QueryDocumentSnapshot document : documents) {
comboXats.addItem(document.getId());
}
comboXats.setSelectedIndex(0);
}
private void inicialitzar() throws InterruptedException, ExecutionException {
// TODO Auto-generated method stub
docRef = database.collection("Xats").document(comboXats.getSelectedItem().toString());
area.setText("");
// Exemple de lectura única: senzillament sobre un ApiFuture i sobre ell get()
// Per a posar el títol. Sobre /Xats/XatProva/nomXat
ApiFuture<DocumentSnapshot> future = docRef.get();
String nomXat = future.get().getString("nomXat");
this.setTitle(nomXat);
// Exemple de listener de lectura contínua addSnapshotListener() sobre un document
// Per a posar l'últim missatge registrat. Sobre /Xats/XatProva/ultimUsuari i /Xats/XatProva/ultimMissatge
// Si estava en marxa, el parem abans de tornar-lo a llançar
if (listenerUltimMissatge != null)
listenerUltimMissatge.remove();
listenerUltimMissatge = docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirestoreException e) {
ultimMissatge.setText(snapshot.getString("ultimMissatge"));
}
});
// Exemple de listener de lectura contínua addSnapshotListener() sobre una col·lecció
// Per a posar tota la llista de missatges. Sobre /Xats/XatProva/missatges
// Si estava en marxa, el parem abans de tornar-lo a llançar
if (listenerMissatges != null)
listenerMissatges.remove();
listenerMissatges = database.collection("Xats").document(comboXats.getSelectedItem().toString()).collection("missatges")
.orderBy("data").addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirestoreException e) {
for (DocumentChange dc : snapshots.getDocumentChanges()) {
switch (dc.getType()) {
case ADDED:
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm");
String dataFormatejada = sdf.format(new Date(dc.getDocument().getLong("data")));
area.append(dc.getDocument().getString("nom") + " (" + dataFormatejada + "): "
+ dc.getDocument().getString("contingut") + "\n");
break;
}
}
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == enviar) {
// Exemple de guardar dades en Cloud Firestore
// Per a guardar dades. Sobre /Xats/XatProva
Map<String, Object> dades = new HashMap<>();
dades.put("ultimUsuari", usuari.getText());
dades.put("ultimMissatge", missatge.getText());
docRef.update(dades);
Missatge m = new Missatge(usuari.getText(), (new Date()).getTime(), missatge.getText());
database.collection("Xats").document(comboXats.getSelectedItem().toString()).collection("missatges").add(m);
}
if (e.getSource() == comboXats) {
//database = FirestoreClient.getFirestore();
try {
inicialitzar();
} catch (InterruptedException | ExecutionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
I aquest és el programa principal
import java.io.IOException;
import java.util.concurrent.ExecutionException;
public class CrearXatCloud {
public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
final Pantalla_CrearXatCloud_def finestra = new Pantalla_CrearXatCloud_def();
finestra.iniciar();
}
}
I aquest és un exemple d'utilització. Es pot veure el JComboBox per a triar els diferents xats
