On the whole, this stuff sounds good to me.  Just two comments.

1.  I would prefer that the Skeleton interface contain the method
getOperationDescsByName.  It doesn't cost much.  The skeletons can still
implement the static method, and the instance methods could do nothing more
than call the static method, but the instance method DOES buy us something.
It allows us to call the method directly rather than introspect on it if we
have the skeleton class itself.

2.  I had hoped at one time that we could keep the emitters separate from
the runtime.  But I've virtually lost this battle over time.  They've
gotten more and more interdependent.  Replacing the WSDL generation
framework's introspection with the ServiceDesc introspection is just one
more nail in this coffin.  Since it seems a hopeless case to pull the
emitters and runtime apart, maybe I should just stop whining.  Just felt
like whining one more time.

One question:  you still believe it should be a fault if the meta data
exists in BOTH WSDD and skeleton, right?  So WSDL2Java will emit the
metadata in either the deploy.wsdd OR in the skeleton, but never both.

Russell Butek
[EMAIL PROTECTED]


Glen Daniels <[EMAIL PROTECTED]> on 03/29/2002 05:42:49 PM

Please respond to [EMAIL PROTECTED]

To:    "'Axis-Dev (E-mail)'" <[EMAIL PROTECTED]>
cc:
Subject:    Skeletons




OK, here's my current thinking re: Skeletons and WSDL generation.

When I last talked with Russell, he said the fact that Skeletons were
classes was much more important than the particular API they used.  Hence,
I'm proposing we move to the following:

interface Skeleton {
}

i.e. just a marker, because AFAIK no one ever intends to use the metadata
methods on an actual object, they're always going to be static on the
class.  So the Skeleton marker indicates that your class should have the
following method:

public static OperationDesc [] getOperationDescsByName(String methodName)

...and an actual skeleton looks something like this:

public class TestSkel implements Skeleton {
    static ParameterDesc [] testParams = new ParameterDesc [] {
        new ParameterDesc(new QName("", "a"), ParameterDesc.IN, null),
        new ParameterDesc(new QName("", "b"), ParameterDesc.INOUT,  null)
    };
    static OperationDesc [] opers = new OperationDesc [] {
        new OperationDesc("testMethod", testParams, new QName("",
    "return"))
    };

    public static OperationDesc[] getOperationDescsByName(String
        methodName) {
        if ("testMethod".equals(methodName))
            return opers;
        else
            return null;
    }

    public int testMethod(String a, IntHolder b) { ...call Impl... }
}

The idea is that you can fill in as much or as little of the information as
you want, and this becomes precisely equivalent to specifying the same
stuff in the WSDD.  When it's time to actually get a "fully filled-in"
OperationDesc, we do the same introspecting-matching-caching that we do
normally to match up the OperationDesc with a Method, and to fill in any
missing stuff.  So for instance, you'll note there are no types specified
for the parameters above, although the names are.  So we'll figure out the
types via introspection.  If there WERE types specified, we'd sanity-check
them as usual against the actual introspected types of the Method before
continuing.

This has two benefits - 1) we get to reuse the existing code/structures, 2)
the Skeleton code looks cleaner (IMHO).  More on (1) below.

OK, so after this we are in a world where a ServiceDesc will exist and be
filled in correctly for classes with a) no metadata (use bytecode if
possible for names, and introspect for types), b) WSDD metadata, or c)
Skeleton metadata.

So the next big piece of this is to change the WSDL generation framework to
stop introspecting on its own, and just piggyback on the code that already
does this work in ServiceDesc.  So WSDL generation essentially becomes a
matter of just walking the ServiceDesc and writing out the appropriate
WSDL.  This will involve improving the ServiceDesc introspection framework
to walk up the inheritance tree like the WSDL code does now, which it needs
to do anyway.  It will also mean adding an optional SOAPAction to the
OperationDesc.

I'm planning to do most of this work by Monday morning.  Thoughts/comments
encouraged and appreciated.

--Glen


Reply via email to