11package etri .sdn .controller .module .firewall ;
22
3- import java .io .IOException ;
43import java .util .ArrayList ;
54import java .util .Collection ;
65import java .util .Collections ;
98import java .util .List ;
109import java .util .Map ;
1110
12- import org .codehaus .jackson .map .ObjectMapper ;
13- import org .restlet .Request ;
14- import org .restlet .Response ;
15- import org .restlet .Restlet ;
16- import org .restlet .data .MediaType ;
17- import org .restlet .data .Method ;
1811import org .slf4j .Logger ;
1912import org .slf4j .LoggerFactory ;
2013
@@ -41,12 +34,56 @@ public class FirewallStorage extends OFModel{
4134
4235 private FirewallEntryTable firewallEntryTable ;
4336
37+ private RESTApi [] apis ;
38+
4439 FirewallStorage (OFMFirewall manager , String name ){
4540 this .manager = manager ;
4641 this .name = name ;
4742 firewallEntryTable = new FirewallEntryTable ();
43+
44+ initRestApis ();
4845 }
4946
47+ /**
48+ * Initialize REST API list.
49+ */
50+ private void initRestApis () {
51+
52+ /**
53+ * Array of RESTApi objects.
54+ * Each objects represent a REST call handler routine bound to a specific URI.
55+ */
56+ RESTApi [] tmp = {
57+ /**
58+ * This object implements a REST handler routine for operations of firewall.
59+ */
60+ new RESTApi (
61+ "/wm/firewall/module/{op}/json" ,
62+ new RESTOperationApi (manager )
63+ ),
64+
65+ /**
66+ * This object implements REST handler routines for
67+ * retrieving, inserting and deleting firewall rule(s).
68+ */
69+ new RESTApi (
70+ "/wm/firewall/rules/json" ,
71+ new RESTPostDeleteApi (manager )
72+ ),
73+
74+ /**
75+ * This object is an additional implements REST handler routines (i.e. RFC2616).
76+ * According to RFC2616, DELETE method cannot have data fields.
77+ */
78+ new RESTApi (
79+ "/wm/firewall/rules/delete/{ruleid}/json" ,
80+ new RESTDeleteByIDApi (manager )
81+ )
82+ };
83+
84+ this .apis = tmp ;
85+ }
86+
5087 public OFMFirewall getManager () {
5188 return this .manager ;
5289 }
@@ -227,197 +264,6 @@ public Collection<Map<String, Object>> getAllDBEntries (IStorageService firewall
227264
228265 return resultList ;
229266 }
230-
231- /**
232- * Array of RESTApi objects.
233- * Each objects represent a REST call handler routine bound to a specific URI.
234- */
235- private RESTApi [] apis = {
236-
237- /**
238- * This object implements a REST handler routine for operations of firewall.
239- */
240- new RESTApi (
241- "/wm/firewall/module/{op}/json" ,
242- new Restlet () {
243- @ Override
244- public void handle (Request request , Response response ) {
245-
246- IFirewallService firewall = getManager ();
247-
248- String op = (String ) request .getAttributes ().get ("op" );
249-
250- String result = null ;
251-
252- if (op .toLowerCase ().equals ("storagerules" )){
253- // create an object mapper.
254- ObjectMapper om = new ObjectMapper ();
255- om .registerModule ( new OFFirewallRuleReplySerializerModule () );
256-
257- try {
258- result = om ./*writerWithDefaultPrettyPrinter().*/ writeValueAsString ( firewallEntryTable .values () );
259- } catch (Exception e ) {
260- e .printStackTrace ();
261- return ;
262- }
263- }
264-
265- else if (op .toLowerCase ().equals ("status" )){
266- if (firewall .isEnabled ())
267- result = "{\" result\" : \" firewall enabled\" }" ;
268- else
269- result = "{\" result\" : \" firewall disabled\" }" ;
270- }
271-
272- else if (op .toLowerCase ().equals ("enable" )){
273- firewall .enableFirewall (true );
274- result = "{\" status\" : \" success\" , \" details\" : \" firewall running\" }" ;
275- }
276-
277- else if (op .toLowerCase ().equals ("disable" )){
278- firewall .enableFirewall (false );
279- result = "{\" status\" : \" success\" , \" details\" : \" firewall stopped\" }" ;
280- }
281-
282- else if (op .toLowerCase ().equals ("get-subnet-mask" )){
283- result = "{\" subnet-mask\" : \" " + firewall .getSubnetMask () + "\" }" ;
284- }
285-
286- else if (op .toLowerCase ().equals ("set-subnet-mask" )){
287- String entityText = request .getEntityAsText ();
288- entityText = entityText .replaceAll ("[\' ]" , "" );
289-
290- try {
291- firewall .setSubnetMask (FirewallRule .jsonToSubnetMask (entityText ));
292- result = "{\" status\" : \" success\" , \" details\" : \" subnet-mask is set\" }" ;
293- }
294- catch (IOException e ) {
295- logger .error ("Error parsing subnet-mask: {}, {}" , entityText , e );
296- return ;
297- }
298- }
299-
300- else {
301- result = "{\" status\" : \" failure\" , \" details\" : \" invalid operation\" }" ;
302- }
303-
304- response .setEntity (result , MediaType .APPLICATION_JSON );
305- }
306- }
307- ),
308-
309- /**
310- * This object implements REST handler routines for
311- * retrieving, inserting and deleting firewall rule(s).
312- */
313- new RESTApi (
314- "/wm/firewall/rules/json" ,
315- new Restlet () {
316- @ Override
317- public void handle (Request request , Response response ) {
318- IFirewallService firewall = getManager ();
319-
320- Method m = request .getMethod ();
321- String result = null ;
322- String status = null ;
323- boolean exists = false ;
324- FirewallRule inRule ;
325-
326- if (m == Method .GET ){
327- // create an object mapper.
328- ObjectMapper om = new ObjectMapper ();
329-
330- try {
331- result = om ./*writerWithDefaultPrettyPrinter().*/ writeValueAsString ( manager .getRules () );
332- } catch ( IOException e ) {
333- e .printStackTrace ();
334- return ;
335- }
336- }
337-
338- else if (m == Method .POST ){
339- Iterator <FirewallRule > iter = firewall .getRules ().iterator ();
340-
341- String entityText = request .getEntityAsText ();
342- entityText = entityText .replaceAll ("[\' ]" , "" );
343-
344- try {
345- inRule = FirewallRule .jsonToFirewallRule (entityText );
346- } catch (IOException e ) {
347- logger .error ("Error parsing firewall rule: {}, {}" , entityText , e );
348- e .printStackTrace ();
349- return ;
350- }
351-
352- while (iter .hasNext ()) {
353- FirewallRule r = iter .next ();
354- if ( inRule .isSameAs (r ) ){
355- exists = true ;
356- logger .error ("Error! A similar firewall rule already exists." );
357- break ;
358- }
359- }
360-
361- if ( exists == false ){
362- // add rule to firewall
363- firewall .addRule (inRule );
364- status = "Rule added" ;
365- }
366-
367- result = "{\" status\" : \" " + status + "\" }" ;
368- }
369-
370- else if (m == Method .DELETE ){
371- Iterator <FirewallRule > iter = firewall .getRules ().iterator ();
372-
373- String entityText = request .getEntityAsText ();
374-
375- // Clear all rules.
376- if (entityText == null ) {
377- firewall .clearRules ();
378- status = "All rules are deleted." ;
379- }
380- // Delete one rule based on input rule id.
381- else {
382- entityText = entityText .replaceAll ("[\' ]" , "" );
383- //System.out.println(entityText);
384-
385- try {
386- inRule = FirewallRule .jsonToFirewallRule (entityText );
387- } catch (IOException e ) {
388- logger .error ("Error parsing firewall rule: {}, {}" , entityText , e );
389- e .printStackTrace ();
390- return ;
391- }
392-
393- while (iter .hasNext ()) {
394- FirewallRule r = iter .next ();
395- if ( r .ruleid == inRule .ruleid ){
396- exists = true ;
397- break ;
398- }
399- }
400-
401- if ( !exists ){
402- logger .error ("Error! Can't delete, a rule with ID {} doesn't exist." ,
403- inRule .ruleid );
404- return ;
405- } else {
406- // delete rule from firewall
407- firewall .deleteRule ( inRule .ruleid );
408- status = "Rule deleted" ;
409- }
410- }
411-
412- result = "{\" status\" : \" " + status + "\" }" ;
413- }
414-
415- response .setEntity (result , MediaType .APPLICATION_JSON );
416- }
417- }
418- )
419-
420- };
421267
422268 /**
423269 * Returns the list of RESTApi objects
0 commit comments