public static HandlerAnnotationInfo parseHandlerFile(XMLStreamReader reader,
ClassLoader classLoader, QName serviceName, QName portName,
WSBinding wsbinding) {
ensureProperName(reader,QNAME_HANDLER_CHAINS);
String bindingId = wsbinding.getBindingId().toString();
HandlerAnnotationInfo info = new HandlerAnnotationInfo();
XMLStreamReaderUtil.nextElementContent(reader);
List<Handler> handlerChain = new ArrayList<Handler>();
Set<String> roles = new HashSet<String>();
while (reader.getName().equals(QNAME_HANDLER_CHAIN)) {
XMLStreamReaderUtil.nextElementContent(reader);
if (reader.getName().equals(QNAME_CHAIN_PORT_PATTERN)) {
if (portName == null) {
logger.warning("handler chain sepcified for port " +
"but port QName passed to parser is null");
}
boolean parseChain = JAXWSUtils.matchQNames(portName,
XMLStreamReaderUtil.getElementQName(reader));
if (!parseChain) {
skipChain(reader);
continue;
}
XMLStreamReaderUtil.nextElementContent(reader);
} else if (reader.getName().equals(QNAME_CHAIN_PROTOCOL_BINDING)) {
if (bindingId == null) {
logger.warning("handler chain sepcified for bindingId " +
"but bindingId passed to parser is null");
}
String bindingConstraint = XMLStreamReaderUtil.getElementText(reader);
boolean skipThisChain = true;
StringTokenizer stk = new StringTokenizer(bindingConstraint);
List<String> bindingList = new ArrayList<String>();
while(stk.hasMoreTokens()) {
String tokenOrURI = stk.nextToken();
/*
Convert short-form tokens to API's binding ids
Unknown token, Put it as it is
*/
tokenOrURI = DeploymentDescriptorParser.getBindingIdForToken(tokenOrURI);
String binding = BindingID.parse(tokenOrURI).toString();
bindingList.add(binding);
}
if(bindingList.contains(bindingId)){
skipThisChain = false;
}
if (skipThisChain) {
skipChain(reader);
continue;
}
XMLStreamReaderUtil.nextElementContent(reader);
} else if (reader.getName().equals(QNAME_CHAIN_SERVICE_PATTERN)) {
if (serviceName == null) {
logger.warning("handler chain sepcified for service " +
"but service QName passed to parser is null");
}
boolean parseChain = JAXWSUtils.matchQNames(
serviceName,
XMLStreamReaderUtil.getElementQName(reader));
if (!parseChain) {
skipChain(reader);
continue;
}
XMLStreamReaderUtil.nextElementContent(reader);
}
// process all <handler> elements
while (reader.getName().equals(QNAME_HANDLER)) {
Handler handler;
XMLStreamReaderUtil.nextContent(reader);
if (reader.getName().equals(QNAME_HANDLER_NAME)) {
skipTextElement(reader);
}
// handler class
ensureProperName(reader, QNAME_HANDLER_CLASS);
try {
handler = (Handler) loadClass(classLoader,
XMLStreamReaderUtil.getElementText(reader).trim()).newInstance();
} catch (InstantiationException ie){
throw new RuntimeException(ie);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
XMLStreamReaderUtil.nextContent(reader);
// init params (ignored)
while (reader.getName().equals(QNAME_HANDLER_PARAM)) {
skipInitParamElement(reader);
}
// headers (ignored)
while (reader.getName().equals(QNAME_HANDLER_HEADER)) {
skipTextElement(reader);
}
// roles (not stored per handler)
while (reader.getName().equals(QNAME_HANDLER_ROLE)) {
roles.add(XMLStreamReaderUtil.getElementText(reader));
XMLStreamReaderUtil.nextContent(reader);
}
// call @PostConstruct method on handler if present
for (Method method : handler.getClass().getMethods()) {
if (method.getAnnotation(PostConstruct.class) == null) {
continue;
}
try {
method.invoke(handler, new Object [0]);
break;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
handlerChain.add(handler);
// move past </handler>
ensureProperName(reader, QNAME_HANDLER);
XMLStreamReaderUtil.nextContent(reader);
}
// move past </handler-chain>
ensureProperName(reader, QNAME_HANDLER_CHAIN);
XMLStreamReaderUtil.nextContent(reader);
}
info.setHandlers(handlerChain);
info.setRoles(roles);
return info;
}