001: /**
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */package org.apache.cxf.transport.http_jetty.spring;
019:
020: import java.util.List;
021: import java.util.Map;
022: import java.util.TreeMap;
023:
024: import javax.xml.namespace.QName;
025:
026: import org.w3c.dom.Element;
027: import org.w3c.dom.Node;
028: import org.w3c.dom.NodeList;
029:
030: import org.apache.cxf.common.util.StringUtils;
031: import org.apache.cxf.configuration.jsse.TLSServerParameters;
032: import org.apache.cxf.configuration.jsse.spring.TLSServerParametersConfig;
033: import org.apache.cxf.configuration.spring.AbstractBeanDefinitionParser;
034: import org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory;
035: import org.apache.cxf.transport.http_jetty.ThreadingParameters;
036:
037: import org.apache.cxf.transports.http_jetty.configuration.TLSServerParametersIdentifiedType;
038: import org.apache.cxf.transports.http_jetty.configuration.ThreadingParametersIdentifiedType;
039: import org.apache.cxf.transports.http_jetty.configuration.ThreadingParametersType;
040:
041: import org.springframework.beans.factory.support.BeanDefinitionBuilder;
042: import org.springframework.beans.factory.support.ManagedList;
043: import org.springframework.beans.factory.xml.ParserContext;
044:
045: public class JettyHTTPServerEngineFactoryBeanDefinitionParser extends
046: AbstractBeanDefinitionParser {
047: private static final String HTTP_JETTY_NS = "http://cxf.apache.org/transports/http-jetty/configuration";
048:
049: @Override
050: public void doParse(Element element, ParserContext ctx,
051: BeanDefinitionBuilder bean) {
052: //bean.setAbstract(true);
053: String bus = element.getAttribute("bus");
054:
055: try {
056: List<ThreadingParametersIdentifiedType> threadingParametersIdentifiedTypes = JAXBHelper
057: .parseListElement(element, bean, new QName(
058: HTTP_JETTY_NS,
059: "identifiedThreadingParameters"),
060: ThreadingParametersIdentifiedType.class);
061: Map<String, ThreadingParameters> threadingParametersMap = toThreadingParameters(threadingParametersIdentifiedTypes);
062: List<TLSServerParametersIdentifiedType> tlsServerParameters = JAXBHelper
063: .parseListElement(element, bean, new QName(
064: HTTP_JETTY_NS,
065: "identifiedTLSServerParameters"),
066: TLSServerParametersIdentifiedType.class);
067: Map<String, TLSServerParameters> tlsServerParametersMap = toTLSServerParamenters(tlsServerParameters);
068:
069: bean.addPropertyValue("threadingParametersMap",
070: threadingParametersMap);
071: bean.addPropertyValue("tlsServerParametersMap",
072: tlsServerParametersMap);
073:
074: if (StringUtils.isEmpty(bus)) {
075: if (ctx.getRegistry().containsBeanDefinition("cxf")) {
076: bean.addPropertyReference("bus", "cxf");
077: }
078: } else {
079: bean.addPropertyReference("bus", bus);
080: }
081:
082: // parser the engine list
083: List list = getRequiredElementsList(element, ctx,
084: new QName(HTTP_JETTY_NS, "engine"), bean);
085: if (list.size() > 0) {
086: bean.addPropertyValue("enginesList", list);
087: }
088:
089: } catch (Exception e) {
090: throw new RuntimeException(
091: "Could not process configuration.", e);
092: }
093: }
094:
095: @SuppressWarnings("unchecked")
096: private List getRequiredElementsList(Element parent,
097: ParserContext ctx, QName name, BeanDefinitionBuilder bean) {
098:
099: NodeList nl = parent.getChildNodes();
100: ManagedList list = new ManagedList(nl.getLength());
101: list.setSource(ctx.extractSource(parent));
102: for (int i = 0; i < nl.getLength(); i++) {
103: Node n = nl.item(i);
104: if (n.getNodeType() == Node.ELEMENT_NODE
105: && name.getLocalPart().equals(n.getLocalName())
106: && name.getNamespaceURI().equals(
107: n.getNamespaceURI())) {
108: list.add(ctx.getDelegate().parsePropertySubElement(
109: (Element) n, bean.getBeanDefinition()));
110:
111: }
112: }
113: return list;
114: }
115:
116: private Map<String, ThreadingParameters> toThreadingParameters(
117: List<ThreadingParametersIdentifiedType> list) {
118: Map<String, ThreadingParameters> map = new TreeMap<String, ThreadingParameters>();
119: for (ThreadingParametersIdentifiedType t : list) {
120: ThreadingParameters parameter = toThreadingParameters(t
121: .getThreadingParameters());
122: map.put(t.getId(), parameter);
123: }
124: return map;
125: }
126:
127: private ThreadingParameters toThreadingParameters(
128: ThreadingParametersType paramtype) {
129: ThreadingParameters params = new ThreadingParameters();
130: params.setMaxThreads(paramtype.getMaxThreads());
131: params.setMinThreads(paramtype.getMinThreads());
132: return params;
133: }
134:
135: private Map<String, TLSServerParameters> toTLSServerParamenters(
136: List<TLSServerParametersIdentifiedType> list) {
137: Map<String, TLSServerParameters> map = new TreeMap<String, TLSServerParameters>();
138: for (TLSServerParametersIdentifiedType t : list) {
139: try {
140: TLSServerParameters parameter = new TLSServerParametersConfig(
141: t.getTlsServerParameters());
142: map.put(t.getId(), parameter);
143: } catch (Exception e) {
144: throw new RuntimeException(
145: "Could not configure TLS for id " + t.getId(),
146: e);
147: }
148:
149: }
150: return map;
151:
152: }
153:
154: /*
155: * We do not require an id from the configuration.
156: *
157: * (non-Javadoc)
158: * @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#shouldGenerateId()
159: */
160: @Override
161: protected boolean shouldGenerateId() {
162: return true;
163: }
164:
165: @Override
166: protected Class getBeanClass(Element arg0) {
167: return JettyHTTPServerEngineFactory.class;
168: }
169:
170: }
|