/*
* (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.generator.utils;
import java.util.Hashtable;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openflexo.foundation.CodeType;
import org.openflexo.foundation.FlexoModelObject;
import org.openflexo.foundation.cg.CGRepository;
import org.openflexo.foundation.dkv.Language;
import org.openflexo.foundation.rm.ResourceType;
import org.openflexo.foundation.rm.cg.CGRepositoryFileResource;
import org.openflexo.generator.MetaGenerator;
import org.openflexo.generator.PackagedResourceToCopyGenerator;
import org.openflexo.generator.ProjectGenerator;
import org.openflexo.generator.exception.GenerationException;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.logging.FlexoLogger;
import org.openflexo.toolbox.FileFormat;
import org.openflexo.toolbox.FileResource;
/**
* @author gpolet
*
*/
public class ResourceGenerator extends MetaGenerator<FlexoModelObject, CGRepository> {
private static final Logger logger = FlexoLogger.getLogger(ResourceGenerator.class.getPackage().getName());
public static final String WO_PROJECT_RELATIVE_PATH = "woproject";
private static final String SETTINGS_RELATIVE_PATH = ".settings";
private static final String[] PATTERNSET_FILE_NAMES = new String[] { "classes.exclude.patternset", "classes.include.patternset",
"resources.exclude.patternset", "resources.include.patternset", "wsresources.exclude.patternset",
"wsresources.include.patternset", "ant.classpaths.wo.wolocalroot.manual", "ant.frameworks.wo.wosystemroot.manual" };
private Hashtable<Language, LocalizedFileGenerator> _localizedGenerator;
private final Hashtable<String, PrototypeProcessBusinessDataSamplesGenerator> _prototypeProcessSamplesGenerator;
private final Hashtable<FileResource, PackagedResourceToCopyGenerator<CGRepository>> _driverGenerator;
private final Hashtable<FileResource, PackagedResourceToCopyGenerator<CGRepository>> _eclipseFilesGenerator;
private JarResourcesGenerator _jarResourcesGenerator;
private WebServerResourcesGenerator _webResourcesGenerator;
private HelpGenerator _helpGenerator;
private PackagedResourceToCopyGenerator<CGRepository> settingsGenerator;
private PrototypeProcessBusinessDataSamplesCreator samplesCreator;
/**
*
*/
public ResourceGenerator(ProjectGenerator prjGenerator) {
super(prjGenerator, null);
_localizedGenerator = new Hashtable<Language, LocalizedFileGenerator>();
_driverGenerator = new Hashtable<FileResource, PackagedResourceToCopyGenerator<CGRepository>>();
_eclipseFilesGenerator = new Hashtable<FileResource, PackagedResourceToCopyGenerator<CGRepository>>();
_prototypeProcessSamplesGenerator = new Hashtable<String, PrototypeProcessBusinessDataSamplesGenerator>();
}
@Override
public ProjectGenerator getProjectGenerator() {
return (ProjectGenerator) super.getProjectGenerator();
}
@Override
public Logger getGeneratorLogger() {
return logger;
}
/**
*
*/
@Override
public void generate(boolean forceRegenerate) throws GenerationException {
startGeneration();
if (logger.isLoggable(Level.INFO)) {
logger.info("Generating resources");
}
getWebResourcesGenerator().generate(forceRegenerate);
getJarResourcesGenerator().generate(forceRegenerate);
if (getTarget() != CodeType.PROTOTYPE) {
for (PackagedResourceToCopyGenerator generator : _driverGenerator.values()) {
generator.generate(forceRegenerate);
}
} else {
for (PrototypeProcessBusinessDataSamplesGenerator generator : _prototypeProcessSamplesGenerator.values()) {
generator.generate(forceRegenerate);
}
}
for (PackagedResourceToCopyGenerator generator : _eclipseFilesGenerator.values()) {
generator.generate(forceRegenerate);
}
if (getProject().getDKVModel(false) != null) {
for (Language lg : getProject().getDKVModel().getLanguages()) {
getGenerator(lg).generate(forceRegenerate);
}
}
if (!getRepository().includeReader()) {
getHelpGenerator().generate(forceRegenerate);
}
settingsGenerator.generate(forceRegenerate);
stopGeneration();
}
@Override
public void buildResourcesAndSetGenerators(CGRepository repository, Vector<CGRepositoryFileResource> resources) {
if (getProject().getDKVModel(false) != null) {
Hashtable<Language, LocalizedFileGenerator> lgHash = new Hashtable<Language, LocalizedFileGenerator>();
for (Language lg : getProject().getDKVModel().getLanguages()) {
if (lg.getIsoCode() != null && lg.isoCodeIsUnique()) {
LocalizedFileGenerator generator = getGenerator(lg);
if (generator != null) {
lgHash.put(lg, generator);
generator.buildResourcesAndSetGenerators(repository, resources);
}
}
}
_localizedGenerator.clear();
_localizedGenerator = lgHash;
}
if (!repository.includeReader()) {
getHelpGenerator().buildResourcesAndSetGenerators(repository, resources);
}
getWebResourcesGenerator().buildResourcesAndSetGenerators(repository, resources);
getJarResourcesGenerator().buildResourcesAndSetGenerators(repository, resources);
if (getTarget() != CodeType.PROTOTYPE) {
FileResource[] drivers = getProject().getDataModel().findDriverFiles();
if (drivers.length > 0) {
for (FileResource wsRes : drivers) {
PackagedResourceToCopyGenerator<CGRepository> generator = getGenerator(wsRes);
if (wsRes == null || !wsRes.exists()) {
continue;
}
refreshSecondaryProgressWindow(FlexoLocalization.localizedForKey("generating") + " " + wsRes.getName(), false);
if (generator != null) {
generator.buildResourcesAndSetGenerators(repository, resources);
} else {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Could not instanciate WebResourceGenerator for " + wsRes);
}
}
}
}
} else {
// Generate Process Instance samples csv files
_prototypeProcessSamplesGenerator.clear();
samplesCreator = null;
for (String businessDataKey : getSamplesCreator().getAllBusinessDataKeys()) {
refreshSecondaryProgressWindow(FlexoLocalization.localizedForKey("generating") + " " + businessDataKey, false);
PrototypeProcessBusinessDataSamplesGenerator generator = getGeneratorForPrototypeProcessSample(businessDataKey);
generator.buildResourcesAndSetGenerators(repository, resources);
}
}
for (int i = 0; i < PATTERNSET_FILE_NAMES.length; i++) {
String s = PATTERNSET_FILE_NAMES[i];
FileResource orig = new FileResource("Config/Generator/Resources/" + s);
PackagedResourceToCopyGenerator<CGRepository> generator = getGeneratorForEclipseResource(orig);
if (orig == null || !orig.exists()) {
continue;
}
refreshSecondaryProgressWindow(FlexoLocalization.localizedForKey("generating") + " " + orig.getName(), false);
if (generator != null) {
generator.buildResourcesAndSetGenerators(repository, resources);
} else {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Could not instanciate PackagedResourceGenerator for " + orig);
}
}
}
if (settingsGenerator == null) {
FileResource orig = new FileResource("Config/Generator/Resources/org.eclipse.core.resources.prefs");
settingsGenerator = new PackagedResourceToCopyGenerator<CGRepository>(getProjectGenerator(), FileFormat.UNKNOWN_BINARY_FILE,
ResourceType.COPIED_FILE, orig, getRepository().getProjectSymbolicDirectory(), SETTINGS_RELATIVE_PATH);
refreshSecondaryProgressWindow(FlexoLocalization.localizedForKey("generating") + " " + orig.getName(), false);
}
settingsGenerator.buildResourcesAndSetGenerators(repository, resources);
}
private LocalizedFileGenerator getGenerator(Language lg) {
if (_localizedGenerator.get(lg) == null) {
_localizedGenerator.put(lg, new LocalizedFileGenerator(getProjectGenerator(), lg));
}
return _localizedGenerator.get(lg);
}
private PrototypeProcessBusinessDataSamplesCreator getSamplesCreator() {
if (samplesCreator == null) {
samplesCreator = new PrototypeProcessBusinessDataSamplesCreator(getProject());
}
return samplesCreator;
}
private PrototypeProcessBusinessDataSamplesGenerator getGeneratorForPrototypeProcessSample(String businessDataKey) {
if (_prototypeProcessSamplesGenerator.get(businessDataKey) == null) {
_prototypeProcessSamplesGenerator.put(businessDataKey, new PrototypeProcessBusinessDataSamplesGenerator(getProjectGenerator(),
businessDataKey, getSamplesCreator()));
}
return _prototypeProcessSamplesGenerator.get(businessDataKey);
}
private PackagedResourceToCopyGenerator<CGRepository> getGenerator(FileResource lg) {
if (_driverGenerator.get(lg) == null) {
_driverGenerator.put(lg, new PackagedResourceToCopyGenerator<CGRepository>(getProjectGenerator(),
FileFormat.UNKNOWN_BINARY_FILE, ResourceType.COPIED_FILE, lg, getProjectGenerator().getRepository()
.getLibSymbolicDirectory(), ""));
}
return _driverGenerator.get(lg);
}
private PackagedResourceToCopyGenerator<CGRepository> getGeneratorForEclipseResource(FileResource lg) {
if (_eclipseFilesGenerator.get(lg) == null) {
_eclipseFilesGenerator.put(lg, new PackagedResourceToCopyGenerator<CGRepository>(getProjectGenerator(),
FileFormat.UNKNOWN_BINARY_FILE, ResourceType.COPIED_FILE, lg, getProjectGenerator().getRepository()
.getProjectSymbolicDirectory(), "woproject"));
}
return _eclipseFilesGenerator.get(lg);
}
private HelpGenerator getHelpGenerator() {
if (_helpGenerator == null) {
_helpGenerator = new HelpGenerator(getProjectGenerator());
}
return _helpGenerator;
}
private WebServerResourcesGenerator getWebResourcesGenerator() {
if (_webResourcesGenerator == null) {
_webResourcesGenerator = new WebServerResourcesGenerator(getProjectGenerator());
}
return _webResourcesGenerator;
}
private JarResourcesGenerator getJarResourcesGenerator() {
if (_jarResourcesGenerator == null) {
_jarResourcesGenerator = new JarResourcesGenerator(getProjectGenerator());
}
return _jarResourcesGenerator;
}
}