package net.sf.minuteProject.application; import java.io.InputStream; import java.net.URL; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.digester.Digester; import org.apache.commons.digester.xmlrules.DigesterLoader; import org.apache.commons.lang.StringUtils; import org.apache.ddlutils.model.Database; import org.apache.log4j.Logger; import org.apache.velocity.VelocityContext; import net.sf.minuteProject.configuration.bean.AbstractConfiguration; import net.sf.minuteProject.configuration.bean.BusinessModel; import net.sf.minuteProject.configuration.bean.Configuration; import net.sf.minuteProject.configuration.bean.FunctionModel; import net.sf.minuteProject.configuration.bean.GeneratorBean; import net.sf.minuteProject.configuration.bean.Model; import net.sf.minuteProject.configuration.bean.Package; import net.sf.minuteProject.configuration.bean.Target; import net.sf.minuteProject.configuration.bean.Targets; import net.sf.minuteProject.configuration.bean.Template; import net.sf.minuteProject.configuration.bean.TemplateTarget; import net.sf.minuteProject.configuration.bean.enrichment.Action; import net.sf.minuteProject.configuration.bean.model.data.Column; import net.sf.minuteProject.configuration.bean.model.data.Component; import net.sf.minuteProject.configuration.bean.model.data.Function; import net.sf.minuteProject.configuration.bean.model.data.Table; import net.sf.minuteProject.configuration.bean.model.data.constant.Direction; import net.sf.minuteProject.configuration.bean.model.webservice.Entity; import net.sf.minuteProject.configuration.bean.service.Scope; import net.sf.minuteProject.configuration.bean.system.Plugin; import net.sf.minuteProject.configuration.bean.view.Service; import net.sf.minuteProject.configuration.bean.view.View; import net.sf.minuteProject.exception.MinuteProjectException; import net.sf.minuteProject.integration.bean.BasicIntegrationConfiguration; import net.sf.minuteProject.loader.target.TargetHolder; import net.sf.minuteProject.plugin.format.I18nUtils; import net.sf.minuteProject.utils.BslaLibraryUtils; import net.sf.minuteProject.utils.BslaViewLibraryUtils; import net.sf.minuteProject.utils.ColumnUtils; import net.sf.minuteProject.utils.CommonUtils; import net.sf.minuteProject.utils.ConvertUtils; import net.sf.minuteProject.utils.DatabaseUtils; import net.sf.minuteProject.utils.EnumUtils; import net.sf.minuteProject.utils.FormatUtils; import net.sf.minuteProject.utils.ModelUtils; import net.sf.minuteProject.utils.ReferenceUtils; import net.sf.minuteProject.utils.ServiceUtils; import net.sf.minuteProject.utils.SqlUtils; import net.sf.minuteProject.utils.TableUtils; import net.sf.minuteProject.utils.TemplateUtils; import net.sf.minuteProject.utils.TestUtils; import net.sf.minuteProject.utils.URLUtils; import net.sf.minuteProject.utils.ViewUtils; import net.sf.minuteProject.utils.WebUtils; import net.sf.minuteProject.utils.io.UpdatedAreaUtils; /** * @author Florian Adler * */ public class WsdlGenerator extends AbstractGenerator { private static Logger logger = Logger.getLogger(ModelGenerator.class); public static final String GENERATOR_MODEL_RULES = "net/sf/minuteProject/configuration/model-config-rules.xml"; public static final String GENERATOR_MODEL_PROPERTY_RULES = "net/sf/minuteProject/configuration/model-property-config-rules.xml"; /* * context object */ private CommonUtils commonUtils = new CommonUtils(); private ConvertUtils convertUtils = new ConvertUtils(); private ColumnUtils columnUtils = new ColumnUtils(); private ViewUtils viewUtils = new ViewUtils(); private FormatUtils formatUtils = new FormatUtils(); private BslaLibraryUtils bslaLibraryUtils = new BslaLibraryUtils(); private DatabaseUtils databaseUtils = new DatabaseUtils(); private ModelUtils modelUtils = new ModelUtils(); private URLUtils urlUtils = new URLUtils(); private TestUtils testUtils = new TestUtils(); private WebUtils webUtils = new WebUtils(); private SqlUtils sqlUtils = new SqlUtils(); private TableUtils tableUtils = new TableUtils(); private ReferenceUtils referenceUtils = new ReferenceUtils(); private EnumUtils enumUtils = new EnumUtils(); private I18nUtils i18nUtils = new I18nUtils(); private UpdatedAreaUtils updatedAreaUtils = new UpdatedAreaUtils(); private Model model; private String modelConfig; public String getModelConfig() { return modelConfig; } public void setModelConfig(String modelConfig) { this.modelConfig = modelConfig; } /** * Constructs the generator with its configuration * * @param configurationFile */ public WsdlGenerator(String configurationFile) { super(configurationFile); } public WsdlGenerator(BasicIntegrationConfiguration bic) { super(bic); } @Override public AbstractConfiguration getConfigurationRoot() { return new Configuration(); } @Override public String getConfigurationRulesFile() { return GENERATOR_MODEL_RULES; } @Override public String getPropertyConfigurationRulesFile() { return GENERATOR_MODEL_PROPERTY_RULES; } public void generate() throws MinuteProjectException { Configuration configuration = (Configuration) load(); generate(configuration); } protected void generate (Configuration configuration) throws MinuteProjectException { Model model = configuration.getModel(); setModel(model); load(model); // applyConventions(model); // applyLimitations(model); if (hasTarget()) loadAndGenerate(model.getConfiguration().getTarget()); if (hasTargets()) loadAndGenerate(model.getConfiguration().getTargets()); } private void applyLimitations(Model model) { model.getBusinessModel().applyLimitations(); } protected void applyConventions (Model model) { model.getBusinessModel().applyConventions(); } protected boolean hasTarget () { return model.getConfiguration().hasTarget(); } protected boolean hasTargets () { return model.getConfiguration().hasTargets(); } protected void loadAndGenerate (Target target) throws MinuteProjectException { loadTarget(model.getConfiguration(), target); applyTargetConventionAndGenerate(model.getConfiguration().getTarget()); } protected void loadAndGenerate (Targets targets) throws MinuteProjectException { Target targetFinal = new Target(); Configuration configuration = model.getConfiguration(); for (Target target : targets.getTargets()) { // TargetHolder targetHolder = new TargetHolder(); loadTarget(configuration, target); configuration.getTarget().setIsGenerable(target.isGenerable()); // generate(configuration.getTarget()); // targetHolder.setTarget(model.getConfiguration().getTarget()); targetFinal.complement(configuration.getTarget()); targetFinal.complementAdditional (target); configuration.setTarget(new Target()); } configuration.setTarget(targetFinal); applyTargetConventionAndGenerate(configuration.getTarget()); // for (Target target : targets.getTargets()) { // complementWithTargetInfo(configuration, target); // System.out.println("---"); // generate(configuration.getTarget()); // } // targets.getAbstractConfigurationRoot().setTarget(targetHolder); } private void applyTargetConventionAndGenerate (Target target) throws MinuteProjectException { applyTargetConvention(target); generate(target); } private void applyTargetConvention(Target target) { model.getConfiguration().applyConventions(); } protected void load(Model model) { model.getWebServiceModel().load(); } /* * (non-Javadoc) * * @see net.sf.minuteProject.application.Generator#generate(net.sf.minuteProject.configuration.bean.Template) */ public void generate(Template template) throws MinuteProjectException { if (SCOPE_WSDL.equals(template.getScopeSpecificValue())) generateArtifactsByWsdl(template); if (SCOPE_WSDL_ENTITY.equals(template.getScopeSpecificValue())) generateArtifactsByWsdlEntity(template); if (SCOPE_WSDL_SERVICE.equals(template.getScopeSpecificValue())) generateArtifactsByWsdlService(template); } private void generateArtifactsByWsdl(Template template) throws MinuteProjectException { writeTemplateResult(getModel().getWebServiceModel().getWsdlModel(), template); } private void generateArtifactsByWsdlEntity(Template template) throws MinuteProjectException { List<Entity> entities = getModel().getWebServiceModel().getWsdlModel().getEntityModel().getEntities(); for (Entity entity : entities) writeTemplateResult(entity, template); } private void generateArtifactsByWsdlService(Template template) throws MinuteProjectException { List<net.sf.minuteProject.configuration.bean.model.webservice.Service> services = getModel().getWebServiceModel().getWsdlModel().getServices(); for (net.sf.minuteProject.configuration.bean.model.webservice.Service service : services) writeTemplateResult(service, template); } public Model getModel() { return model; } public void setModel(Model model) { this.model = model; } protected void writeTemplateResult(GeneratorBean bean, Template template) throws MinuteProjectException { // enable cache bean.enableCache(); //velocity bean manipulation String outputFilename = template.getGeneratorOutputFileNameForConfigurationBean(bean, template); //context VelocityContext context = getVelocityContext(template); Map<String,String> updatedAreas = TemplateUtils.getUpdatedAreas(template, bean); if (updatedAreas!=null) if (updatedAreas.containsKey(UpdatedAreaUtils.MP_MANAGED_STOP_GENERATING)) return; //stop generating directive context.put("updatedAreas", updatedAreas); String beanName = getAbstractBeanName(bean); context.put(beanName, bean); if (bean instanceof Component) { Component component = (Component) bean; Table table = component.getTable(); context.put("table", table); } if (bean instanceof Function) { context.put("table", bean); } if (beanName.equals("view")) context.put("table", bean); context.put("template", template); putCommonContextObject(context, template); // try { produce(context, template, outputFilename); } catch (Exception ex) { logger.error("ERROR on template "+template.getName()+" - on bean "+bean.getName()); ex.printStackTrace(); throwException(ex, "ERROR : "+ex.getMessage()); // logger.error("ERROR : "+ex.getMessage()); // throw ex; } } protected void putCommonContextObject(VelocityContext context, Template template) { putStandardContextObject(context); putPluginContextObject(context, template); context.put("model", model); } // protected void putPluginContextObject (VelocityContext context, Template template) { // List <Plugin> plugins = template.getTemplateTarget().getTarget().getPlugins(); // for (Plugin plugin : plugins) { // ClassLoader cl = ClassLoader.getSystemClassLoader(); // try { // Class clazz = cl.loadClass(plugin.getClassName()); // Object velocityObject = clazz.newInstance(); // context.put(plugin.getName(), velocityObject); // } catch (ClassNotFoundException e) { // logger.info("cannot find plugin "+plugin.getName()+" via class "+plugin.getClassName()); // e.printStackTrace(); // } catch (InstantiationException e) { // logger.info("cannot instantiate plugin "+plugin.getName()+" via class "+plugin.getClassName()); // } catch (IllegalAccessException e) { // logger.info("cannot access plugin "+plugin.getName()+" via class "+plugin.getClassName()); // } // } // } protected void putStandardContextObject (VelocityContext context) { super.putStandardContextObject(context); context.put("convertUtils", getConvertUtils()); context.put("commonUtils", getCommonUtils()); context.put("columnUtils", getColumnUtils()); context.put("viewUtils", getViewUtils()); context.put("formatUtils", getFormatUtils()); context.put("bslaLibraryUtils", getBslaLibraryUtils()); context.put("databaseUtils", getDatabaseUtils()); context.put("modelUtils", getModelUtils()); context.put("URLUtils", getUrlUtils()); context.put("TestUtils", getTestUtils()); context.put("WebUtils", getWebUtils()); context.put("sqlUtils", getSqlUtils()); context.put("tableUtils", getTableUtils()); context.put("testUtils", getTestUtils()); context.put("referenceUtils", referenceUtils); context.put("enumUtils", enumUtils); context.put("i18nUtils", i18nUtils); context.put("updatedAreaUtils", updatedAreaUtils); } public BslaLibraryUtils getBslaLibraryUtils() { if (bslaLibraryUtils==null) bslaLibraryUtils = new BslaLibraryUtils(); return bslaLibraryUtils; } public ColumnUtils getColumnUtils() { if (columnUtils==null) columnUtils = new ColumnUtils(); return columnUtils; } public CommonUtils getCommonUtils() { if (commonUtils==null) commonUtils = new CommonUtils(); return commonUtils; } public ConvertUtils getConvertUtils() { if (convertUtils == null) convertUtils = new ConvertUtils(); return convertUtils; } public DatabaseUtils getDatabaseUtils() { if (databaseUtils == null) databaseUtils = new DatabaseUtils(); return databaseUtils; } public FormatUtils getFormatUtils() { if (formatUtils == null) formatUtils = new FormatUtils(); return formatUtils; } public ModelUtils getModelUtils() { if (modelUtils == null) modelUtils = new ModelUtils(); return modelUtils; } public SqlUtils getSqlUtils() { if (sqlUtils == null) sqlUtils = new SqlUtils(); return sqlUtils; } public TableUtils getTableUtils() { if (tableUtils == null) tableUtils = new TableUtils(); return tableUtils; } public TestUtils getTestUtils() { if (testUtils == null) testUtils = new TestUtils(); return testUtils; } public URLUtils getUrlUtils() { if (urlUtils == null) urlUtils = new URLUtils(); return urlUtils; } public ViewUtils getViewUtils() { if (viewUtils == null) viewUtils = new ViewUtils(); return viewUtils; } public WebUtils getWebUtils() { if (webUtils == null) webUtils = new WebUtils(); return webUtils; } /* * private getter of the context object */ public static void main(String args[]) { String config; if (args.length < 1) { System.exit(1); } config = args[0]; Date startDate = new Date(); logger.info("start time = "+new Date()); WsdlGenerator generator = new WsdlGenerator(config); try { generator.generate(); } catch (MinuteProjectException e) { generator.exit (""); } Date endDate = new Date(); logger.info("time taken : "+(endDate.getTime()-startDate.getTime())/1000+ "s."); } }