juddiv3 (3.0.4) finding all business/services
original post: www.coderanch.com/t/528093/Web-Services/java/juddiv-finding-all-business...
or old.nabble.com/juddiv3-%283.0.4%29-finding-all-business-services-td30975809.html
(go here for better reading quality!)
Hello,
I've been looking for this answer for like a week now. Seems like I've googled everything and everywhere. So here is my story:
I'm using juddi-portal-bundle-3.0.4 at the moment. Juddy behaves happy and works properly, but here comes some problems (or lack of my knowledge) when I wanna get a list of all business and/or services.
So I was learning juddi for a while and now I'm able to manage business/services via soapui (let's say in a manual way) or programmatically (via java). So I've created some temp business with services and here's how they look from UDDIBrowser Portlet:
img: old.nabble.com/file/p30975809/uddibrowserportlet.png
I've read that for searching all business you need to use search name "%", but seems like it is not working for me. I've tried both: programmatically and via soapui:
import org.apache.juddi.ClassUtil;
import org.apache.juddi.api_v3.*;
import org.apache.juddi.v3.client.config.UDDIClientContainer;
import org.apache.juddi.v3.client.transport.Transport;
import org.apache.juddi.v3_service.JUDDIApiPortType;
import org.uddi.api_v3.*;
import org.uddi.v3_service.*;
...
private static UDDISecurityPortType security = null;
private static JUDDIApiPortType juddiApi = null;
private static UDDIPublicationPortType publish = null;
private static UDDIInquiryPortType inquiry = null;
public Tools() throws Exception
{
String clazz = UDDIClientContainer.getUDDIClerkManager(null).getClientConfig()
.getUDDINode("default").getProxyTransport();
Class<?> transportClass = ClassUtil.forName(clazz, Transport.class);
if (transportClass != null)
{
Transport transport = (Transport) transportClass.getConstructor(String.class)
.newInstance("default");
security = transport.getUDDISecurityService();
juddiApi = transport.getJUDDIApiService();
publish = transport.getUDDIPublishService();
inquiry = transport.getUDDIInquiryService();
}
}
...
public BusinessList findBusiness(String searchPattern) throws Exception
{
FindBusiness fb = new FindBusiness();
Name findName = new Name();
findName.setValue(searchPattern);
fb.getName().add(findName);
return inquiry.findBusiness(fb);
}
...
findBusiness("%");
It brings me empty BusinessList. Here's how it looks while debugging:
img: old.nabble.com/file/p30975809/debugFindBusinessWildCard.png
However it works when I search for exact business name, for instance "My Business2":
img: old.nabble.com/file/p30975809/MyBusiness2found.png
Same via soapUI (3.6.1):
Request:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:uddi-org:api_v3">
<soapenv:Header/>
<soapenv:Body>
<urn:find_business>
<!--Zero or more repetitions:-->
<urn:name>My Business2</urn:name>
</urn:find_business>
</soapenv:Body>
</soapenv:Envelope>
Respond:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<businessList xmlns:ns10="urn:uddi-org:policy_v3_instanceParms" xmlns:ns9="urn:uddi-org:vs_v3" xmlns:ns8="urn:uddi-org:repl_v3" xmlns:ns7="urn:uddi-org:policy_v3" xmlns:ns6="urn:uddi-org:subr_v3" xmlns:ns5="urn:uddi-org:sub_v3" xmlns:ns4="urn:uddi-org:vscache_v3" xmlns:ns3="urn:uddi-org:custody_v3" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" xmlns="urn:uddi-org:api_v3">
<listDescription>
<includeCount>1</includeCount>
<actualCount>1</actualCount>
<listHead>1</listHead>
</listDescription>
<businessInfos>
<businessInfo businessKey="uddi:juddi.apache.org:c0d12d2f-9f8b-4444-acae-675f8f53383f">
<name>My Business2</name>
<serviceInfos>
<serviceInfo businessKey="uddi:juddi.apache.org:c0d12d2f-9f8b-4444-acae-675f8f53383f" serviceKey="uddi:juddi.apache.org:beed92d4-57b5-4974-9e56-17d846f2cca2">
<name>My Service2</name>
</serviceInfo>
</serviceInfos>
</businessInfo>
</businessInfos>
</businessList>
</soap:Body>
</soap:Envelope>
But finds nothing with "%" (or "*" or other 100 symbols and combinations I've tried (including xpath and other expressions):
Request:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:uddi-org:api_v3">
<soapenv:Header/>
<soapenv:Body>
<urn:find_business>
<!--Zero or more repetitions:-->
<urn:name>%</urn:name>
</urn:find_business>
</soapenv:Body>
</soapenv:Envelope>]
Respond:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<businessList xmlns:ns10="urn:uddi-org:policy_v3_instanceParms" xmlns:ns9="urn:uddi-org:vs_v3" xmlns:ns8="urn:uddi-org:repl_v3" xmlns:ns7="urn:uddi-org:policy_v3" xmlns:ns6="urn:uddi-org:subr_v3" xmlns:ns5="urn:uddi-org:sub_v3" xmlns:ns4="urn:uddi-org:vscache_v3" xmlns:ns3="urn:uddi-org:custody_v3" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" xmlns="urn:uddi-org:api_v3">
<listDescription>
<includeCount>0</includeCount>
<actualCount>0</actualCount>
<listHead>0</listHead>
</listDescription>
</businessList>
</soap:Body>
</soap:Envelope>
I've read about MetaMatrix (found smth: here) but seems like it's not free. Also tried using some other libraries, but vainly. However that "%" pattern seems to be very logic and seems like everybody is using this way of finding all objects, but I cannot figure out why it does not work. I really would love to get some answers or suggestions cause I feel stuck :/ . Thanks for reading and taking time.
Solution:
So the main trick was to set findqualifier "APPROXIMATE_MATCH" or if you would look into its class:
<code>
package org.apache.juddi.query.util;
import org.uddi.api_v3.FindQualifiers;
public class FindQualifiers
{
...
public static final String APPROXIMATE_MATCH = "approximateMatch";
...
</code>
And now only adding this approximate match qualifier + name "%" it works.
<code>
org.uddi.api_v3.Name name = new org.uddi.api_v3.Name();
name.setValue("%");
org.uddi.api_v3.FindQualifiers qualifiers = new org.uddi.api_v3.FindQualifiers();
qualifiers.getFindQualifier().add(org.apache.juddi.query.util.FindQualifiers.APPROXIMATE_MATCH);
// find business
org.uddi.api_v3.FindBusiness findBusiness = new org.uddi.api_v3.FindBusiness();
findBusiness.getName().add(name);
findBusiness.setFindQualifiers(qualifiers);
BusinessList lst = inquiry.findBusiness(findBusiness);
</code>
Note:
you can find this class in "juddi-core-3.0.4.jar". Or you can just write String manualy:
<code>
...
qualifiers.getFindQualifier().add("approximateMatch");
...
</code>
making request via soapUI:
<code>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:uddi-org:api_v3">
<soapenv:Header/>
<soapenv:Body>
<urn:find_business>
<!--Optional:-->
<urn:findQualifiers>
<!--1 or more repetitions:-->
<urn:findQualifier>approximateMatch</urn:findQualifier>
</urn:findQualifiers>
<!--Zero or more repetitions:-->
<urn:name>%</urn:name>
</urn:find_business>
</soapenv:Body>
</soapenv:Envelope>
</code>
Maybe this will help someone, since I had to find out this by myself and it took few days :/
Good luck!
I also noticed, that search pattern "%" works on juddi 0.9rc4. But juddi 0.9rc4 itself works only on java15. So I tried to run juddiv3 (3.0.4) on java15, but the wildcard "%" still searches zero business/services. Any ideas?





Solution:
So the main trick was to set findqualifier "APPROXIMATE_MATCH" or if you would look into its class:
</p> <p>package org.apache.juddi.query.util;</p> <p>import org.uddi.api_v3.FindQualifiers;</p> <p>public class FindQualifiers</p> <p>{</p> <p> ...</p> <p> public static final String APPROXIMATE_MATCH = "approximateMatch";</p> <p> ...</p> <p>And now only adding this approximate match qualifier + name "%" it works.
</p> <p> org.uddi.api_v3.Name name = new org.uddi.api_v3.Name();</p> <p> name.setValue("%");</p> <p> org.uddi.api_v3.FindQualifiers qualifiers = new org.uddi.api_v3.FindQualifiers();</p> <p> qualifiers.getFindQualifier().add(org.apache.juddi.query.util.FindQualifiers.APPROXIMATE_MATCH);</p> <p> // find business</p> <p> org.uddi.api_v3.FindBusiness findBusiness = new org.uddi.api_v3.FindBusiness();</p> <p> findBusiness.getName().add(name);</p> <p> findBusiness.setFindQualifiers(qualifiers);</p> <p> BusinessList lst = inquiry.findBusiness(findBusiness);</p> <p>Note:
you can find this class in "juddi-core-3.0.4.jar". Or you can just write String manualy:
</p> <p>...</p> <p>qualifiers.getFindQualifier().add("approximateMatch");</p> <p>...</p> <p>making request via soapUI:
Maybe this will help someone, since I had to find out this by myself and it took few days :/
Good luck!