/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.dg.action;
import java.io.File;
import java.io.IOException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import org.openflexo.dg.exception.PDFGenerationFailedException;
import org.openflexo.dg.latex.ProjectDocLatexGenerator;
import org.openflexo.foundation.FlexoEditor;
import org.openflexo.foundation.FlexoModelObject;
import org.openflexo.foundation.action.FlexoActionType;
import org.openflexo.foundation.cg.CGFile;
import org.openflexo.foundation.cg.CGObject;
import org.openflexo.foundation.cg.DGRepository;
import org.openflexo.foundation.rm.SaveResourceException;
import org.openflexo.generator.action.GenerateArtefact;
import org.openflexo.generator.exception.GenerationException;
import org.openflexo.generator.exception.IOExceptionOccuredException;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.toolbox.LatexUtils;
import org.openflexo.toolbox.LogListener;
public class GeneratePDF extends GenerateArtefact<GeneratePDF, DGRepository> implements LogListener {
private static final Logger logger = Logger.getLogger(GeneratePDF.class.getPackage().getName());
public static FlexoActionType<GeneratePDF, DGRepository, CGObject> actionType = new FlexoActionType<GeneratePDF, DGRepository, CGObject>(
"generate_PDF", GENERATE_MENU, WAR_GROUP, FlexoActionType.NORMAL_ACTION_TYPE) {
/**
* Factory method
*/
@Override
public GeneratePDF makeNewAction(DGRepository repository, Vector<CGObject> globalSelection, FlexoEditor editor) {
return new GeneratePDF(repository, globalSelection, editor);
}
@Override
public boolean isVisibleForSelection(DGRepository repository, Vector<CGObject> globalSelection) {
return false;// repository.getFormat() == Format.LATEX;
}
@Override
public boolean isEnabledForSelection(DGRepository repository, Vector<CGObject> globalSelection) {
/*if (repository.getFormat() != Format.LATEX) {
return false;
}
ProjectDocLatexGenerator pg = (ProjectDocLatexGenerator) getProjectGenerator(repository);
return pg != null && repository.getPostBuildDirectory() != null && pg.getProjectDocResource() != null
&& pg.getProjectDocResource().getFile() != null && pg.getProjectDocResource().getFile().exists();*/
return false;
}
};
static {
FlexoModelObject.addActionForClass(GeneratePDF.actionType, DGRepository.class);
}
private String latexCommand;
private File generatedPDF;
private Integer latexTimeOutInSeconds;
protected GeneratePDF(DGRepository focusedObject, Vector<CGObject> globalSelection, FlexoEditor editor) {
super(actionType, focusedObject, globalSelection, editor);
}
@Override
public ProjectDocLatexGenerator getProjectGenerator() {
return (ProjectDocLatexGenerator) super.getProjectGenerator();
}
@Override
public DGRepository getRepository() {
return (DGRepository) super.getRepository();
}
@Override
protected void doAction(Object context) throws GenerationException, SaveResourceException {
ProjectDocLatexGenerator pg = getProjectGenerator();
pg.setAction(this);
if (getSaveBeforeGenerating()) {
getRepository().getProject().save();
}
logger.info("Generate PDF for " + getFocusedObject());
makeFlexoProgress(FlexoLocalization.localizedForKey("generate") + " " + getFocusedObject().getPostProductName() + " "
+ FlexoLocalization.localizedForKey("into") + " " + getFocusedObject().getPostBuildDirectory().getAbsolutePath(), 15);
convertGifToPng();
try {
pg.addToLogListeners(this);
pg.setLatexTimeOutInMillis(getLatexTimeOutInSeconds() * 1000);
generatedPDF = pg.generatePDF(getLatexCommand());
if (generatedPDF == null) {
throw new PDFGenerationFailedException(pg, getLatexErrorMessage());
}
} catch (IOException e) {
e.printStackTrace();
throw new IOExceptionOccuredException(e, pg);
} finally {
pg.removeFromLogListeners(this);
}
hideFlexoProgress();
}
private void convertGifToPng() {
if (getRepository().isConnected()) {
for (CGFile file : getRepository().getFiguresSymbolicDirectory().getFiles()) {
if (file.getResource() != null && file.getResource().getFile() != null && file.getResource().getFile().exists()
&& file.getResource().getFile().getName().toLowerCase().endsWith(".gif")) {
String name = file.getResource().getFile().getName();
if (name.toLowerCase().endsWith("gif")) {
name = "CONVERTED-GIF" + name.substring(0, name.length() - 3) + "png";
}
File f = new File(file.getResource().getFile().getParentFile(), name);
if (!f.exists() || f.lastModified() < file.getResource().getFile().lastModified()) {
if (logger.isLoggable(Level.INFO)) {
logger.info("Converting " + file.getResourceName() + " to " + f.getName());
}
try {
ImageIO.write(ImageIO.read(file.getResource().getFile()), "png", f);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
} else {
if (logger.isLoggable(Level.INFO)) {
logger.info("Repository is not connected");
}
}
}
public String getLatexCommand() {
if (latexCommand == null) {
latexCommand = LatexUtils.getDefaultLatex2PDFCommand();
}
return latexCommand;
}
public void setLatexCommand(String latexCommand) {
this.latexCommand = latexCommand;
}
public File getGeneratedPDF() {
return generatedPDF;
}
@Override
public File getArtefactFile() {
return getGeneratedPDF();
}
/**
* Overrides err
*
* @see org.openflexo.toolbox.LogListener#err(java.lang.String)
*/
@Override
public void err(String line) {
errs.append(line).append('\n');
}
@Override
public void warn(String line) {
warn.append(line).append('\n');
}
/**
* Overrides log
*
* @see org.openflexo.toolbox.LogListener#log(java.lang.String)
*/
@Override
public synchronized void log(String line) {
logs.append(line).append('\n');
}
public String getLatexErrorMessage() {
if (errs.length() > 0) {
int start = errs.indexOf("texify: ");
if (start > -1) {
int end = errs.indexOf("\n", start + 9);
if (end > start) {
return errs.substring(start + 8, end);
} else {
return errs.substring(start + 8);
}
}
return errs.toString();
}
if (logs.indexOf("LaTeX Error: ") > -1) {
int index = logs.lastIndexOf("LaTeX Error: ");
int end = logs.indexOf("\n", index);
if (end > index) {
return logs.substring(index, end);
} else {
return logs.substring(index);
}
}
return null;
}
private StringBuffer logs = new StringBuffer();
private StringBuffer warn = new StringBuffer();
private StringBuffer errs = new StringBuffer();
public Integer getLatexTimeOutInSeconds() {
if (latexTimeOutInSeconds == null) {
latexTimeOutInSeconds = 15;
}
return latexTimeOutInSeconds;
}
public void setLatexTimeOutInSeconds(Integer latexTimeOutInSeconds) {
this.latexTimeOutInSeconds = latexTimeOutInSeconds;
}
}