<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4775484362494100290</id><updated>2012-02-16T11:37:55.810+01:00</updated><category term='google wave'/><category term='google calendar'/><category term='flex'/><title type='text'>Koray's Collaboration and RIA Blog</title><subtitle type='html'>Use-cases and examples for RIA applications and various collaboration technologies</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yersel.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4775484362494100290/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://yersel.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Koray Yersel</name><uri>http://www.blogger.com/profile/08978577339343271768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4775484362494100290.post-4209342215097899525</id><published>2009-12-14T10:45:00.016+01:00</published><updated>2010-02-03T16:39:53.592+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google wave'/><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='google calendar'/><title type='text'>A Java Proxy Servlet to access external web resources without a crossdomain.xml  (or with a restricted crossdomain.xml)</title><content type='html'>Finally I had some time to post the proxy servlet, that I've used in Wave2GoogleCalendar gadget. I've profited from some other libraries and projects to realize the Wave gadget. But first I want to show the solution for a common problem in Flex Development: Flash Player Security aka. the need for crossdomain.xml in external web resources.&lt;br /&gt;&lt;br /&gt;Adobe says:&lt;br /&gt;&lt;i&gt;Adobe® Flash® Player does not allow an application to receive data from a domain other than the domain from which it was loaded, unless it has been given explicit permission.&lt;/i&gt;&lt;br /&gt;(For more information click &lt;a href="http://labs.adobe.com/wiki/index.php/Flex:Accessing_Data"&gt;here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Wave2GoogleCalendar gadget uses &lt;a href="http://code.google.com/apis/calendar/data/2.0/developers_guide_protocol.html"&gt;HTTP/XML services&lt;/a&gt; of Google to create events in Google Calendar. Google has already a crossdomain.xml, but it has some restrictions. For example authorization headers are not allowed and this makes impossible to use services mentioned above. A possible solution is to create your own proxy to handle your requests targeted to HTTP services. I've some Java experience and implemented therefore a proxy servlet by extending HttpServlet. I've deployed it in an application hosted in Google App Engine. Below you can see the source code. Servlet programming and generally HTTP handling in Java are not my strongest areas, so feel free to leave your comments and suggestions. &lt;br /&gt;&lt;br /&gt;The proxy class cannot definitely support every possible POST and GET calls you would use in your Flex applications. But I am pretty sure, that it will give a good head start if you want to (or have to) use a Java proxy for your needs.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.ByteArrayOutputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStream;&lt;br /&gt;import java.io.OutputStream;&lt;br /&gt;import java.net.HttpURLConnection;&lt;br /&gt;import java.net.MalformedURLException;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import java.net.URLEncoder;&lt;br /&gt;import java.util.Enumeration;&lt;br /&gt;import java.util.logging.Logger;&lt;br /&gt;&lt;br /&gt;import javax.servlet.ServletException;&lt;br /&gt;import javax.servlet.http.HttpServlet;&lt;br /&gt;import javax.servlet.http.HttpServletRequest;&lt;br /&gt;import javax.servlet.http.HttpServletResponse;&lt;br /&gt;&lt;br /&gt;public class Proxy extends HttpServlet &lt;br /&gt;{&lt;br /&gt;    private static final long serialVersionUID = 1L;&lt;br /&gt;    &lt;br /&gt;    public static final String CONTENT_KEY = &amp;quot;contentUrl&amp;quot;;&lt;br /&gt;    public static final String METHOD = &amp;quot;realMethod&amp;quot;;&lt;br /&gt;    &lt;br /&gt;    public static final String AUTHORIZATION = &amp;quot;Authorization&amp;quot;;&lt;br /&gt;    public static final String GDATA = &amp;quot;GData-Version&amp;quot;;&lt;br /&gt;    &lt;br /&gt;    private static final Logger log = Logger.getLogger(Proxy.class.getName());&lt;br /&gt;    &lt;br /&gt;    private boolean atomPost = false;&lt;br /&gt;&lt;br /&gt;    @SuppressWarnings(&amp;quot;unchecked&amp;quot;)&lt;br /&gt;    public void service (HttpServletRequest httpRequest,&lt;br /&gt;                         HttpServletResponse httpResponse)&lt;br /&gt;                         throws ServletException&lt;br /&gt;    {&lt;br /&gt;        String contentUrl = httpRequest.getHeader(CONTENT_KEY);        &lt;br /&gt;        String method = httpRequest.getHeader(METHOD);&lt;br /&gt;        atomPost = false;&lt;br /&gt;        &lt;br /&gt;        if (contentUrl == null)&lt;br /&gt;        {&lt;br /&gt;            throw new ServletException(&amp;quot;The init parameter [&amp;quot; + CONTENT_KEY +&lt;br /&gt;                                       &amp;quot;] must be specified as an init &amp;quot; +&lt;br /&gt;                                       &amp;quot;parameter.&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;        log.warning(contentUrl + &amp;quot; as contenturl...&amp;quot;);&lt;br /&gt;        URL content = null;&lt;br /&gt;        try&lt;br /&gt;        { &lt;br /&gt;            content = new URL(contentUrl);&lt;br /&gt;        }&lt;br /&gt;        catch (MalformedURLException exception)&lt;br /&gt;        {&lt;br /&gt;            throw new ServletException(contentUrl + &amp;quot; is a malformed url.&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        String atomString = getAtomString(httpRequest);&lt;br /&gt;        &lt;br /&gt;        HttpURLConnection contentCon = null;&lt;br /&gt;        try&lt;br /&gt;        { &lt;br /&gt;            log.warning(contentUrl + &amp;quot; open connection&amp;quot;);&lt;br /&gt;            contentCon = (HttpURLConnection) content.openConnection();&lt;br /&gt;            addHeaders(httpRequest, contentCon);&lt;br /&gt;        }&lt;br /&gt;        catch (IOException exception)&lt;br /&gt;        {&lt;br /&gt;            throw new ServletException(&amp;quot;Problem opening &amp;quot; + contentUrl +&lt;br /&gt;                                       &amp;quot;: &amp;quot; + exception.toString());&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        InputStream in = null;&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            if(method.equals(&amp;quot;GET&amp;quot;))&lt;br /&gt;            {&lt;br /&gt;                log.warning(contentUrl + &amp;quot; do GET&amp;quot;);&lt;br /&gt;                // Get the content type from the URLConnection and set it on the response.&lt;br /&gt;                String contentType = contentCon.getContentType();&lt;br /&gt;                httpResponse.setContentType(contentType);&lt;br /&gt;                &lt;br /&gt;                in = contentCon.getInputStream();&lt;br /&gt;            }&lt;br /&gt;            else if(method.equals(&amp;quot;POST&amp;quot;))&lt;br /&gt;            {&lt;br /&gt;                contentCon.setDoInput(true);&lt;br /&gt;                contentCon.setDoOutput(true);&lt;br /&gt;                contentCon.setUseCaches(false);&lt;br /&gt;                &lt;br /&gt;                if(atomPost) &lt;br /&gt;                {&lt;br /&gt;                    log.warning(contentUrl + &amp;quot; do ATOM POST&amp;quot;);&lt;br /&gt;                    OutputStream outputStream = contentCon.getOutputStream();&lt;br /&gt;                    outputStream.write(atomString.getBytes());&lt;br /&gt;                    outputStream.close();                    &lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    log.warning(contentUrl + &amp;quot; do NORMAL POST&amp;quot;);&lt;br /&gt;                    // Form the POST parameters&lt;br /&gt;                    StringBuilder postPar = new StringBuilder();&lt;br /&gt;                    Enumeration e = httpRequest.getParameterNames();               &lt;br /&gt;                    int i=0;&lt;br /&gt;                    while (e.hasMoreElements()) &lt;br /&gt;                    {&lt;br /&gt;                        String name = (String)e.nextElement();&lt;br /&gt;                        String value = httpRequest.getParameter(name);&lt;br /&gt;                        if(!name.equals(CONTENT_KEY))&lt;br /&gt;                        {&lt;br /&gt;                            String _char = (i == 0) ? &amp;quot;&amp;quot; : &amp;quot;&amp;amp;&amp;quot;;&lt;br /&gt;                            postPar.append(_char+name+&amp;quot;=&amp;quot;).append(URLEncoder.encode(value, &amp;quot;UTF-8&amp;quot;));&lt;br /&gt;                        }&lt;br /&gt;                        i++;&lt;br /&gt;                    }&lt;br /&gt;    &lt;br /&gt;                    OutputStream outputStream = contentCon.getOutputStream();&lt;br /&gt;                    outputStream.write(postPar.toString().getBytes(&amp;quot;UTF-8&amp;quot;));&lt;br /&gt;                    outputStream.close();&lt;br /&gt;                }&lt;br /&gt;                &lt;br /&gt;                // Retrieve the output&lt;br /&gt;                log.warning(contentUrl + &amp;quot; retrieve output&amp;quot;);&lt;br /&gt;                int responseCode = contentCon.getResponseCode();&lt;br /&gt;                InputStream inputStream;&lt;br /&gt;                if (responseCode == HttpURLConnection.HTTP_OK &lt;br /&gt;                        &amp;#124;&amp;#124; responseCode == HttpURLConnection.HTTP_CREATED) {&lt;br /&gt;                    inputStream = contentCon.getInputStream();&lt;br /&gt;                } else {&lt;br /&gt;                    inputStream = contentCon.getErrorStream();&lt;br /&gt;                }&lt;br /&gt;              &lt;br /&gt;                in = inputStream;&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            byte[] buffer = new byte[1024];&lt;br /&gt;            ByteArrayOutputStream contentStream = new ByteArrayOutputStream();&lt;br /&gt;            for (int cnt = in.read(buffer);&lt;br /&gt;                 cnt  != -1;&lt;br /&gt;                 cnt = in.read(buffer))&lt;br /&gt;            {&lt;br /&gt;                contentStream.write(buffer, 0, cnt);&lt;br /&gt;                if (in.available() == 0)&lt;br /&gt;                {&lt;br /&gt;                    break;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // This is where you have the content from the request.&lt;br /&gt;            String contentString = contentStream.toString();&lt;br /&gt;            log.warning(contentUrl + &amp;quot; write to client&amp;quot;);&lt;br /&gt;            // Now write the bytes out to the client.&lt;br /&gt;            byte[] contentBytes = contentString.getBytes();&lt;br /&gt;            OutputStream out = httpResponse.getOutputStream();&lt;br /&gt;            out.write(contentBytes, 0, contentBytes.length);&lt;br /&gt;            out.flush();&lt;br /&gt;            out.close();&lt;br /&gt;        }&lt;br /&gt;        catch (Exception exception)&lt;br /&gt;        {&lt;br /&gt;            throw new ServletException(&amp;quot;Unable to proxy request: &amp;quot; + exception);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void addHeaders(HttpServletRequest httpRequest, HttpURLConnection contentCon)&lt;br /&gt;    {&lt;br /&gt;        if(atomPost)&lt;br /&gt;            contentCon.setRequestProperty(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/atom+xml&amp;quot;);&lt;br /&gt;        if(httpRequest.getHeader(AUTHORIZATION) != null) &lt;br /&gt;            contentCon.setRequestProperty(AUTHORIZATION, httpRequest.getHeader(AUTHORIZATION));&lt;br /&gt;        if(httpRequest.getHeader(GDATA) != null)&lt;br /&gt;            contentCon.setRequestProperty(GDATA, httpRequest.getHeader(GDATA));&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private String getAtomString(HttpServletRequest httpRequest)&lt;br /&gt;    {&lt;br /&gt;        if(!httpRequest.getContentType().equals(&amp;quot;application/atom+xml&amp;quot;))&lt;br /&gt;            return null;&lt;br /&gt;        atomPost = true;&lt;br /&gt;        StringBuilder sb = null;&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            BufferedReader rr = httpRequest.getReader();&lt;br /&gt;            if(rr != null)&lt;br /&gt;            {&lt;br /&gt;                sb = new StringBuilder();&lt;br /&gt;                String line = null;&lt;br /&gt;&lt;br /&gt;                while ((line = rr.readLine()) != null)&lt;br /&gt;                    sb.append(line);&lt;br /&gt;&lt;br /&gt;                rr.close();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        catch(Exception e)&lt;br /&gt;        {&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        return sb.toString();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4775484362494100290-4209342215097899525?l=yersel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yersel.blogspot.com/feeds/4209342215097899525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yersel.blogspot.com/2009/12/java-proxy-servlet-to-access-external.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4775484362494100290/posts/default/4209342215097899525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4775484362494100290/posts/default/4209342215097899525'/><link rel='alternate' type='text/html' href='http://yersel.blogspot.com/2009/12/java-proxy-servlet-to-access-external.html' title='A Java Proxy Servlet to access external web resources without a crossdomain.xml  (or with a restricted crossdomain.xml)'/><author><name>Koray Yersel</name><uri>http://www.blogger.com/profile/08978577339343271768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4775484362494100290.post-1076781796652371621</id><published>2009-12-02T16:08:00.008+01:00</published><updated>2009-12-14T15:12:45.240+01:00</updated><title type='text'>Some screenshots for Wave2GoogleCalendar</title><content type='html'>&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_i3j9BBXxT10/SxaFWf10WiI/AAAAAAAAAEE/dnVbwc2hyH4/s1600-h/screen1.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5410658623883074082" src="http://2.bp.blogspot.com/_i3j9BBXxT10/SxaFWf10WiI/AAAAAAAAAEE/dnVbwc2hyH4/s320/screen1.gif" style="cursor: hand; cursor: pointer; height: 320px; width: 222px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_i3j9BBXxT10/SxaFeWRNapI/AAAAAAAAAEM/hAEy2Fill6o/s1600-h/screen2.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5410658758752561810" src="http://3.bp.blogspot.com/_i3j9BBXxT10/SxaFeWRNapI/AAAAAAAAAEM/hAEy2Fill6o/s320/screen2.gif" style="cursor: hand; cursor: pointer; height: 320px; width: 222px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_i3j9BBXxT10/SxaHlbvv1BI/AAAAAAAAAEU/wK8RuInrmX0/s1600-h/screen3.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5410661079505163282" src="http://1.bp.blogspot.com/_i3j9BBXxT10/SxaHlbvv1BI/AAAAAAAAAEU/wK8RuInrmX0/s320/screen3.gif" style="cursor: hand; cursor: pointer; height: 320px; width: 217px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_i3j9BBXxT10/SxaHqM6wiJI/AAAAAAAAAEc/XLOaXIoq15M/s1600-h/screen4.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5410661161424160914" src="http://1.bp.blogspot.com/_i3j9BBXxT10/SxaHqM6wiJI/AAAAAAAAAEc/XLOaXIoq15M/s320/screen4.gif" style="cursor: hand; cursor: pointer; height: 320px; width: 219px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_i3j9BBXxT10/SxaLjmHRwmI/AAAAAAAAAE0/5vYqTVb5oyo/s1600-h/screen5.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5410665445974983266" src="http://4.bp.blogspot.com/_i3j9BBXxT10/SxaLjmHRwmI/AAAAAAAAAE0/5vYqTVb5oyo/s320/screen5.gif" style="cursor: hand; cursor: pointer; float: left; height: 256px; margin: 0 10px 10px 0; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4775484362494100290-1076781796652371621?l=yersel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yersel.blogspot.com/feeds/1076781796652371621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yersel.blogspot.com/2009/12/blog-post.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4775484362494100290/posts/default/1076781796652371621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4775484362494100290/posts/default/1076781796652371621'/><link rel='alternate' type='text/html' href='http://yersel.blogspot.com/2009/12/blog-post.html' title='Some screenshots for Wave2GoogleCalendar'/><author><name>Koray Yersel</name><uri>http://www.blogger.com/profile/08978577339343271768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_i3j9BBXxT10/SxaFWf10WiI/AAAAAAAAAEE/dnVbwc2hyH4/s72-c/screen1.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4775484362494100290.post-7154529933779155708</id><published>2009-11-30T13:01:00.005+01:00</published><updated>2010-05-06T22:06:15.537+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google wave'/><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><title type='text'>A Flex based Google Wave gadget to create Google Calendar events</title><content type='html'>&lt;div&gt;Anyone interested in my 'Wave2GoogleCalendar' gadget? To play with it just login to google wave&lt;/div&gt;&lt;ul&gt;&lt;li&gt; New Wave&lt;/li&gt;&lt;li&gt;Add Gadget by URL&lt;/li&gt;&lt;li&gt;Paste &lt;a href="http://tinyurl.com/wave2googlecalendar"&gt;http://tinyurl.com/wave2googlecalendar&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Basically multiple wave participants can edit various settings for a mutual event and submit this event to their default google calendar.&lt;br /&gt;&lt;br /&gt;More to come soon...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4775484362494100290-7154529933779155708?l=yersel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yersel.blogspot.com/feeds/7154529933779155708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yersel.blogspot.com/2009/11/flex-based-google-wave-gadget-to-create.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4775484362494100290/posts/default/7154529933779155708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4775484362494100290/posts/default/7154529933779155708'/><link rel='alternate' type='text/html' href='http://yersel.blogspot.com/2009/11/flex-based-google-wave-gadget-to-create.html' title='A Flex based Google Wave gadget to create Google Calendar events'/><author><name>Koray Yersel</name><uri>http://www.blogger.com/profile/08978577339343271768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>
