blob: ce93b2f14bf1e397a8482074c7ad7b4d14e3e65e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.j2ee.ejbjarproject;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.netbeans.modules.j2ee.dd.api.common.NameAlreadyUsedException;
import org.netbeans.modules.j2ee.dd.api.common.PortComponentRef;
import org.netbeans.modules.j2ee.dd.api.common.RootInterface;
import org.netbeans.modules.j2ee.dd.api.common.ServiceRef;
import org.netbeans.modules.websvc.api.client.ClientStubDescriptor;
import org.openide.util.Mutex.Action;
import static org.netbeans.modules.websvc.api.client.WebServicesClientConstants.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.netbeans.spi.project.support.ant.AntProjectHelper;
import org.netbeans.modules.websvc.spi.client.WebServicesClientSupportImpl;
import org.netbeans.spi.project.support.ant.EditableProperties;
import org.netbeans.spi.project.support.ant.PropertyUtils;
import org.netbeans.modules.j2ee.dd.api.ejb.DDProvider;
import org.netbeans.modules.j2ee.dd.api.ejb.EjbJar;
import org.netbeans.api.project.ProjectManager;
import org.netbeans.api.project.ProjectUtils;
import org.netbeans.api.project.SourceGroup;
import org.netbeans.api.project.Sources;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.NbBundle;
import org.netbeans.api.java.project.JavaProjectConstants;
import org.netbeans.modules.websvc.spi.webservices.WebServicesConstants;
import org.netbeans.modules.websvc.api.client.WsCompileClientEditorSupport;
import org.netbeans.spi.project.support.ant.ReferenceHelper;
/**
*
* @author rico
* Implementation of WebServicesSupportImpl and WebServicesClientSupportImpl
*/
public class EjbJarWebServicesClientSupport implements WebServicesClientSupportImpl{
private EjbJarProject project;
private AntProjectHelper helper;
private ReferenceHelper referenceHelper;
/** Creates a new instance of EjbJarWebServicesSupport */
public EjbJarWebServicesClientSupport(EjbJarProject project, AntProjectHelper helper, ReferenceHelper referenceHelper) {
this.project = project;
this.helper = helper;
this.referenceHelper = referenceHelper;
}
// /**
// * Get the webservices.xml file object
// */
// public FileObject getWebservicesDD() {
// FileObject metaInfFo = getMetaInf();
// if (metaInfFo==null) {
// return null;
// }
// return getMetaInf().getFileObject(WEBSERVICES_DD, "xml");
// }
// /**
// * Returns the directory that contains webservices.xml in the project
// */
// public FileObject getWsDDFolder() {
// return getMetaInf();
// }
// /**
// * Returns the name of the directory that contains the webservices.xml in
// * the archive
// */
// public String getArchiveDDFolderName() {
// return "META-INF"; // NOI18N
// }
public AntProjectHelper getAntProjectHelper() {
return helper;
}
public ReferenceHelper getReferenceHelper(){
return referenceHelper;
}
private boolean updateWsCompileProperties(String serviceName) {
/** Ensure wscompile.classpath and wscompile.tools.classpath are
* properly defined.
*
* wscompile.classpath goes in project properties and includes
* jaxrpc and qname right now.
*
* wscompile.tools.classpath is for tools.jar which is needed when
* running under the Sun JDK to invoke javac. It is placed in
* user.properties so that if we compute it incorrectly (say on a mac)
* the user can change it and we will not blow away the change.
* Hopefully we can do this better for release.
*/
boolean globalPropertiesChanged = false;
EditableProperties globalProperties = PropertyUtils.getGlobalProperties();
if(globalProperties.getProperty(WSCOMPILE_TOOLS_CLASSPATH) == null) {
globalProperties.setProperty(WSCOMPILE_TOOLS_CLASSPATH, "${java.home}\\..\\lib\\tools.jar"); // NOI18N
try {
PropertyUtils.putGlobalProperties(globalProperties);
} catch(java.io.IOException ex) {
String mes = "Error saving global properties when adding wscompile.tools.classpath for service '"
+ serviceName + "'\r\n" + ex.getMessage(); // NOI18N
NotifyDescriptor desc = new NotifyDescriptor.Message(mes, NotifyDescriptor.Message.ERROR_MESSAGE);
DialogDisplayer.getDefault().notify(desc);
}
globalPropertiesChanged = true;
}
boolean projectPropertiesChanged = false;
EditableProperties projectProperties = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
{ // Block that adjusts wscompile.client.classpath as necessary.
HashSet<String> wscJars = new HashSet<String>();
boolean newWscJars = false;
String wscClientClasspath = projectProperties.getProperty(WSCOMPILE_CLASSPATH);
if(wscClientClasspath != null) {
String[] libs = PropertyUtils.tokenizePath(wscClientClasspath);
for(int i = 0; i < libs.length; i++) {
wscJars.add(libs[i]);
}
}
for(int i = 0; i < WSCOMPILE_JARS.length; i++) {
if(!wscJars.contains(WSCOMPILE_JARS[i])) {
wscJars.add(WSCOMPILE_JARS[i]);
newWscJars = true;
}
}
if(newWscJars) {
StringBuffer newClasspathBuf = new StringBuffer(256);
for(Iterator iter = wscJars.iterator(); iter.hasNext(); ) {
newClasspathBuf.append(iter.next().toString());
if(iter.hasNext()) {
newClasspathBuf.append(":"); // NOI18N
}
}
projectProperties.put(WSCOMPILE_CLASSPATH, newClasspathBuf.toString());
projectPropertiesChanged = true;
}
}
// set tools.jar property if not set
if(projectProperties.getProperty(WSCOMPILE_TOOLS_CLASSPATH) == null) {
projectProperties.setProperty(WSCOMPILE_TOOLS_CLASSPATH, "${java.home}\\..\\lib\\tools.jar"); // NOI18N
projectPropertiesChanged = true;
}
if(projectPropertiesChanged) {
helper.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, projectProperties);
}
return globalPropertiesChanged || projectPropertiesChanged;
}
private EjbJar getEjbJar() {
try {
// TODO: first one API EjbJar from project is taken... this should be fixed
return DDProvider.getDefault().getDDRoot(org.netbeans.modules.j2ee.api.ejbjar.EjbJar.getEjbJars(project)[0].getDeploymentDescriptor());
} catch (java.io.IOException e) {
Logger.getLogger("global").log(Level.INFO, e.getLocalizedMessage());
}
return null;
}
public FileObject getMetaInf() {
EjbJarProvider provider = project.getLookup().lookup(EjbJarProvider.class);
return provider.getMetaInf();
}
public FileObject getDeploymentDescriptor() {
FileObject metaInfFo = getMetaInf();
if (metaInfFo==null) {
return null;
}
return metaInfFo.getFileObject(EjbJarProvider.FILE_DD);
}
private String getPackageName(FileObject file){
FileObject parent = file.getParent();
Sources sources = ProjectUtils.getSources(project);
SourceGroup[] groups = sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA);
String packageName = null;
for (int i = 0; i < groups.length && packageName == null; i++) {
packageName = FileUtil.getRelativePath(groups[i].getRootFolder(), parent);
if (packageName != null) {
packageName = groups[i].getName() + "/" + packageName; // NOI18N
}
}
return packageName + ""; // NOI18N
}
private FileObject getFileObject(String propname) {
String prop = helper.getStandardPropertyEvaluator().getProperty(propname);
if (prop != null) {
return helper.resolveFileObject(prop);
}
return null;
}
// Implementation of WebServiceClientSupportImpl
public void addServiceClient(String serviceName, String packageName, String sourceUrl, FileObject configFile, ClientStubDescriptor stubDescriptor) {
this.addServiceClient(serviceName, packageName, sourceUrl, configFile, stubDescriptor, null);
}
// Implementation of WebServiceClientSupportImpl
public void addServiceClient(final String serviceName, final String packageName, final String sourceUrl, final FileObject configFile, final ClientStubDescriptor stubDescriptor, final String[] wscompileFeatures) {
// It seems like it ought to be implemented via the AuxiliaryConfiguration interface.
boolean needToSave = ProjectManager.mutex().writeAccess(new Action<Boolean>() {
public Boolean run() {
boolean needsSave = false;
boolean modifiedProjectProperties = false;
/** Locate root of web service client node structure in project,xml, creating it
* if it's not found.
*/
Element data = helper.getPrimaryConfigurationData(true);
Document doc = data.getOwnerDocument();
NodeList nodes = data.getElementsByTagName(WEB_SERVICE_CLIENTS);
Element clientElements = null;
if(nodes.getLength() == 0) {
// 'needsSave' deliberately left false here because this is a trival change
// that only should be saved if additional changes are also made below.
clientElements = doc.createElementNS(EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, WEB_SERVICE_CLIENTS);
NodeList srcRoots = data.getElementsByTagNameNS(EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, "source-roots"); // NOI18N
assert srcRoots.getLength() == 1 : "Invalid project.xml."; // NOI18N
data.insertBefore(clientElements, srcRoots.item(0));
} else {
clientElements = (Element) nodes.item(0);
}
/** Make sure this service is not already registered in project.xml
*/
boolean serviceAlreadyAdded = false;
NodeList clientNameList = clientElements.getElementsByTagNameNS(
EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, WEB_SERVICE_CLIENT_NAME);
for(int i = 0; i < clientNameList.getLength(); i++ ) {
Element clientNameElement = (Element) clientNameList.item(i);
NodeList nl = clientNameElement.getChildNodes();
if(nl.getLength() >= 1) {
org.w3c.dom.Node n = nl.item(0);
if(n.getNodeType() == org.w3c.dom.Node.TEXT_NODE) {
if(serviceName.equalsIgnoreCase(n.getNodeValue())) {
serviceAlreadyAdded = true;
// !PW FIXME should force stub type to match value passed in
// in case someone is overwriting a current service with a different
// stub type.
}
}
}
}
/** Add entry for the client to project.xml and regenerate build-impl.xml.
*/
if(!serviceAlreadyAdded) {
Element clientElement = doc.createElementNS(EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, WEB_SERVICE_CLIENT);
clientElements.appendChild(clientElement);
Element clientElementName = doc.createElementNS(EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, WEB_SERVICE_CLIENT_NAME);
clientElement.appendChild(clientElementName);
clientElementName.appendChild(doc.createTextNode(serviceName));
Element clientElementStubType = doc.createElementNS(EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, WEB_SERVICE_STUB_TYPE);
clientElement.appendChild(clientElementStubType);
clientElementStubType.appendChild(doc.createTextNode(stubDescriptor.getName()));
Element clientElementSourceUrl = doc.createElementNS(EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, CLIENT_SOURCE_URL);
clientElement.appendChild(clientElementSourceUrl);
clientElementSourceUrl.appendChild(doc.createTextNode(sourceUrl));
helper.putPrimaryConfigurationData(data, true);
needsSave = true;
}
EditableProperties projectProperties = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
// Add property for wscompile features
{
String featurePropertyName = "wscompile.client." + serviceName + ".features"; // NOI18N
String defaultFeatures = "wsi, strict"; // NOI18N -- defaults if stub descriptor is bad type (should never happen?)
if (stubDescriptor instanceof JAXRPCClientStubDescriptor) {
JAXRPCClientStubDescriptor stubDesc = (JAXRPCClientStubDescriptor) stubDescriptor;
if (wscompileFeatures!=null) {
stubDesc.setDefaultFeatures(wscompileFeatures);
}
defaultFeatures = stubDesc.getDefaultFeaturesAsArgument();
} else {
// !PW FIXME wrong stub type -- log error message.
}
String oldFeatures = projectProperties.getProperty(featurePropertyName);
if(!defaultFeatures.equals(oldFeatures)) {
projectProperties.put(featurePropertyName, defaultFeatures);
modifiedProjectProperties = true;
}
}
// Add package name property
{
String packagePropertyName = "wscompile.client." + serviceName + ".package"; // NOI18N
String oldPackageName = projectProperties.getProperty(packagePropertyName);
if(!packageName.equals(oldPackageName)) {
projectProperties.put(packagePropertyName, packageName);
modifiedProjectProperties = true;
}
}
if(modifiedProjectProperties) {
helper.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, projectProperties);
needsSave = true;
}
// Update wscompile related properties. boolean return indicates whether
// any changes were made.
if(updateWsCompileProperties(serviceName)) {
needsSave = true;
}
return needsSave;
}
});
// !PW Lastly, save the project if we actually made any changes to any
// properties or the build script.
if(needToSave) {
try {
ProjectManager.getDefault().saveProject(project);
} catch(IOException ex) {
NotifyDescriptor desc = new NotifyDescriptor.Message(
NbBundle.getMessage(EjbJarWebServicesSupport.class,
"MSG_ErrorSavingOnWSClientAdd", serviceName, ex.getMessage()), // NOI18N
NotifyDescriptor.ERROR_MESSAGE);
DialogDisplayer.getDefault().notify(desc);
}
}
}
public FileObject[] getJavaSources() {
return project.getSourceRoots().getRoots();
}
public void addServiceClientReference(String serviceName, String fqServiceName, String relativeWsdlPath, String relativeMappingPath, String[] portSEIInfo) {
FileObject ddFO = getDeploymentDescriptor();
// If we get null for the deployment descriptor, ignore this step.
if (ddFO != null) {
try {
// TODO: first one API EjbJar from project is taken... this should be fixed
RootInterface rootDD = DDProvider.getDefault().getDDRoot(org.netbeans.modules.j2ee.api.ejbjar.EjbJar.getEjbJars(project)[0].getDeploymentDescriptor());
ServiceRef serviceRef = (ServiceRef) rootDD.findBeanByName("ServiceRef", "ServiceRefName", serviceName); // NOI18N
if (serviceRef == null) {
serviceRef = (ServiceRef) rootDD.addBean("ServiceRef", // NOI18N
new String [] { /* property list */
"ServiceRefName", // NOI18N
"ServiceInterface", // NOI18N
"WsdlFile", // NOI18N
"JaxrpcMappingFile" // NOI18N
},
new String [] { /* property values */
// service name
serviceName,
// interface package . service name
fqServiceName,
// web doc base / wsdl folder / wsdl file name
relativeWsdlPath,
// web doc base / mapping file name
relativeMappingPath
},
"ServiceRefName"); // NOI18N
} else {
serviceRef.setServiceInterface(fqServiceName);
serviceRef.setWsdlFile(new URI(relativeWsdlPath));
serviceRef.setJaxrpcMappingFile(relativeMappingPath);
}
PortComponentRef [] portRefArray = new PortComponentRef [portSEIInfo.length];
for (int pi = 0; pi < portRefArray.length; pi++) {
portRefArray[pi] = (PortComponentRef) serviceRef.createBean("PortComponentRef"); // NOI18N
portRefArray[pi].setServiceEndpointInterface(portSEIInfo[pi]); // NOI18N
}
serviceRef.setPortComponentRef(portRefArray);
rootDD.write(ddFO);
} catch (IOException ex) {
// Strange thing happen
Logger.getLogger("global").log(Level.INFO, null, ex);
} catch (NameAlreadyUsedException ex) {
// Should never happen because we look for it by name first.
Logger.getLogger("global").log(Level.INFO, null, ex);
} catch (URISyntaxException ex) {
// Programmer error - validation of input data should ensure this never happens.
Logger.getLogger("global").log(Level.INFO, null, ex);
} catch (ClassNotFoundException ex) {
// Programmer error - mistyped object name.
Logger.getLogger("global").log(Level.INFO, null, ex);
}
}
}
public void removeServiceClient(final String serviceName) {
// 2. Remove service from project.xml
// Side effect: Regenerate build-impl.xsl
// Optional - if last service, remove properties we generated.
boolean needToSave = ProjectManager.mutex().writeAccess(new Action<Boolean>() {
public Boolean run() {
boolean needsSave = false;
/** Remove properties from project.properties
*/
String featureProperty = "wscompile.client." + serviceName + ".features"; // NOI18N
String packageProperty = "wscompile.client." + serviceName + ".package"; // NOI18N
EditableProperties ep = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
if(ep.getProperty(featureProperty) != null) {
ep.remove(featureProperty);
needsSave = true;
}
if(ep.getProperty(packageProperty) != null) {
ep.remove(packageProperty);
needsSave = true;
}
if(needsSave) {
helper.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, ep);
}
/** Locate root of web service client node structure in project,xml
*/
Element data = helper.getPrimaryConfigurationData(true);
NodeList nodes = data.getElementsByTagName(WEB_SERVICE_CLIENTS);
Element clientElements = null;
/* If there is a root, get all the names of the child services and search
* for the one we want to remove.
*/
if(nodes.getLength() >= 1) {
clientElements = (Element) nodes.item(0);
NodeList clientNameList = clientElements.getElementsByTagNameNS(
EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, WEB_SERVICE_CLIENT_NAME);
for(int i = 0; i < clientNameList.getLength(); i++ ) {
Element clientNameElement = (Element) clientNameList.item(i);
NodeList nl = clientNameElement.getChildNodes();
if(nl.getLength() == 1) {
org.w3c.dom.Node n = nl.item(0);
if(n.getNodeType() == org.w3c.dom.Node.TEXT_NODE) {
if(serviceName.equalsIgnoreCase(n.getNodeValue())) {
// Found it! Now remove it.
org.w3c.dom.Node serviceNode = clientNameElement.getParentNode();
clientElements.removeChild(serviceNode);
helper.putPrimaryConfigurationData(data, true);
needsSave = true;
}
}
}
}
}
return needsSave;
}
});
// !PW Lastly, save the project if we actually made any changes to any
// properties or the build script.
if(needToSave) {
try {
ProjectManager.getDefault().saveProject(project);
} catch(IOException ex) {
NotifyDescriptor desc = new NotifyDescriptor.Message(
NbBundle.getMessage(EjbJarWebServicesSupport.class,
"MSG_ErrorSavingOnWSClientRemove", serviceName, ex.getMessage()), // NOI18N
NotifyDescriptor.ERROR_MESSAGE);
DialogDisplayer.getDefault().notify(desc);
}
}
}
public FileObject getWsdlFolder(boolean create) throws IOException {
FileObject wsdlFolder = null;
FileObject metaInf = getMetaInf();
if(metaInf != null) {
wsdlFolder = metaInf.getFileObject(WSDL_FOLDER);
if(wsdlFolder == null && create) {
wsdlFolder = metaInf.createFolder(WSDL_FOLDER);
}
} else if(create) {
// Create was specified, but no META-INF was found, so how do we create it?
// Expect an NPE if we return null for this case, but log it anyway.
Logger.getLogger("global").log(Level.INFO, NbBundle.getMessage(EjbJarWebServicesSupport.class, "MSG_MetaInfNotFoundForWsdlFolder"));
}
return wsdlFolder;
}
public List<ClientStubDescriptor> getStubDescriptors() {
List<ClientStubDescriptor> stubs = new ArrayList<ClientStubDescriptor>(2);
/*
String version = project.getEjbModule().getJ2eePlatformVersion();
if(EjbProjectConstants.J2EE_14_LEVEL.equals(version)) {
stubs.add(jsr109ClientStub);
}*/
stubs.add(jaxrpcClientStub);
return stubs;
}
/** !PW This method is exposed in the client support API. Though it's
* implementation makes more sense here than anywhere else, perhaps this
* and the other project.xml/project.properties related methods in this
* object should be refactored into another object that this one delegates
* to. That way, this method would be directly available within the web
* web module, as it is needed, and remain missing from the API (where it
* probably does not belong at this time.
*/
private static final String [] WSCOMPILE_CLIENT_FEATURES = {
"datahandleronly", // - portable // NOI18N
// "documentliteral", // SEI ONLY
// "rpcliteral", // SEI ONLY
"explicitcontext", // NOI18N
// "infix:<name>", // difficult to implement.
"jaxbenumtype", // NOI18N
"nodatabinding", // - portable // NOI18N
"noencodedtypes", // NOI18N
"nomultirefs", // NOI18N
"norpcstructures", // - portable // NOI18N
"novalidation", // - portable // NOI18N
"resolveidref", // NOI18N
"searchschema", // - portable // NOI18N
"serializeinterfaces", // NOI18N
"strict", // - portable // NOI18N
// "useonewayoperations", // SEI ONLY // NOI18N
"wsi", // - portable // NOI18N
"unwrap",// - portable // NOI18N
"donotoverride", // - portable // NOI18N
"donotunwrap", // - portable // NOI18N
};
private static final List allClientFeatures = Arrays.asList(WSCOMPILE_CLIENT_FEATURES);
private static final String [] WSCOMPILE_KEY_CLIENT_FEATURES = {
"wsi",
"strict",
"unwrap",
"donotunwrap",
"donotoverride",
"datahandleronly",
"nodatabinding",
"norpcstructures",
"novalidation",
"searchschema",
};
private static final List importantClientFeatures = Arrays.asList(WSCOMPILE_KEY_CLIENT_FEATURES);
public List getServiceClients() {
List<WsCompileClientEditorSupport.ServiceSettings> serviceNames = new ArrayList<WsCompileClientEditorSupport.ServiceSettings>();
Element data = helper.getPrimaryConfigurationData(true);
NodeList nodes = data.getElementsByTagName(WEB_SERVICE_CLIENTS);
EditableProperties projectProperties = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
if(nodes.getLength() != 0) {
Element clientElements = (Element) nodes.item(0);
NodeList clientNameList = clientElements.getElementsByTagNameNS(
EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, WEB_SERVICE_CLIENT_NAME);
for(int i = 0; i < clientNameList.getLength(); i++ ) {
Element clientNameElement = (Element) clientNameList.item(i);
NodeList nl = clientNameElement.getChildNodes();
if(nl.getLength() == 1) {
org.w3c.dom.Node n = nl.item(0);
if(n.getNodeType() == org.w3c.dom.Node.TEXT_NODE) {
String serviceName = n.getNodeValue();
String currentFeatures = projectProperties.getProperty("wscompile.client." + serviceName + ".features");
if(currentFeatures == null) {
// !PW should probably retrieve default features for stub type.
// For now, this will work because this is the same value we'd get doing that.
//
// Defaults if we can't find any feature property for this client
// Mostly for upgrading EA1, EA2 projects which did not have
// this property, but also useful if the user deletes it from
// project.properties.
currentFeatures = "wsi, strict";
}
ClientStubDescriptor stubType = getClientStubDescriptor(clientNameElement.getParentNode());
boolean propVerbose = "true".equalsIgnoreCase( //NOI18N
projectProperties.getProperty("wscompile.client." + serviceName + ".verbose")); //NOI18N
boolean propDebug = "true".equalsIgnoreCase( //NOI18N
projectProperties.getProperty("wscompile.client." + serviceName + ".debug")); //NOI18N
boolean propPrintStackTrace = "true".equalsIgnoreCase( //NOI18N
projectProperties.getProperty("wscompile.client." + serviceName + ".xPrintStackTrace")); //NOI18N
boolean propExtensible = "true".equalsIgnoreCase( //NOI18N
projectProperties.getProperty("wscompile.client." + serviceName + ".xSerializable")); //NOI18N
boolean propOptimize = "true".equalsIgnoreCase( //NOI18N
projectProperties.getProperty("wscompile.client." + serviceName + ".optimize")); //NOI18N
boolean[] options = new boolean[] { //NOI18N
propVerbose,propDebug,propPrintStackTrace,propExtensible,propOptimize
};
WsCompileClientEditorSupport.ServiceSettings settings = new WsCompileClientEditorSupport.ServiceSettings(
serviceName, stubType, options, currentFeatures, allClientFeatures, importantClientFeatures);
serviceNames.add(settings);
} else {
// !PW FIXME node is wrong type?! - log message or trace?
}
} else {
// !PW FIXME no name for this service entry - notify user
}
}
}
return serviceNames;
}
private ClientStubDescriptor getClientStubDescriptor(org.w3c.dom.Node parentNode) {
ClientStubDescriptor result = null;
if(parentNode instanceof Element) {
Element parentElement = (Element) parentNode;
NodeList clientNameList = parentElement.getElementsByTagNameNS(
EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, WebServicesConstants.WEB_SERVICE_STUB_TYPE);
if(clientNameList.getLength() == 1) {
Element clientStubElement = (Element) clientNameList.item(0);
NodeList nl = clientStubElement.getChildNodes();
if(nl.getLength() == 1) {
org.w3c.dom.Node n = nl.item(0);
if(n.getNodeType() == org.w3c.dom.Node.TEXT_NODE) {
String stubName = n.getNodeValue();
if (ClientStubDescriptor.JSR109_CLIENT_STUB.equals(stubName)) {
result = jsr109ClientStub;
} else if (ClientStubDescriptor.JAXRPC_CLIENT_STUB.equals(stubName)) {
result = jaxrpcClientStub;
}
}
}
}
}
return result;
}
public String getWsdlSource(String serviceName) {
Element data = helper.getPrimaryConfigurationData(true);
String wsdlSource = null;
Element clientElement = getWebServiceClientNode(data, serviceName);
if(clientElement != null) {
NodeList fromWsdlList = clientElement.getElementsByTagNameNS(
EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, WebServicesConstants.CLIENT_SOURCE_URL);
if(fromWsdlList.getLength() == 1) {
Element fromWsdlElement = (Element) fromWsdlList.item(0);
NodeList nl = fromWsdlElement.getChildNodes();
if(nl.getLength() == 1) {
org.w3c.dom.Node n = nl.item(0);
if(n.getNodeType() == org.w3c.dom.Node.TEXT_NODE) {
wsdlSource = n.getNodeValue();
}
}
}
}
return wsdlSource;
}
public void setWsdlSource(String serviceName, String wsdlSource) {
Element data = helper.getPrimaryConfigurationData(true);
Document doc = data.getOwnerDocument();
boolean needsSave = false;
Element clientElement = getWebServiceClientNode(data, serviceName);
if(clientElement != null) {
NodeList fromWsdlList = clientElement.getElementsByTagNameNS(
EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, WebServicesConstants.CLIENT_SOURCE_URL);
if(fromWsdlList.getLength() > 0) {
Element fromWsdlElement = (Element) fromWsdlList.item(0);
NodeList nl = fromWsdlElement.getChildNodes();
if(nl.getLength() > 0) {
org.w3c.dom.Node n = nl.item(0);
n.setNodeValue(wsdlSource);
} else {
fromWsdlElement.appendChild(doc.createTextNode(wsdlSource));
}
} else {
Element clientElementSourceUrl = doc.createElementNS(
EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, CLIENT_SOURCE_URL);
clientElement.appendChild(clientElementSourceUrl);
clientElementSourceUrl.appendChild(doc.createTextNode(wsdlSource));
}
needsSave = true;
}
// !PW Save the project if we were able to make the change.
if(needsSave) {
try {
ProjectManager.getDefault().saveProject(project);
} catch(IOException ex) {
NotifyDescriptor desc = new NotifyDescriptor.Message(
NbBundle.getMessage(EjbJarWebServicesSupport.class,
"MSG_ErrorSavingOnWSClientAdd", serviceName, ex.getMessage()), // NOI18N
NotifyDescriptor.ERROR_MESSAGE);
DialogDisplayer.getDefault().notify(desc);
}
}
}
private Element getWebServiceClientNode(Element data, String serviceName) {
Element clientElement = null;
NodeList nodes = data.getElementsByTagName(WEB_SERVICE_CLIENTS);
if(nodes.getLength() != 0) {
Element clientElements = (Element) nodes.item(0);
NodeList clientNameList = clientElements.getElementsByTagNameNS(
EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, WEB_SERVICE_CLIENT_NAME);
for(int i = 0; i < clientNameList.getLength(); i++ ) {
Element clientNameElement = (Element) clientNameList.item(i);
NodeList nl = clientNameElement.getChildNodes();
if(nl.getLength() == 1) {
org.w3c.dom.Node n = nl.item(0);
if(n.getNodeType() == org.w3c.dom.Node.TEXT_NODE) {
String name = n.getNodeValue();
if(serviceName.equals(name)) {
org.w3c.dom.Node node = clientNameElement.getParentNode();
clientElement = (node instanceof Element) ? (Element) node : null;
break;
}
} else {
// !PW FIXME node is wrong type?! - log message or trace?
}
}
}
}
return clientElement;
}
// Client stub descriptors
private static final JAXRPCClientStubDescriptor jsr109ClientStub = new JAXRPCClientStubDescriptor(
ClientStubDescriptor.JSR109_CLIENT_STUB,
NbBundle.getMessage(EjbJarWebServicesSupport.class,"LBL_JSR109ClientStub"),
new String [] { "wsi", "strict" });
private static final JAXRPCClientStubDescriptor jaxrpcClientStub = new JAXRPCClientStubDescriptor(
ClientStubDescriptor.JAXRPC_CLIENT_STUB,
NbBundle.getMessage(EjbJarWebServicesSupport.class,"LBL_JAXRPCStaticClientStub"),
new String [] { "wsi", "strict" });
/** Does nothing in ejb-jar project */
public void setProxyJVMOptions(String proxyHost, String proxyPort) {
}
public String getServiceRefName(String serviceName) {
return "service/" + serviceName;
}
/** Stub descriptor for clients supported by this project type.
*/
private static class JAXRPCClientStubDescriptor extends ClientStubDescriptor {
private String [] defaultFeatures;
public JAXRPCClientStubDescriptor(String name, String displayName, String [] defaultFeatures) {
super(name, displayName);
this.defaultFeatures = defaultFeatures;
}
public String [] getDefaultFeatures() {
return defaultFeatures;
}
public String getDefaultFeaturesAsArgument() {
StringBuffer buf = new StringBuffer(defaultFeatures.length*32);
for(int i = 0; i < defaultFeatures.length; i++) {
if(i > 0) {
buf.append(",");
}
buf.append(defaultFeatures[i]);
}
return buf.toString();
}
void setDefaultFeatures(String[] defaultFeatures) {
this.defaultFeatures=defaultFeatures;
}
}
}