/*
* JBoss, Home of Professional Open Source.
* Copyright 2013, 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.xts.jandex;
import org.jboss.as.server.deployment.DeploymentUnit;
import org.jboss.as.xts.XTSException;
import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.AnnotationValue;
import javax.jws.WebService;
import javax.xml.namespace.QName;
/**
* @author paul.robinson@redhat.com, 2012-02-06
*/
public class WebServiceAnnotation {
private static final String WEBSERVICE_ANNOTATION = WebService.class.getName();
private final String portName;
private final String serviceName;
private final String name;
private final String targetNamespace;
private WebServiceAnnotation(String portName, String serviceName, String name, String targetNamespace) {
this.portName = portName;
this.serviceName = serviceName;
this.name = name;
this.targetNamespace = targetNamespace;
}
public static WebServiceAnnotation build(DeploymentUnit unit, String endpoint) throws XTSException {
AnnotationInstance annotationInstance = JandexHelper.getAnnotation(unit, endpoint, WEBSERVICE_ANNOTATION);
if (annotationInstance == null) {
return null;
}
final String portName = getStringValue(annotationInstance, "portName");
final String serviceName = getStringValue(annotationInstance, "serviceName");
final String name = getStringValue(annotationInstance, "name");
final String targetNamespace = getStringValue(annotationInstance, "targetNamespace");
return new WebServiceAnnotation(portName, serviceName, name, targetNamespace);
}
private static String getStringValue(AnnotationInstance annotationInstance, String key) {
final AnnotationValue value = annotationInstance.value(key);
if (value != null) {
return value.asString();
} else if ("portName".equals(key)) {
return getTargetClassName(annotationInstance) + "Port";
} else if ("serviceName".equals(key)) {
return getTargetClassName(annotationInstance) + "Service";
} else if ("name".equals(key)) {
return getTargetClassName(annotationInstance);
} else if ("targetNamespace".equals(key)) {
return getTargetNamespace(annotationInstance);
} else {
return "";
}
}
private static String getTargetClassName(final AnnotationInstance annotationInstance) {
final String fullName = annotationInstance.target().toString();
final int lastDotIndex = fullName.lastIndexOf(".");
if (lastDotIndex == -1) {
return fullName;
} else {
return fullName.substring(lastDotIndex + 1);
}
}
private static String getTargetNamespace(final AnnotationInstance annotationInstance) {
final String[] parts = annotationInstance.target().toString().split("\\.");
if (parts.length < 2) {
return "";
}
String targetNamespace = "http://";
for (int i = parts.length - 2; i >= 0; i--) {
targetNamespace += parts[i] + ".";
}
return targetNamespace.substring(0, targetNamespace.length() - 1) + "/";
}
public QName buildPortQName() {
return new QName(targetNamespace, portName);
}
public String getPortName() {
return portName;
}
public String getServiceName() {
return serviceName;
}
public String getName() {
return name;
}
public String getTargetNamespace() {
return targetNamespace;
}
}