You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
(2) |
Nov
(7) |
Dec
(5) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
|
Feb
|
Mar
(1) |
Apr
(23) |
May
(3) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(6) |
Nov
|
Dec
(2) |
2005 |
Jan
(2) |
Feb
|
Mar
|
Apr
(1) |
May
(6) |
Jun
(4) |
Jul
(4) |
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
(4) |
2006 |
Jan
(1) |
Feb
(6) |
Mar
|
Apr
(1) |
May
|
Jun
(1) |
Jul
(1) |
Aug
(4) |
Sep
(4) |
Oct
(4) |
Nov
(6) |
Dec
(3) |
2007 |
Jan
(1) |
Feb
(6) |
Mar
|
Apr
(2) |
May
(1) |
Jun
(1) |
Jul
(2) |
Aug
|
Sep
(12) |
Oct
(19) |
Nov
(7) |
Dec
(7) |
2008 |
Jan
(14) |
Feb
(27) |
Mar
(23) |
Apr
(5) |
May
|
Jun
(1) |
Jul
|
Aug
(9) |
Sep
(22) |
Oct
|
Nov
(5) |
Dec
(7) |
2009 |
Jan
|
Feb
(3) |
Mar
(1) |
Apr
(3) |
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
(2) |
Nov
|
Dec
|
2010 |
Jan
|
Feb
(8) |
Mar
|
Apr
(1) |
May
|
Jun
(5) |
Jul
(4) |
Aug
(2) |
Sep
(5) |
Oct
(1) |
Nov
(2) |
Dec
(2) |
2011 |
Jan
(1) |
Feb
(1) |
Mar
(3) |
Apr
|
May
(7) |
Jun
(3) |
Jul
(8) |
Aug
(9) |
Sep
(5) |
Oct
(4) |
Nov
|
Dec
|
2012 |
Jan
|
Feb
|
Mar
|
Apr
(5) |
May
|
Jun
|
Jul
(1) |
Aug
(2) |
Sep
(6) |
Oct
(20) |
Nov
(15) |
Dec
(11) |
2013 |
Jan
(1) |
Feb
(40) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Paul K. <pau...@ya...> - 2004-10-17 20:26:10
|
Mark, --- Mark Fuller <ami...@ya...> wrote: > I've used the v2 support from the CVS with 60a. It > works fine. I'll try it as distributed with the beta > of 65. Regarding v3 support, I haven't had access to a > v3 server until lately. But, from reading the v3 specs > I've got a feeling UDDI::Lite will need some > rethinking to handle some new features in v3. We'll > have to tackle that later. Not a big deal because v3 > servers like Systinet's should be able to handle v2 > and resolve the differences (like required fields in > v3). Just let us know what you think needs to be done/rethought. Given this I won't be implementing any changes in handling non-UDDI namespaces (to be used in v3) described here http://sourceforge.net/mailarchive/forum.php?thread_id=4204695&forum_id=34563 > I noticed the UDDI::Lite documentation Byrne posted > doesn't mention how to select v1, 2 or 3. Do you guys > want to update it to address the way the module was > changed? Or, do you want me to? I think the only > difference was the "use" pragma. As far as I remember it's a matter of using uddiversion parameter with 'use UDDI::Lite'. Either of us can come up with one or two examples showing that. It would be great if you could write a working example with a real v2 server. We probably need to move this thread to soaplite-devel list (cc-ed). Paul. |
From: Alasdair A. <aa...@as...> - 2004-05-26 16:02:59
|
Does anyone have any examples (or documentaiton) about how to use the WSDL import directive in SOAP::Lite? Al. |
From: <ben...@id...> - 2004-05-22 13:54:15
|
Dear Open Source developer I am doing a research project on "Fun and Software Development" in which I kindly invite you to participate. You will find the online survey under http://fasd.ethz.ch/qsf/. The questionnaire consists of 53 questions and you will need about 15 minutes to complete it. With the FASD project (Fun and Software Development) we want to define the motivational significance of fun when software developers decide to engage in Open Source projects. What is special about our research project is that a similar survey is planned with software developers in commercial firms. This procedure allows the immediate comparison between the involved individuals and the conditions of production of these two development models. Thus we hope to obtain substantial new insights to the phenomenon of Open Source Development. With many thanks for your participation, Benno Luthiger PS: The results of the survey will be published under http://www.isu.unizh.ch/fuehrung/blprojects/FASD/. We have set up the mailing list fa...@we... for this study. Please see http://fasd.ethz.ch/qsf/mailinglist_en.html for registration to this mailing list. _______________________________________________________________________ Benno Luthiger Swiss Federal Institute of Technology Zurich 8092 Zurich Mail: benno.luthiger(at)id.ethz.ch _______________________________________________________________________ |
From: Peter K. <Pet...@lu...> - 2004-05-10 11:08:16
|
Hi There, I'm trying SOAP::Lite and Axis with attachments. I had to change one thing to get it to work, see the patch below. It has to do with the local-ization of the BOUNDARY_DELIMITER inside of a block where it is not being used. Furthermore, you may want to update your examples and show that one can use a: SOAP::Data->name(...)->attr({ href => 'cid:...' }) object to refer to a specific MIME part. regards, --- Peter... Patch: --- /export/home/prkas/temp/SOAP-Lite-0.60/lib/SOAP/Lite.pm 2003-08-18 20:44:18.000000000 +0200 +++ /usr/share/perl5/SOAP/Lite.pm 2004-05-10 13:01:33.000000000 +0200 @@ -2985,6 +2985,7 @@ $headers->header('Content-Type' => 'Multipart/Related; type="text/xml"; start="<main_envelope>"; boundary="'.$top->head->multipart_boundary.'"'); } + local $MIME::Entity::BOUNDARY_DELIMITER = "\r\n"; $serializer->on_nonserialized($self->on_nonserialized); my $response = $self->transport->send_receive( endpoint => $self->endpoint, -- "History teaches that grave threats to liberty often come in times of urgency, when constitutional rights seem too extravagant to endure." - Justice Thurgood Marshall, 1989 |
From: Mark A. F. <mar...@ea...> - 2004-04-20 17:16:58
|
Paul, I made a mistake grouping the following two method names (for export) as "get." They are part of the publishing methods and require an "authInfo" element. get_assertionStatusReport get_publisherAssertions They are similar to "get_registeredInfo" which is grouped in the "auth" subset of methods for export. They should probably go there. All three are related to "auth" by the fact that they operate using the authorization credential (you can only see your own stuff). A clearer subset name might be "getown" or "ownership." I suppose "auth" is ok too. But, they shouldn't be in the non-publish "get". Sorry. Mark |
From: Mark A. F. <mar...@ea...> - 2004-04-20 17:01:51
|
Paul, I think I answered my own question. But, let me confirm this is the intended way to do this. ================ $authToken = get_authToken({userID => 'admin', cred => 'changeit'}); $authInfo = $authToken->authInfo; $publisherAssertions = get_publisherAssertions($authInfo) ================= Generates a "authInfo" element namespaced "namesp1:" If I specify "$authInfo->value" it works perfectly. Is that what you expect? Thanks, Mark |
From: Mark F. <mar...@ea...> - 2004-04-20 05:51:08
|
Paul, I'm testing the publishing part of UDDI::Lite. I can obtain an "authInfo" using this: =========================== $attrs{userID} = 'admin'; $attrs{cred} = 'changeit'; $authToken = get_authToken(\%attrs); my $authInfo = $authToken->authInfo; ============================== However, I can't seem to use $authInfo on subsequent calls which require it. For example: ====================== push @params, authInfo($authInfo); <== This is line 155 my $publisherAssertions = get_publisherAssertions(@params); Don't know what to do with 'authInfo' and 'authInfo' elements at publishv2 line 155 ====================== If I try to pass it as a parm to "get_publisherAssertions" ==================== my $publisherAssertions = get_publisherAssertions($authInfo); ==================== It generates the "authinfo" element as prefixed with "namesp1:". I thought this syntax is equivalent to the example "publish1.pl". Am I doing something wrong? Thanks Mark |
From: Mark F. <mar...@ea...> - 2004-04-19 02:50:28
|
From: "Paul Kulchenko" <pau...@ya...> > Just create a hash with those parameters and set only ones you need: Hi Paul, I appreciate your prompt responses. It has helped me test UDDI v2 quickly. I've executed all the inquiry methods and processed every element and attribute. It works fine. The only issue is "lang" namespaced to "xml" (and, in v3, the element "Signiture" namespaced to "dsig"). And the v2 "find_businessExt" method which provides for unknown schemas in the result. There could be some crossover between this and the attributes and elements in the UDDI schema namespaced elsewhere. I've attached the script I used to test all the v2 inquiry services. If you would like to add it to the "samples" I would appreciate it. Something like this would have helped me get up to speed with UDDI::Lite. I think it will be useful to others. If you see any glaring mistakes, or alternative ways to do things, you're welcome to change the script. I'd like to update the POD for UDDI::Lite and make it easier to comprehend (from my "newbie" perspective). But, there's so many ways to invokeUDDI::Lite functions that I'm not sure I can improve on the POD. As a newbie, I wish it would have been simpler and more straightforward. From what I know, I think I could improve upon the POD. But, I'm worried about the things I don't know. :) Do you think it might be better to have a single syntax rather than so many alternatives? I'll test v3 in a month when I have a v3 server. I'd like to create a v3inquire script similiar to v2inquire. Thanks, Mark |
From: Paul K. <pau...@ya...> - 2004-04-18 06:31:06
|
Mark, > if (defined($findQualifier)) { > $find_binding[$#find_binding + 1] = > findQualifiers( > findQualifier(@{$findQualifier}) > ); > } can also be written as: push @params, findQualifiers(findQualifier(@$findQUalifier)) if ref $findQualifier; > $find_binding[$#find_binding + 1] = > tModelBag( > tModelKey(@{$tModelKeys}) > ); push @params, tModelBag(tModelKey(@$tModelKeys)) if ref $tModelKeys; > 2. How can I dynamically add attributes to find_binding? For Just create a hash with those parameters and set only ones you need: $attrs{maxRows} = 5; # and later: $bindingDetail = find_binding($attrs, @parameters); Hope that works for you. Paul. --- Mark Fuller <mar...@ea...> wrote: > Hi Paul, > > A quick question. I hope this isn't something that belongs on the > user list. > It's part of my attempt to contribute a v2 sample which calls each > service > and processes the entire result of each. I have the latter half > complete and > am working on making the "calls" a better example. > > I want to dynamically build the parms (or content model?) to a UDDI > method > based upon whether optional elements (and attributes) are present. > The > sample/syntax1 script gave me ideas. Using "find_binding" as an > example, I > came up with this: > > ======= start ======= > #---------------------- > # If findQualifier values were specified, create the UDDI::Lite > structure > # and add it to the array of objects to be passed to find_binding. > #------------------------------- > if (defined($findQualifier)) { > $find_binding[$#find_binding + 1] = > findQualifiers( > findQualifier(@{$findQualifier}) > ); > } > > #---------------------- > # tModelBag is always required. Build the structure and add > # it to the array of objects to be passed to find_binding. > #---------------------- > $find_binding[$#find_binding + 1] = > tModelBag( > tModelKey(@{$tModelKeys}) > ); > > $bindingDetail = find_binding({serviceKey => $serviceKey, maxRows > => > $maxRows}, > @find_binding); > > ======= end ======= > > Two questions: > > 1. The above works. Is there a better way to accumulate optional > and > required elements and attributes based upon dynamic input to a > script > (example, from a web page)? > > 2. How can I dynamically add attributes to find_binding? For > example, let's > say serviceKey and maxRows are both optional. How can I include > them > depending upon their presence? I can't do > "find_binding->attr->maxRows{maxRows} = $maxRows". It causes > find_binding to > be executed as a method. > > Thanks! > Mark > > > > ------------------------------------------------------- > This SF.Net email is sponsored by: IBM Linux Tutorials > Free Linux tutorial presented by Daniel Robbins, President and CEO > of > GenToo technologies. Learn everything from fundamentals to system > administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click > _______________________________________________ > Soaplite-devel mailing list > Soa...@li... > https://lists.sourceforge.net/lists/listinfo/soaplite-devel |
From: Mark F. <mar...@ea...> - 2004-04-18 05:01:54
|
Hi Paul, A quick question. I hope this isn't something that belongs on the user list. It's part of my attempt to contribute a v2 sample which calls each service and processes the entire result of each. I have the latter half complete and am working on making the "calls" a better example. I want to dynamically build the parms (or content model?) to a UDDI method based upon whether optional elements (and attributes) are present. The sample/syntax1 script gave me ideas. Using "find_binding" as an example, I came up with this: ======= start ======= #---------------------- # If findQualifier values were specified, create the UDDI::Lite structure # and add it to the array of objects to be passed to find_binding. #------------------------------- if (defined($findQualifier)) { $find_binding[$#find_binding + 1] = findQualifiers( findQualifier(@{$findQualifier}) ); } #---------------------- # tModelBag is always required. Build the structure and add # it to the array of objects to be passed to find_binding. #---------------------- $find_binding[$#find_binding + 1] = tModelBag( tModelKey(@{$tModelKeys}) ); $bindingDetail = find_binding({serviceKey => $serviceKey, maxRows => $maxRows}, @find_binding); ======= end ======= Two questions: 1. The above works. Is there a better way to accumulate optional and required elements and attributes based upon dynamic input to a script (example, from a web page)? 2. How can I dynamically add attributes to find_binding? For example, let's say serviceKey and maxRows are both optional. How can I include them depending upon their presence? I can't do "find_binding->attr->maxRows{maxRows} = $maxRows". It causes find_binding to be executed as a method. Thanks! Mark |
From: Mark F. <mar...@ea...> - 2004-04-17 19:37:16
|
Hi Paul, I have written a script to call each v2 inquiry API service and display each element/attribute of each result. Everything works great! I'd like to contribute that inquiry script as a sample. The existing samples demonstrate this. But, this one demonstrates each service and every result. More verbose too. (I started programming in COBOL. Everythign I do looks like COBOL <ha>). I'll send it to you in a few days. Regarding the non-uddi namespace attributes (xml:lang in all three versions) and elements (dsig:Signiture in v3), I discovered something else in v2 which may affect how you plan to handle this. In v2 the method "get_businessDetailExt" which returns a "businessEntityExt". This element contains a "businessEntity" element and this: <xsd:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded" /> I don't know if this is something you want to program for and/or how much it overlaps the issue of non-uddi namespace elements and attribues used in the UDDI schema. At a minimum it will have to be documented that the user use a special syntax to access non-uddi namespace elements and attributes unknown to the UDDI schema. ("foo->attr->{'ns:bar'}" for the attribute. How would the element be accessed?) You could apply the same rule to non-uddi namespace elements and attributes used in the UDDI schema. Conversely, whatever you program for in the case of non-uddi namespace elements and attributes used in the UDDI schema, could it be made more flexible and capable of being extended in cases that a user is processing results that are defined by a schema unknown to UDDI? (That's why it seems like there's a slight amount of overlap between both issues.) Thanks, Mark |
From: Paul K. <pau...@ya...> - 2004-04-17 06:11:16
|
Mark, --- "Mark A. Fuller" <mar...@ea...> wrote: > You're right. The following accesses the "xml:lang" attribute: > > $name->{'_attr'}{'xml:lang'}; This code works, but shouldn't be used. See below. > While we're on the subject of different syntaxes, you provided this > example as a way to bypass ATTRIBUTES hash checking: > > foo->attr({bar => 'foobar'}) > > Is there a form that will return the value? I'm keeping all these > examples and intend to work them into my samples of exercising v2. There is. In fact, the code above is not the best way to do it as it sets 'bar' as the ONLY attribute effectively removing everything else. Here is the code that does what you need. foo->attr->{bar} = 'foobar'; # SET print foo->attr->{bar}; # GET > 1. UDDI:Lite limits its awareness to only attributes within the > UDDI namespace? Users will have to be aware that they must use the > format above to access attributes outside the namespace? Yes. No. Below. > 2. UDDI:Lite maintains non-uddi namespace in its ATTRIBUTES table? > and the user access attributes as "foo->ns:bar" in those cases? > (The interpreter doesn't like that syntax. We'd have to come up > with another way of keeping namespace). This syntax won't work. I suggest we keep everything as it is (ALL attributes in one table) and add one more table for namespaces. Those attributes that are not in UDDI namespace will (also) be represented there. Code that generates attributes will be smart to look at that table. That won't work if there are two element in different namespaces with the same name, but that's not the sace with existing UDDI specs as far as I know. > 3. Since UDDI is a single namespace, can namespace be ignored? > Could there be a collision of differently namespaced elements or > attributes within the UDDI schema? No; you still need to generate proper namespaces, or server will reject your request. Unlikely. > I think this is an important question because v3 increases the use > of "xml:lang". In v1 it may not have been important. It was used on > only one element. For v2 it is used on two and is part of querying > by name (specifying language to limit the query to). v3 increases > it to 4 elements (address and personName). Agreed. I uploaded a new version that includes elements and attributes for UDDIv2 and UDDIv3 you provided. I also fixed NAMESPACES/GENERIC for UDDIv2 and v3. Next step is to figure out what todo for attributes in non-UDDI namespace. I'll check if my idea works. Best wishes, Paul. |
From: Mark A. F. <mar...@ea...> - 2004-04-16 21:08:49
|
>... ATTRIBUTES hash is checked only when you use UDDI >syntax ("foo->bar" or "foo with bar"); in all other cases (when you >use UDDI::Data or foo->attr({bar => 'foobar'})) ATTRIBUTES hash is >not used -- you should be allowed to set/get any attributes you like. You're right. The following accesses the "xml:lang" attribute: $name->{'_attr'}{'xml:lang'}; While we're on the subject of different syntaxes, you provided this example as a way to bypass ATTRIBUTES hash checking: foo->attr({bar => 'foobar'}) Is there a form that will return the value? I'm keeping all these examples and intend to work them into my samples of exercising v2. I guess the question now is, 1. UDDI:Lite limits its awareness to only attributes within the UDDI namespace? Users will have to be aware that they must use the format above to access attributes outside the namespace? 2. UDDI:Lite maintains non-uddi namespace in its ATTRIBUTES table? and the user access attributes as "foo->ns:bar" in those cases? (The interpreter doesn't like that syntax. We'd have to come up with another way of keeping namespace). 3. Since UDDI is a single namespace, can namespace be ignored? Could there be a collision of differently namespaced elements or attributes within the UDDI schema? I think this is an important question because v3 increases the use of "xml:lang". In v1 it may not have been important. It was used on only one element. For v2 it is used on two and is part of querying by name (specifying language to limit the query to). v3 increases it to 4 elements (address and personName). Mark ---- for my $name ($businessInfo->name) { print ' ' . $name . ' (' . $name->lang . ')' . "\n"; my $x = $name->{'_attr'}{'xml:lang'}; print 'here' . $x; } # end loop for name ---- |
From: Paul K. <pau...@ya...> - 2004-04-16 17:26:07
|
Mark, Could you send me the code that is not working for attributes? The thing is that ATTRIBUTES hash is checked only when you use UDDI syntax ("foo->bar" or "foo with bar"); in all other cases (when you use UDDI::Data or foo->attr({bar => 'foobar'})) ATTRIBUTES hash is not used -- you should be allowed to set/get any attributes you like. Are you trying to SET or GET them? I have few examples in the uddi test file that work with attributes. > Caveat (and a reason to believe the namespace has something to do > with this): UDDI:Lite's content model for v1 does not include > "description=>{lang=>2}". You'll have to add it to the > "ATTRIBUTES" section. (Should it retain its namespace? and, the > user access UDDI results using the namespace?) You may be right. I need to check how namespaces affect attribute handling. Still code snippet would be helpful. Best wishes, Paul. --- "Mark A. Fuller" <mar...@ea...> wrote: > Hi Paul, > > I got the version selector to work. I can switch between v1 and v2. > That's nice. I can harvest the v3 information and plug it in. > > I'm still having trouble with attributes. The v1 spec has a "lang" > attribute on the "description" element. The v2 spec has them on > "name" and "description" elements. (It's a way to have multiple > names and descriptions, one per language). I can't access that > attribute using either v1 or v2. > > I believe the problem may have something to do with the fact that > this attribute is namespaced to XML. (<xsd:attribute > ref="xml:lang"/>) The UDDI server returns this markup "<description > xml:lang="en">". > > Caveat (and a reason to believe the namespace has something to do > with this): UDDI:Lite's content model for v1 does not include > "description=>{lang=>2}". You'll have to add it to the > "ATTRIBUTES" section. (Should it retain its namespace? and, the > user access UDDI results using the namespace?) > > Mark > > > ------------------------------------------------------- > This SF.Net email is sponsored by: IBM Linux Tutorials > Free Linux tutorial presented by Daniel Robbins, President and CEO > of > GenToo technologies. Learn everything from fundamentals to system > administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click > _______________________________________________ > Soaplite-devel mailing list > Soa...@li... > https://lists.sourceforge.net/lists/listinfo/soaplite-devel |
From: Mark A. F. <mar...@ea...> - 2004-04-16 16:42:28
|
Hi Paul, I got the version selector to work. I can switch between v1 and v2. That's nice. I can harvest the v3 information and plug it in. I'm still having trouble with attributes. The v1 spec has a "lang" attribute on the "description" element. The v2 spec has them on "name" and "description" elements. (It's a way to have multiple names and descriptions, one per language). I can't access that attribute using either v1 or v2. I believe the problem may have something to do with the fact that this attribute is namespaced to XML. (<xsd:attribute ref="xml:lang"/>) The UDDI server returns this markup "<description xml:lang="en">". Caveat (and a reason to believe the namespace has something to do with this): UDDI:Lite's content model for v1 does not include "description=>{lang=>2}". You'll have to add it to the "ATTRIBUTES" section. (Should it retain its namespace? and, the user access UDDI results using the namespace?) Mark |
From: Byrne R. <by...@ma...> - 2004-04-16 15:22:00
|
It sometimes takes a while for the changes to trickle through the=20 system. Be patient - the changes will show up soon. =3D-D Paul Kulchenko wrote: >Mark, > >I'm not sure what's going on. I definitely committed my changes (my >working copy is in sync with the repository), but I don't see them >through viewCVS. I tried export and it returns the correct version.=20 > >Does anybody have an idea? > >Anyway, I attached the modified UDDI::Lite.pm. I hope the issue will >dissapear tomorrow ;). > >Best wishes, Paul.=20 > >--- Mark Fuller <mar...@ea...> wrote: > =20 > >>>I've just commited the update that fixes a known bug with not >>>handling attributes. See if it works for you. >>> =20 >>> >>Can you give me a URL? I probably don't know what I'm doing, but I >>tried >> >> >> =20 >> >http://cvs.sourceforge.net/viewcvs.py/soaplite/soaplite-dist/lib/UDDI/Li= te.pm > =20 > >>Nothing looked recently updated. I poked around different places >>near there. >>Didn't see anything. >> >>When I get this update I'll do a lot of testing and give you >>feedback about >>bugs I find, and/or enhancement ideas. Maybe this is the >>opportunity for me >>to learn Perl debugger and learn how this module works. I've >>written a few >>modules, but nothing that does so much in so few instructions. :) >> >>Mark >> >> =20 >> >>-----------------------------------------------------------------------= - >> >># =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >># >># Copyright (C) 2000-2001 Paul Kulchenko (pau...@ya...) >># SOAP::Lite is free software; you can redistribute it >># and/or modify it under the same terms as Perl itself. >># >># $Id: Lite.pm,v 1.2 2004/04/16 00:46:51 paulclinger Exp $ >># >># =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> >>package UDDI::Lite; >> >>use 5.004; >>use strict; >>use vars qw($VERSION); >>$VERSION =3D sprintf("%d.%s", map {s/_//g; $_} q$Name: $ =3D~ /-(\d+)_= ([\d_]+)/); >> >>use SOAP::Lite; >> >># =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> >>package UDDI::SOM; >> >>use vars qw(@ISA); >>@ISA =3D qw(SOAP::SOM); >> >>sub result { # result should point to immediate child of Body >> my $self =3D shift; >> my $result =3D '/Envelope/Body/[1]';=20 >> ref $self or return $result; >> defined $self->fault ? undef : $self->valueof($result); >>}; >> >># =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> >>package UDDI::Data; >> >>use Carp (); >> >>use vars qw(@ISA $AUTOLOAD @EXPORT_OK %EXPORT_TAGS); >>@ISA =3D qw(SOAP::Data); >> >>my @elements =3D (with =3D> qw/accessPoint address addressLine authInfo= authToken bindingDetail bindingKey bindingTemplate bindingTemplates busi= nessDetail businessDetailExt businessEntity businessEntityExt businessInf= o businessInfos businessKey businessList businessService businessServices= categoryBag contact contacts description discoveryURL discoveryURLs disp= ositionReport email errInfo findQualifier findQualifiers hostingRedirecto= r identifierBag instanceDetails instanceParms keyValue keyedReference nam= e overviewDoc overviewURL personName phone registeredInfo result serviceD= etail serviceInfo serviceInfos serviceKey serviceList tModel tModelBag tM= odelDetail tModelInfo tModelInfos tModelInstanceDetails tModelInstanceInf= o tModelKey tModelList uploadRegister/); >>@EXPORT_OK =3D (@elements); >>%EXPORT_TAGS =3D ('all' =3D> [@EXPORT_OK]); >> >>use overload fallback =3D> 1, '""' =3D> sub { shift->SUPER::value }; >> >>use vars qw(%elements %attributes); >>%elements =3D (get_serviceDetail=3D>{serviceKey=3D>1},find_tModel=3D>{c= ategoryBag=3D>1,name=3D>1,identifierBag=3D>1,findQualifiers=3D>1},tModelI= nstanceInfo=3D>{instanceDetails=3D>1,description=3D>1},address=3D>{addres= sLine=3D>1},categoryBag=3D>{keyedReference=3D>1},save_binding=3D>{authInf= o=3D>1,bindingTemplate=3D>1},businessEntity=3D>{categoryBag=3D>1,business= Services=3D>1,name=3D>1,description=3D>1,identifierBag=3D>1,discoveryURLs= =3D>1,contacts=3D>1},businessInfos=3D>{businessInfo=3D>1},find_business=3D= >{categoryBag=3D>1,name=3D>1,identifierBag=3D>1,discoveryURLs=3D>1,findQu= alifiers=3D>1,tModelBag=3D>1},get_bindingDetail=3D>{bindingKey=3D>1},iden= tifierBag=3D>{keyedReference=3D>1},get_businessDetailExt=3D>{businessKey=3D= >1},businessServices=3D>{businessService=3D>1},tModelInfo=3D>{name=3D>1},= find_service=3D>{categoryBag=3D>1,name=3D>1,findQualifiers=3D>1,tModelBag= =3D>1},dispositionReport=3D>{result=3D>1},authToken=3D>{authInfo=3D>1},ge= t_tModelDetail=3D>{tModelKey=3D>1},delete_tModel=3D>{tModelKey=3D>1,authI= nfo=3D>1},bindingTemplate=3D>{tModelInstanceDetails=3D>1,accessPoint=3D>1= ,description=3D>1,hostingRedirector=3D>1},tModelDetail=3D>{tModel=3D>1},b= usinessInfo=3D>{serviceInfos=3D>1,name=3D>1,description=3D>1},get_registe= redInfo=3D>{authInfo=3D>1},businessEntityExt=3D>{businessEntity=3D>1},reg= isteredInfo=3D>{businessInfos=3D>1,tModelInfos=3D>1},find_binding=3D>{fin= dQualifiers=3D>1,tModelBag=3D>1},serviceInfo=3D>{name=3D>1},get_businessD= etail=3D>{businessKey=3D>1},delete_business=3D>{businessKey=3D>1,authInfo= =3D>1},discoveryURLs=3D>{discoveryURL=3D>1},businessDetail=3D>{businessEn= tity=3D>1},contacts=3D>{contact=3D>1},tModelInstanceDetails=3D>{tModelIns= tanceInfo=3D>1},tModelList=3D>{tModelInfos=3D>1},delete_service=3D>{servi= ceKey=3D>1,authInfo=3D>1},tModelInfos=3D>{tModelInfo=3D>1},serviceDetail=3D= >{businessService=3D>1},tModel=3D>{categoryBag=3D>1,name=3D>1,description= =3D>1,identifierBag=3D>1,overviewDoc=3D>1},businessList=3D>{businessInfos= =3D>1},bindingTemplates=3D>{bindingTemplate=3D>1},validate_categorization= =3D>{businessEntity=3D>1,tModel=3D>1,businessService=3D>1,keyValue=3D>1,t= ModelKey=3D>1},contact=3D>{email=3D>1,personName=3D>1,phone=3D>1,descript= ion=3D>1,address=3D>1},discard_authToken=3D>{authInfo=3D>1},overviewDoc=3D= >{overviewURL=3D>1,description=3D>1},delete_binding=3D>{bindingKey=3D>1,a= uthInfo=3D>1},serviceList=3D>{serviceInfos=3D>1},bindingDetail=3D>{bindin= gTemplate=3D>1},tModelBag=3D>{tModelKey=3D>1},businessDetailExt=3D>{busin= essEntityExt=3D>1},serviceInfos=3D>{serviceInfo=3D>1},save_tModel=3D>{upl= oadRegister=3D>1,tModel=3D>1,authInfo=3D>1},findQualifiers=3D>{findQualif= ier=3D>1},save_business=3D>{businessEntity=3D>1,uploadRegister=3D>1,authI= nfo=3D>1},instanceDetails=3D>{instanceParms=3D>1,description=3D>1,overvie= wDoc=3D>1},businessService=3D>{categoryBag=3D>1,name=3D>1,bindingTemplate= s=3D>1,description=3D>1},save_service=3D>{businessService=3D>1,authInfo=3D= >1},result=3D>{errInfo=3D>1}); >>%attributes =3D (get_serviceDetail=3D>{generic=3D>2},find_tModel=3D>{ma= xRows=3D>2,generic=3D>2},tModelInstanceInfo=3D>{tModelKey=3D>2},address=3D= >{sortCode=3D>2,useType=3D>2},email=3D>{useType=3D>2},save_binding=3D>{ge= neric=3D>2},businessEntity=3D>{authorizedName=3D>2,operator=3D>2,business= Key=3D>2},discoveryURL=3D>{useType=3D>2},find_business=3D>{maxRows=3D>2,g= eneric=3D>2},get_bindingDetail=3D>{generic=3D>2},get_businessDetailExt=3D= >{generic=3D>2},tModelInfo=3D>{tModelKey=3D>2},find_service=3D>{maxRows=3D= >2,businessKey=3D>2,generic=3D>2},dispositionReport=3D>{truncated=3D>2,op= erator=3D>2,generic=3D>2},authToken=3D>{operator=3D>2,generic=3D>2},get_t= ModelDetail=3D>{generic=3D>2},bindingTemplate=3D>{serviceKey=3D>2,binding= Key=3D>2},delete_tModel=3D>{generic=3D>2},tModelDetail=3D>{truncated=3D>2= ,operator=3D>2,generic=3D>2},businessInfo=3D>{businessKey=3D>2},get_regis= teredInfo=3D>{generic=3D>2},registeredInfo=3D>{truncated=3D>2,operator=3D= >2,generic=3D>2},phone=3D>{useType=3D>2},find_binding=3D>{maxRows=3D>2,se= rviceKey=3D>2,generic=3D>2},serviceInfo=3D>{serviceKey=3D>2,businessKey=3D= >2},get_businessDetail=3D>{generic=3D>2},delete_business=3D>{generic=3D>2= },businessDetail=3D>{truncated=3D>2,operator=3D>2,generic=3D>2},keyedRefe= rence=3D>{keyName=3D>2,keyValue=3D>2,tModelKey=3D>2},tModelList=3D>{trunc= ated=3D>2,operator=3D>2,generic=3D>2},delete_service=3D>{generic=3D>2},se= rviceDetail=3D>{truncated=3D>2,operator=3D>2,generic=3D>2},tModel=3D>{aut= horizedName=3D>2,operator=3D>2,tModelKey=3D>2},businessList=3D>{truncated= =3D>2,operator=3D>2,generic=3D>2},validate_categorization=3D>{generic=3D>= 2},contact=3D>{useType=3D>2},discard_authToken=3D>{generic=3D>2},delete_b= inding=3D>{generic=3D>2},serviceList=3D>{truncated=3D>2,operator=3D>2,gen= eric=3D>2},bindingDetail=3D>{truncated=3D>2,operator=3D>2,generic=3D>2},h= ostingRedirector=3D>{bindingKey=3D>2},businessDetailExt=3D>{truncated=3D>= 2,operator=3D>2,generic=3D>2},get_authToken=3D>{userID=3D>2,generic=3D>2,= cred=3D>2},save_tModel=3D>{generic=3D>2},errInfo=3D>{errCode=3D>2},save_b= usiness=3D>{generic=3D>2},accessPoint=3D>{URLType=3D>2},businessService=3D= >{serviceKey=3D>2,businessKey=3D>2},save_service=3D>{generic=3D>2},result= =3D>{keyType=3D>2,errno=3D>2}); >> >>sub new { >> my $self =3D shift; >> my $class =3D ref($self) || $self; >> >> unless (ref $self) { >> $self =3D $class->SUPER::new(@_, type =3D> 'uddi'); >> } >> return $self; >>} >> >>sub with { >> my $self =3D shift; >> $self =3D (__PACKAGE__->can($self) || Carp::croak "Don't know what to= do with '$self'")->() >> unless ref $self && UNIVERSAL::isa($self =3D> __PACKAGE__); >> >> my $name =3D $self->SUPER::name; >> my @values; >> while (@_) { >> my $data =3D shift; >> my($method, $attr, @value) =3D UNIVERSAL::isa($data =3D> __PACKAGE_= _) >> ? ($data->SUPER::name, $data->SUPER::attr, $data->SUPER::value) >> : ($data, {}, shift); >> exists $attributes{$name}{$method} >> # attribute >> ? $self->$method(@value) >> # sub element >> : push(@values, ($self->can($method) || Carp::croak "Don't know w= hat to do with '$method'")->(@value)->attr($attr)); >> } >> $self->set_value([@values]); >>} >> >>sub _compileit { >> no strict 'refs'; >> my $method =3D shift; >> *$method =3D sub {=20 >> >> # GENERATE element if no parameters: businessInfo() >> return __PACKAGE__->SUPER::name($method)=20 >> if !@_ && exists $elements{$method}; >> >> die "Expected element (UDDI::Data) as parameter for $method()\n" >> if !ref $_[0] && exists $elements{$method}; >> >> # MAKE ELEMENT: name( [{attr =3D> value},] 'old') >> if (!UNIVERSAL::isa($_[0] =3D> __PACKAGE__)) { >> # get optional list of attributes as a first parameter >> my $attr =3D ref $_[0] eq 'HASH' ? shift @_ : {}; >> return __PACKAGE__->SUPER::name($method =3D> @_)->attr($attr); >> } >> >> my $name =3D $_[0]->SUPER::name; >> >> if (defined $name) { >> # GET/SET ATTRIBUTE: businessInfo->businessKey >> return @_ > 1=20 >> ? scalar($_[0]->attr->{$method} =3D $_[1], $_[0]) = # SET >> : __PACKAGE__->SUPER::name($method =3D> $_[0]->attr->{$method= }) # GET >> if exists $attributes{$name} && exists $attributes{$name}{$meth= od}; >> >> # GET ELEMENT: businessInfos->businessInfo >> my @elems =3D grep { >> ref $_ && UNIVERSAL::isa($_ =3D> __PACKAGE__) && $_->SUPER::nam= e eq $method >> } map {ref $_ eq 'ARRAY' ? @$_ : $_} $_[0]->value; >> return wantarray? @elems : $elems[0] >> if exists $elements{$name} && exists $elements{$name}{$method};= >> >> # MAKE ELEMENT: businessInfos(businessInfo('something')) >> return __PACKAGE__->SUPER::name($method =3D> @_)=20 >> if exists $elements{$method} && exists $elements{$method}{$name= }; >> } >> >> # handle UDDI::Data->method() calls for those SOAP::Data methods=20 >> # that conflict with UDDI methods, like name() >> if (UNIVERSAL::can($ISA[0] =3D> $method)) { >> my $pkg =3D shift @_; >> return eval "\$pkg->SUPER::$method(\@_)"; >> } >> >> Carp::croak "Don't know what to do with '$method' and '$name' eleme= nts"; >> } >>} >> >>sub BEGIN { _compileit('name') } >> >>sub AUTOLOAD { >> my $method =3D substr($AUTOLOAD, rindex($AUTOLOAD, '::') + 2); >> return if $method eq 'DESTROY'; >> >> _compileit($method); >> goto &$AUTOLOAD; >>} >> >># =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> >>package UDDI::Serializer; >> >>use vars qw(@ISA); >>@ISA =3D qw(SOAP::Serializer); >> >>sub new {=20 >> my $self =3D shift; >> my $class =3D ref($self) || $self; >> >> unless (ref $self) { >> $self =3D $class->SUPER::new( >> attr =3D> {}, >> namespaces =3D> { >> $SOAP::Constants::PREFIX_ENV ? ($SOAP::Constants::NS_ENV =3D> $= SOAP::Constants::PREFIX_ENV) : (), >> }, >> autotype =3D> 0, >> @_, >> ); >> } >> return $self; >>} >> >>use overload; # protect from stringification in UDDI::Data >>sub gen_id { overload::StrVal($_[1]) =3D~ /\((0x\w+)\)/o; $1 } >> >>sub as_uddi {=20 >> my $self =3D shift; >> my($value, $name, $type, $attr) =3D @_; >> return $self->encode_array($value, $name, undef, $attr) if ref $value= eq 'ARRAY'; >> return $self->encode_hash($value, $name, undef, $attr) if ref $value = eq 'HASH'; >> [$name, {%{$attr || {}}}, ref $value ? ([$self->encode_object($value)= ], $self->gen_id($value)) : $value]; >>} = =20 >> >>sub encode_array { >> my $self =3D shift; >> my $encoded =3D $self->SUPER::encode_array(@_); >> delete $encoded->[1]->{SOAP::Utils::qualify($self->encprefix =3D> 'ar= rayType')}; >> return $encoded; >>} >> >># =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> >>package UDDI::Deserializer; >> >>use vars qw(@ISA); >>@ISA =3D qw(SOAP::Deserializer); >> >>sub decode_value { >> my $self =3D shift; >> my $ref =3D shift; >> my($name, $attrs, $children, $value) =3D @$ref; >> >> # base class knows what to do with elements in SOAP namespace >> return $self->SUPER::decode_value($ref)=20 >> if exists $attrs->{href} ||=20 >> (SOAP::Utils::splitlongname($name))[0] eq $SOAP::Constants::NS_E= NV; >> >> UDDI::Data >> -> SOAP::Data::name($name) >> -> attr($attrs) >> -> set_value(ref $children && @$children ? map(scalar(($self->decod= e_object($_))[1]), @$children) : $value); >>} >> >>sub deserialize { >> bless shift->SUPER::deserialize(@_) =3D> 'UDDI::SOM'; >>} >> >># =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> >>package UDDI::Lite; >> >>use vars qw(@ISA $AUTOLOAD %EXPORT_TAGS); >>use Exporter; >>use Carp (); >>@ISA =3D qw(SOAP::Lite Exporter); >> >>BEGIN { # handle exports >> %EXPORT_TAGS =3D ( >> 'delete' =3D> [qw/delete_binding delete_business delete_service d= elete_tModel/], >> 'auth' =3D> [qw/get_authToken discard_authToken get_registeredI= nfo/], >> 'save' =3D> [qw/save_binding save_business save_service save_tM= odel/], >> 'validate' =3D> [qw/validate_categorization/], >> 'find' =3D> [qw/find_binding find_business find_service find_tM= odel/], >> 'get' =3D> [qw/get_bindingDetail get_businessDetail get_busine= ssDetailExt get_serviceDetail get_tModelDetail/], >> ); >> $EXPORT_TAGS{inquiry} =3D [map {@{$EXPORT_TAGS{$_}}} qw/find get/]; >> $EXPORT_TAGS{publish} =3D [map {@{$EXPORT_TAGS{$_}}} qw/delete auth s= ave validate/]; >> $EXPORT_TAGS{all} =3D [map {@{$EXPORT_TAGS{$_}}} qw/inquiry publi= sh/]; >> Exporter::export_ok_tags('all'); >>} >> >>sub new {=20 >> my $self =3D shift; >> my $class =3D ref($self) || $self; >> >> unless (ref $self) { >> $self =3D $class->SUPER::new( >> on_action =3D> sub {'""'}, >> serializer =3D> UDDI::Serializer->new, # register UDDI Serial= izer >> deserializer =3D> UDDI::Deserializer->new, # and Deserializer >> @_, >> ); >> } >> return $self; >>} >> >>sub AUTOLOAD { >> my $method =3D substr($AUTOLOAD, rindex($AUTOLOAD, '::') + 2); >> return if $method eq 'DESTROY'; >> >> no strict 'refs'; >> *$AUTOLOAD =3D sub {=20 >> return shift->call($method =3D> @_) if UNIVERSAL::isa($_[0] =3D> __= PACKAGE__); >> my $som =3D (__PACKAGE__->self || Carp::croak "Method call on unspe= cified object. Died")->call($method =3D> @_); >> UNIVERSAL::isa($som =3D> 'SOAP::SOM') ? $som->result : $som; >> }; >> goto &$AUTOLOAD; >>} >> >>sub call { SOAP::Trace::trace('()');=20 >> my $self =3D shift; >> my $method =3D shift; >> my @parameters; >> my $attr =3D ref $_[0] eq 'HASH' ? shift() : {}; >> while (@_) { >> push(@parameters, UNIVERSAL::isa($_[0] =3D> 'UDDI::Data')=20 >> ? shift : SOAP::Data->name(shift, shift)); >> } >> my $message =3D SOAP::Data >> -> name($method =3D> \SOAP::Data->value(@parameters)) >> -> attr({xmlns=3D>'urn:uddi-org:api', generic =3D> '1.0', %$attr});= >> >> my $serializer =3D $self->serializer; >> $serializer->on_nonserialized($self->on_nonserialized); >> >> my $respond =3D $self->transport->send_receive( >> endpoint =3D> $self->endpoint,=20 >> action =3D> $self->on_action->($self->uri), >> envelope =3D> $serializer->envelope(freeform =3D> $message),=20 >> encoding =3D> $serializer->encoding, >> ); >> >> return $respond if $self->outputxml; >> >> unless ($self->transport->is_success) { >> my $result =3D eval { $self->deserializer->deserialize($respond) } = if $respond; >> return $self->on_fault->($self, $@ ? $respond : $result) || $result= ; >> } >> >> return unless $respond; # nothing to do for one-ways >> return $self->deserializer->deserialize($respond); >>} >> >># =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> >>1; >> >>__END__ >> >>=3Dhead1 NAME >> >>UDDI::Lite - Library for UDDI clients in Perl >> >>=3Dhead1 SYNOPSIS >> >> use UDDI::Lite; >> print UDDI::Lite >> -> proxy('http://uddi.microsoft.com/inquire') >> -> find_business(name =3D> 'old') >> -> result >> -> businessInfos->businessInfo->serviceInfos->serviceInfo->name; >> >>The same code with autodispatch:=20 >> >> use UDDI::Lite +autodispatch =3D>=20 >> proxy =3D> 'http://uddi.microsoft.com/inquire' >> ; >> >> print find_business(name =3D> 'old') >> -> businessInfos->businessInfo->serviceInfos->serviceInfo->name; = =20 >> >>Or with importing: >> >> use UDDI::Lite=20 >> 'UDDI::Lite' =3D> [':inquiry'], >> proxy =3D> 'http://uddi.microsoft.com/inquire' >> ; >> >> print find_business(name =3D> 'old') >> -> businessInfos->businessInfo->serviceInfos->serviceInfo->name; = =20 >> >>Publishing API: >> >> use UDDI::Lite=20 >> import =3D> ['UDDI::Data'],=20 >> import =3D> ['UDDI::Lite'], >> proxy =3D> "https://some.server.com/endpoint_fot_publishing_API"; >> >> my $auth =3D get_authToken({userID =3D> 'USERID', cred =3D> 'CRED'})-= >authInfo; >> my $busent =3D with businessEntity =3D> >> name("Contoso Manufacturing"),=20 >> description("We make components for business"), >> businessKey(''), >> businessServices with businessService =3D> >> name("Buy components"),=20 >> description("Bindings for buying our components"), >> serviceKey(''), >> bindingTemplates with bindingTemplate =3D> >> description("BASDA invoices over HTTP post"), >> accessPoint('http://www.contoso.com/buy.asp'), >> bindingKey(''), >> tModelInstanceDetails with tModelInstanceInfo =3D> >> description('some tModel'), >> tModelKey('UUID:C1ACF26D-9672-4404-9D70-39B756E62AB4') >> ; >> print save_business($auth, $busent)->businessEntity->businessKey; >> >>=3Dhead1 DESCRIPTION >> >>UDDI::Lite for Perl is a collection of Perl modules which provides a=20 >>simple and lightweight interface to the Universal Description, Discover= y >>and Integration (UDDI) server. >> >>To learn more about UDDI, visit http://www.uddi.org/. >> >>The main features of the library are: >> >>=3Dover 3 >> >>=3Ditem * >> >>Supports both inquiry and publishing API=20 >> >>=3Ditem * >> >>Builded on top of SOAP::Lite module, hence inherited syntax and feature= s >> >>=3Ditem * >> >>Supports easy-to-use interface with convinient access to (sub)elements >>and attributes >> >>=3Ditem * >> >>Supports HTTPS protocol >> >>=3Ditem * >> >>Supports SMTP protocol >> >>=3Ditem * >> >>Supports Basic/Digest server authentication >> >>=3Dback >> >>=3Dhead1 OVERVIEW OF CLASSES AND PACKAGES >> >>This table should give you a quick overview of the classes provided by = the >>library. >> >> UDDI::Lite.pm >> -- UDDI::Lite -- Main class provides all logic >> -- UDDI::Data -- Provides extensions for serialization archite= cture >> -- UDDI::Serializer -- Serializes data structures to UDDI/SOAP packa= ge >> -- UDDI::Deserializer -- Deserializes result into objects >> -- UDDI::SOM -- Provides access to deserialized object tree >> >>=3Dhead2 UDDI::Lite >> >>All methods that UDDI::Lite gives you access to can be used for both >>setting and retrieving values. If you provide no parameters, you'll >>get current value, and if you'll provide parameter(s), new value >>will be assigned and method will return object (if not stated something= >>else). This is suitable for stacking these calls like: >> >> $uddi =3D UDDI::Lite >> -> on_debug(sub{print@_}) >> -> proxy('http://uddi.microsoft.com/inquire') >> ; >> >>Order is insignificant and you may call new() method first. If you >>don't do it, UDDI::Lite will do it for you. However, new() method >>gives you additional syntax: >> >> $uddi =3D new UDDI::Lite >> on_debug =3D> sub {print@_}, >> proxy =3D> 'http://uddi.microsoft.com/inquire' >> ; >> >>new() accepts hash with method names and values, and will call=20 >>appropriate method with passed value. >> >>Since new() is optional it won't be mentioned anymore. >> >>Other available methods inherited from SOAP::Lite and most usable are: >> >>=3Dover 4 >> >>=3Ditem proxy() >> >>Shortcut for C<transport-E<gt>proxy()>. This lets you specify an endpoi= nt and=20 >>also loads the required module at the same time. It is required for dis= patching SOAP=20 >>calls. The name of the module will be defined depending on the protocol= =20 >>specific for the endpoint. SOAP::Lite will do the rest work. >> >>=3Ditem on_fault() >> >>Lets you specify handler for on_fault event. Default behavior is die=20 >>on transport error and does nothing on others. You can change this=20 >>behavior globally or locally, for particular object. >> >>=3Ditem on_debug() >> >>Lets you specify handler for on_debug event. Default behavior is do=20 >>nothing. Use +trace/+debug option for UDDI::Lite instead. >> >>=3Dback >> >>=3Dhead2 UDDI::Data >> >>You can use this class if you want to specify value and name for UDDI=20 >>elements.=20 >>For example, C<UDDI::Data-E<gt>name('businessInfo')-E<gt>value(123)> wi= ll=20 >>be serialized to C<E<lt>businessInfoE<gt>123E<lt>/businessInfoE<gt>>, a= s=20 >>well as C<UDDI::Data->name(businessInfo =3DE<gt> 123)>. >> >>If you want to provide names for your parameters you can either specify= >> >> find_business(name =3D> 'old') >> >>or do it with UDDI::Data: >> >> find_business(UDDI::Data->name(name =3D> 'old')) >> >>Later has some advantages: it'll work on any level, so you can do: >> >> find_business(UDDI::Data->name(name =3D> UDDI::Data->name(subname =3D= > 'old'))) >> >>and also you can create arrays with this syntax: >> =20 >> find_business(UDDI::Data->name(name =3D>=20 >> [UDDI::Data->name(subname1 =3D> 'name1'),=20 >> UDDI::Data->name(subname2 =3D> 'name2')])) >> >>will be serialized into: >> >> <find_business xmlns=3D"urn:uddi-org:api" generic=3D"1.0"> >> <name> >> <subname1>name1</subname1> >> <subname2>name2</subname2> >> </name> >> </find_business> >> >>For standard elements more convinient syntax is available: >> >> find_business( >> findQualifiers(findQualifier('sortByNameAsc', >> 'caseSensitiveMatch')), >> name('M') >> ) >> >>and >>=20 >> find_business( >> findQualifiers([findQualifier('sortByNameAsc'),=20 >> findQualifier('caseSensitiveMatch')]),=20 >> name('M') >> ) >> >>both will generate: >> >> <SOAP-ENV:Envelope=20 >> xmlns:SOAP-ENV=3D"http://schemas.xmlsoap.org/soap/envelope/"> >> <SOAP-ENV:Body> >> <find_business xmlns=3D"urn:uddi-org:api" generic=3D"1.0"> >> <findQualifiers> >> <findQualifier>sortByNameAsc</findQualifier> >> <findQualifier>caseSensitiveMatch</findQualifier> >> </findQualifiers> >> <name>M</name> >> </find_business> >> </SOAP-ENV:Body> >> </SOAP-ENV:Envelope> >> >>You can use ANY valid combinations (according to "UDDI Programmer's=20 >>API Specification"). If you try to generate something unusual, like=20 >>C<name(name('myname'))>, you'll get: >> >> Don't know what to do with 'name' and 'name' elements .... >> >>If you REALLY need to do it, use C<UDDI::Data> syntax described above. >> >>As special case you can pass hash as the first parameter of method >>call and values of this hash will be added as attributes to top element= : >> >> find_business({maxRows =3D> 10}, UDDI::Data->name(name =3D> old)) >> >>gives you >> >> <find_business xmlns=3D"urn:uddi-org:api" generic=3D"1.0" maxRows=3D"= 10"> >> .... >> </find_business> >> >>You can also pass back parameters exactly as you get it from method cal= l >>(like you probably want to do with authInfo). >> >>You can get access to attributes and elements through the same interfac= e: >> >> my $list =3D find_business(name =3D> old); >> my $bis =3D $list->businessInfos; >> for ($bis->businessInfo) { >> my $s =3D $_->serviceInfos->serviceInfo; >> print $s->name, # element >> $s->businessKey, # attribute >> "\n"; >> } >> >>To match advantages provided by C<with> operator available in other=20 >>languages (like VB) we provide similar functionality that adds you=20 >>flexibility: >> >> with findQualifiers =3D>=20 >> findQualifier =3D> 'sortByNameAsc', >> findQualifier =3D> 'caseSensitiveMatch' >> >>is the same as:=20 >> >> with(findQualifiers =3D>=20 >> findQualifier('sortByNameAsc'), >> findQualifier('caseSensitiveMatch'), >> ) >> >>and: >> >> findQualifiers->with(=20 >> findQualifier('sortByNameAsc'), >> findQualifier('caseSensitiveMatch'), >> ) >> >>will all generate the same code as mentioned above: >> >> findQualifiers(findQualifier('sortByNameAsc', >> 'caseSensitiveMatch')), >> >>Advantage of C<with> syntax is the you can specify both attributes and = >>elements through the same interface. First argument is element where al= l=20 >>other elements and attributes will be attached. Provided examples and=20 >>tests cover different syntaxes. >> >>=3Dhead2 AUTODISPATCHING >> >>UDDI::Lite provides autodispatching feature that lets you create=20 >>code that looks similar for local and remote access. >> >>For example: >> >> use UDDI::Lite +autodispatch =3D>=20 >> proxy =3D> 'http://uddi.microsoft.com/inquire'; >> >>tells autodispatch all UDDI calls to=20 >>'http://uddi.microsoft.com/inquire'. All subsequent calls can look=20 >>like: >> >> find_business(name =3D> 'old'); >> find_business(UDDI::Data->name(name =3D> 'old')); >> find_business(name('old')); >> >>=3Dhead1 BUGS AND LIMITATIONS >> >>=3Dover 4 >> >>=3Ditem * >> >>Interface is still subject to change. >> >>=3Ditem * >> >>Though HTTPS/SSL is supported you should specify it yourself (with=20 >>C<proxy> or C<endpoint>) for publishing API calls. >> >>=3Dback >> >>=3Dhead1 AVAILABILITY >> >>For now UDDI::Lite is distributed as part of SOAP::Lite package. >>You can download it from ( http://soaplite.com/ )=20 >>or from CPAN ( http://search.cpan.org/search?dist=3DSOAP-Lite ). =20 >> >>=3Dhead1 SEE ALSO >> >>L<SOAP::Lite> ( http://search.cpan.org/search?dist=3DSOAP-Lite ) >>L<UDDI> ( http://search.cpan.org/search?dist=3DUDDI ) >> >>=3Dhead1 COPYRIGHT >> >>Copyright (C) 2000-2001 Paul Kulchenko. All rights reserved. >> >>This library is free software; you can redistribute it and/or modify >>it under the same terms as Perl itself. >> >>=3Dhead1 AUTHOR >> >>Paul Kulchenko (pau...@ya...) >> >>=3Dcut >> =20 >> |
From: Paul K. <pau...@ya...> - 2004-04-16 04:52:23
|
Mark, That's great! I just committed one more update for UDDI::Lite that enables support for multiple versions. Use: use UDDI::Lite uddiversion => 2, ...everything else... to switch to v2. You'll find placeholders for v2 values under UDDI::Constants. I'm attaching the latest version as I still don't see it in viewCVS ;( (I even thought that I may ve using a wrong repository ;)). Let me know if you have any troubles using it. Thanks! Best wishes, Paul. --- "Mark A. Fuller" <mar...@ea...> wrote: > > Just a quick update. I have written a script to extract information > from the UDDI schema(s). I'm going to plug the v2 data into a copy > of UDDI::Lite and do some testing. I did some manual changes (like > adding find_relatedBusinesses which is new to v2) and it worked > fine. > > I'll start again with a fresh copy of the UDDI::Lite, replace the > hashs and arrays of UDDI values with what I've extracted, and > create a script to test each UDDI API web service. > > Paul, > > Do you have any ideas about how you'd like to make version > selectable? For my testing I am making the following code change: > > -> attr({xmlns=>'urn:uddi-org:api_v2', generic => '2.0', > %$attr}); # v2 > # -> attr({xmlns=>'urn:uddi-org:api', generic => '1.0', > %$attr}); # v1 > > Everything else I'm doing is just with the "my" data. If you can > tell me how you'd like to make those values (and the data I'm > working with) selectable, I can try to do it. Or, if you change the > script and give it to me, I can do my testing with it. > > Mark > > > ------------------------------------------------------- > This SF.Net email is sponsored by: IBM Linux Tutorials > Free Linux tutorial presented by Daniel Robbins, President and CEO > of > GenToo technologies. Learn everything from fundamentals to system > administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click > _______________________________________________ > Soaplite-devel mailing list > Soa...@li... > https://lists.sourceforge.net/lists/listinfo/soaplite-devel |
From: Paul K. <pau...@ya...> - 2004-04-16 04:02:12
|
Mark, I'm not sure what's going on. I definitely committed my changes (my working copy is in sync with the repository), but I don't see them through viewCVS. I tried export and it returns the correct version. Does anybody have an idea? Anyway, I attached the modified UDDI::Lite.pm. I hope the issue will dissapear tomorrow ;). Best wishes, Paul. --- Mark Fuller <mar...@ea...> wrote: > > I've just commited the update that fixes a known bug with not > > handling attributes. See if it works for you. > > Can you give me a URL? I probably don't know what I'm doing, but I > tried > > http://cvs.sourceforge.net/viewcvs.py/soaplite/soaplite-dist/lib/UDDI/Lite.pm > > Nothing looked recently updated. I poked around different places > near there. > Didn't see anything. > > When I get this update I'll do a lot of testing and give you > feedback about > bugs I find, and/or enhancement ideas. Maybe this is the > opportunity for me > to learn Perl debugger and learn how this module works. I've > written a few > modules, but nothing that does so much in so few instructions. :) > > Mark > |
From: Mark F. <mar...@ea...> - 2004-04-16 01:57:40
|
> I've just commited the update that fixes a known bug with not > handling attributes. See if it works for you. Can you give me a URL? I probably don't know what I'm doing, but I tried http://cvs.sourceforge.net/viewcvs.py/soaplite/soaplite-dist/lib/UDDI/Lite.pm Nothing looked recently updated. I poked around different places near there. Didn't see anything. When I get this update I'll do a lot of testing and give you feedback about bugs I find, and/or enhancement ideas. Maybe this is the opportunity for me to learn Perl debugger and learn how this module works. I've written a few modules, but nothing that does so much in so few instructions. :) Mark |
From: Paul K. <pau...@ya...> - 2004-04-16 00:53:54
|
Mark, I've just commited the update that fixes a known bug with not handling attributes. See if it works for you. > 1. How can I pass an element and attribute? Example: > > $list = find_business(name => 'D%') > > I need to include attribute lang="en" in the "name" element. This should work: find_business(name({lang => 'en'}, '%D')); as well as find_business(name('%D')->attr({lang => 'en'})); and find_business(UDDI::Data->name(name => '%D')->attr({lang => 'en'})); I've added tests to make sure it's not my imagination ;) > 2. How do I specify multiple "name" elements and "lang" attribues? > (UDDI v2 has "lang" on "name"). I know I can get multiple elements > this way: > > $list = find_business(name('D%', 'X%')) First syntax should work even though I haven't tested it yet: find_business(name({lang => 'en'}, 'D%', 'X%')); > 3. I thought the answer might involve UDDI::Data. But, when I try > an example from the POD, it fails > > $list = find_business(UDDI::Data->name( name => 'D%' )) I get a different error, but I believe the reason is the same. As I said, current version doesn't handle attributes; the updated one does. You can get it from the project CVS repository. > I'm accustomed to. But, I can do a lot with examples and > documentation (as I understand more about how the features work). That would be great! I haven't updated the documentation yet, but added tests to make sure that different sintaxes work. I'll do other changes to enable different UDDI versions later today (fix bugs first ;)). Thanks! Best wishes, Paul. --- "Mark A. Fuller" <mar...@ea...> wrote: > Paul, I need to understand something. If I can get this under my > belt, I want to create an example script showing how to call and > process each UDDI web service. I can update the POD too if I see > anything that could have been clearer as a newbie. > > 1. How can I pass an element and attribute? Example: > > $list = find_business(name => 'D%') > > I need to include attribute lang="en" in the "name" element. > > 2. How do I specify multiple "name" elements and "lang" attribues? > (UDDI v2 has "lang" on "name"). I know I can get multiple elements > this way: > > $list = find_business(name('D%', 'X%')) > > How can I get attribute "lang" with each "name"? > > 3. I thought the answer might involve UDDI::Data. But, when I try > an example from the POD, it fails > > $list = find_business(UDDI::Data->name( name => 'D%' )) > > Use of uninitialized value in exists at > C:/Perl/site/lib/UDDI/Lite.pm line 103. > Use of uninitialized value in exists at > C:/Perl/site/lib/UDDI/Lite.pm line 112. > Use of uninitialized value in concatenation (.) or string at > C:/Perl/site/lib/UDDI/Lite.pm line 119. > > This was using the unmodified UDDI::Lite script. I am using Perl > 5.8.2 on Win XP Professional. > > I'm accustomed to. But, I can do a lot with examples and > documentation (as I understand more about how the features work). > > Thanks! > Mark > |
From: Mark A. F. <mar...@ea...> - 2004-04-15 00:08:39
|
Just a quick update. I have written a script to extract information from the UDDI schema(s). I'm going to plug the v2 data into a copy of UDDI::Lite and do some testing. I did some manual changes (like adding find_relatedBusinesses which is new to v2) and it worked fine. I'll start again with a fresh copy of the UDDI::Lite, replace the hashs and arrays of UDDI values with what I've extracted, and create a script to test each UDDI API web service. Paul, Do you have any ideas about how you'd like to make version selectable? For my testing I am making the following code change: -> attr({xmlns=>'urn:uddi-org:api_v2', generic => '2.0', %$attr}); # v2 # -> attr({xmlns=>'urn:uddi-org:api', generic => '1.0', %$attr}); # v1 Everything else I'm doing is just with the "my" data. If you can tell me how you'd like to make those values (and the data I'm working with) selectable, I can try to do it. Or, if you change the script and give it to me, I can do my testing with it. Mark |
From: Mark A. F. <mar...@ea...> - 2004-04-14 17:35:25
|
Ooops. I discovered the mechanism for accessing $result->element_name. I needed to use +autodispatch and import UDDI::Data. I realized this from the O'Reilly book and the sample starting at page 234. This seems to be a decent way to process the results from UDDI (without the user having to write their own xpath-like specifications to loop through the elements). I'm going to play with it and if I have more questions I'll ask. After I understand it a little better, I'll manually compare the v2 schema with what is in UDDI::Lite. Thanks! Mark |
From: Mark A. F. <mar...@ea...> - 2004-04-14 16:33:16
|
Paul, following up to my previous email, I tried the UDDI result access described in the POD. I get this error message: "Can't locate object method "businessInfos" via package "UDDI::SOM" at testuddi2 line 19." This part (accessing results using element names) is the thing I'd like to understand. Where is the $SOM->element-name functionality supposed to come from? Here's the code I used: ================================== use UDDI::Lite +trace=>[qw(headers fault debug)]; my $uddi = UDDI::Lite -> on_debug(sub{print@_}) -> proxy('http://localhost:8080/uddi/inquiry'); my $list = $uddi->find_business(name => 'D%'); my $bis = $list->businessInfos; for ($bis->businessInfo) { my $s = $_->serviceInfos->serviceInfo; print $s->name, # element $s->businessKey, # attribute "\n"; } ================================= |
From: Mark F. <mar...@ea...> - 2004-04-14 14:37:42
|
Paul, I can manually add v2 to the list of elements and attributes where it doesn't exist. (I wonder how many differences there are.) I was planning on writing my own UDDI module and add a "fetchInstance" method to the SOAP::Lite result. This would unload UDDI's returned values to Perl structures. This seemed simpler than working with xPath to navigate through UDDI's result. It would encapsulate all the xPath navigation. But, after processing some resulting Perl structures (arrays of arrays), it seems like all I did was transfer the complexity of navigating xPath to the complexity of nested array refs. :). How does UDDI::Lite access results? The example in the POD shows: =============================== my $list = find_business(name => old); my $bis = $list->businessInfos; for ($bis->businessInfo) { my $s = $_->serviceInfos->serviceInfo; print $s->name, # element $s->businessKey, # attribute "\n"; } =============================== How do those UDDI element names access the SOAP::Lite::SOM? Is this something UDDI::Lite is doing? Or, is this functionality inherent to SOAP::Lite::SOM? Sorry if this is a question that should be on the user's list. My idea to unload data to Perl structures was based upon xPath navigation being too much work to repeat all the time. But, the above example form of access is simple. I'm curious how that happens under the covers. Thanks, Mark ----- Original Message ----- From: "Paul Kulchenko" <pau...@ya...> To: "Mark Fuller" <mar...@ea...>; <soa...@li...> Sent: Tuesday, April 13, 2004 11:12 PM Subject: Re: [Soaplite-devel] UDDI v2 > Mark, > > From what I know about UDDIv2 it should be quite simple to make > UDDI::Lite to support it. The key is in %elements and %attributes > hashes (lines 50 and 51 in v0.60). They describe what combinations of > elements and attributes are possible; everything else is sugar around > it. I have a script that generates those hashes automatically from > the UDDI schema. Unfortunately it doesn't work with v2 schema (I > oversimplified the script a bit). It should not be difficult to > update it or write a new one; it seems like there is nothing else > that needs to be done. Also, we may add a parameter for 'use' and > support both UDDI v1 and v2 in one module. > > Let me know if you need more details on how the module does its work. > > Paul > > --- Mark Fuller <mar...@ea...> wrote: > > Before I get too far into my own UDDI implementation, I'd like to > > know if > > there is a way to make the existing UDDI::Lite accomodate UDDI v2, > > or what > > significant drawbacks you've found with it. I've looked at the code > > and it's > > so brief that I don't understand what it's doing or how. What I'm > > working on > > will be significantly larger -- but I'll understand it. :) However, > > this > > makes me wonder if I'm on the wrong track. Maybe I'm not taking > > advantage of > > something in SOAP::Lite the way the existing UDDI::Lite does? > > > > Mark > > > > > > > > > > ------------------------------------------------------- > > This SF.Net email is sponsored by: IBM Linux Tutorials > > Free Linux tutorial presented by Daniel Robbins, President and CEO > > of > > GenToo technologies. Learn everything from fundamentals to system > > > administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click > > _______________________________________________ > > Soaplite-devel mailing list > > Soa...@li... > > https://lists.sourceforge.net/lists/listinfo/soaplite-devel > |
From: Paul K. <pau...@ya...> - 2004-04-14 06:12:31
|
Mark, From what I know about UDDIv2 it should be quite simple to make UDDI::Lite to support it. The key is in %elements and %attributes hashes (lines 50 and 51 in v0.60). They describe what combinations of elements and attributes are possible; everything else is sugar around it. I have a script that generates those hashes automatically from the UDDI schema. Unfortunately it doesn't work with v2 schema (I oversimplified the script a bit). It should not be difficult to update it or write a new one; it seems like there is nothing else that needs to be done. Also, we may add a parameter for 'use' and support both UDDI v1 and v2 in one module. Let me know if you need more details on how the module does its work. Paul --- Mark Fuller <mar...@ea...> wrote: > Before I get too far into my own UDDI implementation, I'd like to > know if > there is a way to make the existing UDDI::Lite accomodate UDDI v2, > or what > significant drawbacks you've found with it. I've looked at the code > and it's > so brief that I don't understand what it's doing or how. What I'm > working on > will be significantly larger -- but I'll understand it. :) However, > this > makes me wonder if I'm on the wrong track. Maybe I'm not taking > advantage of > something in SOAP::Lite the way the existing UDDI::Lite does? > > Mark > > > > > ------------------------------------------------------- > This SF.Net email is sponsored by: IBM Linux Tutorials > Free Linux tutorial presented by Daniel Robbins, President and CEO > of > GenToo technologies. Learn everything from fundamentals to system > administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click > _______________________________________________ > Soaplite-devel mailing list > Soa...@li... > https://lists.sourceforge.net/lists/listinfo/soaplite-devel |