Package com.btmatthews.tools.xjc.addon.commons_lang3

Source Code of com.btmatthews.tools.xjc.addon.commons_lang3.XjcCommonsLang3Plugin

/*
* Copyright 2006-2013 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License")
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.btmatthews.tools.xjc.addon.commons_lang3;

import com.sun.codemodel.*;
import com.sun.tools.xjc.BadCommandLineException;
import com.sun.tools.xjc.Options;
import com.sun.tools.xjc.Plugin;
import com.sun.tools.xjc.outline.ClassOutline;
import com.sun.tools.xjc.outline.Outline;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.xml.sax.ErrorHandler;

/**
* Automatically generates the toString(), hashCode() and equals() methods
* using Jakarta's commons-lang3.
* <p/>
* Supports the optional ToStringStyle command line parameter to specify
* the style for use within the toString method.
* <p/>
* <pre>
* Example 1:
*
*     -Xcommons-lang3
*     -Xcommons-lang3:ToStringStyle=SIMPLE_STYLE
*
*     to specify the use of
*
*     org.apache.commons.lang.builder.ToStringStyle.SIMPLE_STYLE
*
* Example 2:
*
*     -Xcommons-lang3
*     -Xcommons-lang3:ToStringStyle=my.CustomToStringStyle
*
*     to specify the use of
*
*     my.CustomToStringStyle, which must be a subclass of
*
*     org.apache.commons.lang.builder.ToStringStyle, and contains a public no-arg constructor.
*
* </pre>
* <p/>
* The default ToStringStyle adopted by this plugin is MULTI_LINE_STYLE.
*
* @author Hanson Char
* @author <a href="mailto:brian@btmatthews.com">Brian Matthews</a>
* @see org.apache.commons.lang3.builder.ToStringStyle
*/
public class XjcCommonsLang3Plugin extends Plugin {
    private static final String TOSTRING_STYLE_PARAM = "-Xcommons-lang3:ToStringStyle=";
    private String toStringStyle = "MULTI_LINE_STYLE";
    private Class<?> customToStringStyle;

    @Override
    public String getOptionName() {
        return "Xcommons-lang3";
    }

    @Override
    public String getUsage() {
        return "  -Xcommons-lang3        :  generate toString(), hashCode() and equals() for generated code using Jakarta's common-lang\n"
                + " [-Xcommons-lang3:ToStringStyle=MULTI_LINE_STYLE\n\t"
                + "| DEFAULT_STYLE\n\t"
                + "| NO_FIELD_NAMES_STYLE\n\t"
                + "| SHORT_PREFIX_STYLE\n\t"
                + "| SIMPLE_STYLE\n\t"
                + "| <Fully qualified class name of a ToStringStyle subtype>]\n"
                ;
    }

    @Override
    public boolean run(final Outline outline,
                       @SuppressWarnings("unused") final Options opt,
                       @SuppressWarnings("unused") final ErrorHandler errorHandler) {
        // Process every pojo class generated by jaxb
        for (final ClassOutline classOutline : outline.getClasses()) {
            final JDefinedClass implClass = classOutline.implClass;
            this.createToStringMethod(implClass);
            this.createEqualsMethod(implClass);
            this.createHashCodeMethod(implClass);
        }
        return true;
    }

    private void createToStringMethod(final JDefinedClass implClass) {
        final JCodeModel codeModel = implClass.owner();
        final JMethod toStringMethod =
                implClass.method(JMod.PUBLIC, codeModel.ref(String.class), "toString");
        // Annotate with @Override
        toStringMethod.annotate(Override.class);
        final JExpression toStringStyleExpr =
                customToStringStyle == null
                        ? codeModel.ref(ToStringStyle.class)
                        .staticRef(toStringStyle)
                        : JExpr._new(
                        codeModel.ref(customToStringStyle));
        // Invoke ToStringBuilder.reflectionToString(Object,StringStyle)
        toStringMethod.body()
                ._return(
                        codeModel.ref(ToStringBuilder.class)
                                .staticInvoke("reflectionToString")
                                .arg(JExpr._this())
                                .arg(toStringStyleExpr)
                );
        return;
    }

    private void createEqualsMethod(final JDefinedClass implClass) {
        final JCodeModel codeModel = implClass.owner();
        final JMethod toStringMethod =
                implClass.method(JMod.PUBLIC, codeModel.BOOLEAN, "equals");
        final JVar that = toStringMethod.param(Object.class, "that");
        // Annotate with @Override
        toStringMethod.annotate(Override.class);
        // Invoke EqualsBuilder.reflectionEquals(Object,Object);
        toStringMethod.body()._return(
                codeModel.ref(EqualsBuilder.class)
                        .staticInvoke("reflectionEquals")
                        .arg(JExpr._this())
                        .arg(that)
        );
    }

    private void createHashCodeMethod(JDefinedClass implClass) {
        final JCodeModel codeModel = implClass.owner();
        final JMethod toStringMethod =
                implClass.method(JMod.PUBLIC, codeModel.INT, "hashCode");
        // Annotate with @Override
        toStringMethod.annotate(Override.class);
        // Invoke EqualsBuilder.reflectionHashCode(Object);
        toStringMethod.body()._return(
                codeModel.ref(HashCodeBuilder.class)
                        .staticInvoke("reflectionHashCode")
                        .arg(JExpr._this())
        );
    }

    @Override
    public int parseArgument(final Options opt, final String[] args, final int i)
            throws BadCommandLineException {
        // eg. -Xcommons-lang3 ToStringStyle=SIMPLE_STYLE
        final String arg = args[i].trim();

        if (arg.startsWith(TOSTRING_STYLE_PARAM)) {
            toStringStyle = arg.substring(TOSTRING_STYLE_PARAM.length());
            try {
                ToStringStyle.class.getField(toStringStyle);
                return 1;
            } catch (final SecurityException e) {
                throw new BadCommandLineException(e.getMessage());
            } catch (final NoSuchFieldException ignore) {
            }
            try {
                customToStringStyle = Class.forName(toStringStyle);
            } catch (final ClassNotFoundException e) {
                throw new BadCommandLineException(e.getMessage());
            }
            return 1;
        }
        return 0;
    }
}
TOP

Related Classes of com.btmatthews.tools.xjc.addon.commons_lang3.XjcCommonsLang3Plugin

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.