From db53dfb2c1cf2a3e0b331d0f79c683d392b0f54e Mon Sep 17 00:00:00 2001 From: leebeomjun Date: Tue, 13 Jun 2023 15:41:52 +0900 Subject: [PATCH] =?UTF-8?q?SVG=ED=8C=8C=EC=9D=BC=20=EC=83=89=EC=83=81=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EC=B2=98=EB=A6=AC=EC=9A=A9=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cokr/xit/fims/ResourceController.java | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/main/java/cokr/xit/fims/ResourceController.java diff --git a/src/main/java/cokr/xit/fims/ResourceController.java b/src/main/java/cokr/xit/fims/ResourceController.java new file mode 100644 index 00000000..46cfb6de --- /dev/null +++ b/src/main/java/cokr/xit/fims/ResourceController.java @@ -0,0 +1,132 @@ +package cokr.xit.fims; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.StringWriter; +import java.net.URISyntaxException; +import java.net.URLDecoder; + +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 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.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import cokr.xit.foundation.Log; +import cokr.xit.foundation.web.AbstractController; + + +@Controller +@RequestMapping(name = "리소스 파일 변환 처리 컨트롤러", value = "/mresources") +public class ResourceController extends AbstractController { + + @GetMapping(name = "이미지 파일 색상 변경", value = "/image/**") + 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("\\","/"); + String contextPath = request.getSession().getServletContext().getContextPath(); + filepath = filepath.replace("webapp"+contextPath+"/resources", "webapp/resources"); + 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. + } + } + } + } + } +}