Update of /cvsroot/xdoclet/xdoclet/modules/hibernate/src/xdoclet/modules/hibernate In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3952/modules/hibernate/src/xdoclet/modules/hibernate
Modified Files: HibernateSubTask.java HibernateTagsHandler.java Log Message: XDT-1196: support for specifying hibernate mapping files Index: HibernateSubTask.java =================================================================== RCS file: /cvsroot/xdoclet/xdoclet/modules/hibernate/src/xdoclet/modules/hibernate/HibernateSubTask.java,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -r1.15 -r1.16 *** HibernateSubTask.java 8 Aug 2005 15:02:28 -0000 1.15 --- HibernateSubTask.java 11 Apr 2006 15:01:12 -0000 1.16 *************** *** 5,14 **** --- 5,31 ---- package xdoclet.modules.hibernate; + import java.io.File; import java.text.MessageFormat; + import java.util.Collection; + import java.util.Iterator; + + import org.apache.commons.collections.MultiHashMap; + import org.apache.commons.collections.MultiMap; + import org.apache.commons.logging.Log; import xjavadoc.XClass; + import xjavadoc.XDoc; + import xjavadoc.XJavaDoc; + import xjavadoc.XPackage; + import xjavadoc.XTag; + import xdoclet.TemplateSubTask; import xdoclet.XDocletException; + import xdoclet.XDocletMessages; import xdoclet.XmlSubTask; + import xdoclet.tagshandler.PackageTagsHandler; + import xdoclet.template.TemplateEngine; + import xdoclet.template.TemplateException; + import xdoclet.util.LogUtil; import xdoclet.util.Translator; *************** *** 67,70 **** --- 84,89 ---- private String hibernateVersion = HibernateVersion.HIBERNATE_1_1; + private boolean generationPerClass = true; + //~ Constructors ................................................................................................... *************** *** 118,122 **** public void execute() throws XDocletException { - if (hibernateVersion.equals(HibernateVersion.HIBERNATE_1_1)) { setPublicId(HIBERNATE_PUBLICID_11); --- 137,140 ---- *************** *** 135,139 **** setDtdURL(getClass().getResource(DTD_FILE_NAME_30)); } ! startProcess(); } --- 153,158 ---- setDtdURL(getClass().getResource(DTD_FILE_NAME_30)); } ! generationPerClass = true; ! startUserFileMappingProcess(); } *************** *** 143,155 **** * Called when the engine is started * ! * @exception XDocletException Thrown in case of problem */ - protected void engineStarted() - throws XDocletException - { - System.out.println(Translator.getString(XDocletModulesHibernateMessages.class, - XDocletModulesHibernateMessages.GENERATING_HIBERNATE_FOR, - new String[]{getCurrentClass().getQualifiedName()})); - } /** --- 162,167 ---- * Called when the engine is started * ! * @return */ /** *************** *** 164,167 **** --- 176,316 ---- /** + * Always set false for Hibernate + * + * @return The GenerationPerClass value + */ + private boolean isGenerationPerClass() + { + return generationPerClass; + } + + private void startUserFileMappingProcess() throws XDocletException + { + Log log = LogUtil.getLog(HibernateSubTask.class, "startUserFileMappingProcess"); + + Collection classes; + MultiMap mapFiles = new MultiHashMap(); + XJavaDoc xjavadoc = getXJavaDoc(); + + generationPerClass = false; + + xjavadoc.setUseNodeParser(false); + if (processInnerClasses()) { + classes = xjavadoc.getSourceClasses(); + } + else { + classes = xjavadoc.getSourceClasses(new XJavaDoc.NoInnerClassesPredicate()); + } + + // First, look through all source classes and find out the mapping file + // that they should be written to. + + for (Iterator i = classes.iterator(); i.hasNext(); ) { + XClass clazz = (XClass) i.next(); + + if (log.isDebugEnabled()) { + log.debug("Checking for mapping target, class: " + clazz); + } + + XDoc doc = clazz.getDoc(); + + // First decision point: if there is a hibernate.mapping tag + // then a new mapping file will be generated for this source file. + if (doc.hasTag("hibernate.mapping")) { + if (log.isDebugEnabled()) { + log.debug("class " + clazz + " has mapping tag"); + } + + XTag tag = doc.getTag("hibernate.mapping"); + String file = null; + + // If the hibernate.mapping tag specifies the name of the + // mapping file to generate, use that name. Otherwise, + // determine the mapping file name based on the source + // class name. + if (tag.getAttributeNames().contains("file")) { + if (log.isDebugEnabled()) { + log.debug("class has mapping file attribute"); + } + + XPackage pak = clazz.getContainingPackage(); + String package_structure = null; + + if (isPrefixWithPackageStructure() == true) + package_structure = PackageTagsHandler.packageNameAsPathFor(pak); + else + package_structure = null; + + String packageName = isPackageSubstitutionInheritanceSupported() == true ? package_structure : null; + String name = tag.getAttributeValue("file"); + String destinationFile = MessageFormat.format(getDestinationFile(), new Object[]{name}); + + if (log.isDebugEnabled()) { + log.debug("packageName: " + packageName); + log.debug("destinationFile: " + packageName); + log.debug("destDir: " + getDestDir()); + } + file = new File(packageName, destinationFile).toString(); + } + else { + if (log.isDebugEnabled()) { + log.debug("class does not have mapping file attribute"); + log.debug("generatedFileName: " + getGeneratedFileName(clazz)); + log.debug("destDir: " + getDestDir()); + } + file = getGeneratedFileName(clazz); + } + // Add the class to the collection of source classes that + // will be mapped to this mapping file. It's quite possible + // for many classes to be mapped to a single mapping file, + // so a multimap is used to keep track of all classes that + // belong to each mapping file. + mapFiles.put(file, clazz); + } + else { + // The class does not have a mapping tag, but we will map it + // if it has a class, query, or sql-query tag. + if (log.isDebugEnabled()) { + log.debug("class does not have mapping tag"); + } + // if (matchesGenerationRules(clazz)) { + if (doc.hasTag("hibernate.class") || doc.hasTag("hibernate.query") || doc.hasTag("hibernate.sql-query")) { + if (log.isDebugEnabled()) { + // log.debug("class matches generation rules"); + log.debug("class has class, query, or sql-query tag"); + log.debug("generatedFileName: " + getGeneratedFileName(clazz)); + log.debug("destDir: " + getDestDir()); + } + + String file = getGeneratedFileName(clazz); + + mapFiles.put(file, clazz); + } + } + } + + // Now that the mapping files have all been determined, loop through + // them and generate each one. + for (Iterator i = mapFiles.keySet().iterator(); i.hasNext(); ) { + String file = (String) i.next(); + + setDestinationFile(file); + + if (log.isDebugEnabled()) { + log.debug("file=" + file); + } + + // Set the collection of classes that belong in this current + // mapping file. + // + // TODO: there's got to be a better way to do this, without + // a static var in HibernateTagsHandler! + HibernateTagsHandler.setMappedClasses((Collection) mapFiles.get(file)); + + startProcess(); + } + } + + /** * @author <a href="mailto:[EMAIL PROTECTED]">Matt Raible</a> * @created February 23, 2003 *************** *** 186,188 **** --- 335,338 ---- } } + } Index: HibernateTagsHandler.java =================================================================== RCS file: /cvsroot/xdoclet/xdoclet/modules/hibernate/src/xdoclet/modules/hibernate/HibernateTagsHandler.java,v retrieving revision 1.46 retrieving revision 1.47 diff -C2 -r1.46 -r1.47 *** HibernateTagsHandler.java 9 Jan 2006 01:31:31 -0000 1.46 --- HibernateTagsHandler.java 11 Apr 2006 15:01:12 -0000 1.47 *************** *** 40,43 **** --- 40,49 ---- { + // This is a collection of all the classes that belong in + // the 'current' mapping file. + // + // TODO: there's got to be a better way! + private static Collection mappedClasses; + // prefix for @hibernate.component columns private LinkedList columnPrefixes = new LinkedList(); *************** *** 53,56 **** --- 59,72 ---- private Parameter currentOtherMapping; + public static Collection getMappedClasses() + { + return mappedClasses; + } + + public static void setMappedClasses(Collection mappedClasses) + { + HibernateTagsHandler.mappedClasses = mappedClasses; + } + /** * Returns full path of hibernate file for the current class. *************** *** 469,472 **** --- 485,515 ---- /** + * Iterates over all classes to be mapped in current mapping file. + * + * @param template The body of the block tag + * @param attributes The attributes of the template tag + * @exception XDocletException Description of Exception + * @doc.tag type="block" + */ + public void forAllMappedClasses(String template, Properties attributes) throws XDocletException + { + Log log = LogUtil.getLog(HibernateTagsHandler.class, "forAllMappedClasses"); + + if (log.isDebugEnabled()) { + log.debug("Mapped classes are: " + mappedClasses.toString()); + } + + Iterator i = mappedClasses.iterator(); + + while (i.hasNext()) { + XClass clazz = (XClass) i.next(); + + pushCurrentClass(clazz); + generate(template); + popCurrentClass(); + } + } + + /** * Iterates over all classes marked as persistent. * ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ xdoclet-devel mailing list xdoclet-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/xdoclet-devel