diff --git a/src/main/java/koreatech/in/controller/LostAndFoundController.java b/src/main/java/koreatech/in/controller/LostAndFoundController.java index 189717cb..cd22144c 100644 --- a/src/main/java/koreatech/in/controller/LostAndFoundController.java +++ b/src/main/java/koreatech/in/controller/LostAndFoundController.java @@ -64,7 +64,7 @@ ResponseEntity getLostItem(@ApiParam(required = true) @PathVariable int id) thro @ApiOperation(value = "", authorizations = {@Authorization(value="Authorization")}) @RequestMapping(value = "/lost/lostItems/{id}", method = RequestMethod.PUT) public @ResponseBody - ResponseEntity updateLostItem(@ApiParam(value="(optional: type, title, location, date, content, state, phone, is_phone_open, thumbnail)", required = false) @RequestBody @Validated(ValidationGroups.Update.class) LostItem lostItem, BindingResult bindingResult, @ApiParam(required = true) @PathVariable int id) throws Exception { + ResponseEntity updateLostItem(@ApiParam(value="(required: type), (optional: title, location, date, content, state, phone, is_phone_open, thumbnail)", required = false) @RequestBody @Validated(ValidationGroups.Update.class) LostItem lostItem, BindingResult bindingResult, @ApiParam(required = true) @PathVariable int id) throws Exception { LostItem clear = new LostItem(); return new ResponseEntity(lostAndFoundService.updateLostItem((LostItem) StringXssChecker.xssCheck(lostItem, clear), id), HttpStatus.CREATED); } diff --git a/src/main/java/koreatech/in/schedule/BusTago.java b/src/main/java/koreatech/in/schedule/BusTago.java index 0dd3402a..3b148d8f 100644 --- a/src/main/java/koreatech/in/schedule/BusTago.java +++ b/src/main/java/koreatech/in/schedule/BusTago.java @@ -1,8 +1,9 @@ package koreatech.in.schedule; -import com.google.gson.*; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import koreatech.in.domain.BusArrivalInfo; -import koreatech.in.domain.NotiSlack; import koreatech.in.service.JsonConstructor; import koreatech.in.util.SlackNotiSender; import org.springframework.beans.factory.annotation.Autowired; @@ -24,20 +25,6 @@ @Service("busTagoSchedule") public class BusTago { - private String CACHE_KEY_BUS_ARRIVAL_INFO = "Tago@busArrivalInfo.%s.%s"; - - @Value("${OPEN_API_KEY}") - private static String OPEN_API_KEY; - @Value("${OPEN_API_KEY}") - private void setOpenApiKey(String key) { OPEN_API_KEY = key; } - public static String getOpenApiKey() { return OPEN_API_KEY; } - - public int[] avaliableBus = {400, 401, 402, 493}; - - @Autowired - SlackNotiSender slackNotiSender; - - private static String cityCode = "34010"; public static List> nodeIds = new ArrayList>() {{ add(new ArrayList() {{ add("CAB285000405"); @@ -56,25 +43,31 @@ public class BusTago { add("terminal"); }}); }}; - + private static String OPEN_API_KEY; + private static String cityCode = "34010"; private static ValueOperations>> valueOps; - @Resource(name = "redisTemplate") - public void setValueOps(ValueOperations>> _valueOps) { - valueOps = _valueOps; - } + public int[] avaliableBus = {400, 401, 402, 493}; - private void updateAndCacheBusArrivalInfo(String cityCode, List nodeId) throws IOException { - String cacheKey = getBusArrivalInfoCacheKey(cityCode, nodeId.get(0)); + @Autowired + SlackNotiSender slackNotiSender; - List> info = requestBusArrivalInfo(cityCode, nodeId); + private static JsonConstructor con; - valueOps.set(cacheKey, info); + private String CACHE_KEY_BUS_ARRIVAL_INFO = "Tago@busArrivalInfo.%s.%s"; + + @Value("${OPEN_API_KEY}") + private void setOpenApiKey(String key) { + OPEN_API_KEY = key; + } + + @Autowired + private void setCon(JsonConstructor jsonConstructor) { + con = jsonConstructor; } private static List> requestBusArrivalInfo(String cityCode, List nodeId) throws IOException { List> result = new ArrayList>(); - JsonConstructor con = new JsonConstructor(); StringBuilder urlBuilder = new StringBuilder("http://openapi.tago.go.kr/openapi/service/ArvlInfoInqireService/getSttnAcctoArvlPrearngeInfoList"); /*URL*/ urlBuilder.append("?" + URLEncoder.encode("ServiceKey", "UTF-8") + "=" + OPEN_API_KEY); /*Service Key*/ @@ -101,9 +94,8 @@ private static List> requestBusArrivalInfo(String cityCode, } rd.close(); conn.disconnect(); -// System.out.println(sb.toString()); - if (!con.isObjectParse(sb.toString())) return result; + if (!con.isJsonObject(sb.toString())) return result; JsonObject nodeInfo = new JsonParser().parse(sb.toString()).getAsJsonObject(); @@ -114,24 +106,37 @@ private static List> requestBusArrivalInfo(String cityCode, int count = nodeInfo.getAsJsonObject("response").getAsJsonObject("body").get("totalCount").getAsInt(); Gson gson = new Gson(); - if (count <=1) { + if (count <= 1) { BusArrivalInfo col = new BusArrivalInfo(); if (count == 1) { - result.add(con.objectParse(nodeInfo.getAsJsonObject("response").getAsJsonObject("body").getAsJsonObject("items").getAsJsonObject("item"))); + result.add(con.parseJsonObject(nodeInfo.getAsJsonObject("response").getAsJsonObject("body").getAsJsonObject("items").getAsJsonObject("item"))); } return result; } - result = con.arrayObjectParse(nodeInfo.getAsJsonObject("response").getAsJsonObject("body").getAsJsonObject("items").getAsJsonArray("item")); + result = con.parseJsonArrayWithObject(nodeInfo.getAsJsonObject("response").getAsJsonObject("body").getAsJsonObject("items").getAsJsonArray("item")); return result; } + @Resource(name = "redisTemplate") + public void setValueOps(ValueOperations>> _valueOps) { + valueOps = _valueOps; + } + + private void updateAndCacheBusArrivalInfo(String cityCode, List nodeId) throws IOException { + String cacheKey = getBusArrivalInfoCacheKey(cityCode, nodeId.get(0)); + + List> info = requestBusArrivalInfo(cityCode, nodeId); + + valueOps.set(cacheKey, info); + } + @Scheduled(cron = "0 */1 * * * *") public void handle() { try { - for (List nodeId: nodeIds) { - System.out.println("updating...("+cityCode+","+nodeId.get(0)+","+nodeId.get(1)+")\n"); + for (List nodeId : nodeIds) { + System.out.println("updating...(" + cityCode + "," + nodeId.get(0) + "," + nodeId.get(1) + ")\n"); updateAndCacheBusArrivalInfo(cityCode, nodeId); } } catch (NullPointerException e) { @@ -153,7 +158,7 @@ private List> getBusArrivalInfo(String cityCode, String node } public List> getBusArrivalInfo(String nodeId) { - return getBusArrivalInfo(cityCode,nodeId); + return getBusArrivalInfo(cityCode, nodeId); } // private void sendError(Exception e) { diff --git a/src/main/java/koreatech/in/service/ActivityServiceImpl.java b/src/main/java/koreatech/in/service/ActivityServiceImpl.java index a373ebad..f093cc66 100644 --- a/src/main/java/koreatech/in/service/ActivityServiceImpl.java +++ b/src/main/java/koreatech/in/service/ActivityServiceImpl.java @@ -5,7 +5,9 @@ import koreatech.in.exception.NotFoundException; import koreatech.in.exception.PreconditionFailedException; import koreatech.in.repository.ActivityMapper; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.text.SimpleDateFormat; @@ -13,7 +15,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.regex.Pattern; import static koreatech.in.domain.DomainToMap.domainToMap; @@ -22,6 +23,9 @@ public class ActivityServiceImpl implements ActivityService { @Resource(name = "activityMapper") private ActivityMapper activityMapper; + @Autowired + private JsonConstructor con; + @Override public Map getActivities(String year) throws Exception { Map map = new HashMap(); @@ -35,16 +39,9 @@ public Map getActivities(String year) throws Exception { List> appendActivities = new ArrayList>(); Map convertActivity; - JsonConstructor con = new JsonConstructor(); for(Activity activity : activities) { convertActivity = domainToMap(activity); - - if (activity.getImage_urls() != null && !activity.getImage_urls().isEmpty()) { - try { - convertActivity.replace("image_urls", con.arrayStringParse(activity.getImage_urls())); - } catch (Exception e) { - } - } + convertActivity.replace("image_urls", con.parseJsonArrayWithOnlyString(activity.getImage_urls())); appendActivities.add(convertActivity); } @@ -68,16 +65,9 @@ public Map getActivitiesForAdmin(String year) throws Exception { List> appendActivities = new ArrayList>(); Map convertActivity; - JsonConstructor con = new JsonConstructor(); for(Activity activity : activities) { convertActivity = domainToMap(activity); - - if (activity.getImage_urls() != null && !activity.getImage_urls().isEmpty()) { - try { - convertActivity.replace("image_urls", con.arrayStringParse(activity.getImage_urls())); - } catch (Exception e) { - } - } + convertActivity.replace("image_urls", con.parseJsonArrayWithOnlyString(activity.getImage_urls())); appendActivities.add(convertActivity); } diff --git a/src/main/java/koreatech/in/service/CircleServiceImpl.java b/src/main/java/koreatech/in/service/CircleServiceImpl.java index 6ed4874d..8fbb850b 100644 --- a/src/main/java/koreatech/in/service/CircleServiceImpl.java +++ b/src/main/java/koreatech/in/service/CircleServiceImpl.java @@ -4,18 +4,17 @@ import koreatech.in.domain.Circle.Circle; import koreatech.in.domain.Circle.CircleResponseType; import koreatech.in.domain.Criteria.Criteria; -import koreatech.in.domain.DomainToMap; import koreatech.in.domain.ErrorMessage; import koreatech.in.domain.Faq.Faq; import koreatech.in.domain.Faq.FaqResponseType; -import koreatech.in.domain.User.User; import koreatech.in.exception.*; import koreatech.in.repository.CircleMapper; import koreatech.in.repository.FaqMapper; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import javax.inject.Inject; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -31,8 +30,8 @@ public class CircleServiceImpl implements CircleService { @Inject FaqMapper faqMapper; - @Inject - JwtValidator jwtValidator; + @Autowired + private JsonConstructor con; @Override public Map getCirclesForAdmin(Criteria criteria) throws Exception { @@ -64,11 +63,9 @@ public Circle createCircleForAdmin(Circle circle) throws Exception { throw new ConflictException(new ErrorMessage("exists circle name", 0)); } - JsonConstructor con = new JsonConstructor(); //link_urls 체크 - if(circle.getLink_urls() != null && !circle.getLink_urls().isEmpty()) - if(con.isArrayObjectParse(circle.getLink_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if(!con.isJsonArrayWithOnlyObject(circle.getLink_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); if (circle.getIs_deleted() == null) { circle.setIs_deleted(false); @@ -121,15 +118,7 @@ public Map getCircle(int page, int limit, int id) throws Excepti faq.put("totalPage", faqTotalPage); faq.put("totalItemCount", faqTotalCount); - if(circle.getLink_urls() != null && !circle.getLink_urls().isEmpty()) { - JsonConstructor con = new JsonConstructor(); - //link_urls 컬럼을 list로 - try { - //link_url 리스트를 JsonArray로 변환하고 다시 for문으로 하나씩 map으로 변환해 새 리스트에 add - map.replace("link_urls", con.arrayObjectParse(circle.getLink_urls())); - } catch (Exception e) { - } - } + map.replace("link_urls", con.parseJsonArrayWithObject(circle.getLink_urls())); map.put("faq", faq); return map; @@ -162,11 +151,9 @@ public Circle updateCircleForAdmin(Circle circle, int id) throws Exception { throw new PreconditionFailedException(new ErrorMessage("invalid category name", 1)); } - JsonConstructor con = new JsonConstructor(); //link_urls 체크 - if(circle.getLink_urls() != null && !circle.getLink_urls().isEmpty()) - if(!con.isArrayObjectParse(circle.getLink_urls())) - throw new PreconditionFailedException(new ErrorMessage("link_urls are not valid", 0)); + if(!con.isJsonArrayWithOnlyObject(circle.getLink_urls())) + throw new PreconditionFailedException(new ErrorMessage("link_urls are not valid", 0)); selectCircle.update(circle); circleMapper.updateCircleForAdmin(selectCircle); diff --git a/src/main/java/koreatech/in/service/DiningServiceImpl.java b/src/main/java/koreatech/in/service/DiningServiceImpl.java index 98fdc591..45a45154 100644 --- a/src/main/java/koreatech/in/service/DiningServiceImpl.java +++ b/src/main/java/koreatech/in/service/DiningServiceImpl.java @@ -4,6 +4,7 @@ import koreatech.in.domain.ErrorMessage; import koreatech.in.exception.PreconditionFailedException; import koreatech.in.repository.DiningMapper; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.inject.Inject; @@ -22,6 +23,9 @@ public class DiningServiceImpl implements DiningService { @Inject DiningMapper diningMapper; + @Autowired + private JsonConstructor con; + @Override public List> getDinings(String from) throws Exception { LocalDate localDate; @@ -36,13 +40,9 @@ public List> getDinings(String from) throws Exception { List dinings = diningMapper.getList(localDate.format(DateTimeFormatter.ISO_DATE)); List> menus = new ArrayList<>(); - JsonConstructor con = new JsonConstructor(); for (DiningMenu dining : dinings) { Map convertMenu = domainToMap(dining); - try { - convertMenu.replace("menu", con.arrayStringParse(dining.getMenu())); - } catch (Exception e) { - } + convertMenu.replace("menu", con.parseJsonArrayWithOnlyString(dining.getMenu())); menus.add(convertMenu); } diff --git a/src/main/java/koreatech/in/service/JsonConstructor.java b/src/main/java/koreatech/in/service/JsonConstructor.java index 36f8accb..7e65f76c 100644 --- a/src/main/java/koreatech/in/service/JsonConstructor.java +++ b/src/main/java/koreatech/in/service/JsonConstructor.java @@ -2,131 +2,172 @@ import com.google.gson.*; import com.google.gson.reflect.TypeToken; +import org.springframework.stereotype.Component; -import java.lang.reflect.Type; import java.util.*; import static koreatech.in.domain.DomainToMap.isContain; +@Component public class JsonConstructor { - private Gson gson = new Gson(); - public JsonConstructor(){} + private static Gson gson = new Gson(); + private static JsonParser parser = new JsonParser(); - // ["~~~"] 형태 - public List> arrayStringParse(String jsonString) { - List> list = new ArrayList<>(); + public JsonConstructor() { + } + + // 내부에 문자열만 존재하는 ["~~~"] 형태의 JSON을 객체로 binding, 실패 시 null 반환 + public List parseJsonArrayWithOnlyString(String jsonString) { + if (jsonString == null) return null; + List list; try { - Type type = new TypeToken>() {}.getType(); - list = gson.fromJson(jsonString, type); + list = gson.fromJson(jsonString, new TypeToken>() {}.getType()); } catch (Exception e) { + return null; } return list; } - public Boolean isArrayStringParse(String jsonString) { + + // 내부에 문자열만 존재하는 ["~~~"] 형태인지 검사 + public Boolean isJsonArrayWithOnlyString(String jsonString) { + if (jsonString == null) return false; + JsonElement jsonElement; try { - arrayStringParse(jsonString); + jsonElement = parser.parse(jsonString); + if (jsonElement == null || !jsonElement.isJsonArray()) + return false; + + JsonArray jsonArray = jsonElement.getAsJsonArray(); + if (jsonArray.size() == 0) return false; + for (JsonElement element : jsonArray) { + if (element.isJsonObject()) + return false; + } } catch (Exception e) { return false; } return true; } - // [{"~~~", "~~~"}] 형태 - public List> arrayObjectParse(JsonArray jsonArray) { - Gson gson = new Gson(); - Iterator iterator = jsonArray.iterator(); - JsonElement jsonElement; - Type type = new TypeToken>>(){}.getType(); - - for (int i = 0; i < jsonArray.size(); i++) { - jsonElement = jsonArray.get(i); - objectParse(jsonElement.getAsJsonObject()); + // [{"~~~": "~~~", "~~~": "~~~"}] 형태의 JSON을 객체로 binding, 실패 시 null 반환 + public List> parseJsonArrayWithObject(JsonArray jsonArray) { + if (jsonArray == null) return null; + List> list; + try { + list = gson.fromJson(jsonArray, new TypeToken>>() {}.getType()); + } catch (Exception e) { + return null; } - return gson.fromJson(jsonArray, type); + return list; } - public List> arrayObjectParse(String jsonString) throws JsonParseException { - List> list = new ArrayList<>(); - JsonArray jsonArray = new JsonParser().parse(jsonString).getAsJsonArray(); - list = arrayObjectParse(jsonArray); + // [{"~~~": "~~~", "~~~": "~~~"}] 형태의 JSON을 객체로 binding, 실패 시 null 반환 + public List> parseJsonArrayWithObject(String jsonString) { + if (jsonString == null) return null; + List> list; + try { + JsonElement jsonElement = parser.parse(jsonString); + if (jsonElement == null || !jsonElement.isJsonArray()) + return null; + + JsonArray jsonArray = jsonElement.getAsJsonArray(); + list = parseJsonArrayWithObject(jsonArray); + } catch (Exception e) { + return null; + } return list; } - public Boolean isArrayObjectParse(String jsonString) { + // 내부에 JSON Object만 존재하는 [{"~~~": "~~~", "~~~": "~~~"}] 형태인지 검사 + public Boolean isJsonArrayWithOnlyObject(String jsonString) { + if (jsonString == null) return false; + JsonElement jsonElement; try { - arrayObjectParse(jsonString); + jsonElement = parser.parse(jsonString); + if (jsonElement == null || !jsonElement.isJsonArray()) + return false; + + JsonArray jsonArray = jsonElement.getAsJsonArray(); + if (jsonArray.size() == 0) return false; + for (JsonElement element : jsonArray) { + if (!element.isJsonObject()) + return false; + } } catch (Exception e) { return false; } return true; } - private Map objectParse(JsonObject jsonObject, String[] arrAllowKeys) { - Gson gson = new Gson(); - Iterator> iterator = jsonObject.entrySet().iterator(); - Map.Entry entry; - Type type = new TypeToken>(){}.getType(); - - while (iterator.hasNext()) { - entry = iterator.next(); + private Map parseJsonObject(JsonObject jsonObject, String[] arrAllowKeys) throws JsonSyntaxException, JsonIOException { + for (Map.Entry entry : jsonObject.entrySet()) { if (arrAllowKeys != null && !isContain(arrAllowKeys, entry.getKey())) continue; JsonElement value = entry.getValue(); if (value.isJsonPrimitive()) { try { entry.setValue(new JsonPrimitive(entry.getValue().getAsString())); - } catch (Exception e) {} - + } catch (Exception e) { + } } else if (value.isJsonObject()) { - objectParse(value.getAsJsonObject(), arrAllowKeys); - + parseJsonObject(value.getAsJsonObject(), arrAllowKeys); } else if (value.isJsonArray()) { JsonArray jsonArray = value.getAsJsonArray(); - JsonElement jsonElement; - for (int i = 0; i < jsonArray.size(); i++) { - jsonElement = jsonArray.get(i); - objectParse(jsonElement.getAsJsonObject(), arrAllowKeys); + for (JsonElement element : jsonArray) { + parseJsonObject(element.getAsJsonObject(), arrAllowKeys); } } } - return gson.fromJson(jsonObject, type); + return gson.fromJson(jsonObject, new TypeToken>() {}.getType()); } - public Map objectParse(JsonObject jsonObject) { - Map map = new HashMap<>(); + public Map parseJsonObject(JsonObject jsonObject) { + if (jsonObject == null) return null; + Map map; try { - map = objectParse(jsonObject, null); + map = parseJsonObject(jsonObject, null); } catch (Exception e) { + return null; } return map; } - public Map objectParse(String jsonString, String[] arrAllowKeys) { - Map map = new HashMap<>(); + public Map parseJsonObject(String jsonString, String[] arrAllowKeys) { + if (jsonString == null) return null; + Map map; try { - JsonObject jsonObject = new JsonParser().parse(jsonString).getAsJsonObject(); - map = objectParse(jsonObject, arrAllowKeys); + JsonElement jsonElement = parser.parse(jsonString); + if (jsonElement == null || !jsonElement.isJsonObject()) + return null; + + map = parseJsonObject(jsonElement.getAsJsonObject(), arrAllowKeys); } catch (Exception e) { + return null; } return map; } - public Map objectParse(String jsonString) { - Map map = new HashMap<>(); + public Map parseJsonObject(String jsonString) { + if (jsonString == null) return null; + Map map; try { - JsonObject jsonObject = new JsonParser().parse(jsonString).getAsJsonObject(); - map = objectParse(jsonObject, null); + JsonElement jsonElement = parser.parse(jsonString); + if (jsonElement == null || !jsonElement.isJsonObject()) + return null; + + map = parseJsonObject(jsonElement.getAsJsonObject(), null); } catch (Exception e) { + return null; } return map; } - public Boolean isObjectParse(String jsonString) { + public Boolean isJsonObject(String jsonString) { + if (jsonString == null) return false; try { - objectParse(jsonString); + JsonElement jsonElement = parser.parse(jsonString); + return jsonElement != null && jsonElement.isJsonObject(); } catch (Exception e) { return false; } - return true; } - } diff --git a/src/main/java/koreatech/in/service/LandServiceImpl.java b/src/main/java/koreatech/in/service/LandServiceImpl.java index ece02a36..6bf831b4 100644 --- a/src/main/java/koreatech/in/service/LandServiceImpl.java +++ b/src/main/java/koreatech/in/service/LandServiceImpl.java @@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.net.URLEncoder; @@ -29,6 +30,9 @@ public class LandServiceImpl implements LandService { @Autowired JwtValidator jwtValidator; + @Autowired + private JsonConstructor con; + @Transactional @Override public Land createLandForAdmin(Land land) throws Exception { @@ -40,11 +44,9 @@ public Land createLandForAdmin(Land land) throws Exception { land.init(); land.setInternal_name(land.getName().replace(" ","").toLowerCase()); - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if(land.getImage_urls() != null && !land.getImage_urls().isEmpty()) - if (!con.isArrayObjectParse(land.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if (!con.isJsonArrayWithOnlyObject(land.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); landMapper.createLandForAdmin(land); @@ -62,11 +64,9 @@ public Land updateLandForAdmin(Land land, int id) throws Exception { land.setInternal_name(land.getName().replace(" ", "").toLowerCase()); } - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if(land.getImage_urls() != null && !land.getImage_urls().isEmpty()) - if (!con.isArrayStringParse(land.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if (!con.isJsonArrayWithOnlyString(land.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); land_old.update(land); landMapper.updateLandForAdmin(land_old); @@ -127,14 +127,8 @@ public Map getLand(int id) throws Exception { } } Map convertLand = domainToMap(land); - JsonConstructor con = new JsonConstructor(); - if (land.getImage_urls() != null && !land.getImage_urls().isEmpty()) { - try { - convertLand.replace("image_urls", con.arrayStringParse(land.getImage_urls())); - } catch (Exception e) { - } - } + convertLand.replace("image_urls", con.parseJsonArrayWithOnlyString(land.getImage_urls())); convertLand.put("permalink", URLEncoder.encode(land.getInternal_name(), "UTF-8")); convertLand.put("comments", landComments); diff --git a/src/main/java/koreatech/in/service/LostAndFoundServiceImpl.java b/src/main/java/koreatech/in/service/LostAndFoundServiceImpl.java index 312ff0d0..d66dfbc3 100644 --- a/src/main/java/koreatech/in/service/LostAndFoundServiceImpl.java +++ b/src/main/java/koreatech/in/service/LostAndFoundServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.multipart.MultipartFile; @@ -45,6 +46,9 @@ public class LostAndFoundServiceImpl implements LostAndFoundService { @Autowired private SearchUtil searchUtil; + @Autowired + private JsonConstructor con; + @Transactional @Override public LostItem createLostItemForAdmin(LostItem lostItem) throws Exception { @@ -70,11 +74,9 @@ public LostItem createLostItemForAdmin(LostItem lostItem) throws Exception { lostItem.setIp(ip); - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) - if (!con.isArrayObjectParse(lostItem.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if (!con.isJsonArrayWithOnlyObject(lostItem.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); if (lostItem.getIs_deleted() == null) { lostItem.setIs_deleted(false); @@ -108,16 +110,9 @@ public Map getLostItemsForAdmin(int type, Criteria criteria) thr List> convert_items = new ArrayList<>(); - JsonConstructor con = new JsonConstructor(); for (LostItem lostItem : lostItems) { Map map_lostItem = domainToMap(lostItem); - //image_urls 변환 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) { - try { - map_lostItem.replace("image_urls", con.arrayStringParse(lostItem.getImage_urls())); - } catch (Exception e) { - } - } + map_lostItem.replace("image_urls", con.parseJsonArrayWithOnlyString(lostItem.getImage_urls())); convert_items.add(map_lostItem); } @@ -150,14 +145,7 @@ public Map getLostItemForAdmin(int id) throws Exception { Map map = domainToMap(lostItem); Map profile = new HashMap(); - JsonConstructor con = new JsonConstructor(); - //image_urls 변환 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) { - try { - map.replace("image_urls", con.arrayStringParse(lostItem.getImage_urls())); - } catch (Exception e) { - } - } + map.replace("image_urls", con.parseJsonArrayWithOnlyString(lostItem.getImage_urls())); profile.put("profile_image_url", user != null ? user.getProfile_image_url() : null); map.put("user", profile); map.put("comments", comments); @@ -184,11 +172,9 @@ public LostItem updateLostItemForAdmin(LostItem lostItem, int id) throws Excepti ip = req.getRemoteAddr(); lostItem.setIp(ip); - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) - if (!con.isArrayObjectParse(lostItem.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if (!con.isJsonArrayWithOnlyObject(lostItem.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); //TODO : validator를 사용해 입력된 정보의 유효화 검사 후 입력된 부분만 기존 내용에 반영 if (!lostItem.getIs_phone_open()) { @@ -320,11 +306,9 @@ public LostItem createLostItem(LostItem lostItem) throws Exception { lostItem.setIp(ip); - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) - if (!con.isArrayObjectParse(lostItem.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if (!con.isJsonArrayWithOnlyObject(lostItem.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); lostAndFoundMapper.createLostItem(lostItem); searchUtil.createArticle(lostItem); @@ -363,16 +347,9 @@ public Map getLostItems(int type, Criteria criteria) throws Exce List> convert_items = new ArrayList<>(); - JsonConstructor con = new JsonConstructor(); for (LostItem lostItem : lostItems) { Map map_lostItem = domainToMap(lostItem); - //image_urls 변환 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) { - try { - map_lostItem.replace("image_urls", con.arrayStringParse(lostItem.getImage_urls())); - } catch (Exception e) { - } - } + map_lostItem.replace("image_urls", con.parseJsonArrayWithOnlyString(lostItem.getImage_urls())); convert_items.add(map_lostItem); } @@ -421,14 +398,7 @@ public Map getLostItem(int id) throws Exception { Map map = domainToMap(lostItem); Map profile = new HashMap(); - JsonConstructor con = new JsonConstructor(); - //image_urls 변환 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) { - try { - map.replace("image_urls", con.arrayStringParse(lostItem.getImage_urls())); - } catch (Exception e) { - } - } + map.replace("image_urls", con.parseJsonArrayWithOnlyString(lostItem.getImage_urls())); profile.put("profile_image_url", user != null ? user.getProfile_image_url() : null); map.put("user", profile); map.put("comments", comments); @@ -458,11 +428,9 @@ public LostItem updateLostItem(LostItem lostItem, int id) throws Exception { ip = req.getRemoteAddr(); lostItem.setIp(ip); - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) - if (!con.isArrayObjectParse(lostItem.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); + if (!con.isJsonArrayWithOnlyString(lostItem.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); //TODO : validator를 사용해 입력된 정보의 유효화 검사 후 입력된 부분만 기존 내용에 반영 lostItem.setNickname(user.getNickname()); @@ -539,16 +507,9 @@ public Map getMyLostItemList(int type, Criteria criteria) throws List items = lostAndFoundMapper.getMyLostItemList(criteria.getCursor(), criteria.getLimit(), type, user.getId()); List> convert_items = new ArrayList<>(); - JsonConstructor con = new JsonConstructor(); for (LostItem lostItem : items) { Map map_lostItem = domainToMap(lostItem); - //image_urls 변환 - if (lostItem.getImage_urls() != null && !lostItem.getImage_urls().isEmpty()) { - try { - map_lostItem.replace("image_urls", con.arrayStringParse(lostItem.getImage_urls())); - } catch (Exception e) { - } - } + map_lostItem.replace("image_urls", con.parseJsonArrayWithOnlyString(lostItem.getImage_urls())); convert_items.add(map_lostItem); } diff --git a/src/main/java/koreatech/in/service/SearchServiceImpl.java b/src/main/java/koreatech/in/service/SearchServiceImpl.java index 564244a4..182ddbbd 100644 --- a/src/main/java/koreatech/in/service/SearchServiceImpl.java +++ b/src/main/java/koreatech/in/service/SearchServiceImpl.java @@ -4,8 +4,6 @@ import koreatech.in.domain.ErrorMessage; import koreatech.in.domain.Search.SearchArticles; import koreatech.in.domain.Search.SearchArticlesMinified; -import koreatech.in.domain.Search.SearchComments; -import koreatech.in.domain.Search.SearchCommentsMinified; import koreatech.in.domain.Shop.Menu; import koreatech.in.domain.Shop.Shop; import koreatech.in.exception.PreconditionFailedException; @@ -26,13 +24,15 @@ public class SearchServiceImpl implements SearchService { @Autowired private SearchMapper searchMapper; + @Autowired + private JsonConstructor con; + public Map searchShop(SearchCriteria searchCriteria) throws Exception { if (searchCriteria.getQuery().isEmpty()) throw new PreconditionFailedException(new ErrorMessage("공백으로는 검색할 수 없습니다.", 0)); Map map = new HashMap<>(); double totalCount, countByLimit, totalPage; - JsonConstructor con = new JsonConstructor(); switch (searchCriteria.getSearchType()) { case 0: default: // 상점명 검색 @@ -48,8 +48,8 @@ public Map searchShop(SearchCriteria searchCriteria) throws Exce for (Shop shop : shops) { shop.setPermalink(shop.getInternal_name()); Map shopMap = domainToMap(shop); - if (shopMap.get("image_urls") != null && con.isArrayStringParse(shop.getImage_urls())) { - shopMap.replace("image_urls", con.arrayStringParse(shop.getImage_urls())); + if (shopMap.get("image_urls") != null && con.isJsonArrayWithOnlyString(shop.getImage_urls())) { + shopMap.replace("image_urls", con.parseJsonArrayWithOnlyString(shop.getImage_urls())); } shopsMapList.add(shopMap); } @@ -68,8 +68,8 @@ public Map searchShop(SearchCriteria searchCriteria) throws Exce List> menusMapList = new ArrayList<>(); for (Menu menu : menus) { Map menuMap = domainToMap(menu); - if (menuMap.get("price_type") != null && con.isArrayObjectParse(menu.getPrice_type())) { - menuMap.replace("price_type", con.arrayObjectParse(menu.getPrice_type())); + if (menuMap.get("price_type") != null && con.isJsonArrayWithOnlyObject(menu.getPrice_type())) { + menuMap.replace("price_type", con.parseJsonArrayWithObject(menu.getPrice_type())); } menusMapList.add(menuMap); } diff --git a/src/main/java/koreatech/in/service/ShopServiceImpl.java b/src/main/java/koreatech/in/service/ShopServiceImpl.java index 94fbec95..0d9b4c17 100644 --- a/src/main/java/koreatech/in/service/ShopServiceImpl.java +++ b/src/main/java/koreatech/in/service/ShopServiceImpl.java @@ -1,7 +1,6 @@ package koreatech.in.service; import koreatech.in.domain.Criteria.Criteria; -import koreatech.in.domain.Criteria.SearchCriteria; import koreatech.in.domain.ErrorMessage; import koreatech.in.domain.Event.EventArticle; import koreatech.in.domain.Shop.Menu; @@ -10,11 +9,11 @@ import koreatech.in.domain.User.User; import koreatech.in.exception.*; import koreatech.in.repository.ShopMapper; -import koreatech.in.repository.UserMapper; import koreatech.in.util.DateUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -28,9 +27,13 @@ public class ShopServiceImpl implements ShopService { @Resource(name="shopMapper") private ShopMapper shopMapper; + @Autowired JwtValidator jwtValidator; + @Autowired + private JsonConstructor con; + @Transactional @Override public Shop createShopForAdmin(Shop shop) throws Exception { @@ -41,12 +44,9 @@ public Shop createShopForAdmin(Shop shop) throws Exception { throw new PreconditionFailedException(new ErrorMessage("No such Category", 2)); } - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if(shop.getImage_urls() != null && !shop.getImage_urls().isEmpty()) { - if(!con.isArrayStringParse(shop.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); - } + if(!con.isJsonArrayWithOnlyString(shop.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); shop.setInternal_name(shop.getName().replace(" ","").toLowerCase()); @@ -81,19 +81,12 @@ public Shop createShopForAdmin(Shop shop) throws Exception { @Override public Map getShopsForAdmin(Criteria criteria) throws Exception { - JsonConstructor con = new JsonConstructor(); List shops = shopMapper.getShopListForAdmin(criteria.getCursor(), criteria.getLimit()); List> convert_shops = new ArrayList<>(); for(Shop shop : shops) { Map map_shop = domainToMap(shop); - //image_urls 변환 - if(shop.getImage_urls() != null && !shop.getImage_urls().isEmpty()) { - try { - map_shop.replace("image_urls", con.arrayStringParse(shop.getImage_urls())); - } catch (Exception e) { - } - } + map_shop.replace("image_urls", con.parseJsonArrayWithOnlyString(shop.getImage_urls())); convert_shops.add(map_shop); } @@ -140,15 +133,11 @@ public Map getShopForAdmin(String id) throws Exception { List> convert_menus = new ArrayList>(); - JsonConstructor con = new JsonConstructor(); try { for (Menu menu : menus) { //menu를 map 객체로 바꾼 후 price_type 값을 array_in_convert_price로 교체, 그것을 다시 convert_menus에 추가 Map convert_price_menu = domainToMap(menu); - try { - convert_price_menu.replace("price_type", con.arrayObjectParse(menu.getPrice_type())); - } catch (Exception e) { - } + convert_price_menu.replace("price_type", con.parseJsonArrayWithObject(menu.getPrice_type())); convert_menus.add(convert_price_menu); } } catch (Exception e) { @@ -156,12 +145,8 @@ public Map getShopForAdmin(String id) throws Exception { map.put("menus", convert_menus); //image_urls 컬럼을 list로 - try { - //변환된 list로 값 교체 - map.replace("image_urls", con.arrayStringParse(map.get("image_urls").toString())); - } catch (Exception e) { - return map; - } + //변환된 list로 값 교체 + map.replace("image_urls", con.parseJsonArrayWithOnlyString(map.get("image_urls").toString())); return map; } @@ -181,12 +166,9 @@ public Shop updateShopForAdmin(Shop shop, int id) throws Exception { throw new PreconditionFailedException(new ErrorMessage("No such Category", 2)); } - JsonConstructor con = new JsonConstructor(); //image_urls 체크 - if(shop.getImage_urls() != null && !shop.getImage_urls().isEmpty()) { - if(!con.isArrayStringParse(shop.getImage_urls())) - throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); - } + if(!con.isJsonArrayWithOnlyString(shop.getImage_urls())) + throw new PreconditionFailedException(new ErrorMessage("Image_urls are not valid", 0)); if (shop.getName() != null) { shop.setInternal_name(shop.getName().replace(" ", "").toLowerCase()); @@ -215,11 +197,9 @@ public Map deleteShopForAdmin(int id) throws Exception { @Transactional @Override public Menu createMenuForAdmin(Menu menu, int shop_id) throws Exception { - JsonConstructor con = new JsonConstructor(); //price_type 검증 - if (!menu.getPrice_type().isEmpty()) - if (!con.isArrayObjectParse(menu.getPrice_type())) - throw new PreconditionFailedException(new ErrorMessage("Price_type is not valid", 0)); + if (!con.isJsonArrayWithOnlyObject(menu.getPrice_type())) + throw new PreconditionFailedException(new ErrorMessage("Price_type is not valid", 0)); menu.setShop_id(shop_id); if (menu.getIs_deleted() == null) { @@ -241,14 +221,7 @@ public Map getMenuForAdmin(int shop_id, int menu_id) throws Exce throw new NotFoundException(new ErrorMessage("There is no such menu", 0)); Map map = domainToMap(menu); - JsonConstructor con = new JsonConstructor(); - //price_type 컬럼을 list로 - if(!menu.getPrice_type().isEmpty()) { - try { - map.replace("price_type", con.arrayObjectParse(menu.getPrice_type())); - } catch (Exception e) { - } - } + map.replace("price_type", con.parseJsonArrayWithObject(menu.getPrice_type())); return map; } @@ -260,11 +233,9 @@ public Menu updateMenuForAdmin(Menu menu, int shop_id, int id) throws Exception if (menu_old == null) throw new NotFoundException(new ErrorMessage("There is no such menu", 0)); - JsonConstructor con = new JsonConstructor(); ///price_type 검증 - if (!menu.getPrice_type().isEmpty()) - if (!con.isArrayObjectParse(menu.getPrice_type())) - throw new PreconditionFailedException(new ErrorMessage("Price_type is not valid", 0)); + if (!con.isJsonArrayWithOnlyObject(menu.getPrice_type())) + throw new PreconditionFailedException(new ErrorMessage("Price_type is not valid", 0)); menu_old.update(menu); @@ -294,14 +265,11 @@ public Map getShops() throws Exception { List shops = shopMapper.getShopList(); List> shopsMapList = new ArrayList<>(); - JsonConstructor con = new JsonConstructor(); for (Shop shop : shops) { shop.setPermalink(shop.getInternal_name()); Map shopMap = domainToMap(shop); - if (shopMap.get("image_urls") != null) { - shopMap.replace("image_urls", con.arrayStringParse(shopMap.get("image_urls").toString())); - } + shopMap.replace("image_urls", con.parseJsonArrayWithOnlyString(shopMap.get("image_urls").toString())); List eventArticles = shopMapper.getPendingEventByShopId(shop.getId()); shopMap.put("event_articles", eventArticles); shopsMapList.add(shopMap); @@ -359,15 +327,11 @@ public Map getShop(String id) throws Exception { List> convert_menus = new ArrayList>(); - JsonConstructor con = new JsonConstructor(); try { for (Menu menu : menus) { //menu를 map 객체로 바꾼 후 price_type 값을 array_in_convert_price로 교체, 그것을 다시 convert_menus에 추가 Map convert_price_menu = domainToMap(menu); - try { - convert_price_menu.replace("price_type", con.arrayObjectParse(menu.getPrice_type())); - } catch (Exception e) { - } + convert_price_menu.replace("price_type", con.parseJsonArrayWithObject(menu.getPrice_type())); convert_menus.add(convert_price_menu); } } catch (Exception e) { @@ -376,12 +340,8 @@ public Map getShop(String id) throws Exception { map.put("event_articles", eventArticles); //image_urls 컬럼을 list로 - try { - //변환된 list로 값 교체 - map.replace("image_urls", con.arrayStringParse(map.get("image_urls").toString())); - } catch (Exception e) { - return map; - } + //변환된 list로 값 교체 + map.replace("image_urls", con.parseJsonArrayWithOnlyString(map.get("image_urls").toString())); return map; } diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index cfa976dd..1d90c9f7 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -12,16 +12,17 @@ contextConfigLocation /WEB-INF/root-context.xml - classpath*:common/application_context_provider.xml - classpath*:common/config.xml - classpath*:common/context-*.xml - classpath*:common/mailSend.xml - classpath*:common/jwt.xml - classpath*:common/redis.xml - classpath*:common/s3.xml - classpath*:common/security.xml - classpath*:common/slack_noti.xml - classpath*:common/search.xml + classpath*:common/*.xml + + + + + + + + + +