/* * JBoss, Home of Professional Open Source * Copyright 2010, Red Hat Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.ee.component.interceptors; import org.jboss.invocation.proxy.MethodIdentifier; /** * Post class loading description of an interceptor class. * * @author Stuart Douglas */ public class InterceptorClassDescription { public static final InterceptorClassDescription EMPTY_INSTANCE = new Builder().build(); private final MethodIdentifier aroundInvoke; private final MethodIdentifier aroundTimeout; private final MethodIdentifier aroundConstruct; private final MethodIdentifier preDestroy; private final MethodIdentifier postConstruct; private final MethodIdentifier prePassivate; private final MethodIdentifier postActivate; public InterceptorClassDescription(final MethodIdentifier aroundInvoke, final MethodIdentifier aroundTimeout, final MethodIdentifier aroundConstruct, final MethodIdentifier preDestroy, final MethodIdentifier postConstruct, final MethodIdentifier postActivate, final MethodIdentifier prePassivate) { this.aroundInvoke = aroundInvoke; this.aroundTimeout = aroundTimeout; this.aroundConstruct = aroundConstruct; this.preDestroy = preDestroy; this.postConstruct = postConstruct; this.postActivate = postActivate; this.prePassivate = prePassivate; } /** * Merges two descriptors, either of the parameters will be null. * <p/> * this method will never return null; * * @param existing * @param override * @return */ public static InterceptorClassDescription merge(InterceptorClassDescription existing, InterceptorClassDescription override) { if (existing == null && override == null) { return EMPTY_INSTANCE; } if (override == null) { return existing; } if (existing == null) { return override; } final Builder builder = builder(existing); if (override.getAroundInvoke() != null) { builder.setAroundInvoke(override.getAroundInvoke()); } if (override.getAroundTimeout() != null) { builder.setAroundTimeout(override.getAroundTimeout()); } if (override.getAroundConstruct() != null) { builder.setAroundConstruct(override.getAroundConstruct()); } if (override.getPostConstruct() != null) { builder.setPostConstruct(override.getPostConstruct()); } if (override.getPreDestroy() != null) { builder.setPreDestroy(override.getPreDestroy()); } if (override.getPrePassivate() != null) { builder.setPrePassivate(override.getPrePassivate()); } if (override.getPostActivate() != null) { builder.setPostActivate(override.getPostActivate()); } return builder.build(); } /** * Constructs a new empty builder * * @return An empty builder */ public static Builder builder() { return new Builder(); } /** * @param base The existing description, or null for an empty builder * @return A builder based on the existing description */ public static Builder builder(InterceptorClassDescription base) { if (base == null) { return new Builder(); } return new Builder(base); } public static class Builder { private MethodIdentifier aroundInvoke; private MethodIdentifier aroundTimeout; private MethodIdentifier aroundConstruct; private MethodIdentifier preDestroy; private MethodIdentifier postConstruct; private MethodIdentifier prePassivate; private MethodIdentifier postActivate; Builder() { } Builder(InterceptorClassDescription existing) { this.aroundInvoke = existing.aroundInvoke; this.aroundTimeout = existing.aroundTimeout; this.aroundConstruct = existing.aroundConstruct; this.preDestroy = existing.preDestroy; this.postConstruct = existing.postConstruct; this.prePassivate = existing.prePassivate; this.postActivate = existing.postActivate; } public InterceptorClassDescription build() { return new InterceptorClassDescription(aroundInvoke, aroundTimeout, aroundConstruct, preDestroy, postConstruct, postActivate, prePassivate); } public MethodIdentifier getAroundInvoke() { return aroundInvoke; } public void setAroundInvoke(final MethodIdentifier aroundInvoke) { this.aroundInvoke = aroundInvoke; } public MethodIdentifier getAroundTimeout() { return aroundTimeout; } public void setAroundTimeout(final MethodIdentifier aroundTimeout) { this.aroundTimeout = aroundTimeout; } public MethodIdentifier getPostConstruct() { return postConstruct; } public void setPostConstruct(final MethodIdentifier postConstruct) { this.postConstruct = postConstruct; } public MethodIdentifier getPreDestroy() { return preDestroy; } public void setPreDestroy(final MethodIdentifier preDestroy) { this.preDestroy = preDestroy; } public MethodIdentifier getPrePassivate() { return prePassivate; } public void setPrePassivate(final MethodIdentifier prePassivate) { this.prePassivate = prePassivate; } public MethodIdentifier getPostActivate() { return postActivate; } public void setPostActivate(final MethodIdentifier postActivate) { this.postActivate = postActivate; } public MethodIdentifier getAroundConstruct() { return aroundConstruct; } public void setAroundConstruct(final MethodIdentifier aroundConstruct) { this.aroundConstruct = aroundConstruct; } } public MethodIdentifier getAroundInvoke() { return aroundInvoke; } public MethodIdentifier getAroundTimeout() { return aroundTimeout; } public MethodIdentifier getPostConstruct() { return postConstruct; } public MethodIdentifier getPreDestroy() { return preDestroy; } public MethodIdentifier getPrePassivate() { return prePassivate; } public MethodIdentifier getPostActivate() { return postActivate; } public MethodIdentifier getAroundConstruct() { return aroundConstruct; } }