Package org.jboss.forge.spec.javaee.validation

Source Code of org.jboss.forge.spec.javaee.validation.RemovePropertyConstraintPlugin

/*
* Copyright 2012 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.spec.javaee.validation;

import static org.jboss.forge.spec.javaee.validation.util.JavaHelper.getFieldAccessor;
import static org.jboss.forge.spec.javaee.validation.util.ResourceHelper.getJavaClassFromResource;

import java.io.FileNotFoundException;
import java.util.List;

import javax.inject.Inject;

import org.jboss.forge.parser.java.Annotation;
import org.jboss.forge.parser.java.Field;
import org.jboss.forge.parser.java.JavaClass;
import org.jboss.forge.parser.java.Member;
import org.jboss.forge.project.Project;
import org.jboss.forge.project.facets.JavaSourceFacet;
import org.jboss.forge.resources.java.JavaResource;
import org.jboss.forge.shell.Shell;
import org.jboss.forge.shell.plugins.Alias;
import org.jboss.forge.shell.plugins.DefaultCommand;
import org.jboss.forge.shell.plugins.Option;
import org.jboss.forge.shell.plugins.Plugin;
import org.jboss.forge.shell.plugins.RequiresFacet;
import org.jboss.forge.shell.plugins.RequiresResource;
import org.jboss.forge.spec.javaee.ValidationFacet;
import org.jboss.forge.spec.javaee.validation.completer.PropertyCompleter;

/**
* @author Kevin Pollet
*/
@Alias("remove-constraint")
@RequiresResource(JavaResource.class)
@RequiresFacet({ValidationFacet.class, JavaSourceFacet.class})
public class RemovePropertyConstraintPlugin implements Plugin
{
    private final Shell shell;
    private final Project project;

    @Inject
    public RemovePropertyConstraintPlugin(Shell shell, Project project)
    {
        this.shell = shell;
        this.project = project;
    }

    @DefaultCommand(help = "Removes the given constraint on the given property/property accessor")
    public void removePropertyConstraint(@Option(name = "property", completer = PropertyCompleter.class, required = true) String property,
                                         @Option(name = "named", required = true) String constraint,
                                         @Option(name = "onAccessor", flagOnly = true) boolean onAccessor) throws FileNotFoundException
    {
        final JavaClass clazz = getJavaClassFromResource(shell.getCurrentResource());
        final Member<JavaClass, ?> member = getMember(clazz, property, onAccessor);
        if (member == null)
        {
            throw new IllegalStateException("There is no property named '" + property + "' or accessor for this property");
        }

        if (!removeConstraint(member, constraint))
        {
            throw new IllegalStateException("There is no constraint named '" + constraint + "' on " + member.getName());
        }

        // save java source
        project.getFacet(JavaSourceFacet.class).saveJavaSource(clazz);
        shell.println("Constraint named '" + constraint + "' has been successfully removed.\n");
    }

    /**
     * Retrieves the property or property accessor member in the given java class.
     *
     * @param clazz      The java class.
     * @param property   The property name.
     * @param onAccessor {@code true} to retrieve the property accessor.
     * @return The targeted java member or {@code null} if none.
     */
    private Member<JavaClass, ?> getMember(JavaClass clazz, String property, boolean onAccessor)
    {
        final Field<JavaClass> field = clazz.getField(property);
        if (field != null && onAccessor)
        {
            return getFieldAccessor(field);
        }
        return field;
    }

    /**
     * Removes the given constraint on the given member.
     *
     * @param member         The member on which the constraint has to be removed.
     * @param constraint The constraint name.
     * @return {@code true} if the constraint have been successfully removed, {@code false} otherwise
     */
    private boolean removeConstraint(Member<JavaClass, ?> member, String constraint)
    {
        final List<Annotation<JavaClass>> annotations = member.getAnnotations();
        for (Annotation<JavaClass> oneAnnotation : annotations)
        {
            if (oneAnnotation.getName().equals(constraint))
            {
                member.removeAnnotation(oneAnnotation);
                return true;
            }
        }
        return false;
    }
}
TOP

Related Classes of org.jboss.forge.spec.javaee.validation.RemovePropertyConstraintPlugin

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.