/** * Copyright (c) <2013> <Radware Ltd.> and others. All rights reserved. * * This program and the accompanying materials are made available under the terms of the Eclipse Public License * v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html * @author Kobi Samoray * @author Gera Goft * @version 0.1 */ package org.opendaylight.defense4all.restservice; import org.opendaylight.defense4all.core.*; import org.opendaylight.defense4all.core.interactionstructures.PNStatReport; import org.opendaylight.defense4all.framework.core.FMHolder; import org.opendaylight.defense4all.framework.core.Repo; import org.opendaylight.defense4all.restservice.AmsResource.AMSResourceStatus; import org.opendaylight.defense4all.restservice.NetNodeResource.NetNodeResourceStatus; import org.opendaylight.defense4all.restservice.PNResource.PNResourceStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletResponse; import javax.transaction.NotSupportedException; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Request; import javax.ws.rs.core.UriInfo; import java.io.IOException; import java.util.*; @Path("/df") public class Defense4allRestService { private static Logger log = LoggerFactory.getLogger("org.opendaylight.defense4all.restservice"); @Context UriInfo uriInfo; @Context Request request; @GET @Path("pos") @Produces(MediaType.APPLICATION_JSON) public Collection<PO> getPOs(@Context HttpServletResponse servletResponse) { if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } ArrayList<PO> poList = new ArrayList<PO>(); try { log.debug("getPOs: Invoked"); Repo<String> posRepo = DFHolder.get().posRepo; Hashtable<String,Hashtable<String,Object>> res = posRepo.getTable(); if(res == null) return poList; Collection<Hashtable<String, Object>> poResList = res.values(); for(Iterator<Hashtable<String, Object>> i = poResList.iterator(); i.hasNext();) poList.add(new PO(i.next())); return poList; } catch (Throwable e) { log.error("Failed to retrieve pos. ", e); return poList; } } @GET @Path("pos/count") @Produces(MediaType.APPLICATION_JSON) public String getPOsCount(@Context HttpServletResponse servletResponse) { log.debug("getPOsCount: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } try { Repo<String> posRepo = DFHolder.get().posRepo; int count = posRepo.getKeys().size(); return String.valueOf(count); } catch (Throwable e) { log.error("Failed to retrieve POs count"); return null; } } @GET @Produces(MediaType.APPLICATION_JSON) @Path("pos/{po}") public PO getPO(@PathParam("po") String poLabel, @Context HttpServletResponse servletResponse) { log.debug("getPO: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } POResource poResource = new POResource(uriInfo, request, poLabel); return poResource.getPO(); } @POST @Path("pos") @Consumes(MediaType.APPLICATION_JSON) public void addPO(PO po, @Context HttpServletResponse servletResponse) throws Exception { log.debug("addPO: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return; } try { if (DFHolder.get().posRepo.getRow(po.label) != null) { log.debug("addPO: already contains " + po.label); servletResponse.sendError(400, "addPO: already contains " + po.label); } else { if (!po.isValid()) { log.debug("addPO: invalid PO: " + po); servletResponse.sendError(400, "addPO: invalid PO: " + po); } log.debug("addPO: adding " + po.label); DFHolder.get().posRepo.setRow(po.label, po.toRow()); } } catch (Throwable e) { log.error("Failed to add PO " + po.label); try { servletResponse.sendError(500, "Failed to add PO " + po.label); } catch (IOException e1) { log.error("Error in response "+e); } } } @DELETE @Path("pos/{po}") public void deletePO(@PathParam("po") String poLabel, @Context HttpServletResponse servletResponse) { log.debug("deletePO: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return; } POResource poResource = new POResource(uriInfo, request, poLabel); poResource.deletePO(); } @GET @Path("pns") @Produces(MediaType.APPLICATION_JSON) public Collection<PN> getPNs(@Context HttpServletResponse servletResponse) { log.debug("getPNs: Invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } ArrayList<PN> pnList = new ArrayList<PN>(); try { Repo<String> pNsRepo = DFHolder.get().pNsRepo; Hashtable<String,Hashtable<String,Object>> res = pNsRepo.getTable(); if(res == null) return pnList; Collection<Hashtable<String, Object>> pnResList = res.values(); for(Iterator<Hashtable<String, Object>> i = pnResList.iterator(); i.hasNext();) pnList.add(new PN(i.next())); return pnList; } catch (Throwable e) { log.error("Failed to retrieve pns. ", e); return pnList; } } @GET @Path("pns/count") @Produces(MediaType.APPLICATION_JSON) public String getPNsCount(@Context HttpServletResponse servletResponse) { log.debug("getPNsCount: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } try { Repo<String> pNsRepo = DFHolder.get().pNsRepo; int count = pNsRepo.getKeys().size(); return String.valueOf(count); } catch (Throwable e) { log.error("Failed to retrieve PNs count"); return null; } } @GET @Produces(MediaType.APPLICATION_JSON) @Path("pns/{pn}") public PN getPN(@PathParam("pn") String pnLabel, @Context HttpServletResponse servletResponse) { log.debug("getPN: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } PNResource pnResource = new PNResource(uriInfo, request, pnLabel); return pnResource.getPN(); } @POST @Path("pns") @Consumes(MediaType.APPLICATION_JSON) public void addPN(PN pn, @Context HttpServletResponse servletResponse) throws Exception { log.debug("addPN: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return ; } try { DFHolder.get().getMgmtPoint().addPN(pn); } catch (IllegalStateException e1) { try { servletResponse.sendError(409, "Failed to add PN " + pn.label); } catch (IOException e2) { log.error("Error in response "+e2); } } catch (Throwable e) { log.error("Failed to add PN " + pn.label); try { servletResponse.sendError(500, "Failed to add PN " + pn.label); } catch (IOException e3) { log.error("Error in response "+e3); } } } @DELETE @Path("pns/{pn}") public void deletePn(@PathParam("pn") String pnLabel, @Context HttpServletResponse servletResponse) { log.debug("deletePn: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return; } PNResource pnResource = new PNResource(uriInfo, request, pnLabel); PNResourceStatus status = pnResource.deletePN(); int errorCode = 0; switch (status) { case OK: errorCode = 0; break; case CONFLICT: errorCode = 409; break; case SERVER_ERROR: errorCode = 500; break; } if(errorCode != 0) { try { servletResponse.sendError(errorCode, "Failed to remove PN " + pnLabel); } catch (IOException e) {/* Ignore */} } } @GET @Path("amss") @Produces(MediaType.APPLICATION_JSON) public Collection<AMS> getAMSs(@Context HttpServletResponse servletResponse) { log.debug("getAMSs: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } ArrayList<AMS> amsList = new ArrayList<AMS>(); try { Repo<String> amsRepo = DFHolder.get().amsRepo; Hashtable<String,Hashtable<String,Object>> res = amsRepo.getTable(); if(res == null) return amsList; Collection<Hashtable<String, Object>> amsResList = res.values(); for(Iterator<Hashtable<String, Object>> i = amsResList.iterator(); i.hasNext();) amsList.add(new AMS(i.next())); } catch (Throwable e) { log.error("Failed to retrieve amss. ", e); } return amsList; } @GET @Path("amss/count") @Produces(MediaType.APPLICATION_JSON) public String getDPsCount(@Context HttpServletResponse servletResponse) { log.debug("getDPsCount: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } try { Repo<String> dPsRepo = DFHolder.get().amsRepo; int count = dPsRepo.getKeys().size(); return String.valueOf(count); } catch (Throwable e) { log.error("Failed to retrieve AMSs count"); return null; } } @GET @Path("amss/{ams}") @Produces(MediaType.APPLICATION_JSON) public AMS getAMS(@PathParam("ams") String amsLabel, @Context HttpServletResponse servletResponse) { log.debug("getAMS: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } try { AmsResource amsResource = new AmsResource(uriInfo, request, amsLabel); return amsResource.getAms(); } catch (Throwable e) { return new AMS(); } } @POST @Path("amss") @Consumes(MediaType.APPLICATION_JSON) public void addAMS(AMS ams, @Context HttpServletResponse servletResponse) { log.debug("addAMS: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return ; } try { DFHolder.get().getMgmtPoint().addAMS(ams); } catch (IllegalStateException e1) { try { servletResponse.sendError(409, "Failed to add AMS " + ams.label); } catch (IOException e2) { log.error("Error in response "+e2); } } catch (Throwable e) { log.error("Failed to add AMS " + ams.label); try { servletResponse.sendError(500, "Failed to add AMS " + ams.label); } catch (IOException e3) { log.error("Error in response "+e3); } } } @DELETE @Path("amss/{ams}") public void deleteAms(@PathParam("ams") String amsLabel, @Context HttpServletResponse servletResponse) { log.debug("deleteAms: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return ; } AmsResource amsResource = new AmsResource(uriInfo, request, amsLabel); AMSResourceStatus status = amsResource.deleteAms(); int errorCode = 0; switch (status) { case OK: errorCode = 0; break; case CONFLICT: errorCode = 409; break; case SERVER_ERROR: errorCode = 500; break; } if(errorCode != 0) { try { servletResponse.sendError(errorCode, "Failed to remove AMS " + amsLabel); } catch (IOException e) {/* Ignore */} } } @GET @Path("ofcs") @Produces(MediaType.APPLICATION_JSON) public Collection<OFC> getOFCs(@Context HttpServletResponse servletResponse) { log.debug("getOFCs: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } ArrayList<OFC> ofcList = new ArrayList<OFC>(); try { Repo<String> oFCsRepo = DFHolder.get().oFCsRepo; Hashtable<String,Hashtable<String,Object>> res = oFCsRepo.getTable(); if(res == null) return ofcList; Collection<Hashtable<String, Object>> ofcResList = res.values(); for(Iterator<Hashtable<String, Object>> i = ofcResList.iterator(); i.hasNext();) ofcList.add(new OFC(i.next())); } catch (Throwable e) { log.error("Failed to retrieve ofcs. ", e); return null; } return ofcList; } @GET @Path("ofcs/count") @Produces(MediaType.APPLICATION_JSON) public String getOFCsCount(@Context HttpServletResponse servletResponse) { log.debug("getOFCsCount: invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } try { log.debug("getOFCsCount: invoked"); Repo<String> oFCsRepo = DFHolder.get().oFCsRepo; int count = oFCsRepo.getKeys().size(); return String.valueOf(count); } catch (Throwable e) { log.error("Failed to retrieve OFCs count"); return null; } } @GET @Path("ofcs/{ofc}") @Produces(MediaType.APPLICATION_JSON) public OFC getOFC(@PathParam("ofc") String ofcLabel, @Context HttpServletResponse servletResponse) { log.debug("getOFC : " + ofcLabel); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } try { OFCResource ofcResource = new OFCResource(uriInfo, request, ofcLabel); return ofcResource.getOFC(); } catch (Throwable e) { return new OFC(); } } @POST @Path("ofcs") @Consumes(MediaType.APPLICATION_JSON) public void addOFC(OFC ofc, @Context HttpServletResponse servletResponse) { log.debug("addOFC : invoked " ); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return ; } try { Repo<String> oFCsRepo = DFHolder.get().oFCsRepo; if (oFCsRepo.getRow(ofc.hostname) != null) { log.debug("addOFC: already contains " + ofc.hostname); servletResponse.sendError(400, "addOFC: already contains " + ofc.hostname); } else { log.debug("addOFC: adding " + ofc.hostname); DFHolder.get().getMgmtPoint().addOFC(ofc); } } catch (Throwable e) { try { DFHolder.get().getMgmtPoint().removeOFC(ofc.getHostname()); } catch (Exception e2) { log.warn("caught an exception when trying to remove OFC leftovers after add OFC failed", e2); } log.error("Failed to add OFC " + ofc.hostname); try { servletResponse.sendError(500, "Failed to add OFC " + ofc.hostname); } catch (IOException e1) { log.error("Error in response "+e1); } } } @DELETE @Path("ofcs/{ofc}") public void deleteOfc(@PathParam("ofc") String ofcLabel, @Context HttpServletResponse servletResponse) { log.debug("deleteOfc : invoked " ); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return ; } try { if ( ! FMHolder.get().isOpenForBusiness() ) servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); return; } OFCResource ofcResource = new OFCResource(uriInfo, request, ofcLabel); ofcResource.deleteOFC(); } @GET @Path("netnodes") @Produces(MediaType.APPLICATION_JSON) public ArrayList<NetNode> getNetnodes(@Context HttpServletResponse servletResponse) { log.debug("getNetnode: Invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } ArrayList<NetNode> netNodeList = new ArrayList<NetNode>(); Collection<Hashtable<String, Object>> netNodeResList ; NetNode netNode; try { Repo<String> netNodesRepo = DFHolder.get().netNodesRepo; Hashtable<String,Hashtable<String,Object>> res = netNodesRepo.getTable(); if(res == null) return netNodeList; netNodeResList = res.values(); } catch (Throwable e) { log.error("Failed to retrieve netnodes. ", e); return null; } Hashtable<String, Object> netNodeRow=null; for(Iterator<Hashtable<String, Object>> i = netNodeResList.iterator(); i.hasNext();) { try { netNodeRow = i.next(); netNode = new NetNode(netNodeRow); netNode.toJacksonFriendly(); netNodeList.add(netNode); log.debug("NetNode retrieved "+netNodeRow.toString()); } catch (Throwable e) { log.error("Failed to retrieve netnode. " + netNodeRow.toString()); continue; } } return netNodeList; } @GET @Path("netnodes/count") @Produces(MediaType.APPLICATION_JSON) public String getNetnodesCount(@Context HttpServletResponse servletResponse) { log.debug("getNetnodesCount: Invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } try { Repo<String> netNodesRepo = DFHolder.get().netNodesRepo; int count = netNodesRepo.getKeys().size(); return String.valueOf(count); } catch (Throwable e) { log.error("Failed to retrieve OFCs count"); return null; } } @GET @Path("netnodes/{netnode}") @Produces(MediaType.APPLICATION_JSON) public NetNode getNetNode(@PathParam("netnode") String netNodeLabel, @Context HttpServletResponse servletResponse) { log.debug("getNetNode: Invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } try { NetNodeResource netNodeResource = new NetNodeResource(uriInfo, request, netNodeLabel); return netNodeResource.getNetNode(); } catch (Throwable e) { return new NetNode(); } } @POST @Path("netnodes") @Consumes(MediaType.APPLICATION_JSON) public void addNetNode(NetNode netNode, @Context HttpServletResponse servletResponse) throws Exception { log.debug("addNetNode: Invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return ; } int errorCode = 0; try { DFHolder.get().getMgmtPoint().addNetNode(netNode); errorCode = 0; } catch (NotSupportedException e1) { errorCode = 405; } catch (Throwable e) { log.error("Failed to add NetNode " + netNode.label); errorCode = 500; } if(errorCode != 0) { try { servletResponse.sendError(errorCode, "Failed to add NetNode " + netNode.label); } catch (IOException e1) { log.error("Error in response "+e1); } } } @DELETE @Path("netnodes/{netnode}") public void deleteNetNode(@PathParam("netnode") String netNodeLabel, @Context HttpServletResponse servletResponse) { log.debug("deleteNetNode: Invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return ; } NetNodeResource netNodeResource = new NetNodeResource(uriInfo, request, netNodeLabel); NetNodeResourceStatus status = netNodeResource.deleteNetNode(); int errorCode = 0; switch (status) { case OK: errorCode = 0; break; case FORBIDDEN: errorCode = 405; break; case CONFLICT: errorCode = 409; break; case SERVER_ERROR: errorCode = 500; break; } if(errorCode != 0) { try { servletResponse.sendError(errorCode, "Failed to remove PN " + netNodeLabel); } catch (IOException e) {/* Ignore */} } } @GET @Path("mitigations") @Produces(MediaType.APPLICATION_JSON) public Collection<Mitigation> getMitigations(@Context HttpServletResponse servletResponse) { log.debug("getMitigations: Invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } ArrayList<Mitigation> mitigationsList = new ArrayList<Mitigation>(); try { Repo<String> mitigationsRepo = DFHolder.get().mitigationsRepo; Hashtable<String,Hashtable<String,Object>> res = mitigationsRepo.getTable(); if(res == null) return mitigationsList; Collection<Hashtable<String, Object>> mitigationsResList = res.values(); for(Iterator<Hashtable<String, Object>> i = mitigationsResList.iterator(); i.hasNext();) mitigationsList.add(new Mitigation(i.next())); } catch (Throwable e) { log.error("Failed to retrieve mitigations. ", e); return null; } return mitigationsList; } @GET @Path("mitigations/{mitigation}") @Produces(MediaType.APPLICATION_JSON) public Mitigation getMitigation(@PathParam("mitigation") String mitigationLabel, @Context HttpServletResponse servletResponse) { log.debug("getMitigation: Invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } try { Repo<String> mitigationsRepo = DFHolder.get().mitigationsRepo; Hashtable<String,Object> mitigationRow = mitigationsRepo.getRow(mitigationLabel); Mitigation mitigation = new Mitigation(mitigationRow); return mitigation; } catch (Throwable e) { log.error("Failed to retrieve mitigation " + mitigationLabel, e); return null; } } @GET @Path("attacks") @Produces(MediaType.APPLICATION_JSON) public Collection<Attack> getAttacks(@Context HttpServletResponse servletResponse) { log.debug("getAttacks: Invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } ArrayList<Attack> attackList = new ArrayList<Attack>(); try { log.debug("getAttacks: Invoked"); Repo<String> attacksRepo = DFHolder.get().attacksRepo; Hashtable<String,Hashtable<String,Object>> res = attacksRepo.getTable(); if(res == null) return attackList; Collection<Hashtable<String, Object>> attackResList = res.values(); for(Iterator<Hashtable<String, Object>> i = attackResList.iterator(); i.hasNext();) attackList.add(new Attack(i.next())); } catch (Throwable e) { log.error("Failed to retrieve attacks. ", e); return null; } return attackList; } @GET @Path("attacks/{attack}") @Produces(MediaType.APPLICATION_JSON) public Attack getAttack(@PathParam("attack") String attackLabel, @Context HttpServletResponse servletResponse) { log.debug("getAttack: Invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } try { Repo<String> attacksRepo = DFHolder.get().attacksRepo; Hashtable<String,Object> attackRow = attacksRepo.getRow(attackLabel); Attack attack = new Attack(attackRow); return attack; } catch (Throwable e) { log.error("Failed to retrieve attack " + attackLabel, e); return null; } } @GET @Produces(MediaType.APPLICATION_JSON) @Path("pnstats") public Collection<PNStatReport> getPNStats(@Context HttpServletResponse servletResponse) { log.debug("getPNStats: Invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } try { Collection<PNStatReport> pnStatReports = DFHolder.get().getMgmtPoint().getLatestPNStatReports(); return pnStatReports; } catch (Throwable e) { log.error("Failed to retrieve pnStats. ", e); return null; } } @GET @Produces(MediaType.APPLICATION_JSON) @Path("pnstats/{pn}") public PNStatReport getPNStat(@PathParam("pn") String pnLabel, @Context HttpServletResponse servletResponse) { log.debug("getPNStat: Invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return null; } try { PNStatReport pnStatReport = DFHolder.get().getMgmtPoint().getLatestPNStatReport(pnLabel); return pnStatReport; } catch (IllegalArgumentException e) { try { servletResponse.sendError(400, "get pnstat: Null or empty pnLabel."); } catch (IOException e1) {log.error("Error in response "+e1);} } catch (Throwable e1) { try { servletResponse.sendError(500, "Failed to get pnstat for pn " + pnLabel); } catch (IOException e2) {log.error("Error in response "+e2);} } return null; } @POST @Path("detectors/{label}") @Consumes(MediaType.APPLICATION_JSON) public void changeDetector(Map<String,String> input, @PathParam("label") String detectorLabel, @Context HttpServletResponse servletResponse) { log.debug("detectors: Invoked"); if ( ! FMHolder.get().isOpenForBusiness() ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return; } if ( detectorLabel== null || DFHolder.get().getDetectorMgr().getDetector(detectorLabel) == null ) { try { servletResponse.sendError(503, "Service is unavailable" ); } catch (Throwable e) { log.error("Error in response "+e); } return; } try { Iterator<Map.Entry<String,String>> iter = input.entrySet().iterator(); Map.Entry<String,String> entry; while ( iter.hasNext() ) { entry = iter.next(); String attrName = entry.getKey(); String attrValue = entry.getValue(); DFHolder.get().getDetectorMgr().setDetectorProperties ( detectorLabel, attrName,attrValue ); } } catch (Throwable e) { try { servletResponse.sendError(500, "Failed to update detector " + detectorLabel); } catch (IOException e2) {log.error("Error in response "+e2);} } } }