/*******************************************************************************
* SiJaPP - Simple Java PreProcessor
* Copyright (C) 2003 Manuel Linsmayer
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*******************************************************************************/
package sijapp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.Vector;
public class Sijapp {
// Java source file extension
public static String JAVASRC_EXT = ".java";
public static String LANG_EXT = ".lang";
/*************************************************************************** */
// Source diretory
private File srcDir;
// Destination directory
private File destDir;
// Files
private String[] filenames;
// Constructor
public Sijapp(File srcDir, File destDir) {
this.srcDir = new File(srcDir.getPath());
this.destDir = new File(destDir.getPath());
this.filenames = this.scanDir(this.srcDir, "");
}
// Scans the given directory (srcDir/srcDirExt) for Java source files
private String[] scanDir(File srcDir, String srcDirExt) {
// Initalize vector
Vector filenames = new Vector();
// Get all Java source file in the current directory
File[] files = (new File(srcDir, srcDirExt)).listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile() &&
(files[i].getName().endsWith(Sijapp.JAVASRC_EXT) || files[i].getName().endsWith(Sijapp.LANG_EXT)) )
{
filenames.add(srcDirExt + File.separator + files[i].getName());
} else if (files[i].isDirectory()) {
filenames.addAll(Arrays.asList(this.scanDir(srcDir, srcDirExt + File.separator + files[i].getName())));
}
}
// Return Vector as array
String[] ret = new String[filenames.size()];
filenames.copyInto(ret);
return (ret);
}
// Preprocess files
public void run(Preprocessor pp) throws SijappException {
// Loop through all files
for (int i = 0; i < this.filenames.length; i++) {
// Open source file
File srcFile = new File(this.srcDir, this.filenames[i]);
BufferedReader reader;
try {
InputStreamReader isr= new InputStreamReader(new FileInputStream(srcFile),"UTF-8");
reader = new BufferedReader(isr);
} catch (Exception e) {
throw (new SijappException("File " + srcFile.getPath() + " could not be read"));
}
// Open destination file
File destFile = new File(this.destDir, this.filenames[i]);
BufferedWriter writer;
try {
(new File(destFile.getParent())).mkdirs();
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(destFile),"UTF-8");
writer = new BufferedWriter(osw);
} catch (Exception e) {
throw (new SijappException("File " + destFile.getPath() + " could not be written"));
}
// Preprocess
try {
pp.run(reader, writer);
} catch (SijappException e) {
try { reader.close(); } catch (IOException f) { /* Do nothing */ }
try { writer.close(); } catch (IOException f) { /* Do nothing */ }
try { destFile.delete(); } catch (SecurityException f) { /* Do nothing */ }
throw (new SijappException(srcFile.getPath() + ":" + e.getMessage()));
} catch (Exception e) {
throw (new SijappException(srcFile.getPath() + ":" + e.toString()));
}
// Close files
try { reader.close(); } catch (IOException e) { /* Do nothing */ }
try { writer.close(); } catch (IOException e) { /* Do nothing */ }
}
}
}