Skip to content
This repository has been archived by the owner on Jun 7, 2021. It is now read-only.

Commit

Permalink
Enable CORS on ribbon services. Make UI interactive.
Browse files Browse the repository at this point in the history
  • Loading branch information
lance committed Nov 30, 2015
1 parent 186fbe3 commit a4f2cb7
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 9 deletions.
@@ -0,0 +1,23 @@
package org.wildfly.swarm.examples.netflix.ribbon.events;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;

/**
* @author Lance Ball
*/
@Provider
public class CORSFilter implements ContainerResponseFilter {
public void filter(ContainerRequestContext paramContainerRequestContext,
ContainerResponseContext paramContainerResponseContext)
throws IOException {
paramContainerResponseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
paramContainerResponseContext.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
paramContainerResponseContext.getHeaders().add("Access-Control-Allow-Credentials", "true");
paramContainerResponseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
paramContainerResponseContext.getHeaders().add("Access-Control-Max-Age", "1209600");
}
}
Expand Up @@ -10,10 +10,13 @@
import rx.Observable;

import javax.ws.rs.GET;
import javax.ws.rs.OPTIONS;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
Expand All @@ -33,7 +36,7 @@ public EventsResource() {
}

@GET
@Produces("application/json")
@Produces(MediaType.APPLICATION_JSON)
public void get(@Suspended final AsyncResponse asyncResponse) {
Observable<ByteBuf> obs = this.time.currentTime().observe();

Expand All @@ -46,9 +49,23 @@ public void get(@Suspended final AsyncResponse asyncResponse) {
JsonParser parser = factory.createParser(new ByteBufInputStream(result));
Map map = reader.readValue(parser, Map.class);
int hour = (int) map.get( "h" );
int minute = (int) map.get( "m" );
int millis = (int) map.get( "ms" );
String tz = (String) map.get( "tz" );
List<String> events = new ArrayList<>();
for ( int i = 1 ; i <= 10 ; ++i ) {
events.add( "Event #" + i + " at " + hour + ":00" );
StringBuffer buffer = new StringBuffer("Event #")
.append(i)
.append(" at ")
.append(hour)
.append(":")
.append(minute)
.append(".")
.append(millis)
.append(" ")
.append(tz);

events.add( buffer.toString() );
}
asyncResponse.resume(events);
} catch (IOException e) {
Expand All @@ -59,4 +76,16 @@ public void get(@Suspended final AsyncResponse asyncResponse) {
asyncResponse.resume(err);
});
}

@OPTIONS
@Path("{path : .*}")
public Response options() {
return Response.ok("")
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD, undefined")
.header("Access-Control-Max-Age", "1209600")
.build();
}
}
38 changes: 36 additions & 2 deletions ribbon/frontend/src/main/resources/js/app.js
Expand Up @@ -51,8 +51,42 @@ var Service = React.createClass({
});
return (
<div className='service'>
<h2>{this.props.service}</h2>
{addresses}
<h2>{this.props.service}</h2>
{addresses}
<DataButton serviceName={this.props.service} />
</div>
);
}
});

var DataButton = React.createClass({
getInitialState: function() {
return {response: ''};
},

handleClick: function(event) {
var button = this;
console.log("Calling service: " + this.props.serviceName);
Ribbon.getJSON(this.props.serviceName)
.promise
.then(function(response) {
console.log("Got response ")
console.log(response);
button.setState({
response: JSON.stringify(response)
});
});
},

render: function() {
return (
<div>
<p onClick={this.handleClick}>
Click to request {this.props.serviceName}
</p>
<p>
{this.state.response}
</p>
</div>
);
}
Expand Down
@@ -0,0 +1,23 @@
package org.wildfly.swarm.examples.netflix.ribbon.time;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;

/**
* @author Lance Ball
*/
@Provider
public class CORSFilter implements ContainerResponseFilter {
public void filter(ContainerRequestContext paramContainerRequestContext,
ContainerResponseContext paramContainerResponseContext)
throws IOException {
paramContainerResponseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
paramContainerResponseContext.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
paramContainerResponseContext.getHeaders().add("Access-Control-Allow-Credentials", "true");
paramContainerResponseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
paramContainerResponseContext.getHeaders().add("Access-Control-Max-Age", "1209600");
}
}
Expand Up @@ -3,8 +3,11 @@
import org.joda.time.DateTime;

import javax.ws.rs.GET;
import javax.ws.rs.OPTIONS;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.HashMap;
import java.util.Map;

Expand All @@ -15,8 +18,8 @@
public class TimeResource {

@GET
@Produces("application/json")
public Map<String,Object> get() {
@Produces(MediaType.APPLICATION_JSON)
public Response get() {
System.err.println( "I was asked for the time" );
Map<String,Object> t = new HashMap<>();
DateTime d = new DateTime();
Expand All @@ -26,11 +29,30 @@ public Map<String,Object> get() {
t.put( "M", d.getMonthOfYear() );
t.put( "D", d.getDayOfMonth() );
t.put( "h", d.getHourOfDay() );
t.put( "m", d.getMinuteOfDay() );
t.put( "m", d.getMinuteOfHour() );
t.put( "s", d.getSecondOfMinute() );
t.put( "ms", d.getMillisOfDay() );
t.put( "ms", d.getMillisOfSecond() );
t.put( "tz", d.getZone().getID() );

return t;
return Response.ok(t, MediaType.APPLICATION_JSON_TYPE)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD, undefined")
.header("Access-Control-Max-Age", "1209600")
.entity(t)
.build();
}

@OPTIONS
@Path("{path : .*}")
public Response options() {
return Response.ok("")
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD, undefined")
.header("Access-Control-Max-Age", "1209600")
.build();
}
}

0 comments on commit a4f2cb7

Please sign in to comment.