Background: Apache Streams contains java interfaces which emulate social network REST APIs and implementations (some using Juneau Rest Proxy) for call calling method on those APIs via java .and transcribing native requests and responses to and from streams interoperability formats
Objective: Expose those interfaces / implementations via a hosted REST API, supporting an HTML serialization option, allowing a user to discover what methods are available, activate them, and view the results directly in the browser.
...
- https://github.com/apache/streams/blob/master/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Account.java
- Defines interface for getting account details of the authenticated token.
- https://github.com/apache/streams/blob/master/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/api/Twitter.java
- Includes implementation of Account via Rest Proxy to api.twitter.com
- https://github.com/apache/incubator-juneau/blob/master/juneau-rest/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java
- Server side of juneau remoting
- https://github.com/apache/incubator-juneau/blob/master/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
- Client side of juneau remoting
Proof of concept code : TwitterResource.scala
https://gist.github.com/steveblackmon/928396d08b0bde3dfbd601ad3d2200a5
Proof of content result concept interaction :
- http://localhost:8000/remoteable
HTML script twitter^TwitterResource.HTML <html> <head> <style> @import "/twitter/styles/light.css"; </style> <script> </script> </head> <body> <header> Probot > Twitter </header> <nav> <ol> <li><a href="/twitter/'?method=OPTIONS'">options</a></li> </ol> </nav> <section> <article> <div class="outerdata"> <div class="data" id="data"> <ul> <li><a href="/twitter/org.apache.streams.twitter.api.Geo">org.apache.streams.twitter.api.Geo</a></li> <li><a href="/twitter/org.apache.streams.twitter.api.Friends">org.apache.streams.twitter.api.Friends</a></li> <li><a href="/twitter/org.apache.streams.twitter.api.Account">org.apache.streams.twitter.api.Account</a></li> <li><a href="/twitter/org.apache.streams.twitter.api.Users">org.apache.streams.twitter.api.Users</a></li> <li><a href="/twitter/org.apache.streams.twitter.api.Statuses">org.apache.streams.twitter.api.Statuses</a></li> <li><a href="/twitter/org.apache.streams.twitter.api.Favorites">org.apache.streams.twitter.api.Favorites</a></li> <li><a href="/twitter/org.apache.streams.twitter.api.AccountActivity">org.apache.streams.twitter.api.AccountActivity</a></li> <li><a href="/twitter/org.apache.streams.twitter.api.Twitter">org.apache.streams.twitter.api.Twitter</a></li> <li><a href="/twitter/org.apache.streams.twitter.api.WelcomeMessageRules">org.apache.streams.twitter.api.WelcomeMessageRules</a></li> <li><a href="/twitter/org.apache.streams.twitter.api.Media">org.apache.streams.twitter.api.Media</a></li> <li><a href="/twitter/org.apache.streams.twitter.api.WelcomeMessages">org.apache.streams.twitter.api.WelcomeMessages</a></li> </ul> </div> </div> </article> </section> <footer> ASF 2.0 License </footer> </body> </html>
http://localhost:8000/twitter/org.apache.streams.twitter.api.Account
HTML <html> <head> <style> @import "/twitter/styles/light.css"; </style> <script> </script> </head> <body> <header> Probot > Twitter </header> <nav> <ol> <li><a href="/twitter/'?method=OPTIONS'">options</a></li> </ol> </nav> <section> <article> <div class="outerdata"> <div class="data" id="data"> <ul> <li>settings</li> <li>verifyCredentials</li> </ul> </div> </div> </article> </section> <footer> ASF 2.0 License </footer> </body> </html>
- http://localhost:8000/twitter/org.apache.streams.twitter.api.Account?invokeMethod=settings
HTML <html> <head> <style> @import "/twitter/styles/light.css"; </style> <script> </script> </head> <body> <header> Probot > Twitter </header> <nav> <ol> <li><a href="/twitter/'?method=OPTIONS'">options</a></li> </ol> </nav> <section> <article> <div class="outerdata"> <div class="data" id="data"> <string>org.apache.juneau.rest.RestException: Error occurred trying to invoke method: settings</string> </div> </div> </article> </section> <footer> ASF 2.0 License </footer> </body> </html>
- Proof of concept : Diagnosis
Failure seem to occur in PojoIntrospector.java
Line 131
Method m = p.getBeanContext().createSession().getClassMeta(o.getClass()).getPublicMethods().get(method);
m = null
because o.getClass() = java.util.LinkedHashMap$LinkedKeySet
where-as it seems that it should be org.apache.streams.twitter.api.Account.class
In fact
p.getBeanContext().createSession().getClassMeta(org.apache.streams.twitter.api.Account.class).getPublicMethods().get(method);
finds 'settings' as expected.