/*
* (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;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import org.openflexo.dg.latex.DocGeneratorConstants;
import org.openflexo.foundation.DocType;
import org.openflexo.foundation.FlexoModelObject;
import org.openflexo.foundation.FlexoObserver;
import org.openflexo.foundation.cg.CGFile;
import org.openflexo.foundation.cg.CGSymbolicDirectory;
import org.openflexo.foundation.cg.DGRepository;
import org.openflexo.foundation.cg.generator.GeneratedTextResource;
import org.openflexo.foundation.cg.generator.IFlexoResourceGenerator;
import org.openflexo.foundation.dkv.DKVModel;
import org.openflexo.foundation.dm.DMEntity;
import org.openflexo.foundation.dm.DMModel;
import org.openflexo.foundation.dm.DMRepository;
import org.openflexo.foundation.dm.eo.DMEOEntity;
import org.openflexo.foundation.ie.IEPageComponent;
import org.openflexo.foundation.ie.IEPopupComponent;
import org.openflexo.foundation.ie.IETabComponent;
import org.openflexo.foundation.ie.cl.ComponentDefinition;
import org.openflexo.foundation.ie.cl.FlexoComponentLibrary;
import org.openflexo.foundation.ie.cl.OperationComponentDefinition;
import org.openflexo.foundation.ie.cl.PopupComponentDefinition;
import org.openflexo.foundation.ie.cl.TabComponentDefinition;
import org.openflexo.foundation.ie.menu.FlexoNavigationMenu;
import org.openflexo.foundation.rm.FlexoCopiedResource;
import org.openflexo.foundation.rm.FlexoProject;
import org.openflexo.foundation.rm.GeneratedResourceData;
import org.openflexo.foundation.rm.cg.CGRepositoryFileResource;
import org.openflexo.foundation.toc.TOCEntry;
import org.openflexo.foundation.wkf.FlexoProcess;
import org.openflexo.foundation.wkf.FlexoWorkflow;
import org.openflexo.foundation.wkf.ProcessFolder;
import org.openflexo.foundation.wkf.node.AbstractActivityNode;
import org.openflexo.foundation.wkf.node.OperationNode;
import org.openflexo.generator.Generator;
import org.openflexo.generator.exception.GenerationException;
import org.openflexo.generator.exception.UnexpectedExceptionOccuredException;
import org.openflexo.logging.FlexoLogger;
/**
* @author gpolet
*
*/
public abstract class DGGenerator<T extends FlexoModelObject> extends Generator<T, DGRepository> implements FlexoObserver {
protected static final Logger logger = FlexoLogger.getLogger(DGGenerator.class.getPackage().getName());
protected static final String BAD_CHARACTERS_REG_EXP = "[\"'&}%#~\\s_?+:/\\\\]";
protected static final Pattern BAD_CHARACTERS_PATTERN = Pattern.compile(BAD_CHARACTERS_REG_EXP);
protected static final String BAD_LATEX_FILE_NAME_CHARACTERS_REG_EXP = "[^-A-Za-z0-9.]";
protected static final Pattern BAD_LATEX_FILE_NAME_CHARACTERS_PATTERN = Pattern.compile(BAD_LATEX_FILE_NAME_CHARACTERS_REG_EXP);
public static final double FULL_PAGE_RATIO = 654.0d / 458.0d;
public static void main(String[] args) {
String dirty = "Coucou-'blabla-'\"\"--And---oiuzeoi-------13558";
String clean = getValidReference(dirty);
System.out.println(dirty + "\n" + clean);
}
public static double FULL_PAGE_RATIO() {
return FULL_PAGE_RATIO;
}
public static double getImageRatio(Icon image) {
return (double) image.getIconHeight() / (double) image.getIconWidth();
}
private boolean isGenerating = false;
private String templateName;
private String identifier;
private String fileName;
private TOCEntry entry;
public static String cleanFileName(String fileName) {
return BAD_LATEX_FILE_NAME_CHARACTERS_PATTERN.matcher(fileName).replaceAll("-");
}
public static String removeNewLines(String text) {
if (text == null) {
return null;
}
String replaced = text.replaceAll("(\r*\n)+", " ");
return replaced;
}
public static String nameForObjectNoExt(FlexoModelObject object, DGRepository repository) {
if (object instanceof ComponentDefinition) {
return nameForComponentNoExt((ComponentDefinition) object, repository);
} else if (object instanceof OperationNode) {
return nameForOperationNoExt((OperationNode) object, repository);
} else if (object instanceof FlexoProcess) {
return nameForProcessNoExt((FlexoProcess) object, repository);
} else if (object instanceof ProcessFolder) {
return nameForProcessFolderNoExt((ProcessFolder) object, repository);
} else if (object instanceof DMEntity) {
return nameForEntityNoExt((DMEntity) object, repository);
} else if (object instanceof DMRepository) {
return nameForRepositoryNoExt((DMRepository) object, repository);
} else if (object instanceof DMModel) {
return nameForDataModelNoExt(repository);
} else if (object instanceof DKVModel) {
return nameForDKVNoExt(repository);
} else if (object instanceof FlexoWorkflow) {
return nameForWorkflowNoExt(repository);
} else if (object instanceof FlexoComponentLibrary) {
return nameForComponentLibraryNoExt(repository);
} else if (object instanceof FlexoNavigationMenu) {
return nameForMenuNoExt(repository);
} else if (object instanceof FlexoProject) {
return nameForProjectNoExt(repository);
} else if (logger.isLoggable(Level.WARNING)) {
logger.warning("So far there is no known way to name a " + object);
}
return null;
}
public static String nameForProjectNoExt(DGRepository repository) {
return "main";
}
public static String nameForProcessNoExt(FlexoProcess process, DGRepository repository) {
return cleanFileName(repository.getName() + ".process." + process.getName() + externalObjectExtension(process, repository));
}
public static String externalObjectExtension(FlexoModelObject object, DGRepository repository) {
return repository.getProject() == object.getProject() ? "" : object.getProject().getDisplayName();
}
public static String nameForProcessFolderNoExt(ProcessFolder processFolder, DGRepository repository) {
return cleanFileName(repository.getName() + ".processfolder." + processFolder.getName() + "-"
+ externalObjectExtension(processFolder, repository) + "-" + processFolder.getFlexoID());
}
public static String nameForDKVNoExt(DGRepository repository) {
return cleanFileName(repository.getName() + ".dkv");
}
public static String nameForOperationNoExt(OperationNode operation, DGRepository repository) {
return cleanFileName(repository.getName() + ".operation." + operation.getProcess().getName() + "."
+ operation.getAbstractActivityNode().getName() + "." + operation.getName());
}
public static String nameForMenuNoExt(DGRepository repository) {
return cleanFileName(repository.getName() + ".menu");
}
public static String nameForComponentNoExt(ComponentDefinition cd, DGRepository repository) {
if (cd instanceof OperationComponentDefinition) {
return cleanFileName(repository.getName() + ".screen." + cd.getName());
} else if (cd instanceof PopupComponentDefinition) {
return cleanFileName(repository.getName() + ".popup." + cd.getName());
} else if (cd instanceof TabComponentDefinition) {
return cleanFileName(repository.getName() + ".tab." + cd.getName());
} else {
return cleanFileName(repository.getName() + ".component." + cd.getName());
}
}
public static String nameForDataModelNoExt(DGRepository repository) {
return cleanFileName(repository.getName() + ".dm");
}
public static String nameForComponentLibraryNoExt(DGRepository repository) {
return cleanFileName(repository.getName() + ".cl");
}
public static String nameForWorkflowNoExt(DGRepository repository) {
return cleanFileName(repository.getName() + ".wkf");
}
public static String nameForReadersGuideNoExt(DGRepository repository) {
return cleanFileName(repository.getName() + ".readersguide");
}
public static String nameForDefinitionsNoExt(DGRepository repository) {
return cleanFileName(repository.getName() + ".definitions");
}
public static String nameForRepositoryNoExt(DMRepository dmr, DGRepository repository) {
return cleanFileName(repository.getName() + ".repository." + dmr.getName());
}
public static String nameForEntityNoExt(DMEntity entity, DGRepository repository) {
if (entity instanceof DMEOEntity) {
return cleanFileName(repository.getName() + ".eoentity." + entity.getName());
} else {
return cleanFileName(repository.getName() + ".entity." + entity.getName());
}
}
public String realNameForProjectNoExt(DGRepository repository) {
CGRepositoryFileResource<? extends GeneratedResourceData, IFlexoResourceGenerator, CGFile> r = getProjectGenerator()
.getResourceForObject(repository.getProject());
if (r != null) {
String fileName = r.getFileName();
if (fileName.endsWith(getFileExtension())) {
return fileName.substring(0, fileName.length() - getFileExtension().length());
}
return fileName;
}
return nameForProjectNoExt(repository);
}
public String realNameForProcessNoExt(FlexoProcess process, DGRepository repository) {
CGRepositoryFileResource<? extends GeneratedResourceData, IFlexoResourceGenerator, CGFile> r = getProjectGenerator()
.getResourceForObject(process);
if (r != null) {
String fileName = r.getFileName();
if (fileName.endsWith(getFileExtension())) {
return fileName.substring(0, fileName.length() - getFileExtension().length());
}
return fileName;
}
return nameForProcessNoExt(process, repository);
}
public String realNameForDKVNoExt(DGRepository repository) {
if (getProject().getDKVModel(false) != null) {
CGRepositoryFileResource<? extends GeneratedResourceData, IFlexoResourceGenerator, CGFile> r = getProjectGenerator()
.getResourceForObject(repository.getProject().getDKVModel());
if (r != null) {
String fileName = r.getFileName();
if (fileName.endsWith(getFileExtension())) {
return fileName.substring(0, fileName.length() - getFileExtension().length());
}
return fileName;
}
return nameForDKVNoExt(repository);
} else {
return null;
}
}
public String realNameForOperationNoExt(OperationNode operation, DGRepository repository) {
CGRepositoryFileResource<? extends GeneratedResourceData, IFlexoResourceGenerator, CGFile> r = getProjectGenerator()
.getResourceForObject(operation);
if (r != null) {
String fileName = r.getFileName();
if (fileName.endsWith(getFileExtension())) {
return fileName.substring(0, fileName.length() - getFileExtension().length());
}
return fileName;
}
return nameForOperationNoExt(operation, repository);
}
public String realNameForMenuNoExt(DGRepository repository) {
if (getProject().getFlexoNavigationMenu(false) != null) {
CGRepositoryFileResource<? extends GeneratedResourceData, IFlexoResourceGenerator, CGFile> r = getProjectGenerator()
.getResourceForObject(repository.getProject().getFlexoNavigationMenu());
if (r != null) {
String fileName = r.getFileName();
if (fileName.endsWith(getFileExtension())) {
return fileName.substring(0, fileName.length() - getFileExtension().length());
}
return fileName;
}
return nameForMenuNoExt(repository);
}
return null;
}
public String realNameForComponentNoExt(ComponentDefinition cd, DGRepository repository) {
CGRepositoryFileResource<? extends GeneratedResourceData, IFlexoResourceGenerator, CGFile> r = getProjectGenerator()
.getResourceForObject(cd);
if (r != null) {
String fileName = r.getFileName();
if (fileName.endsWith(getFileExtension())) {
return fileName.substring(0, fileName.length() - getFileExtension().length());
}
return fileName;
}
return nameForComponentNoExt(cd, repository);
}
public String realNameForDataModelNoExt(DGRepository repository) {
CGRepositoryFileResource<? extends GeneratedResourceData, IFlexoResourceGenerator, CGFile> r = getProjectGenerator()
.getResourceForObject(repository.getProject().getDataModel());
if (r != null) {
String fileName = r.getFileName();
if (fileName.endsWith(getFileExtension())) {
return fileName.substring(0, fileName.length() - getFileExtension().length());
}
return fileName;
}
return nameForDataModelNoExt(repository);
}
public String realNameForRepositoryNoExt(DMRepository dmr, DGRepository repository) {
CGRepositoryFileResource<? extends GeneratedResourceData, IFlexoResourceGenerator, CGFile> r = getProjectGenerator()
.getResourceForObject(dmr);
if (r != null) {
String fileName = r.getFileName();
if (fileName.endsWith(getFileExtension())) {
return fileName.substring(0, fileName.length() - getFileExtension().length());
}
return fileName;
}
return nameForRepositoryNoExt(dmr, repository);
}
public String realNameForEntityNoExt(DMEntity entity, DGRepository repository) {
CGRepositoryFileResource<? extends GeneratedResourceData, IFlexoResourceGenerator, CGFile> r = getProjectGenerator()
.getResourceForObject(entity);
if (r != null) {
String fileName = r.getFileName();
if (fileName.endsWith(getFileExtension())) {
return fileName.substring(0, fileName.length() - getFileExtension().length());
}
return fileName;
}
return nameForEntityNoExt(entity, repository);
}
public static String screenshotName(FlexoModelObject o) {
return CGSymbolicDirectory.FIGURES
+ "/"
+ o.getProject().getScreenshotResource(o, true).getFile().getName()
.substring(0, o.getProject().getScreenshotResource(o).getFile().getName().length() - 4);
}
public static String screenshotName(FlexoModelObject o, ProjectDocGenerator pdg) {
FlexoCopiedResource r = pdg.getScreenshot(o);
if (r != null) {
return CGSymbolicDirectory.FIGURES + "/" + r.getFile().getName().substring(0, r.getFile().getName().length() - 4);
} else {
return CGSymbolicDirectory.FIGURES + "/" + "GenerateScreenshot";
}
}
public static Icon screenshot(FlexoModelObject o, ProjectDocGenerator pdg) {
FlexoCopiedResource r = pdg.getScreenshot(o);
if (r != null) {
if (r.getFile().exists()) {
return new ImageIcon(r.getFile().getAbsolutePath());
} else {
if (r.getResourceToCopy() != null) {
return new ImageIcon(r.getResourceToCopy().getFile().getAbsolutePath());
}
}
}
return new ImageIcon(o.getProject().getScreenshotResource(o, true).getFile().getAbsolutePath());
}
public static String getReference(FlexoModelObject object) {
String s = "";
if (object instanceof FlexoProcess) {
s = "PROCESS-" + ((FlexoProcess) object).getName();
} else if (object instanceof DMModel) {
s = "DMMODEL-" + ((DMModel) object).getName();
} else if (object instanceof DMEOEntity) {
s = "DMEOENTITY-" + ((DMEOEntity) object).getName();
} else if (object instanceof AbstractActivityNode) {
s = "ACTIVITY-" + ((AbstractActivityNode) object).getName() + "-" + object.getFlexoID();
} else if (object instanceof OperationNode) {
s = "OPERATION-" + ((OperationNode) object).getName() + "-" + object.getFlexoID();
} else if (object instanceof DKVModel) {
s = "DKVMODEL-" + ((DKVModel) object).getName();
} else if (object instanceof FlexoNavigationMenu) {
s = "MENU-" + ((FlexoNavigationMenu) object).getName();
} else if (object instanceof IEPopupComponent) {
s = "POPUP-" + ((IEPopupComponent) object).getName();
} else if (object instanceof IETabComponent) {
s = "TAB-" + ((IETabComponent) object).getName();
} else if (object instanceof IEPageComponent) {
s = "PAGE-" + ((IEPageComponent) object).getName();
} else {
s = object.getFullyQualifiedName();
}
return getValidReference(DocGeneratorConstants.DG_LABEL_PREFIX + s);
}
public static String getValidReference(String label) {
return BAD_CHARACTERS_PATTERN.matcher(label).replaceAll("-");
}
protected DGGenerator(ProjectDocGenerator projectGenerator, T object) {
super(projectGenerator, object);
}
public DGGenerator(ProjectDocGenerator projectGenerator, T source, String templateName) {
this(projectGenerator, source, templateName, source.getFullyQualifiedName(), nameForObjectNoExt(source,
projectGenerator.getRepository()), null);
}
public DGGenerator(ProjectDocGenerator projectGenerator, T source, String templateName, String identifier, String fileName,
TOCEntry entry) {
this(projectGenerator, source);
this.templateName = templateName;
this.identifier = identifier;
this.fileName = fileName;
this.entry = entry;
}
@Override
public ProjectDocGenerator getProjectGenerator() {
return (ProjectDocGenerator) super.getProjectGenerator();
}
@Override
public Logger getGeneratorLogger() {
return logger;
}
public abstract String getFileExtension();
/**
* Generate code related to this generator. If this generator may store result, setting forceGenerate flag to false will result in
* giving the already generated code (cache scheme).
*
* @param forceRegenerate
* @throws GenerationException
*/
@Override
public void generate(boolean forceRegenerate) {
if (!forceRegenerate && !needsGeneration()) {
return;
}
startGeneration();
try {
generatedCode = new GeneratedTextResource(getFileName().endsWith(getFileExtension()) ? getFileName() : getFileName()
+ getFileExtension(), merge(getTemplateName()));
} catch (GenerationException e) {
setGenerationException(e);
} catch (Exception e) {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Unexpected exception occured: " + e.getMessage() + " for " + getObject().getFullyQualifiedName());
}
e.printStackTrace();
setGenerationException(new UnexpectedExceptionOccuredException(e, getProjectGenerator()));
}
stopGeneration();
}
public TOCEntry getTOCEntry() {
TOCEntry reply = getRepository().getTOCEntryForObject(getObject());
if (reply == null) {
return entry;
}
return reply;
}
@Override
public void buildResourcesAndSetGenerators(DGRepository repository, Vector<CGRepositoryFileResource> resources) {
getProjectGenerator().refreshConcernedResources();
}
/**
* The name of the generated file without the extension.
*
* @return the name of the generated file.
*/
public String getFileName() {
return fileName;
}
/**
* The name of the template to use to generate the associated file of this generator
*
* @return the name of the template to use
*/
public String getTemplateName() {
return templateName;
}
public String getIdentifier() {
return identifier;
}
@Override
public DocType getTarget() {
return (DocType) super.getTarget();
}
}