/*
* -----------------------------------------------------------------------
* File: $HeadURL$
* Revision $LastChangedRevision$
* Last Modified: $LastChangedDate$
* Last Change by: $LastChangedBy$
* -----------------------------------------------------------------------
* Copyright (C) 2007 Keith Stribley <devel@thanlwinsoft.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
* -----------------------------------------------------------------------
*/
/**
*
*/
package org.thanlwinsoft.languagetest.eclipse.export;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.thanlwinsoft.languagetest.MessageUtil;
import org.thanlwinsoft.languagetest.eclipse.LanguageTestPlugin;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* @author keith
*
*/
public class FopConfigPage extends WizardPage implements ExporterProperties, IExecutableExtension
{
private String xsltPath = null;
@SuppressWarnings("unused")
private boolean enabled = false;
private FopFactory fopFactory = null;
private FOUserAgent userAgent = null;
private Button useImagesButton = null;
private Combo pageSizeCombo = null;
private Combo columnCombo = null;
private final static String [] PARAMETERS = new String [] {
"title", "colCount", "useImage", "pageSize"
};
private final static String [] DEFAULTS = new String [] {
"Language Module", "1", "1", "A4"
};
private String [] values = null;
private final static String [] PAGE_SIZES = new String [] {
"A4","A5","Letter","Legal"
};
/**
* @param pageName
*/
public FopConfigPage()
{
super("FOP Config");
values = DEFAULTS;
}
/* (non-Javadoc)
* @see org.thanlwinsoft.languagetest.eclipse.export.ExporterProperties#convert(java.lang.String, java.lang.String)
*/
public boolean convert(String source, String target, String [] properties, String [] values)
{
// mustn't access any widgets because this isn't run in a display thread
System.out.println(source + " " + target);
// Step 1: Construct a FopFactory
// (reuse if you plan to render multiple documents!)
//Bundle fopBundle = Platform.getBundle("org.apache.fop");
//Bundle graphiteBundle = Platform.getBundle("org.sil.graphite");
boolean success = false;
try
{
//fopBundle.loadClass("org.apache.fop.apps.FopFactory");
//if (graphiteBundle != null)
// graphiteBundle.loadClass("org.sil.graphite.GraphiteFont");
if (fopFactory == null)
fopFactory = FopFactory.newInstance();
File sourceFile = new File(source);
String title = new Path(source).removeFileExtension().lastSegment();
// Step 2: Set up output stream.
// Note: Using BufferedOutputStream for performance reasons (helpful with FileOutputStreams).
OutputStream out = new BufferedOutputStream(new FileOutputStream(new File(target)));
try
{
//if (userAgent == null)
{
userAgent = fopFactory.newFOUserAgent();
DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder();
InputStream fopConfig =
getClass().getResourceAsStream("/org/thanlwinsoft/languagetest/language/text/fop.xconf");
Configuration cfg = cfgBuilder.build(fopConfig);
fopFactory.setUserConfig(cfg);
}
// Step 3: Construct fop with desired output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, userAgent, out);
// Step 4: Setup JAXP using identity transformer
TransformerFactory factory = TransformerFactory.newInstance();
//Transformer transformer = factory.newTransformer(); // identity transformer
Source xslt = new StreamSource(this.getClass().getResourceAsStream(xsltPath));
Transformer transformer = factory.newTransformer(xslt);
transformer.setParameter("title", title);
for (int i = 0; i < properties.length; i++)
{
transformer.setParameter(properties[i], values[i]);
}
// Step 5: Setup input and output for XSLT transformation
// Setup input stream
Source src = new StreamSource(sourceFile);
// Resulting SAX events (the generated FO) must be piped through to FOP
DefaultHandler dh = fop.getDefaultHandler();
Result res = new SAXResult(dh);
// Step 6: Start XSLT transformation and FOP processing
transformer.transform(src, res);
success = true;
}
catch (TransformerException e)
{
LanguageTestPlugin.log(IStatus.WARNING, e.getMessage(), e);
e.printStackTrace();
}
catch (FOPException e)
{
LanguageTestPlugin.log(IStatus.WARNING, e.getMessage(), e);
e.printStackTrace();
}
catch (ConfigurationException e)
{
LanguageTestPlugin.log(IStatus.WARNING, e.getMessage(), e);
e.printStackTrace();
}
catch (SAXException e)
{
LanguageTestPlugin.log(IStatus.WARNING, e.getMessage(), e);
e.printStackTrace();
}
finally
{
//Clean-up
out.close();
//fopFactory = null;
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
LanguageTestPlugin.log(IStatus.WARNING, e.getMessage(), e);
}
catch (IOException e)
{
e.printStackTrace();
LanguageTestPlugin.log(IStatus.WARNING, e.getMessage(), e);
}
// catch (ClassNotFoundException e)
// {
// LanguageTestPlugin.log(IStatus.WARNING, e.getMessage(), e);
// }
return success;
}
/* (non-Javadoc)
* @see org.thanlwinsoft.languagetest.eclipse.export.ExporterProperties#getParameters()
*/
public String[] getParameters()
{
return PARAMETERS;
}
/* (non-Javadoc)
* @see org.thanlwinsoft.languagetest.eclipse.export.ExporterProperties#getValues()
*/
public String[] getValues()
{
//"title", "colCount", "useImage", "pageSize"
if (!getControl().isDisposed())
{
values[0] = "LanguageTest";
values[1] = Integer.toString(columnCombo.getSelectionIndex() + 1);
if (useImagesButton.getSelection())
values[2] = "1";
else
values[2] = "0";
values[3] = PAGE_SIZES[pageSizeCombo.getSelectionIndex()];
}
return values;
}
/* (non-Javadoc)
* @see org.thanlwinsoft.languagetest.eclipse.export.ExporterProperties#parameterOptions(java.lang.String)
*/
public String[] parameterOptions(String propertyName)
{
if (propertyName.equals("pageSize"))
return PAGE_SIZES;
if (propertyName.equals("title"))
return null;
if (propertyName.equals("colCount"))
return new String [] { "1","2","3" };
if (propertyName.equals("useImage"))
return new String [] { "1","0"};
return null;
}
/* (non-Javadoc)
* @see org.thanlwinsoft.languagetest.eclipse.export.ExporterProperties#setEnabled(boolean)
*/
public void setEnabled(boolean enable)
{
this.enabled = enable;
}
/* (non-Javadoc)
* @see org.thanlwinsoft.languagetest.eclipse.export.ExporterProperties#setXslt(java.lang.String)
*/
public void setXslt(String xsltPath)
{
this.xsltPath = xsltPath;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent)
{
//parent.setLayout(new FillLayout());
setTitle(MessageUtil.getString("FopConfigTitle"));
setDescription(MessageUtil.getString("FopConfigInstructions"));
Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
//GridLayout layout = new GridLayout();
//layout.numColumns = 2;
RowLayout layout = new RowLayout();
layout.type = SWT.VERTICAL;
layout.fill = true;
group.setLayout(layout);
Label t1 = new Label(group, SWT.LEFT | SWT.WRAP);
t1.setText(MessageUtil.getString("PageSize"));
t1.setToolTipText(MessageUtil.getString("PageSize"));
pageSizeCombo = new Combo(group, SWT.DROP_DOWN);
pageSizeCombo.setItems(PAGE_SIZES);
pageSizeCombo.select(0);
Label t2 = new Label(group, SWT.LEFT | SWT.WRAP);
t2.setText(MessageUtil.getString("NumColumns"));
columnCombo = new Combo(group, SWT.DROP_DOWN);
columnCombo.setItems(parameterOptions("colCount"));
columnCombo.select(0);
useImagesButton = new Button(group, SWT.CHECK);
useImagesButton.setText(MessageUtil.getString("ShowImages"));
useImagesButton.setToolTipText(MessageUtil.getString("ShowImages"));
this.setControl(group);
group.pack();
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement, java.lang.String, java.lang.Object)
*/
public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException
{
}
public static void main(String [] argv)
{
FopConfigPage fopCP = new FopConfigPage();
String [] properties = { "nativeLang","foreignLang","nativeLangDesc","foreignLangDesc"};
String [] values = { "en", "my[Mymr]", "English", "Myanmar" };
String source = "/home/keith/runtime-LanguageBuddy/testme/MyanmarVocab/Unicode/RainySeason.xml";
String targetA = "/home/keith/tmp/testA.pdf";
String targetB = "/home/keith/tmp/testB.pdf";
fopCP.setXslt("/org/thanlwinsoft/languagetest/language/text/LangTestTableFo.xsl");
fopCP.convert(source, targetA, properties, values);
//fopCP = null;
//fopCP = new FopConfigPage();
fopCP.setXslt("/org/thanlwinsoft/languagetest/language/text/LangTestTableFo.xsl");
fopCP.convert(source, targetB, properties, values);
}
}