/*
* (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.ie;
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.ie.cl.ComponentDefinition;
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.rm.cg.CGRepositoryFileResource;
import org.openflexo.generator.MetaGenerator;
import org.openflexo.generator.ProjectGenerator;
import org.openflexo.generator.exception.GenerationException;
import org.openflexo.generator.utils.StaticComponentGenerator;
import org.openflexo.localization.FlexoLocalization;
/**
* @author gpolet
*
*/
public class ComponentsGenerator extends MetaGenerator<FlexoModelObject, CGRepository> {
private static final Logger logger = Logger.getLogger(ComponentsGenerator.class.getPackage().getName());
private Hashtable<ComponentDefinition, ComponentGenerator> generators;
private Hashtable<PopupComponentDefinition, PopupLinkComponentGenerator> popupLinkGenerators;
private Hashtable<String, StaticComponentGenerator> staticComponentsGenerators;
public ComponentsGenerator(ProjectGenerator projectGenerator) {
super(projectGenerator, null);
generators = new Hashtable<ComponentDefinition, ComponentGenerator>();
popupLinkGenerators = new Hashtable<PopupComponentDefinition, PopupLinkComponentGenerator>();
staticComponentsGenerators = new Hashtable<String, StaticComponentGenerator>();
}
@Override
public ProjectGenerator getProjectGenerator() {
return (ProjectGenerator) super.getProjectGenerator();
}
@Override
public Logger getGeneratorLogger() {
return logger;
}
@Override
public void generate(boolean forceRegenerate) throws GenerationException {
if (logger.isLoggable(Level.FINE)) {
logger.fine("Called ComponentsGenerator.generate(forceRegenerate)");
}
resetSecondaryProgressWindow(generators.values().size() + popupLinkGenerators.size());
startGeneration();
for (PopupLinkComponentGenerator generator : popupLinkGenerators.values()) {
refreshSecondaryProgressWindow(FlexoLocalization.localizedForKey("generating") + " " + generator.getGeneratedComponentName(),
false);
generator.generate(forceRegenerate);
}
for (ComponentGenerator generator : generators.values()) {
refreshSecondaryProgressWindow(FlexoLocalization.localizedForKey("generating") + " " + generator.getGeneratedComponentName(),
false);
generator.generate(forceRegenerate);
}
stopGeneration();
}
@Override
public void buildResourcesAndSetGenerators(CGRepository repository, Vector<CGRepositoryFileResource> resources) {
Hashtable<ComponentDefinition, ComponentGenerator> hash = new Hashtable<ComponentDefinition, ComponentGenerator>();
Hashtable<PopupComponentDefinition, PopupLinkComponentGenerator> links = new Hashtable<PopupComponentDefinition, PopupLinkComponentGenerator>();
for (TabComponentDefinition tcd : getProject().getFlexoComponentLibrary().getTabComponentList()) {
ComponentGenerator generator = getGenerator(tcd);
if (generator != null) {
hash.put(tcd, generator);
generator.buildResourcesAndSetGenerators(repository, resources);
} else {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Could not instanciate ComponentGenerator for " + tcd);
}
}
}
for (PopupComponentDefinition pcd : getProject().getFlexoComponentLibrary().getPopupsComponentList()) {
if (pcd.isHelper()) {
continue;
}
PopupLinkComponentGenerator linkGenerator = getPopupLinkGenerator(pcd);
if (linkGenerator != null) {
links.put(pcd, linkGenerator);
linkGenerator.buildResourcesAndSetGenerators(repository, resources);
} else {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Could not instanciate ComponentGenerator for " + pcd);
}
}
ComponentGenerator generator = getGenerator(pcd);
if (generator != null) {
hash.put(pcd, generator);
generator.buildResourcesAndSetGenerators(repository, resources);
} else {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Could not instanciate ComponentGenerator for " + pcd);
}
}
}
for (OperationComponentDefinition ocd : getProject().getFlexoComponentLibrary().getOperationsComponentList()) {
ComponentGenerator generator = getGenerator(ocd);
if (generator != null) {
hash.put(ocd, generator);
generator.buildResourcesAndSetGenerators(repository, resources);
} else {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Could not instanciate ComponentGenerator for " + ocd);
}
}
}
if (getTarget() == CodeType.PROTOTYPE) {
// Add page to manage samples
StaticComponentGenerator generator = getStaticComponentGenerator("PrototypeSamplesAdminPage", "PrototypeSamplesAdminPage");
if (generator != null) {
generator.buildResourcesAndSetGenerators(repository, resources);
} else {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Could not instanciate StaticComponentGenerator for PrototypeSamplesAdminPage");
}
}
}
generators.clear();
popupLinkGenerators.clear();
generators = hash;
popupLinkGenerators = links;
}
protected ComponentGenerator getGenerator(ComponentDefinition def) {
ComponentGenerator returned = generators.get(def);
if (returned == null) {
if (def instanceof OperationComponentDefinition) {
generators.put(def, returned = new PageComponentGenerator(getProjectGenerator(), (OperationComponentDefinition) def));
} else if (def instanceof PopupComponentDefinition) {
generators.put(def, returned = new PopupComponentGenerator(getProjectGenerator(), (PopupComponentDefinition) def));
} else if (def instanceof TabComponentDefinition) {
generators.put(def, returned = new TabComponentGenerator(getProjectGenerator(), (TabComponentDefinition) def));
}
}
return returned;
}
protected PopupLinkComponentGenerator getPopupLinkGenerator(PopupComponentDefinition def) {
PopupLinkComponentGenerator returned = popupLinkGenerators.get(def);
if (returned == null) {
popupLinkGenerators.put(def, returned = new PopupLinkComponentGenerator(getProjectGenerator(), def));
}
return returned;
}
protected StaticComponentGenerator getStaticComponentGenerator(String templateNamePrefix, String componentName) {
StaticComponentGenerator returned = staticComponentsGenerators.get(componentName);
if (returned == null) {
returned = new StaticComponentGenerator(getProjectGenerator(), templateNamePrefix, componentName);
staticComponentsGenerators.put(componentName, returned);
}
return returned;
}
}