Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
  * JBoss, Home of Professional Open Source.
  * Copyright 2011, Red Hat, Inc., and individual contributors
  * as indicated by the @author tags. See the copyright.txt file 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.webservices.injection;
 
 import static org.jboss.as.server.deployment.Attachments.ANNOTATION_INDEX;
 import static org.jboss.as.webservices.WSMessages.MESSAGES;
 import static org.jboss.as.webservices.util.ASHelper.isJaxwsService;
 import static org.jboss.as.webservices.util.DotNames.HANDLER_CHAIN_ANNOTATION;
 import static org.jboss.as.webservices.util.DotNames.WEB_SERVICE_ANNOTATION;
 import static org.jboss.as.webservices.util.DotNames.WEB_SERVICE_PROVIDER_ANNOTATION;
 import static org.jboss.as.webservices.util.WSAttachmentKeys.WS_ENDPOINT_HANDLERS_MAPPING_KEY;
 
 import java.net.URI;
 import java.net.URL;
 import java.util.List;
 import java.util.Set;
 

Author(s):
Richard Opalka
 
 public final class WSHandlerChainAnnotationProcessor implements DeploymentUnitProcessor {
 
     @Override
     public void deploy(final DeploymentPhaseContext phaseContextthrows DeploymentUnitProcessingException {
         final DeploymentUnit unit = phaseContext.getDeploymentUnit();
         if (DeploymentTypeMarker.isType(.unit)) {
             return;
         }
         List<ResourceRootresourceRoots = ASHelper.getResourceRoots(unit);
         if (resourceRoots == null) {
             return;
         }
 
         final WSEndpointHandlersMapping mapping = new WSEndpointHandlersMapping();
         Index index = null;
         for (final ResourceRoot resourceRoot : resourceRoots) {
             index = resourceRoot.getAttachment();
             if (index != null) {
                 // process @HandlerChain annotations
                 processHandlerChainAnnotations(resourceRootindexmapping);
             }
         }
         if (!mapping.isEmpty()) {
             unit.putAttachment(mapping);
         }
     }
 
     @Override
     public void undeploy(final DeploymentUnit context) {
         // noop
     }
 
     private static void processHandlerChainAnnotations(final ResourceRoot resourceRootfinal Index indexfinal WSEndpointHandlersMapping mappingthrows DeploymentUnitProcessingException {
         final List<AnnotationInstancehandlerChainAnnotations = index.getAnnotations();
 
        for (final AnnotationInstance handlerChainAnnotation : handlerChainAnnotations) {
            final AnnotationTarget annotationTarget = handlerChainAnnotation.target();
            if (annotationTarget instanceof ClassInfo) {
                final ClassInfo classInfo = (ClassInfoannotationTarget;
                if (isJaxwsEndpoint(classInfoindex)) {
                    final String endpointClass = classInfo.name().toString();
                    processHandlerChainAnnotation(resourceRoothandlerChainAnnotationendpointClassmapping);
                }
            } else {
                // We ignore fields & methods annotated with @HandlerChain.
                // These are used always in combination with @WebServiceRef
                // which are always referencing JAXWS client proxies only.
            }
        }
    }
    private static void processHandlerChainAnnotation(final ResourceRoot resourceRootfinal AnnotationInstance handlerChainAnnotationfinal String endpointClassfinal WSEndpointHandlersMapping mappingthrows DeploymentUnitProcessingException {
        final String handlerChainConfigFile = handlerChainAnnotation.value("file").asString();
        InputStream is = null;
        try {
            is = getInputStream(resourceRoothandlerChainConfigFileendpointClass);
            final Set<StringendpointHandlers = getHandlers(is);
            if (endpointHandlers.size() > 0) {
                mapping.registerEndpointHandlers(endpointClassendpointHandlers);
            } else {
                ..invalidHandlerChainFile(handlerChainConfigFile);
            }
        } catch (final IOException e) {
            throw new DeploymentUnitProcessingException(e);
        } finally {
            if (is != null) {
                try { is.close(); } catch (final IOException ignore) {}
            }
        }
    }
    private static InputStream getInputStream(final ResourceRoot resourceRootfinal String handlerChainConfigFilefinal String annotatedClassNamethrows IOException {
        if (handlerChainConfigFile.startsWith("file://") || handlerChainConfigFile.startsWith("http://")) {
            return new URL(handlerChainConfigFile).openStream();
        } else {
            URI classURI = null;
            try {
                classURI = new URI(annotatedClassName.replace('.''/'));
            } catch (final URISyntaxException ignore) {}
            final String handlerChainConfigFileResourcePath = classURI.resolve(handlerChainConfigFile).toString();
            final VirtualFile config = resourceRoot.getRoot().getChild(handlerChainConfigFileResourcePath);
            if (config.exists() && config.isFile()) {
                return config.openStream();
            }
            throw .missingHandlerChainConfigFile(handlerChainConfigFileResourcePathresourceRoot);
        }
    }
    private static Set<StringgetHandlers(final InputStream isthrows IOException {
        final Set<StringretVal = new HashSet<String>();
        final UnifiedHandlerChainsMetaData handlerChainsUMDM = UnifiedHandlerChainsMetaDataParser.parse(is);
        if (handlerChainsUMDM != null) {
            for (final UnifiedHandlerChainMetaData handlerChainUMDM : handlerChainsUMDM.getHandlerChains()) {
                for (final UnifiedHandlerMetaData handlerUMDM : handlerChainUMDM.getHandlers()) {
                    retVal.add(handlerUMDM.getHandlerClass());
                }
            }
        }
        return retVal;
    }
    private static boolean isJaxwsEndpoint(final ClassInfo clazzfinal Index index) {
        // assert JAXWS endpoint class flags
        final short flags = clazz.flags();
        if (Modifier.isInterface(flags)) return false;
        if (Modifier.isAbstract(flags)) return false;
        if (!Modifier.isPublic(flags)) return false;
        if (isJaxwsService(clazzindex)) return false;
        if (Modifier.isFinal(flags)) return false;
        final boolean isWebService = clazz.annotations().containsKey();
        final boolean isWebServiceProvider = clazz.annotations().containsKey();
        return isWebService || isWebServiceProvider;
    }
New to GrepCode? Check out our FAQ X