From 9f8cf82888db570c1b50edb81eccf7f42bb86ec3 Mon Sep 17 00:00:00 2001 From: leebeomjun Date: Fri, 19 May 2023 10:55:01 +0900 Subject: [PATCH] =?UTF-8?q?fix=20:=20svg=ED=8C=8C=EC=9D=BC=20=EC=83=89?= =?UTF-8?q?=EC=83=81=20=EB=B3=80=EA=B2=BD=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/cmm/web/ResourceController.java | 119 ++++++++++++++++++ .../css/fims/framework/common/xit-icon.css | 58 +++++++-- 2 files changed, 165 insertions(+), 12 deletions(-) create mode 100644 src/main/java/kr/xit/fims/framework/biz/cmm/web/ResourceController.java diff --git a/src/main/java/kr/xit/fims/framework/biz/cmm/web/ResourceController.java b/src/main/java/kr/xit/fims/framework/biz/cmm/web/ResourceController.java new file mode 100644 index 00000000..f5fc73df --- /dev/null +++ b/src/main/java/kr/xit/fims/framework/biz/cmm/web/ResourceController.java @@ -0,0 +1,119 @@ +package kr.xit.fims.framework.biz.cmm.web; + +import cokr.xit.foundation.web.AbstractController; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.w3c.dom.*; +import org.xml.sax.SAXException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.*; +import java.net.URISyntaxException; +import java.net.URLDecoder; + +@Controller +@RequestMapping(name = "", value = "/mresources") +public class ResourceController extends AbstractController { + @GetMapping(name = "", value = "/**") + public void modifySvg(HttpServletRequest request, HttpServletResponse response) throws URISyntaxException, IOException, ParserConfigurationException, SAXException { + String requestURI = request.getRequestURI().toString(); + + String filepath = requestURI.replace("/mresources","/resources"); + filepath = URLDecoder.decode(filepath); + filepath = request.getSession().getServletContext().getRealPath(filepath); + filepath = filepath.replace("\\","/"); + filepath = "file:///"+filepath; + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = factory.newDocumentBuilder(); + Document document = documentBuilder.parse(filepath); + Element root = document.getDocumentElement(); + NodeList nodeList = root.getChildNodes(); + + try { + String modify = request.getParameter("modify"); + if(modify == null || modify.equals("")){ + + } else if(modify.equals("active")){ + updateTagFillColor(nodeList, "green"); + } else if(modify.equals("alert")){ + updateTagFillColor(nodeList, "red"); + } + + String str4 = DocumentToString(document); + byte[] bytes = str4.getBytes(); + + response.setHeader(HttpHeaders.ACCEPT_RANGES, "bytes"); + response.setHeader(HttpHeaders.CONTENT_TYPE, "image/svg+xml"); + response.setHeader(HttpHeaders.CONNECTION, "keep-alive"); + response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); + response.setHeader("Pragma", "no-cache"); + response.setHeader(HttpHeaders.CACHE_CONTROL, "no-cache, must-revalidate"); + response.setDateHeader(HttpHeaders.EXPIRES, 0); + response.setHeader(HttpHeaders.CONTENT_LENGTH, Integer.toString(bytes.length)); + response.setContentType("image/svg+xml"); + + OutputStream os = response.getOutputStream(); + os.write(bytes); + os.flush(); + os.close(); + + + } catch (Exception e){ + + } + + + } + + + + public static String DocumentToString( Document doc ) + { + try + { + StringWriter clsOutput = new StringWriter( ); + Transformer clsTrans = TransformerFactory.newInstance( ).newTransformer( ); + + clsTrans.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "no" ); + clsTrans.setOutputProperty( OutputKeys.METHOD, "xml" ); + clsTrans.setOutputProperty( OutputKeys.INDENT, "yes" ); + clsTrans.setOutputProperty( OutputKeys.ENCODING, "UTF-8" ); + + clsTrans.transform( new DOMSource( doc ), new StreamResult( clsOutput ) ); + + return clsOutput.toString( ); + } + catch( Exception ex ) + { + return ""; + } + } + + private void updateTagFillColor(NodeList nodeList, String newFillColor) { + + for (int i = 0; i < nodeList.getLength(); i++) { + Node node = nodeList.item(i); + NamedNodeMap namedNodeMap = node.getAttributes(); + if(namedNodeMap != null && namedNodeMap.getLength() > 0){ + for (int j = 0; j < namedNodeMap.getLength(); j++) { + Node namedNode = namedNodeMap.item(j); + if (namedNode.getNodeName().equalsIgnoreCase("fill")) { + namedNode.setNodeValue(newFillColor); // Change the color of the fill attribute. + } + } + } + } + } +} diff --git a/src/main/webapp/resources/css/fims/framework/common/xit-icon.css b/src/main/webapp/resources/css/fims/framework/common/xit-icon.css index 46d72796..fadf3930 100644 --- a/src/main/webapp/resources/css/fims/framework/common/xit-icon.css +++ b/src/main/webapp/resources/css/fims/framework/common/xit-icon.css @@ -1,47 +1,81 @@ .svg-cctv-fixed:before { - content : url("../../../../image/fims/framework/고정형cctv.svg"); + --bs-origin : url("../../../../../mresources/image/fims/framework/고정형cctv.svg"); + --bs-active : url("../../../../../mresources/image/fims/framework/고정형cctv.svg?modify=active"); + --bs-alert : url("../../../../../mresources/image/fims/framework/고정형cctv.svg?modify=alert"); } .svg-cctv-drive:before { - content : url("../../../../image/fims/framework/이동형cctv.svg"); + --bs-origin : url("../../../../../mresources/image/fims/framework/이동형cctv.svg"); + --bs-active : url("../../../../../mresources/image/fims/framework/이동형cctv.svg?modify=active"); + --bs-alert : url("../../../../../mresources/image/fims/framework/이동형cctv.svg?modify=alert"); } .svg-crackdown-road:before { - content : url("../../../../image/fims/framework/도보단속.svg"); + --bs-origin : url("../../../../../mresources/image/fims/framework/도보단속.svg"); + --bs-active : url("../../../../../mresources/image/fims/framework/도보단속.svg?modify=active"); + --bs-alert : url("../../../../../mresources/image/fims/framework/도보단속.svg?modify=alert"); } .svg-crackdown-minwon:before { - content : url("../../../../image/fims/framework/민원(즉시단속).svg"); + --bs-origin : url("../../../../../mresources/image/fims/framework/민원(즉시단속).svg"); + --bs-active : url("../../../../../mresources/image/fims/framework/민원(즉시단속).svg?modify=active"); + --bs-alert : url("../../../../../mresources/image/fims/framework/민원(즉시단속).svg?modify=alert"); } .svg-target-lvy:before { - content : url("../../../../image/fims/framework/등록대상.svg"); + --bs-origin : url("../../../../../mresources/image/fims/framework/등록대상.svg"); + --bs-active : url("../../../../../mresources/image/fims/framework/등록대상.svg?modify=active"); + --bs-alert : url("../../../../../mresources/image/fims/framework/등록대상.svg?modify=alert"); } .svg-target-transfer:before { - content : url("../../../../image/fims/framework/이첩대상.svg"); + --bs-origin : url("../../../../../mresources/image/fims/framework/이첩대상.svg"); + --bs-active : url("../../../../../mresources/image/fims/framework/이첩대상.svg?modify=active"); + --bs-alert : url("../../../../../mresources/image/fims/framework/이첩대상.svg?modify=alert"); } .svg-sendstat-guide:before { - content : url("../../../../image/fims/framework/계도장 발송현황.svg"); + --bs-origin : url("../../../../../mresources/image/fims/framework/계도장 발송현황.svg"); + --bs-active : url("../../../../../mresources/image/fims/framework/계도장 발송현황.svg?modify=active"); + --bs-alert : url("../../../../../mresources/image/fims/framework/계도장 발송현황.svg?modify=alert"); } .svg-sendstat-before:before { - content : url("../../../../image/fims/framework/사전통보 발송현황.svg"); + --bs-origin : url("../../../../../mresources/image/fims/framework/사전통보 발송현황.svg"); + --bs-active : url("../../../../../mresources/image/fims/framework/사전통보 발송현황.svg?modify=active"); + --bs-alert : url("../../../../../mresources/image/fims/framework/사전통보 발송현황.svg?modify=alert"); } .svg-sendstat-nop:before { - content : url("../../../../image/fims/framework/고지서 발송현황.svg"); + --bs-origin : url("../../../../../mresources/image/fims/framework/고지서 발송현황.svg"); + --bs-active : url("../../../../../mresources/image/fims/framework/고지서 발송현황.svg?modify=active"); + --bs-alert : url("../../../../../mresources/image/fims/framework/고지서 발송현황.svg?modify=alert"); } .svg-opn-rcp:before { - content : url("../../../../image/fims/framework/접수.svg"); + --bs-origin : url("../../../../../mresources/image/fims/framework/접수.svg"); + --bs-active : url("../../../../../mresources/image/fims/framework/접수.svg?modify=active"); + --bs-alert : url("../../../../../mresources/image/fims/framework/접수.svg?modify=alert"); } .svg-opn-decision:before { - content : url("../../../../image/fims/framework/수용_미수용.svg"); + --bs-origin : url("../../../../../mresources/image/fims/framework/수용_미수용.svg"); + --bs-active : url("../../../../../mresources/image/fims/framework/수용_미수용.svg?modify=active"); + --bs-alert : url("../../../../../mresources/image/fims/framework/수용_미수용.svg?modify=alert"); } .svg-opn-selfdrop:before { - content : url("../../../../image/fims/framework/자진취하.svg"); + --bs-origin : url("../../../../../mresources/image/fims/framework/자진취하.svg"); + --bs-active : url("../../../../../mresources/image/fims/framework/자진취하.svg?modify=active"); + --bs-alert : url("../../../../../mresources/image/fims/framework/자진취하.svg?modify=alert"); +} + +[class^=svg-]:before { + content : var(--bs-origin); +} +[class^=svg-].active-svg:before { + content : var(--bs-active); +} +[class^=svg-].alert-svg:before { + content : var(--bs-alert); } \ No newline at end of file