001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.geronimo.axis2.builder;
019    
020    import org.apache.geronimo.jaxws.builder.JAXWSServiceRefBuilder;
021    import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
022    import org.apache.geronimo.kernel.GBeanNotFoundException;
023    import org.apache.geronimo.kernel.repository.Environment;
024    import org.apache.geronimo.xbeans.javaee.PortComponentRefType;
025    import org.apache.geronimo.xbeans.javaee.ServiceRefType;
026    import org.apache.geronimo.xbeans.geronimo.naming.GerServiceRefType;
027    import org.apache.geronimo.j2ee.deployment.EARContext;
028    import org.apache.geronimo.j2ee.deployment.Module;
029    import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
030    import org.apache.geronimo.axis2.client.Axis2ConfigGBean;
031    import org.apache.geronimo.common.DeploymentException;
032    import org.apache.geronimo.gbean.AbstractName;
033    import org.apache.geronimo.gbean.GBeanData;
034    import org.apache.geronimo.gbean.GBeanInfo;
035    import org.apache.geronimo.gbean.GBeanInfoBuilder;
036    import org.apache.geronimo.naming.deployment.ServiceRefBuilder;
037    
038    import javax.xml.namespace.QName;
039    import java.net.URI;
040    import java.util.Map;
041    
042    public class Axis2ServiceRefBuilder extends JAXWSServiceRefBuilder {
043    
044        private final Axis2Builder axis2Builder;
045    
046        public Axis2ServiceRefBuilder(Environment defaultEnvironment,
047                                    String[] eeNamespaces,
048                                    Axis2Builder axis2Builder) {
049            super(defaultEnvironment, eeNamespaces);
050            this.axis2Builder = axis2Builder;
051        }
052    
053        public Object createService(ServiceRefType serviceRef, GerServiceRefType gerServiceRef,
054                                    Module module, ClassLoader cl, Class serviceInterfaceClass,
055                                    QName serviceQName, URI wsdlURI, Class serviceReferenceType,
056                                    Map<Class, PortComponentRefType> portComponentRefMap) throws DeploymentException {
057            registerConfigGBean(module);
058            return this.axis2Builder.createService(serviceInterfaceClass, serviceReferenceType, wsdlURI,
059                                                 serviceQName, portComponentRefMap, serviceRef.getHandlerChains(),
060                                                 gerServiceRef, module, cl);
061        }
062    
063        private void registerConfigGBean(Module module) throws DeploymentException {
064            EARContext context = module.getEarContext();
065            AbstractName containerFactoryName = context.getNaming().createChildName(
066                    module.getModuleName(), Axis2ConfigGBean.GBEAN_INFO.getName(),
067                    NameFactory.GERONIMO_SERVICE);
068    
069            try {
070                context.getGBeanInstance(containerFactoryName);
071            } catch (GBeanNotFoundException e1) {
072                GBeanData configGBeanData = new GBeanData(containerFactoryName, Axis2ConfigGBean.GBEAN_INFO);
073                configGBeanData.setAttribute("moduleName", module.getModuleName());
074                
075                try {
076                    context.addGBean(configGBeanData);
077                } catch (GBeanAlreadyExistsException e) {
078                    throw new DeploymentException("Could not add config gbean", e);
079                }
080            }
081        }
082        
083        public static final GBeanInfo GBEAN_INFO;
084    
085        static {
086            GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(
087                    Axis2ServiceRefBuilder.class, NameFactory.MODULE_BUILDER);
088            infoBuilder.addInterface(ServiceRefBuilder.class);
089            infoBuilder.addAttribute("defaultEnvironment", Environment.class, true,
090                    true);
091            infoBuilder.addAttribute("eeNamespaces", String[].class, true, true);
092            infoBuilder.addReference("Axis2Builder", Axis2Builder.class,
093                    NameFactory.MODULE_BUILDER);
094    
095            infoBuilder.setConstructor(new String[] { "defaultEnvironment",
096                    "eeNamespaces", "Axis2Builder" });
097    
098            GBEAN_INFO = infoBuilder.getBeanInfo();
099        }
100    
101        public static GBeanInfo getGBeanInfo() {
102            return Axis2ServiceRefBuilder.GBEAN_INFO;
103        }
104    }