From: <bma...@us...> - 2011-12-02 10:31:16
|
Revision: 6764 http://fudaa.svn.sourceforge.net/fudaa/?rev=6764&view=rev Author: bmarchan Date: 2011-12-02 10:31:06 +0000 (Fri, 02 Dec 2011) Log Message: ----------- Fix : Divers correctifs Modified Paths: -------------- trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivManageOriginalFilesPanel.java trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivTransfView.java trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/action/PivSelectImagesAction.java trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/io/PivExeLauncher.java trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/metier/PivProject.java Modified: trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivManageOriginalFilesPanel.java =================================================================== --- trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivManageOriginalFilesPanel.java 2011-12-02 08:36:54 UTC (rev 6763) +++ trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivManageOriginalFilesPanel.java 2011-12-02 10:31:06 UTC (rev 6764) @@ -43,7 +43,7 @@ ui_=_ui; setLayout(new BuVerticalLayout(5, true, true)); - setHelpText(PivResource.getS("Les images seront utilis\xE9es pour le calcul dans l'ordre ou elles sont d\xE9finies.\nUtilisez Monter/Descendre pour modifier cet ordre.")); + setHelpText(PivResource.getS("Les images pgm seront utilis\xE9es pour le calcul dans l'ordre ou elles sont d\xE9finies.\nUtilisez Monter/Descendre pour modifier cet ordre.")); // Label images add(new JLabel(PivResource.getS("Liste des images"),JLabel.LEFT)); Modified: trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivTransfView.java =================================================================== --- trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivTransfView.java 2011-12-02 08:36:54 UTC (rev 6763) +++ trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/PivTransfView.java 2011-12-02 10:31:06 UTC (rev 6764) @@ -246,6 +246,7 @@ @Override public void projectStateChanged(PivProject _prj, String _prop) { if ("transfImages".equals(_prop)) { + majTools(); mdlTransfImage.update(); mdlIASA.update(); } Modified: trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/action/PivSelectImagesAction.java =================================================================== --- trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/action/PivSelectImagesAction.java 2011-12-02 08:36:54 UTC (rev 6763) +++ trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/action/PivSelectImagesAction.java 2011-12-02 10:31:06 UTC (rev 6764) @@ -9,11 +9,7 @@ import java.awt.event.ActionEvent; import java.io.File; -import java.util.ArrayList; -import java.util.List; -import javax.swing.filechooser.FileFilter; - import org.fudaa.ctulu.CtuluAnalyze; import org.fudaa.ctulu.gui.CtuluDialog; import org.fudaa.ctulu.gui.CtuluTaskOperationGUI; @@ -26,7 +22,6 @@ import org.fudaa.fudaa.piv.PivResource; import org.fudaa.fudaa.piv.PivVisuPanel; import org.fudaa.fudaa.piv.io.PivExeLauncher; -import org.fudaa.fudaa.piv.metier.PivProject; /** * Une action pour selectionner et reconditionner les images sources. @@ -36,7 +31,6 @@ */ public class PivSelectImagesAction extends EbliActionSimple { PivImplementation impl; -// MdlSceneEditor sceneEditor_; PivManageOriginalFilesPanel pnMngImages; CtuluDialog diProgress_; @@ -48,8 +42,6 @@ super(PivResource.getS("S\xE9lection des images sources..."), null, "SELECT_IMAGES"); impl=_impl; -// setSceneEditor(_sceneEditor); -// sceneEditor_.getScene().addSelectionListener(this); setEnabled(false); } @@ -86,46 +78,29 @@ } final File[] srcImgFiles=pnMngImages.getFiles(); -// List<File> img2Repack=new ArrayList<File>(); -// for (File f : srcImgFiles) { -// if (!f.getPath().startsWith(impl.getCurrentProject().getRoot().getPath()) && PivProject.FLT_PGM_FILES.accept(f)) { -// img2Repack.add(f); -// } -// } - impl.getCurrentProject().setSrcImagesFiles(srcImgFiles); // Le reconditionnement des images. - CtuluTaskOperationGUI r=new CtuluTaskOperationGUI(impl, PivResource.getS("Reconditionnement des images")) { + CtuluTaskOperationGUI r=new CtuluTaskOperationGUI(impl, PivResource.getS("Traitement des images sources")) { @Override public void act() { try { CtuluAnalyze ana=new CtuluAnalyze(); ana.setDesc(getName()); - PivExeLauncher.instance().launchRepackingImg(ana, impl.getCurrentProject(), this, srcImgFiles); + impl.getCurrentProject().setSrcImagesFiles(srcImgFiles, this); if (ana.containsErrorOrFatalError()) { impl.error(ana.getResume()); return; } - // Suppression des images transform\xE9es pour ne pas avoir d'effets de bord - File prjTransfImgDir=new File(impl.getCurrentProject().getRoot(), PivProject.IMG_TRANSF_DIR); - if (prjTransfImgDir.exists()) { - File[] prjTransfImgFiles=prjTransfImgDir.listFiles(); - for (int i=0; i<prjTransfImgFiles.length; i++) { - prjTransfImgFiles[i].delete(); - } - -// impl.getCurrentProject().setTransfImagesChanged(); - } } finally { diProgress_.dispose(); } impl.get2dFrame().getVisuPanel().setViewMode(PivVisuPanel.MODE_ORIGINAL_VIEW); - impl.message(PivResource.getS("{0} images ont \xE9t\xE9 reconditionn\xE9es avec succ\xE8s",impl.getCurrentProject().getSrcImageFiles().length)); +// impl.message(PivResource.getS("{0} images ont \xE9t\xE9 reconditionn\xE9es avec succ\xE8s",impl.getCurrentProject().getSrcImageFiles().length)); } }; @@ -135,27 +110,14 @@ diProgress_.setDefaultCloseOperation(CtuluDialog.DO_NOTHING_ON_CLOSE); diProgress_.setTitle(r.getName()); -// r.start(); -// diProgress_.afficheDialogModal(); + r.start(); + diProgress_.afficheDialogModal(); } /** * @return true Si toutes les donn\xE9es sont pr\xE9sentes pour un lancement. */ public boolean isValide() { -// if (impl.getCurrentProject().getOrthoPoints()==null) { -// impl.error(PivResource.getS("Erreur"), PivResource.getS("Aucun point de r\xE9f\xE9rence au sol n'a \xE9t\xE9 d\xE9fini")); -// return false; -// } -// if (impl.getCurrentProject().getOrthoParameters()==null) { -// impl.error(PivResource.getS("Erreur"), PivResource.getS("Les param\xE8tres d'orthorectification n'ont pas \xE9t\xE9 donn\xE9s")); -// return false; -// } -// if (!impl.getCurrentProject().hasInputImages()) { -// impl.error(PivResource.getS("Erreur"), PivResource.getS("Le projet ne contient aucune image \xE0 transformer")); -// return false; -// } - return true; } Modified: trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/io/PivExeLauncher.java =================================================================== --- trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/io/PivExeLauncher.java 2011-12-02 08:36:54 UTC (rev 6763) +++ trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/io/PivExeLauncher.java 2011-12-02 10:31:06 UTC (rev 6764) @@ -326,7 +326,7 @@ // On signale au projet que les images transform\xE9es ont chang\xE9. finally { delExeDirs(); - _prj.setTransfImagesChanged(); + _prj.setTransfImagesChanged(_task); if (_task!=null) _task.setProgression(100); } Modified: trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/metier/PivProject.java =================================================================== --- trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/metier/PivProject.java 2011-12-02 08:36:54 UTC (rev 6763) +++ trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/metier/PivProject.java 2011-12-02 10:31:06 UTC (rev 6764) @@ -27,6 +27,7 @@ import org.fudaa.ctulu.ProgressionInterface; import org.fudaa.ctulu.fileformat.FileReadOperationAbstract; import org.fudaa.ctulu.fileformat.FileWriteOperationAbstract; +import org.fudaa.ctulu.gui.CtuluTaskOperationGUI; import org.fudaa.fudaa.piv.PivResource; import org.fudaa.fudaa.piv.io.PivAverageVelFileFormat; import org.fudaa.fudaa.piv.io.PivBathyFileFormat; @@ -222,7 +223,7 @@ * @param _dir Le r\xE9pertoire contenant les fichiers \xE0 mettre en cache. * @return false : Si un probl\xE8me s'est produit lors de la production. */ - public boolean rebuiltCacheImagesIfNeeded(List<File> _files, final List<File> _readyFiles, final File _dir, ProgressionInterface _prog) { + public boolean rebuiltCacheImagesIfNeeded(List<File> _files, final List<File> _readyFiles, final File _dir, final ProgressionInterface _prog) { boolean b=true; File imgCacheDir=new File(_dir,"cache"); @@ -230,13 +231,19 @@ _readyFiles.clear(); - final String prop=_dir.equals(new File(rootPath,IMG_PGM_DIR)) ? "pgmImages":"transfImages"; + final boolean bsrc=_dir.equals(new File(rootPath,IMG_PGM_DIR)); final List<File> file2Cache=new ArrayList<File>(); final List<Integer> posFile2Cache=new ArrayList<Integer>(); final List<File> cacheFiles=new ArrayList<File>(); // Cr\xE9ation des images cache manquantes + if (_prog!=null) { + _prog.setDesc(bsrc ? PivResource.getS("Cr\xE9ation des caches images sources"): + PivResource.getS("Cr\xE9ation des caches images transform\xE9es")); + _prog.setProgression(0); + } + for (int i=0; i<_files.size(); i++) { File cache = getCacheImageFile(_files.get(i)); cacheFiles.add(cache); @@ -247,7 +254,6 @@ else { file2Cache.add(_files.get(i)); posFile2Cache.add(i); -// b &= createCacheFromImage(f); } } @@ -257,8 +263,11 @@ public void run() { for (int i=0; i<file2Cache.size(); i++) { createCacheFromImage(file2Cache.get(i)); + if (_prog!=null) + _prog.setProgression(i*100/file2Cache.size()); + _readyFiles.add(posFile2Cache.get(i), file2Cache.get(i)); - fireProjectStateChanged(prop); +// fireProjectStateChanged(bsrc ? "pgmImages":"transfImages"); } // Suppression des images cache inutiles @@ -266,31 +275,18 @@ if (!cacheFiles.contains(f)) f.delete(); } + + if (_prog!=null) + _prog.setProgression(100); } }; // new Thread(r).start(); r.run(); - fireProjectStateChanged(prop); + fireProjectStateChanged(bsrc ? "pgmImages":"transfImages"); return b; } -// /** -// * Retourne le chemin des images cache des images reconditionn\xE9es. -// * @return Les chemins des images. -// */ -// public File[] getPgmCacheImageFiles() { -// File imgInpDir=new File(rootPath,IMG_PGM_DIR); -// if (!imgInpDir.isDirectory()) return new File[0]; -// -// File[] files=imgInpDir.listFiles(new FileFilter() { -// public boolean accept(File _f) { -// return _f.isFile() && _f.getName().startsWith("__") && _f.getName().endsWith(".jpg"); -// } -// }); -// return files; -// } - /** * Retourne le chemin du fichier cache pour un fichier donn\xE9. Les fichiers * cache sont utilis\xE9s pour l'affichage. Si le type de l'image n'est pas @@ -305,46 +301,34 @@ String name="__"+CtuluLibFile.getSansExtension(_file.getName())+".jpg"; return new File(_file.getParentFile(), "cache"+File.separator+name); } - - /** - * Retourne le chemin de l'image cache transform\xE9e. - * @return Le chemin de l'image cache transform\xE9e. - */ -// public File getPgmCacheImageFile() { -// return getCacheImageFile(getSrcImageFiles()[0]); -//// File[] files=getPgmCacheImageFiles(); -//// return files[0]; -//// return new File(new File(rootPath,IMG_PGM_DIR),"cache.jpg"); -// } /** - * Retourne le chemin de l'image cache transform\xE9e. - * @return Le chemin de l'image cache transform\xE9e. - */ - public File getTransfCacheImageFile() { - return new File(new File(rootPath,IMG_TRANSF_DIR),"cache.jpg"); - } - - /** * Retourne le flux d'entr\xE9e de l'image cache indiqu\xE9e. L'ancien flux est alors * ferm\xE9. * @param _f L'image cache * @return Le flux. */ public ImageInputStream getPgmCacheImageInputStream(File _f) { -// if (!getPgmCacheImageFile().exists()) -// rebuiltPgmCacheImages(null); - try { - if (cachePgmInputStream_ != null) { - cachePgmInputStream_.close(); - } + closePgmCacheImageInputStream(); cachePgmInputStream_=ImageIO.createImageInputStream(_f); } catch (IOException _exc) { } return cachePgmInputStream_; } + + /** + * Fermeture de l'input stream cache pgm + */ + private void closePgmCacheImageInputStream() { + try { + if (cachePgmInputStream_ != null) + cachePgmInputStream_.close(); + cachePgmInputStream_=null; + } + catch (IOException _exc) {} + } /** * Retourne le flux d'entr\xE9e de l'image cache transform\xE9e en espace transform\xE9. L'ancien flux est alors @@ -353,13 +337,8 @@ * @return Le flux. */ public ImageInputStream getTransfCacheImageInputStream(File _f) { -// if (!getTransfCacheImageFile().exists()) -// rebuiltTransfCacheImage(); - try { - if (cacheTransfInputStream_ != null) { - cacheTransfInputStream_.close(); - } + closeTransfCacheImageInputStream(); cacheTransfInputStream_=ImageIO.createImageInputStream(_f); } catch (IOException _exc) {} @@ -367,24 +346,43 @@ } /** + * Fermeture de l'input stream cache image transform\xE9e + */ + private void closeTransfCacheImageInputStream() { + try { + if (cacheTransfInputStream_ != null) + cacheTransfInputStream_.close(); + cacheTransfInputStream_=null; + } + catch (IOException _exc) {} + } + + /** * Retourne le flux d'entr\xE9e de l'image cache transform\xE9e en espace r\xE9el indiqu\xE9e. L'ancien flux est alors * ferm\xE9. * @param _f L'image cache * @return Le flux. */ public ImageInputStream getRealCacheImageInputStream(File _f) { -// if (!getTransfCacheImageFile().exists()) -// rebuiltTransfCacheImage(); - try { - if (cacheRealInputStream_ != null) { - cacheRealInputStream_.close(); - } + closeRealCacheImageInputStream(); cacheRealInputStream_=ImageIO.createImageInputStream(_f); } catch (IOException _exc) {} return cacheRealInputStream_; } + + /** + * Fermeture de l'input stream cache image reel + */ + private void closeRealCacheImageInputStream() { + try { + if (cacheRealInputStream_ != null) + cacheRealInputStream_.close(); + cacheRealInputStream_=null; + } + catch (IOException _exc) {} + } /** * Retourne la taille des images source. @@ -477,16 +475,28 @@ /** * D\xE9finit que les images transform\xE9es ont chang\xE9 suite au calcul. */ - public void setTransfImagesChanged() { + public void setTransfImagesChanged(ProgressionInterface _prog) { areTransfImagesChanged=true; isModified=true; + // Lib\xE8re les stream cache. + closeRealCacheImageInputStream(); + closeTransfCacheImageInputStream(); + File imgTransfDir=new File(rootPath,IMG_TRANSF_DIR); + + // Destruction de toutes les images caches. + File imgCacheDir=new File(imgTransfDir,"cache"); + File[] oldCacheFiles=imgCacheDir.listFiles(); + if (oldCacheFiles!=null) { + for (File f : oldCacheFiles) { + f.delete(); + } + } + File[] transfFiles=imgTransfDir.listFiles(FLT_FILES); if (transfFiles==null) transfFiles=new File[0]; - rebuiltCacheImagesIfNeeded(Arrays.asList(transfFiles),new ArrayList<File>(),imgTransfDir,null); -// rebuiltTransfCacheImage(); -// fireProjectStateChanged("transfImages"); + rebuiltCacheImagesIfNeeded(Arrays.asList(transfFiles),new ArrayList<File>(),imgTransfDir,_prog); } /** @@ -497,24 +507,26 @@ * * @param _files Les images. */ - public void setSrcImagesFiles(File[] _files) { + public void setSrcImagesFiles(File[] _files, CtuluTaskOperationGUI _task) { File imgInpDir=new File(rootPath,IMG_PGM_DIR); imgInpDir.mkdirs(); areSrcImagesChanged=!CtuluLibArray.isEquals(_files, srcFiles_.toArray(new File[0])); + // Lib\xE8re le stream. + closePgmCacheImageInputStream(); + List<File> newFiles=new ArrayList<File>(); - - // Traitement des fichiers .pgm, pour mise en cache. Le reconditionnement - // a d\xE9ja \xE9t\xE9 fait. + List<File> newpgm=new ArrayList<File>(); + + // Traitement des fichiers .pgm, pour mise en cache. for (File f : _files) { File fimg=new File(imgInpDir,f.getName()); if (!srcFiles_.contains(f)) { // Reconditionnement de l'image. if (f.getName().endsWith(".pgm")) { - CtuluAnalyze ana=new CtuluAnalyze(); - PivExeLauncher.instance().launchRepackingImg(ana, this, null, new File[]{f}); + newpgm.add(f); } else { // Copie du fichier localement au projet. @@ -523,6 +535,10 @@ } newFiles.add(fimg); } + + // Reconditionnement des pgm + CtuluAnalyze ana=new CtuluAnalyze(); + PivExeLauncher.instance().launchRepackingImg(ana, this, _task, newpgm.toArray(new File[0])); // Suppression des anciennes images sources for (File f : imgInpDir.listFiles(FLT_FILES)) { @@ -530,74 +546,11 @@ f.delete(); } - rebuiltCacheImagesIfNeeded(newFiles,srcFiles_,imgInpDir,null); + // Reconstruction des images caches + rebuiltCacheImagesIfNeeded(newFiles,srcFiles_,imgInpDir,_task); } /** - * D\xE9finit que les images reconditionn\xE9e ont chang\xE9 suite au calcul. - */ -// public void setPgmImagesChanged() { -// areSrcImagesChanged=true; -// isModified=true; -// rebuiltPgmCacheImages(null); -// fireProjectStateChanged("pgmImages"); -// } - - /** - * Reconstruit les images en asynchrone car l'op\xE9ration est longue. - */ -// private void rebuiltPgmCacheImages(ProgressionInterface _prog) { -// try { -// if (cachePgmInputStream_ != null) { -// cachePgmInputStream_.close(); -// } -// } -// catch (IOException _exc) {} -// cachePgmInputStream_ = null; - - // Destruction des anciennes images cache. -// for (File cache : getPgmCacheImageFiles()) { -// cache.delete(); -// } -// -// CtuluTaskOperationGUI task = new CtuluTaskOperationGUI(null, -// PivResource.getS("Mise en cache des images")) { -// -// public void act() { -// for (File fpgm : getPgmImageFiles()) { -// createCacheFromImage(fpgm, getCacheImageFile(fpgm)); -// fireProjectStateChanged("pgmImages"); -// } -// } -// -// }; -// task.start(); - // -// File[] files = getSrcImageFiles(); -// if (files.length>0) -// createCacheFromImage(files[0]); -// } - - private void rebuiltTransfCacheImage() { - try { - if (cacheTransfInputStream_ != null) { - cacheTransfInputStream_.close(); - } - if (cacheRealInputStream_ != null) { - cacheRealInputStream_.close(); - } - } - catch (IOException _exc) {} - cacheTransfInputStream_ = null; - cacheRealInputStream_ = null; - - getTransfCacheImageFile().delete(); - File[] files = getTransfImageFiles(); - if (files.length>0) - createCacheFromImage(files[0]); - } - - /** * Les images transform\xE9es ont-elles \xE9t\xE9 modifi\xE9es par le calcul ? * @return true : elles ont \xE9t\xE9 modifi\xE9es. */ @@ -634,18 +587,9 @@ * projet. */ public void dispose() { - try { - if (cachePgmInputStream_ != null) - cachePgmInputStream_.close(); - cachePgmInputStream_=null; - if (cacheRealInputStream_ != null) - cacheRealInputStream_.close(); - cacheRealInputStream_=null; - if (cacheTransfInputStream_ != null) - cacheTransfInputStream_.close(); - cacheTransfInputStream_=null; - } - catch (IOException ex) {} + closePgmCacheImageInputStream(); + closeRealCacheImageInputStream(); + closeTransfCacheImageInputStream(); // Supprime aussi le repertoire temporaire CtuluLibFile.deleteDir(rootPath); @@ -937,7 +881,7 @@ if (orthoPoints!=null) { File grpFile=new File(getOutputDir(),"GRP.dat"); FileWriteOperationAbstract writer=PivGRPFileFormat.getInstance().createWriter(); - CtuluIOOperationSynthese ret=writer.write(orthoPoints, grpFile, null); + writer.write(orthoPoints, grpFile, null); } // Les fichiers de parametres ortho @@ -945,11 +889,11 @@ Object[] params=new Object[]{orthoParams,getSrcImageSize()}; File imgRefFile=new File(getOutputDir(),"img_ref.dat"); FileWriteOperationAbstract writer=PivImgRefFileFormat.getInstance().createWriter(); - CtuluIOOperationSynthese ret=writer.write(params, imgRefFile, null); + writer.write(params, imgRefFile, null); File hFile=new File(getOutputDir(),"h.dat"); writer=PivHFileFormat.getInstance().createWriter(); - ret=writer.write(orthoParams.getWaterElevation(), hFile, null); + writer.write(orthoParams.getWaterElevation(), hFile, null); } // Le fichiers de parametres de calcul @@ -957,28 +901,28 @@ Object[] params=new Object[]{computeParams,flowParams,getTransfImageSize()}; File paramFile=new File(getOutputDir(),"PIV_param.dat"); FileWriteOperationAbstract writer=PivParamFileFormat.getInstance().createWriter(); - CtuluIOOperationSynthese ret=writer.write(params, paramFile, null); + writer.write(params, paramFile, null); } // Le contour de grille if (cntGrid!=null) { File cntGridFile=new File(getOutputDir(),"grid_param.dat"); FileWriteOperationAbstract writer=PivGridParamFileFormat.getInstance().createWriter(); - CtuluIOOperationSynthese ret=writer.write(cntGrid, cntGridFile, null); + writer.write(cntGrid, cntGridFile, null); } // Le fichiers des points de grille if (computeGrid!=null) { File gridFile=new File(getOutputDir(),"grid.dat"); FileWriteOperationAbstract writer=PivGridFileFormat.getInstance().createWriter(); - CtuluIOOperationSynthese ret=writer.write(computeGrid, gridFile, null); + writer.write(computeGrid, gridFile, null); } // Un transect if (transect!=null) { File transectFile=new File(getOutputDir(),"bathy.dat"); FileWriteOperationAbstract writer=PivBathyFileFormat.getInstance().createWriter(); - CtuluIOOperationSynthese ret=writer.write(transect, transectFile, null); + writer.write(transect, transectFile, null); } // Les resultats utilis\xE9s pour le calcul de vitesse moyenne. @@ -1033,7 +977,7 @@ File globalFile = new File(getOutputDir(), "global.xml"); FileWriteOperationAbstract writer = new PivGlobalXmlWriter(); - CtuluIOOperationSynthese ret = writer.write(param, globalFile, null); + writer.write(param, globalFile, null); } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |