cs_harleen
Messages postés22Date d'inscriptionlundi 10 novembre 2008StatutMembreDernière intervention20 juillet 2009
-
7 juil. 2009 à 16:12
cs_harleen
Messages postés22Date d'inscriptionlundi 10 novembre 2008StatutMembreDernière intervention20 juillet 2009
-
8 juil. 2009 à 16:42
Bonjour à tous,
Je travaille actuellement sur une application de conversion d'un
standard XML à un autre, je vais les nommer std 1 et std 2 par facilité.
Pour cela, j'ai deux boutons de traduction : de std1 à std2 et de std2 à std1.
Les transformations sont gérées par deux fichiers .xsl qui fonctionnent.
Cependant, je rencontre un problème au niveau de l'enregistrement du
fichier de sortie généré à la suite du clic sur le bouton de traduction.
En effet, j'ai un JFileChooser en entrée avec lequel je sélectionne un
fichier en entrée (qui a plus la fonction "ouvrir un fichier") et un
deuxième JFileChooser en sortie qui permettra soit d'écraser un fichier
.xml existant, soit de se placer où l'on souhaite et d'enregistrer avec
le fichier traduit en .xml.
Le JFileChooser d'ouverture de fichier est OK.
Cependant, j'ai fait de nombreux tests pour le deuxième JFileChooser
afin d'enregistrer le fichier de sortie où je souhaite, mais je n'y
arrive pas : cela bloque au niveau de transformer, en effet, pour ce
qui est du fichier.xsl de transformation, de la source ou de la sortie,
on ne peut passer qu'un seul nom de fichier.
Or, lorsqu'on ne passe qu'un seul nom de fichier, le fichier de sortie
apparait dans une sorte de répertoire par défaut lié, je pense, au
paramétrage des fichiers properties d'eclipse.
comment passer un chemin absolu afin d'enregistrer mon fichier de sortie où je souhaite?
J'ai tenté d'utiliser la méthode renameTo afin de déplacer la sortie
vers l'absolutePath du JFileChooser de sortie, sans succès...
cs_harleen
Messages postés22Date d'inscriptionlundi 10 novembre 2008StatutMembreDernière intervention20 juillet 2009 8 juil. 2009 à 16:42
Salut Darksidious,
Je suis d'accord avec toi, j'ai compris que vous vouliez mon code afin de pouvoir tester directement, autant pour moi...
J'ai finalement pu résoudre mon problème moi-même :
Pour ceux que ça intéresserait, j'ai modifié les constructeurs de StreamSource et StreamResult en leur passant un File en paramètre et non un String comme auparavant, de même, j'ai retiré l'instruction :
System.setProperty("javax.xml.transform.TransformerFactory",
"net.sf.saxon.TransformerFactoryImpl");
@SuppressWarnings("serial")
public class FenetreSaisie extends JFrame{
//labels
private JLabel label_presentation_fenetre;
private JLabel label_entree;
private JLabel label_sortie;
//zones de texte
private JTextField txtlocalPath = new JTextField(32);
private JTextField txtSortie = new JTextField(32);
//fichiers d'entrée et de sortie
File inputFile;
File outputFile;
//boutons
private JButton btnparcourirentree = new JButton("Parcourir...");
private JButton btnparcourirsortie = new JButton("Parcourir...");
private JButton btntradsimple = new JButton("ebXML -> XML");
private JButton btntradcomplique = new JButton("XML -> ebXML");
//private JButton btnZero = new JButton ("Remise à zero");
//creation du panel
JPanel panel = new JPanel();
//enumération
private XmlType xmlType;
//liste des erreurs
private List<Error> listErrors = new ArrayList<Error>();
//JLabel pour afficher message d'erreur
JTextArea message_erreur = new JTextArea(5,40);
//Constructeur de la fenêtre
public FenetreSaisie(){
super();
txtlocalPath.setEditable(false);
inputFile = null;
outputFile = null;
xmlType = null;
setTitle("Utilitaire de conversion");//On donne un titre à l'application
//initialisation Fenetre
private void build(){
setSize(500,350); //On donne une taille à notre fenêtre
setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
setResizable(false); //On permet le redimensionnement
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit à l'application de se fermer lors du clic sur la croix
setContentPane(buildContentPane());
message_erreur.setText("Veuillez sélectionner un fichier en entrée");
message_erreur.setForeground(Color.BLUE);
btnparcourirsortie.setEnabled(false);
}
private JPanel buildContentPane(){
//affectation du Layout GridBagLayout au panel
panel.setLayout(new GridBagLayout());
//création des composants
label_presentation_fenetre = new JLabel("Informations");
//creation du bouton Parcourir afin de chercher la source
btnparcourirentree.addActionListener(new BoutonParcourirEntreeListener());
btnparcourirentree.setFocusable(false);
btnparcourirsortie.addActionListener(new BoutonParcourirSortieListener());
btnparcourirsortie.setFocusable(false);
//creation de labels pour informer l'utilisateur
label_entree = new JLabel("Fichier à traduire");
label_sortie = new JLabel("Saisir le nom du fichier XML de sortie");
//creation du bouton Traduire ebXML vers XML
btntradsimple.addActionListener(new BoutonTradSimpleListener());
btntradsimple.setToolTipText("Traduit du ebXML vers le XML simplifié");
//creation du bouton traduire XML vers ebXML
btntradcomplique.addActionListener(new BoutonTradCompliqueListener());
btntradcomplique.setToolTipText("Traduit du XML simplifié vers le ebXML");
//creation du bouton de remise à zero
//btnZero.addActionListener(new BoutonZeroListener());
//Ajout des composants en spécifiant les contraintes
GridBagConstraints gbc = new GridBagConstraints();
//DocumentListener rajouté pour les zones de texte entrée et sortie
txtlocalPath.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
VerifAll();
}
@Override
public void insertUpdate(DocumentEvent e) {
VerifAll();
}
@Override
public void removeUpdate(DocumentEvent e) {
VerifAll();
}
});
txtSortie.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
VerifAll();
}
@Override
public void insertUpdate(DocumentEvent e) {
VerifAll();
}
@Override
public void removeUpdate(DocumentEvent e) {
VerifAll();
}
});
//fin des DocumentListener
//classe interne permettant d'écouter le bouton Parcourir pour la sélection d'un fichier en entrée
//on utilise un JFileChooser
class BoutonParcourirEntreeListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent event)
{
message_erreur.setText("");
txtSortie.setText("");
//rajout d'un filtre afin de ne garder que les documents .xml
ExampleFileFilter filter = new ExampleFileFilter();
filter.addExtension("xml");
filter.setDescription("fichiers .xml");
chooser.setFileFilter(filter);
//on ne garde que les fichiers
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int choix = chooser.showOpenDialog(null);
//cas où on sélectionne un fichier à l'aide du bouton Parcourir
if (choix == JFileChooser.APPROVE_OPTION) {
inputFile = chooser.getSelectedFile();
if(inputFile.exists()){
txtlocalPath.setText(inputFile.getPath());
txtSortie.requestFocus();
}
else{
message_erreur.setText("Le fichier "+inputFile.getName()+ " n'existe pas" );
txtlocalPath.setText("");
}
}
//pas besoin de rajouter où l'utilisateur annule l'opération : JFileChooser.CANCEL_OPTION
}
}//fin classe BoutonParcourirListener
//classe interne permettant d'écouter le bouton Parcourir pour la sélection d'un fichier ou d'un répertoire en sortie
//on utilise un JFileChooser
//si on sélectionne un répertoire, alors va créer le fichier à cet endroit,
//si on sélectionne un fichier, alors va deamnder à écraser le fichier ou non.
class BoutonParcourirSortieListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent event)
{
message_erreur.setText("");
txtSortie.setText("");
//rajout d'un filtre afin de ne garder que les documents .xml
ExampleFileFilter filter = new ExampleFileFilter();
filter.addExtension("xml");
filter.setDescription("fichiers .xml");
chooser.setFileFilter(filter);
//soit on prend les fichiers, soit on prend les répertoires
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int choix = chooser.showOpenDialog(null);
//cas où on sélectionne un fichier à l'aide du bouton Parcourir
if (choix == JFileChooser.APPROVE_OPTION) {
outputFile = chooser.getSelectedFile();//le fichier de sortie
JOptionPane jop = new JOptionPane();
int option = jop.showConfirmDialog(null, "Le fichier existe déjà, souhaitez-vous l'écraser ?", "Fichier existant", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if(option == JOptionPane.NO_OPTION || option==JOptionPane.CANCEL_OPTION)
{
btntradsimple.setEnabled(false);
btntradcomplique.setEnabled(false);
}
else{//si l'utilisateur clique sur Yes, alors le fichier qui est existant sera écrasé
if(xmlType == XmlType.COMPLEX){
txtSortie.setText(outputFile.getName());
btntradsimple.setEnabled(true);
message_erreur.setText("le fichier "+outputFile.getName()+" sera écrasé");
}
else if (xmlType == XmlType.SIMPLE){
txtSortie.setText(outputFile.getName());
btntradcomplique.setEnabled(true);
message_erreur.setText("le fichier "+outputFile.getName()+" sera écrasé");
}
}//fin du else
}
else{ //si le fichier sélectionné n'est pas un .xml
message_erreur.setText("Veuillez sélectionner un fichier .xml");
message_erreur.setForeground(Color.RED);
}
}
else{ //si le fichier n'existe pas
if(xmlType == XmlType.COMPLEX){
txtSortie.setText(outputFile.getName());
btntradsimple.setEnabled(true);
}
else if (xmlType == XmlType.SIMPLE){
txtSortie.setText(outputFile.getName());
btntradcomplique.setEnabled(true);
}
}
}
}//fin du if (choix == JFileChooser.APPROVE_OPTION)
}//fin classe BoutonParcourirSortieListener
//classe BoutonTradSimpleListener permettant d'écouter le bouton btntradsimple : pour passer du ebXML vers le XML simple
class BoutonTradSimpleListener implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
//récupérer le contenu de la textBox et traduire
System.setProperty("javax.xml.transform.TransformerFactory",
"net.sf.saxon.TransformerFactoryImpl");
//on crée une fabrique de transformeurs
TransformerFactory factory = TransformerFactory.newInstance();
//fichier xsl de transformation
File fxsl = new File("transfo.xsl");
//fichier traduit et déplacé à l'endroit spécifié par le path
String newpath = outputFile.getAbsolutePath();
File nouveaufic = new File(newpath);
//fichier xml source de type source
Source xmlSource = new StreamSource(decoupeURL(txtlocalPath.getText()));
//nom du fichier de sortie de type Result
Result sortie = new StreamResult(nouveaufic.getName());
//transformer
Transformer transformer;
try {
//on récupère un transformeur à partir d'une fabrique de transformeurs
transformer = factory.newTransformer(new StreamSource(fxsl));
/*Utilisation d'un parser DOM ou SAX sans DTD ou xml schema pour la validation,
* s'il ya une erreur de parsing alors le fichier XML n'est pas bien formé càd NON XML.
*/
DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
DocumentBuilder constructeur = fabrique.newDocumentBuilder();
// lecture du contenu d'un fichier XML avec DOM
File xml = new File(decoupeURL(txtlocalPath.getText()));
Document document = constructeur.parse(xml);
//transformation en prenant en paramètre le fichier xml source et fait le fichier xml de sortie
transformer.transform(xmlSource, sortie );
File old = new File(sortie.toString());
File oldfile = new File(old.getAbsolutePath());
File newfile = new File(outputFile.getAbsolutePath());
System.out.println("Old File or directory name : "+ oldfile);
System.out.println("New File or directory name : "+ newfile);
boolean Rename = oldfile.renameTo(newfile);
if(!Rename)
{
System.out.println("File or directory does not rename successfully.");
System.exit(0);
}
else {
System.out.println("File or directory rename is successfully.");
}
/*
* BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Please enter the file or directory name which has to be Renamed : ");
String old_name = in.readLine();
File oldfile = new File(old_name);
if(!oldfile.exists())
{
System.out.println("File or directory does not exist.");
System.exit(0);
}
System.out.print("please enter the new file or directory name : ");
String new_name = in.readLine();
File newfile = new File(new_name);
boolean Rename = oldfile.renameTo(newfile);
if(!Rename)
{
System.out.println("File or directory does not rename successfully.");
System.exit(0);
}
else {
System.out.println("File or directory rename is successfully.");
}
*
*/
/*File interm = new File(sortie.toString());
boolean Rename = interm.renameTo(nouveaufic);
if(!Rename)
{
System.out.println("File or directory does not rename successfully.");
System.exit(0);
}
else {
System.out.println("File or directory rename is successfully.");
}
*/
//message informant que la traduction a bien été faite
message_erreur.setText("Traduction simple effectuée");
message_erreur.setForeground(Color.green);
}
catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch(SAXException se){
//C'est un fichier Non Xml
}catch(IOException ioe){
// TODO Auto-generated catch block
}
}
}//fin de la classe BoutonTradSimpleListener
//classe BoutonTradCompliqueListener permettant d'écouter le bouton btntradcomplique : pour passer du XML simple au ebXML
class BoutonTradCompliqueListener implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
//récupérer le contenu de la textBox et traduire
System.setProperty("javax.xml.transform.TransformerFactory",
"net.sf.saxon.TransformerFactoryImpl");
//on crée une fabrique de transformeurs
TransformerFactory factory = TransformerFactory.newInstance();
//fichier xsl de transformation
File fxsl = new File("transfo_eb.xsl");
//fichier xml source de type source
Source xmlSource = new StreamSource(decoupeURL(txtlocalPath.getText()));
//fichier xml de sortie de type Result
Result sortie = new StreamResult(decoupeURL(txtSortie.getText()));
//transformer
Transformer transformer;
try {
//on récupère un transformeur à partir d'une fabrique de transformeurs
transformer = factory.newTransformer(new StreamSource(fxsl));
/*Utilisation d'un parser DOM ou SAX sans DTD ou xml schema pour la validation,
* s'il ya une erreur de parsing alors le fichier XML n'est pas bien formé càd NON XML.
*/
DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
DocumentBuilder constructeur = fabrique.newDocumentBuilder();
// lecture du contenu d'un fichier XML avec DOM
File xml = new File(decoupeURL(txtlocalPath.getText()));
Document document = constructeur.parse(xml);
//transformation en prenant en paramètre le fichier xml source et fait le fichier xml de sortie
transformer.transform(xmlSource, sortie );
//le fichier de sortie est copié dans le rep par défaut
/*méthode permettant de découper l'adresse absolue qui est écrite dans le textarea du chemin : txtlocalPath
* 1) permet de récupérer l'URL du fichier xml à traduire
* 2) ne prend que le fichier .xml de cette URL
*/
public String decoupeURL(String s){
File file = new File(s);
s = file.getName();
return s;
}
/*méthode permettant d'extraire l'extension d'un fichier
* On se servira de cette méthode pour s'assurer notamment que :
* les fichiers qui sont passés en entrée et les noms de fichiers de sortie sont bien des .xml
*/
public static String getFileExtension(String NomFichier) {
File tmpFichier = new File(NomFichier);
tmpFichier.getName();
int posPoint = tmpFichier.getName().lastIndexOf('.');
if (0 < posPoint && posPoint <= tmpFichier.getName().length() - 2 ) {
return tmpFichier.getName().substring(posPoint + 1);
}
return "";
}
if (inputFile == null || !inputFile.exists()) {
inputFile = null;
listErrors.add(Error.UNKNOW_INPUT_FILE);
}
//dans le cas où le fichier n'est pas d'extension .xml et que le contenu de la zone de txt d'entrée n'est pas renseigné
else if((getFileExtension(txtlocalPath.getText())).compareTo("xml")!=0 && txtlocalPath.getText()!=null){
message_erreur.setText("Veuillez saisir un document XML");
message_erreur.setForeground(Color.RED);
txtSortie.setEditable(false);
btnparcourirsortie.setEnabled(false);
}
/*cas où le fichier est bien d'extension .xml : on parse le fichier .xml et on analyse les racines pour voir
* s'il s'agit d'un ebXML ou d'un XML simple*/
else{
try {
//test dans le cas où il s'agit bien d'un fichier .xml, mais vide
/*on se place sur la racine, on vérifie alors :
* - soit que le fichier d'entrée est un document ebXML
* -soit que le fichier d'entrée est un document XML simple
* - soit ni l'un ni l'autre, alors erreur...*/
if (nomRacine.equals("Dematerialisation_prix")) {
xmlType = XmlType.SIMPLE;
txtSortie.setEditable(true);
btnparcourirsortie.setEnabled(true);
message_erreur.setText("Saisir le nom du document de sortie d'extension.xml.\nSi vous souhaitez changer d'emplacement pour le fichier de sortie : \n cliquez sur parcourir");
message_erreur.setForeground(Color.BLUE);
message_erreur.setLineWrap(true);
} else if (nomRacine.equals("itt:InvitationToTenderDetails")) {
xmlType = XmlType.COMPLEX;
txtSortie.setEditable(true);
btnparcourirsortie.setEnabled(true);
message_erreur.setText("Saisir le nom du document de sortie d'extension.xml.\nSi vous souhaitez changer d'emplacement pour le fichier de sortie : \n cliquez sur parcourir");
message_erreur.setForeground(Color.BLUE);
message_erreur.setLineWrap(true);
}
}catch (ParserConfigurationException e1) {
xmlType = null;
listErrors.add(Error.PARSE_ERROR);
} catch (SAXException e1) {
xmlType = null;
listErrors.add(Error.SAX_ERROR);
} catch (IOException e1) {
xmlType = null;
listErrors.add(Error.IO_ERROR);
message_erreur.setText("Le fichier XML n'est ni un ebXML, ni un XML simple, veuillez recommencer la saisie");
message_erreur.setForeground(Color.RED);
message_erreur.setLineWrap(true);
//vérification du document de sortie
/*public void VerificationSortie() {
boolean afficher = (txtSortie.getText().length() > 4 && ".xml".equalsIgnoreCase(txtSortie.getText().substring(txtSortie.getText().length()-4)));
//tonBouton.setVisible(afficher);
outputFile = new File(txtSortie.getText());
if (outputFile.exists()) {
// Si ce fichier existe déjà, on s'arrête pour ne pas le modifier.
// 'System.err' est le flux d'erreur standard, qui s'affiche normalement
// dans le terminal qui a servi à lancer l'exécution du programme.
JOptionPane jop = new JOptionPane();
int option = jop.showConfirmDialog(null, "Le fichier existe déjà, souhaitez-vous l'écraser ?", "Fichier existant", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
//if(option != JOptionPane.NO_OPTION && option != JOptionPane.CANCEL_OPTION && option != JOptionPane.CLOSED_OPTION)
if(option == JOptionPane.NO_OPTION || option==JOptionPane.CANCEL_OPTION)
{
btntradsimple.setEnabled(false);
btntradcomplique.setEnabled(false);
}
else{//si l'utilisateur clique sur Yes, alors le fichier qui est existant sera écrasé
if(xmlType == XmlType.COMPLEX){
btntradsimple.setEnabled(afficher);
message_erreur.setText("le fichier "+outputFile.getName()+" sera écrasé");
}
else if (xmlType == XmlType.SIMPLE){
btntradcomplique.setEnabled(afficher);
message_erreur.setText("le fichier "+outputFile.getName()+" sera écrasé");
}
}//fin du else
}//fin du if(outputFile.exists())
else{ //si le fichier n'existe pas, on peut le créer
if(xmlType == XmlType.COMPLEX){
btntradsimple.setEnabled(afficher);
}
else if (xmlType == XmlType.SIMPLE){
//enum pour les erreurs
private enum Error {
UNKNOW_INPUT_FILE,
UNDEFINED_OUTPUT_FILE,
IO_ERROR,
SAX_ERROR,
PARSE_ERROR;
}
//enum pour les deux types de dic XML
private enum XmlType {
SIMPLE,
COMPLEX;
}
public static void main(String[] args) {
//On crée une nouvelle instance de notre FenetreTexte
FenetreSaisie fenetre = new FenetreSaisie();
fenetre.setVisible(true);//On la rend visible
}
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 8 juil. 2009 à 10:19
C'est cool, on a ton code, mais facilite nous au moins le boulot en précisant les bout de code correspondant à ton problème : on va pas se relire un milier de ligne de code pour tenter de savoir d'où peux venir le problème, c'est à toi de faciliter la tâche en mettant en valeur là où ca coince !