Package org.jvnet.jaxb2_commons.javaforkmlapi.fluent

Source Code of org.jvnet.jaxb2_commons.javaforkmlapi.fluent.CreateConstructors

// ///////////////////////////////////////////////////////////////////////////
//
// $RCSfile: $
//
// Project JaxbPluginJavaForKmlApi
//
// Author Flori (f.bachmann@micromata.de)
// Created 20.03.2009
// Copyright Micromata 20.03.2009
//
// $Id: $
// $Revision: $
// $Date: $
//
// ///////////////////////////////////////////////////////////////////////////
package org.jvnet.jaxb2_commons.javaforkmlapi.fluent;

import java.util.Collection;
import java.util.Map;

import org.apache.log4j.Logger;
import org.jvnet.jaxb2_commons.javaforkmlapi.ClazzPool;
import org.jvnet.jaxb2_commons.javaforkmlapi.Util;
import org.jvnet.jaxb2_commons.javaforkmlapi.XJCJavaForKmlApiPlugin;
import org.jvnet.jaxb2_commons.javaforkmlapi.command.Command;
import org.xml.sax.ErrorHandler;

import com.sun.codemodel.JExpr;
import com.sun.codemodel.JFieldVar;
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JMod;
import com.sun.codemodel.JVar;
import com.sun.tools.xjc.Options;
import com.sun.tools.xjc.generator.bean.ClassOutlineImpl;
import com.sun.tools.xjc.outline.ClassOutline;
import com.sun.tools.xjc.outline.FieldOutline;
import com.sun.tools.xjc.outline.Outline;

public class CreateConstructors extends Command {
  private static final Logger LOG = Logger.getLogger(CreateConstructors.class.getName());

  public CreateConstructors(final Outline outline, final Options opts, final ErrorHandler errorHandler, final ClazzPool pool) {
    super(outline, opts, errorHandler, pool);
  }

  @Override
  public void execute() {
    LOG.info(XJCJavaForKmlApiPlugin.PLUGINNAME + " generate Overloaded Constructors for required fields.");
    for (final ClassOutline classOutline : outline.getClasses()) {
      final ClassOutlineImpl cc = (ClassOutlineImpl) classOutline;
      if (cc.implClass.name().equals("Coordinate")) {
        LOG.info(XJCJavaForKmlApiPlugin.PLUGINNAME + " skip Coordinate standard constructors and create custom ones");
        continue;
      }
      final Collection<JFieldVar> requiredConstructorFields = Util.getConstructorRequiredFields(cc);
      int mods = JMod.PUBLIC;
      if (requiredConstructorFields.size() > 0) {
        createArgConstructor(cc, requiredConstructorFields);
        mods = JMod.PRIVATE;
        // continue;
      }

      createNoArgConstructor(cc, mods);
    }
  }

  private void createNoArgConstructor(final ClassOutline classOutline, final int mods) {
    // Create the default, no-arg constructor
    final JMethod defaultConstructor = classOutline.implClass.constructor(mods);
    if (mods == JMod.PRIVATE) {
      defaultConstructor.annotate(Deprecated.class);
      defaultConstructor.javadoc().add("Default no-arg constructor is private. Use overloaded constructor instead! ");
      defaultConstructor.javadoc().add("(Temporary solution, till a better and more suitable ObjectFactory is created.) ");
    }
    defaultConstructor.body().invoke("super");
  }

  private void createArgConstructor(final ClassOutlineImpl cc, final Collection<JFieldVar> required) {
    final StringBuffer debugOut = new StringBuffer();
    final Map<String, FieldOutline> fieldOutlineasMap = Util.getRequiredFieldsAsMap(cc);

    final JMethod defaultConstructor = cc.implClass.constructor(JMod.PUBLIC);
    defaultConstructor.javadoc().add("Value constructor with only mandatory fields");
    defaultConstructor.body().invoke("super");

    for (final JFieldVar field : required) {
      // FieldOutline fo = fieldOutlineasMap.get(field.name());
      // if (fo == null) {
      // continue;
      // }
      // if (fo.getPropertyInfo().isCollection()) {
      // LOG.info("!!!!! " + cc.implClass.name() + " is collection " + field.name() );
      // continue;
      // }

      final JVar arg = defaultConstructor.param(JMod.FINAL, Util.removeJAXBElement(cm, field.type()), field.name());
      defaultConstructor.javadoc().addParam(arg).append("required parameter");
      defaultConstructor.body().assign(JExpr.refthis(field.name()), arg);
    }

    debugOut.append("c> " + cc.implRef.name() + " :: public " + cc.target.shortName + "(");
    for (final JFieldVar field : required) {
      debugOut.append(field.type().name() + ", ");
    }
    if (required.size() > 0) {
      debugOut.delete(debugOut.length() - 2, debugOut.length());
    }
    debugOut.append(")");

    LOG.info(debugOut.toString());
  }

}
TOP

Related Classes of org.jvnet.jaxb2_commons.javaforkmlapi.fluent.CreateConstructors

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.