/*
* This software and supporting documentation were developed by
*
* Siemens Corporate Technology
* Competence Center Knowledge Management and Business Transformation
* D-81730 Munich, Germany
*
* Authors (representing a really great team ;-) )
* Stefan B. Augustin, Thorbj�rn Hansen, Manfred Langen
*
* This software is Open Source under GNU General Public License (GPL).
* Read the text of this license in LICENSE.TXT
* or look at www.opensource.org/licenses/
*
* Once more we emphasize, that:
* THIS SOFTWARE IS MADE AVAILABLE, AS IS, WITHOUT ANY WARRANTY
* REGARDING THE SOFTWARE, ITS PERFORMANCE OR
* FITNESS FOR ANY PARTICULAR USE, FREEDOM FROM ANY COMPUTER DISEASES OR
* ITS CONFORMITY TO ANY SPECIFICATION. THE ENTIRE RISK AS TO QUALITY AND
* PERFORMANCE OF THE SOFTWARE IS WITH THE USER.
*
*/
// TemplatesProcessor
// ************ package ******************************************************
package KFM.preprocessor;
// ************ imports ******************************************************
import java.util.*;
import java.io.*;
import KFM.DirNavigator.*;
import KFM.*;
import KFM.File.*;
/** The TemplatesProcessor traverses the templates directory.<br>
* <p>It does the necessary jsp-compiling through the jsp engine.
* Each processing is done for each language described in the corresponding
* properties file 'TemplProcessor.properties' if the file has no language in
* its path (new templates). The old templates will be processed as before.</p>
*
* @see KFM.Taglib.LocalizerTag
* @see KFM.preprocessor.AbstractPreprocessor
*/
public class TemplatesProcessor extends AbstractPreprocessor
{
private static final String cTemplateDir = "resources"; // the templates directory
private PropertiesNode mConfigNode = null; //holds the properties of the corresponding
//properties file
private Properties mHttpProps = new Properties(); // the http properties
private Vector mLangs = new Vector(); //vector of the actual supported languages
private Properties mLocalizedDirs = new Properties();
//properties with the actual localized directories as keys
private String mLang = null; //the current language
/**
* Constructor.
* @param aServerName the name of the server the tomcat engine runs on
* @param aServerPort the port of the tomcat engine
* @param aConfigDir path to the corresponding TemplProcessor.properties.
* @param aInitProps the command line arguments that will be searched after http parameters.
*/
public TemplatesProcessor(
String aServerName,
String aServerPort,
String aConfigPath,
Properties aInitProps,
String aTempDir)
throws IOException,
FileNotFoundException,
NoSuchNodeException
{
super(aServerName,
aServerPort,
"resources",
"resources",
new File(aTempDir));
//load the properties
Properties tHelpProps = new Properties();
tHelpProps.load(new FileInputStream (aConfigPath));
//build the properties nodes
PropertiesNodeBuilder tBuilder = new PropertiesNodeBuilder(tHelpProps);
mConfigNode = tBuilder.load();
mHttpProps = AbstractPreprocessor.initHttpProps(aInitProps);
PropertiesNode[] tLocalizedDirs = mConfigNode.getChild("localizedDir").getChildren();
PropertiesNode[] tLangs = mConfigNode.getChild("lang").getChildren();
//initialize the current languages
for (int i = 0; i < tLangs.length; i++)
{
PropertiesNode tLangNode = tLangs[i];
String tLang = (String)tLangNode.getValue();
mLangs.addElement(tLang);
}
//initialize the current localized directories
for (int i = 0; i < tLocalizedDirs.length; i++)
{
PropertiesNode tLocalizedDirNode = tLocalizedDirs[i];
String tLocalizedDir = (String)tLocalizedDirNode.getValue();
mLocalizedDirs.put(tLocalizedDir, "true");
}
}
private void setLanguage (String aLang)
{
mLang = aLang;
}
/**
* Returns all current http parameters
*/
public Properties getHttpParams()
{
if (mLang != null)
mHttpProps.put("language", mLang);
else mHttpProps.remove("language");
return mHttpProps;
}
/**
* Returns true if the file is a file that has to be divides in as much copies
* as languages are provided.
*
*/
private boolean checkWithLanguage(File aFile)
{
int tIndex = -1;
for (int i = 0; i < mLangs.size(); i++)
{
String tLang = (String)mLangs.elementAt(i);
String tNewPath = aFile.getAbsolutePath();
tNewPath = tNewPath.replace('\\', '/');
String tLangTxt = "." + tLang + "." ;
tIndex = tNewPath.indexOf(tLangTxt);
}
return (tIndex != -1);
}
/**
* Create the new dirs. If file already exists on file system
* delete it to prevent errors if it is write protected.
*/
private void ensurePathForFileExists(File aFile)
{
File tPath = new File(aFile.getParent());
if(!tPath.exists()) {
tPath.mkdirs();
}
}
/**
* Returns the path to the new file.
* The new path will contain the language if 'checkWithLanguage' returns true.
*/
public String computeNewFilePath(File aFile)
{
String cSrcDir = "/src";
String tNewPath = aFile.getAbsolutePath();
tNewPath = tNewPath.replace('\\', '/');
// Now we separate the tempates sources and 'objects' = precompiled files.
// The sources are in the 'resources/src' directory whereas the precompiled
// files stay in the 'resources' directory. So remove the 'src' directory from
// target path.
int tSrcIndex = 0;
if ((tSrcIndex = tNewPath.indexOf(cSrcDir)) != -1)
{
String tPostFix = tNewPath.substring(tSrcIndex + cSrcDir.length());
tNewPath = tNewPath.substring(0, tSrcIndex) + tPostFix;
// System.out.println("new path "+tNewPath);
}
if (mLang != null)
{
StringBuffer tNewPathBuf = new StringBuffer();
String tStr = tNewPath.substring(0, (tNewPath.lastIndexOf("/") + 1));
tNewPathBuf.append(tStr);
String tFileName = aFile.getName();
int tIndex = tFileName.indexOf(".kfmt");
if (tIndex != -1)
{
tNewPathBuf.append(tFileName.substring(0, tFileName.indexOf(".kfmt")));
tNewPathBuf.append(".");
tNewPathBuf.append(mLang);
tNewPathBuf.append(tFileName.substring(tFileName.indexOf(".kfmt"), tFileName.length()));
tNewPath = tNewPathBuf.toString();
}
else if ((tIndex = tFileName.indexOf(".xsl"))!= -1)
{
tNewPathBuf.append(tFileName.substring(0, tFileName.indexOf(".xsl")));
tNewPathBuf.append(".");
tNewPathBuf.append(mLang);
tNewPathBuf.append(tFileName.substring(tFileName.indexOf(".xsl"), tFileName.length()));
tNewPath = tNewPathBuf.toString();
}
}
return tNewPath;
}
/**
* Prints the usage of this class.
*/
public static void printUsage()
{
System.out.println("Wrong usage! Please refer to:");
System.out.println("java KFM.preprocessor.TemplatesProcessor tempDir=<tempDir> startDir=<startDir> configDir=<configDir> host=<hostname> port=<port> [tomcat=<TRUE|false>]");
}
/**
* Nothing to filter so return the file content itself.
*
* @param aContent The content of the properties file.
*/
public String filterContent(String aContent)
{
return aContent;
}
/**
* Traverses each file one time for each language (for the new templates)
* else only one time.
*/
public void workFile(File aFile)
{
String tPath = aFile.getAbsolutePath();
if (tPath.endsWith(".jsp"))
{
tPath = tPath.replace('\\', '/');
System.out.println("work file "+tPath);
tPath = tPath.substring(0, (tPath.indexOf(aFile.getName()) - 1));
tPath = tPath.substring (tPath.indexOf(cTemplateDir), tPath.length());
if ((!checkWithLanguage(aFile))&& (mLocalizedDirs.getProperty(tPath)!= null))
{
for (int i = 0; i < mLangs.size(); i++)
{
String tLang = (String)mLangs.elementAt(i);
setLanguage(tLang);
super.workFile(aFile, false);
}
super.deleteTempFiles();
}
else
{
setLanguage(null);
super.workFile(aFile);
super.deleteTempFiles();
}
} else {
File tTargetFile = new File(computeNewFilePath(aFile));
ensurePathForFileExists(tTargetFile);
if(tTargetFile.exists()) {
tTargetFile.delete();
}
try {
FileUtils.copy(aFile, tTargetFile);
} catch(IOException e) {
mErrors++;
System.err.println(e);
}
System.out.println("copied to " + tTargetFile);
}
}
public static void main (String[] args)
{
try{
// @@@ TODO : JD: I'm not sure if this number is still ok. check
if (args.length < 2)
{
TemplatesProcessor.printUsage();
// @@@ JD: There should be a System.exit() here when the number is fixed.
}
else
{
System.out.println("Attention:::Each localized directory has to be in the TemplProcessor.properties file!");
System.out.println("Else you will get a NullPointerException of your LocalizerBean!");
System.out.println();
//Ensures all mandantory properties are included
Properties tProps = Converter.getParams(args);
//users host
String tHost = tProps.getProperty("host");
//users port
String tPort = tProps.getProperty("port");
String tConfigDir = tProps.getProperty("configDir");
String tStartDir = tProps.getProperty("startDir");
String tTempDir = tProps.getProperty("tempDir");
// true if we are using tomcat, this parameter is optional
String tTomcat = tProps.getProperty("tomcat");
boolean tComments = false;
// fetch make portal.properties
Properties tFileProps = new Properties();
try {
tFileProps.load(new FileInputStream("/home/sipdev/KFM/config" + "/" + tProps.getProperty("propFilePath") + "/MakePortal.properties"));
} catch(IOException e) {
e.printStackTrace();
}
// step through the ifdef params to check if comments flag is set
PropertiesNodeBuilder tBuilder = new PropertiesNodeBuilder(tFileProps);
PropertiesNode tRoot = tBuilder.load();
PropertiesNode tChild = tRoot.getChild("ifdefparam");
if (tChild != null)
{
PropertiesNode[] tChildren = tChild.getChildren();
for (int i = 0; i < tChildren.length; i++)
{
PropertiesNode tNode = tChildren[i];
String tValue = ((String)tNode.getValue()).trim();
if (tValue.startsWith("comments"))
{
// no value of 'false' found so comments are on
if (tValue.indexOf("false") == -1)
{
tComments = true;
break;
}
}
}
}
if ((tHost == null)
|| (tPort == null)
|| (tConfigDir == null)
|| (tStartDir == null)
|| (tTempDir == null))
TemplatesProcessor.printUsage();
tProps.remove("host");
tProps.remove("port");
tProps.remove("configDir");
tProps.remove("startDir");
tProps.remove("tempDir");
if (tTomcat != null)
tProps.remove("tomcat");
tComments = false;
// Resin for example can handle long filenames and there is need to copy
// them to temporary files with shorter filenames.
if(!(tTomcat == null || tTomcat.equals("")) && /* tomcat param provided */
Boolean.valueOf(tTomcat).equals(Boolean.FALSE) /* and it must be false */) {
AbstractPreprocessor.setTomcat(false);
}
TemplatesProcessor tProcessor = new TemplatesProcessor(
tHost,
tPort,
tConfigDir,
tProps,
tTempDir);
tProcessor.setCommentsOn(tComments);
tProcessor.traverse(tStartDir);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}