Update of 
/cvsroot/xdoclet-plugins/xdoclet-plugins/plugin-jdo/src/main/java/org/xdoclet/plugin/jdo
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27014

Added Files:
        Class.jelly Field.jelly JdoPlugin.jelly Package.jelly 
        JdoPlugin.java JdoProperty.java 
Log Message:
Add initial version of JDO plugin

--- NEW FILE: JdoPlugin.jelly ---
<?xml version="1.0" encoding="UTF-8"?>

<j:jelly xmlns:j="jelly:core" xmlns:x="jelly:xml">
  <x:doctype
      name="jdo"
      publicId="-//Sun Microsystems, Inc.//DTD Java Data Objects Metadata 
2.0//EN"
      systemId="http://java.sun.com/dtd/jdo_2_0.dtd";
      trim="true"
      />
  <j:set var="class" value="${metadata}"/>

  <jdo>
    <j:import uri="org/xdoclet/plugin/jdo/Package.jelly" inherit="true"/>
  </jdo>
</j:jelly>

--- NEW FILE: Class.jelly ---
<?xml version="1.0" encoding="UTF-8"?>

<j:jelly xmlns:j="jelly:core">
    <j:set var="classTag" value="${class.getTagByName('jdo.class')}"/>

    <class name="${class.name}" identity-type="${classTag.identityType}" 
detachable="${classTag.detachable}"
        embedded-only="${classTag.embeddedOnly}" 
objectid-class="${classTag.objectidClass}"
        persistence-modifier="${classTag.persistenceModifier}" 
requires-extent="${classTag.requiresExtent}"
        table="${classTag.table}">
        <j:forEach var="field" items="${plugin.getClassProperties(class)}">
<!--        <j:forEach var="fieldTag" 
items="${class.getTagsByName('jdo.field')}">-->
            <j:import uri="org/xdoclet/plugin/jdo/Field.jelly" inherit="true"/>
        </j:forEach>
    </class>
</j:jelly>
--- NEW FILE: Field.jelly ---
<?xml version="1.0" encoding="UTF-8"?>

<j:jelly xmlns:j="jelly:core">
    <j:set var="fieldTag" value="${field.entity.getTagByName('jdo.field')}"/>
    <field name="${field.name}"
        persistence-modifier="${fieldTag.persistenceModifier}"
        column="${fieldTag.column}"
        default-fetch-group="${fieldTag.defaultFetchGroup}"
        delete-action="${fieldTag.deleteAction}"
        dependent="${fieldTag.dependent}"
        embedded="${fieldTag.embedded}"
        fetch-depth="${fieldTag.fetchDepth}"
        foreign-key="${fieldTag.foreignKey}"
        indexed="${fieldTag.indexed}"
        load-fetch-group="${fieldTag.loadFetchGroup}"
        null-value="${fieldTag.nullValue}"
        primary-key="${fieldTag.primaryKey}"
        sequence="${fieldTag.sequence}"
        serialized="${fieldTag.serialized}"
        table="${fieldTag.table}"
        unique="${fieldTag.unique}"
        value-strategy="${fieldTag.valueStrategy}">
    </field>
</j:jelly>
--- NEW FILE: JdoPlugin.java ---
/*
 * Copyright (c) 2003
 * XDoclet Team
 * All rights reserved.
 */
package org.xdoclet.plugin.jdo;

import java.util.*;

import org.generama.JellyTemplateEngine;
import org.generama.QDoxCapableMetadataProvider;
import org.generama.WriterMapper;

import org.generama.defaults.QDoxPlugin;

import org.xdoclet.plugin.jdo.qtags.TagLibrary;

import com.thoughtworks.qdox.model.AbstractJavaEntity;
import com.thoughtworks.qdox.model.BeanProperty;
import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaField;

/**
 * DOCUMENT ME!
 *
 * @author Anatol Pomozov
 * @version $Revision: 1.1 $
 */
public class JdoPlugin extends QDoxPlugin {
    // list holding tag names defining property existence
    private static final List PROPERTY_TAGS = new ArrayList();

    static {
        PROPERTY_TAGS.add("jdo.field");
    }

    public JdoPlugin(JellyTemplateEngine jellyTemplateEngine, 
QDoxCapableMetadataProvider metadataProvider,
        WriterMapper writerMapper) {
        super(jellyTemplateEngine, metadataProvider, writerMapper);
        setFileregex("\\.java");
        setFilereplace("\\.jdo.xml");
        setMultioutput(true);
        new TagLibrary(metadataProvider);
    }

    /**
     * provide list of hibernate properties for class. it could be getter, as 
well as
     * field ( for direct property access )
     *
     * @param clazz DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public List getClassProperties(JavaClass clazz) {
        List retval = new ArrayList();
        getProperties(clazz, PROPERTY_TAGS, retval);
        return retval;
    }

    /**
     * provide list of valid property tags
     *
     * @return DOCUMENT ME!
     */
    public List getPropertyTagList() {
        return PROPERTY_TAGS;
    }

    public boolean shouldGenerate(Object metadata) {
        JavaClass clazz = (JavaClass) metadata;
        return clazz.getTagByName("jdo.class") != null;
    }

    /**
     * gather hibernate propertis from given class into list
     *
     * @param clazz DOCUMENT ME!
     * @param requierdTags DOCUMENT ME!
     * @param accumulate DOCUMENT ME!
     */
    private void getProperties(JavaClass clazz, Collection requierdTags, List 
accumulate) {
        // walk through property getters
        BeanProperty[] beanProperties = clazz.getBeanProperties();
        JdoProperty property;

        for (int i = 0; i < beanProperties.length; i++) {
            // property is ours, if we have at least one of designated property
            // tags
            // and there is accessor
            if ((beanProperties[i] != null) && (beanProperties[i].getAccessor() 
!= null) &&
                    !getTags(beanProperties[i].getAccessor(), 
requierdTags).isEmpty()) {
                property = new JdoProperty();
                property.setName(beanProperties[i].getName());
                property.setEntity(beanProperties[i].getAccessor());

                if (!accumulate.contains(property)) {
                    accumulate.add(property);
                }
            }
        }

        JavaField[] fields = clazz.getFields();

        for (int i = 0; i < fields.length; i++) {
            if (!getTags(fields[i], requierdTags).isEmpty()) {
                property = new JdoProperty();
                property.setName(fields[i].getName());
                property.setEntity(fields[i]);
                property.setAccess("field");

                if (!accumulate.contains(property)) {
                    accumulate.add(property);
                }
            }
        }
    }

    /**
     * provide combined list of all the tags with given tag names
     *
     * @param metadata DOCUMENT ME!
     * @param tagNames DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    private List getTags(AbstractJavaEntity metadata, Collection tagNames) {
        List al = new ArrayList();

        for (Iterator iter = tagNames.iterator(); iter.hasNext();) {
            al.addAll(Arrays.asList(metadata.getTagsByName((String) 
iter.next())));
        }

        return al;
    }
}
--- NEW FILE: Package.jelly ---
<?xml version="1.0" encoding="UTF-8"?>

<j:jelly xmlns:j="jelly:core" xmlns:x="jelly:xml">
  <package name="${class.package}">
    <j:import uri="org/xdoclet/plugin/jdo/Class.jelly" inherit="true"/>
  </package>
</j:jelly>

--- NEW FILE: JdoProperty.java ---
/*
 * Copyright (c) 2003
 * XDoclet Team
 * All rights reserved.
 */
package org.xdoclet.plugin.jdo;

import com.thoughtworks.qdox.model.AbstractJavaEntity;
import com.thoughtworks.qdox.model.JavaField;
import com.thoughtworks.qdox.model.JavaMethod;
import com.thoughtworks.qdox.model.Type;

/**
 * DOCUMENT ME!
 *
 * @author Anatol Pomozov
 */
public class JdoProperty {
    private AbstractJavaEntity entity;
    private String access;
    private String name;

    public void setAccess(String access) {
        this.access = access;
    }

    public String getAccess() {
        return access;
    }

    public void setEntity(AbstractJavaEntity entity) {
        this.entity = entity;
    }

    public AbstractJavaEntity getEntity() {
        return entity;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    /**
     * retrtieve corresponding type from property
     *
     * @return DOCUMENT ME!
     */
    public Type getType() {
        final AbstractJavaEntity en = getEntity();

        if (en instanceof JavaMethod) {
            return ((JavaMethod) en).getReturns();
        } else if (en instanceof JavaField) {
            return ((JavaField) en).getType();
        } else {
            return Type.VOID;
        }
    }

    /**
     * puprose of this equality method is to allow proprety overriding 
properties are
     * equal, if they have the same name, regardless of access. Since we build 
property
     * map from top to bottom of class hierarchy, we will reflect java behaviour
     *
     * @param o DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public boolean equals(Object o) {
        if (o == null) {
            return false;
        }

        if (!(o instanceof JdoProperty)) {
            return false;
        }

        if (getName() != null) {
            return getName().equals(((JdoProperty) o).getName());
        }

        return false;
    }

    public int hashCode() {
        if (getName() != null) {
            return getName().hashCode();
        }

        return super.hashCode();
    }

    public String toString() {
        return "[" + this.name + "][" + this.access + "]";
    }
}


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
xdoclet-plugins-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xdoclet-plugins-commits

Reply via email to