{"action":"created","comment":{"url":"https://api.github.com/repos/proptigercom/MIDL-SEO/pulls/comments/22850212","id":22850212,"diff_hunk":"@@ -0,0 +1,1378 @@\n+package com.proptiger.seo.service;\n+\n+import java.io.ByteArrayInputStream;\n+import java.io.File;\n+import java.io.FileReader;\n+import java.io.IOException;\n+import java.net.MalformedURLException;\n+import java.net.URI;\n+import java.util.ArrayList;\n+import java.util.Comparator;\n+import java.util.HashMap;\n+import java.util.HashSet;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.Set;\n+\n+import javax.annotation.PostConstruct;\n+\n+import net.htmlparser.jericho.MasonTagTypes;\n+import net.htmlparser.jericho.MicrosoftConditionalCommentTagTypes;\n+import net.htmlparser.jericho.PHPTagTypes;\n+import net.htmlparser.jericho.Source;\n+\n+import org.apache.commons.io.FileUtils;\n+import org.apache.commons.io.IOUtils;\n+import org.apache.commons.lang.StringUtils;\n+import org.apache.commons.lang.text.StrBuilder;\n+import org.apache.commons.lang.time.StopWatch;\n+import org.languagetool.JLanguageTool;\n+import org.languagetool.language.English;\n+import org.languagetool.rules.RuleMatch;\n+import org.languagetool.rules.spelling.morfologik.MorfologikSpellerRule;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+import org.springframework.beans.factory.annotation.Autowired;\n+import org.springframework.beans.factory.annotation.Value;\n+import org.springframework.stereotype.Service;\n+import org.springframework.web.util.UriComponentsBuilder;\n+\n+import com.proptiger.core.model.cms.Builder;\n+import com.proptiger.core.model.cms.City;\n+import com.proptiger.core.model.cms.Locality;\n+import com.proptiger.core.model.cms.Project;\n+import com.proptiger.core.model.cms.Suburb;\n+import com.proptiger.core.util.HttpRequestUtil;\n+import com.proptiger.core.util.PropertyKeys;\n+import com.proptiger.core.util.PropertyReader;\n+import com.proptiger.seo.interceptor.ResponseInterceptor;\n+import com.proptiger.seo.model.IgnoreWords;\n+\n+/**\n+ * Service class to check content data\n+ * \n+ * @author Tokala Sai Teja\n+ * \n+ */\n+@Service\n+public class ContentCheckService {\n+\n+\n+\n+    @Autowired\n+    private ResponseInterceptor responceInterceptor;\n+    /*\n+     * @Autowired private IgnoreWordsDao ignoreWordsDao;\n+     */\n+    /*\n+     * list of words to be ignored at any ponit of time\n+     */\n+    private List<String>        ignoreWords;\n+    /*\n+     * tool for checking gramatical and spelling errorrs\n+     */\n+    private JLanguageTool       languageTool;\n+\n+    @Value(\"${test.default.entity.fetch.pagesize}\")\n+    private int                 DefaultEntityFetchPageSize;\n+\n+    @Value(\"${city.api.url}\")\n+    private String              CITY_API_URL;\n+\n+    @Value(\"${locality.api.url.list}\")\n+    private String              LOCALITY_API_URL;\n+\n+    @Value(\"${project.api.url}\")\n+    private String              PROJECT_API_URL;\n+\n+    @Value(\"${suburb.api.url.two}\")\n+    private String              SUBURB_API_URL;\n+\n+    @Value(\"${builder.api.url.two}\")\n+    private String              BUILDER_API_URL;\n+\n+    @Value(\"${proptiger.url}\")\n+    private String              BASE_URL;\n+\n+\n+    @Value(\"${test.default.entity.fetch.limit}\")\n+    private int                 defaultEntityFetchLimit;\n+\n+    @Value(\"${test.default.entity.fetch.pagesize.builder}\")\n+    private int                 DefaultEntityFetchPageSizeBuilder;\n+\n+    private static final String URL_CITY_V1                               = \"data/v1/entity/city/\";\n+\n+    @Autowired\n+    private HttpRequestUtil     httpRequestUtil;\n+\n+    private static Logger       logger                                    = LoggerFactory\n+                                                                                  .getLogger(ContentCheckService.class);\n+\n+    private static String       tempPropTigerURL                          = \"http://www.proptiger.com/\";\n+    public static String        selectorAllCity                           = \"selector={\\\"fields\\\":[\\\"id\\\",\\\"label\\\",\\\"overviewUrl\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s}}\";\n+    public static String        selectorAllBuilder                        = \"selector={\\\"fields\\\":[\\\"id\\\",\\\"name\\\",\\\"url\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s}}\";\n+    public static String        selectorAllLocality                       = \"selector={\\\"fields\\\":[\\\"localityId\\\",\\\"label\\\",\\\"url\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s}}\";\n+    public static String        selectorAllProject                        = \"selector={\\\"fields\\\":[\\\"projectId\\\",\\\"name\\\",\\\"URL\\\",\\\"builder\\\",\\\"name\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s}}\";\n+    public static String        selectorAllSuburb                         = \"selector={\\\"fields\\\":[\\\"id\\\",\\\"label\\\",\\\"url\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s}}\";\n+\n+    public static String        selectorAllLocalityForCity                = \"selector={\\\"fields\\\":[\\\"localityId\\\",\\\"label\\\",\\\"url\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s},\\\"filters\\\":{\\\"and\\\":[{\\\"equal\\\":{\\\"cityId\\\":[%s]}}]}}\";\n+    public static String        selectorAllProjectForCity                 = \"selector={\\\"fields\\\":[\\\"projectId\\\",\\\"name\\\",\\\"URL\\\",\\\"builder\\\",\\\"name\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s},\\\"filters\\\":{\\\"and\\\":[{\\\"equal\\\":{\\\"cityId\\\":[%s]}}]}}\";\n+    public static String        selectorAllSuburbForCity                  = \"selector={\\\"fields\\\":[\\\"id\\\",\\\"label\\\",\\\"url\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s},\\\"filters\\\":{\\\"and\\\":[{\\\"equal\\\":{\\\"cityId\\\":[%s]}}]}}\";\n+    public static String        selectorAllBuilderForCity                 = \"selector={\\\"fields\\\":[\\\"id\\\",\\\"name\\\",\\\"url\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s},\\\"filters\\\":{\\\"and\\\":[{\\\"equal\\\":{\\\"cityId\\\":[%s]}}]}}\";\n+\n+    public static String        selectorAllCitywithDescription            = \"selector={\\\"fields\\\":[\\\"id\\\",\\\"label\\\",\\\"overviewUrl\\\",\\\"description\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s}}\";\n+    public static String        selectorAllLocalitywithDescription        = \"selector={\\\"fields\\\":[\\\"localityId\\\",\\\"label\\\",\\\"url\\\",\\\"description\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s}}\";\n+    public static String        selectorAllProjectwithDescription         = \"selector={\\\"fields\\\":[\\\"projectId\\\",\\\"name\\\",\\\"description\\\",\\\"URL\\\",\\\"builder\\\",\\\"name\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s}}\";\n+    public static String        selectorAllSuburbwithDescription          = \"selector={\\\"fields\\\":[\\\"id\\\",\\\"label\\\",\\\"description\\\",\\\"url\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s}}\";\n+    public static String        selectorAllBuilderwithDescription         = \"selector={\\\"fields\\\":[\\\"id\\\",\\\"name\\\",\\\"description\\\",\\\"url\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s}}\";\n+\n+    /*\n+     * ,\\\"filters\\\":{\\\"and\\\":[{\\\"equal\\\":{\\\"cityId\\\":[%s]}}]}\n+     */\n+\n+    public static String        selectorAllBuilderwithDescriptionForCity  = \"selector={\\\"fields\\\":[\\\"id\\\",\\\"name\\\",\\\"description\\\",\\\"url\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s},\\\"filters\\\":{\\\"and\\\":[{\\\"equal\\\":{\\\"cityId\\\":[%s]}}]}}\";\n+    public static String        selectorAllSuburbwithDescriptionForCity   = \"selector={\\\"fields\\\":[\\\"id\\\",\\\"label\\\",\\\"description\\\",\\\"url\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s},\\\"filters\\\":{\\\"and\\\":[{\\\"equal\\\":{\\\"cityId\\\":[%s]}}]}}\";\n+    public static String        selectorAllProjectwithDescriptionForCity  = \"selector={\\\"fields\\\":[\\\"projectId\\\",\\\"name\\\",\\\"description\\\",\\\"URL\\\",\\\"builder\\\",\\\"name\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s},\\\"filters\\\":{\\\"and\\\":[{\\\"equal\\\":{\\\"cityId\\\":[%s]}}]}}\";\n+    public static String        selectorAllLocalitywithDescriptionForCity = \"selector={\\\"fields\\\":[\\\"localityId\\\",\\\"label\\\",\\\"url\\\",\\\"description\\\"],\\\"paging\\\":{\\\"start\\\":%s,\\\"rows\\\":%s},\\\"filters\\\":{\\\"and\\\":[{\\\"equal\\\":{\\\"cityId\\\":[%s]}}]}}\";\n+\n+    public static String        seoCity                                   = \"<span itemscope itemtype=\\\"https://schema.org/City\\\"><span itemprop=\\\"name\\\">%s</span></span>\";\n+    public static String        seoLocality                               = \"<span itemscope itemtype=\\\"http://schema.org/PostalAddress\\\"><span itemprop=\\\"addressLocality\\\">%s</span></span>\";\n+    public static String        seoSuburb                                 = \"<span itemscope itemtype=\\\"http://schema.org/PostalAddress\\\"><span itemprop=\\\"addressLocality\\\">%s</span></span>\";\n+    public static String        seoProject                                = \"<span itemscope itemtype=\\\"http://schema.org/ApartmentComplex\\\"><span itemprop=\\\"name\\\">%s</span></span>\";\n+    public static String        link                                      = \"<a href=\\\"%s%s\\\">%s</a>\";\n+\n+    // single project with description\n+    public static String        SelectorGetProjectWithDescriptionById     = \"{\\\"filters\\\":{\\\"and\\\":[{\\\"equal\\\":{\\\"projectId\\\":%d}}]},\" + \"\\\"fields\\\":[\\\"label\\\",\\\"description\\\", \"\n+                                                                                  + \"\\\"projectId\\\", \\\"name\\\"\"\n+                                                                                  + \"]}\";\n+\n+    /*\n+     * This will Initiate the language tool with all the known words to ignore\n+     */\n+    @PostConstruct\n+    private void init() throws IOException {\n+\n+        ignoreWords = new ArrayList<String>();\n+        // ignoreWordsDao.save(getCityTestCases(defaultEntityFetchLimit));\n+\n+        /*\n+         * ignoreWordsDao.save(getLocalityTestCases(defaultEntityFetchLimit,null)\n+         * );\n+         * ignoreWordsDao.save(getSuburbTestCases(defaultEntityFetchLimit,null\n+         * )); List<IgnoreWords> xx=getCityTestCases(defaultEntityFetchLimit);\n+         */\n+        /*\n+         * List<IgnoreWords> xx =\n+         * getProjectTestCases(defaultEntityFetchLimit,null); for(int\n+         * i=0;i<xx.size();){ if((i+1000)<xx.size()){\n+         * ignoreWordsDao.save(xx.subList(i, i+1000)); } else{\n+         * ignoreWordsDao.save(xx.subList(i, xx.size())); } i=i+1000; }\n+         */\n+        // ignoreWordsDao.save(getBuilderTestCases(defaultEntityFetchLimit,null));\n+\n+        /*\n+         * Iterable<IgnoreWords> igwords = ignoreWordsDao.findAll(); for\n+         * (IgnoreWords s : igwords) { if\n+         * (!ignoreWords.contains(s.getTitle().toLowerCase())) {\n+         * ignoreWords.add(s.getTitle().toLowerCase()); } String[] wrds =\n+         * s.getTitle().toLowerCase().split(\" \"); for (String wrd : wrds) { if\n+         * (!ignoreWords.contains(wrd)) { ignoreWords.add(wrd); } } }\n+         */\n+        languageTool = getLanguageTool(ignoreWords);\n+\n+        logger.info(\"Entering INIT\");\n+    }\n+\n+    //\n+    private List<IgnoreWords> getProjectTestCases(int limit, Integer cityId, boolean... description) {\n+        List<IgnoreWords> testList = new ArrayList<IgnoreWords>();\n+        String selectorProject;\n+        if (cityId == null && description.length > 0 && description[0] == true) {\n+            selectorProject = selectorAllProjectwithDescription;\n+        }\n+        else if (cityId != null && description.length > 0 && description[0] == true) {\n+            selectorProject = selectorAllProjectwithDescriptionForCity;\n+        }\n+        else if (cityId != null) {\n+            selectorProject = selectorAllProjectForCity;\n+        }\n+        else {\n+            selectorProject = selectorAllProject;\n+        }\n+\n+        List<Project> entitylist = getEntityList(\n+                selectorProject,\n+                PROJECT_API_URL,\n+                Project.class,\n+                DefaultEntityFetchPageSize,\n+                limit,\n+                cityId);\n+        for (Project x : entitylist) {\n+            // x.getBuilder().getName()+\" \"+\n+            testList.add(new IgnoreWords(x.getProjectId(), \"PROJECT\", x.getBuilder().getName() + \" \" + x.getName(), x\n+                    .getURL()));\n+        }\n+        return testList;\n+    }\n+\n+    private List<IgnoreWords> getCityTestCases(int limit, boolean... description) {\n+        List<IgnoreWords> testList = new ArrayList<IgnoreWords>();\n+        String selectorCity;\n+        if (description.length > 0 && description[0] == true) {\n+            selectorCity = selectorAllCitywithDescription;\n+        }\n+        else {\n+            selectorCity = selectorAllCity;\n+        }\n+        List<City> entitylist = getEntityList(\n+                selectorCity,\n+                CITY_API_URL,\n+                City.class,\n+                DefaultEntityFetchPageSize,\n+                limit,\n+                null);\n+        for (City x : entitylist) {\n+            testList.add(new IgnoreWords(x.getId(), \"CITY\", x.getLabel().toLowerCase(), String.format(seoCity, x\n+                    .getLabel().toLowerCase())));\n+        }\n+        return testList;\n+    }\n+\n+    private List<IgnoreWords> getLocalityTestCases(int limit, Integer cityId, boolean... description) {\n+        List<IgnoreWords> testList = new ArrayList<IgnoreWords>();\n+        String selectorLocality;\n+        if (cityId == null && description.length > 0 && description[0] == true) {\n+            selectorLocality = selectorAllLocalitywithDescription;\n+        }\n+        else if (cityId != null && description.length > 0 && description[0] == true) {\n+            selectorLocality = selectorAllLocalitywithDescriptionForCity;\n+        }\n+        else if (cityId != null) {\n+            selectorLocality = selectorAllLocalityForCity;\n+        }\n+        else {\n+            selectorLocality = selectorAllLocality;\n+        }\n+\n+        List<Locality> entitylist = getEntityList(\n+                selectorLocality,\n+                LOCALITY_API_URL,\n+                Locality.class,\n+                DefaultEntityFetchPageSize,\n+                limit,\n+                cityId);\n+\n+        for (Locality x : entitylist) {\n+            if ((x.getLocalityId() == 51071) || (x.getLocalityId() == 52141)) {\n+                System.out.println(\"id is \");\n+            }\n+            testList.add(new IgnoreWords(x.getLocalityId(), \"LOCALITY\", x.getLabel(), x.getUrl()));\n+        }\n+        return testList;\n+    }\n+\n+    private List<IgnoreWords> getSuburbTestCases(int limit, Integer cityId, boolean... description) {\n+        List<IgnoreWords> testList = new ArrayList<IgnoreWords>();\n+        String selectorSuburb;\n+        if (cityId == null && description.length > 0 && description[0] == true) {\n+            selectorSuburb = selectorAllSuburbwithDescription;\n+        }\n+        else if (cityId != null && description.length > 0 && description[0] == true) {\n+            selectorSuburb = selectorAllSuburbwithDescriptionForCity;\n+        }\n+        else if (cityId != null) {\n+            selectorSuburb = selectorAllSuburbForCity;\n+        }\n+        else {\n+            selectorSuburb = selectorAllSuburb;\n+        }\n+\n+        List<Suburb> entitylist = getEntityList(\n+                selectorSuburb,\n+                SUBURB_API_URL,\n+                Suburb.class,\n+                DefaultEntityFetchPageSize,\n+                limit,\n+                cityId);\n+        for (Suburb x : entitylist) {\n+            testList.add(new IgnoreWords(x.getId(), \"SUBURB\", x.getLabel(), x.getUrl()));\n+        }\n+        return testList;\n+    }\n+\n+    private List<IgnoreWords> getBuilderTestCases(int limit, Integer cityId, boolean... description) {\n+        List<IgnoreWords> testList = new ArrayList<IgnoreWords>();\n+        String selectorBuilder;\n+        if (cityId == null && description.length > 0 && description[0] == true) {\n+            selectorBuilder = selectorAllBuilderwithDescription;\n+        }\n+        else if (cityId != null && description.length > 0 && description[0] == true) {\n+            selectorBuilder = selectorAllBuilderwithDescriptionForCity;\n+        }\n+        else if (cityId != null) {\n+            selectorBuilder = selectorAllBuilderForCity;\n+        }\n+        else {\n+            selectorBuilder = selectorAllBuilder;\n+        }\n+\n+        List<Builder> entityList = getEntityList(\n+                selectorBuilder,\n+                BUILDER_API_URL,\n+                Builder.class,\n+                DefaultEntityFetchPageSizeBuilder,\n+                limit,\n+                cityId);\n+\n+        for (Builder x : entityList) {\n+            testList.add(new IgnoreWords(x.getId(), \"BUILDER\", x.getName(), x.getUrl()));\n+        }\n+        return testList;\n+    }\n+\n+    public String createSeoTextforCity(int cityId) {\n+        City city = responceInterceptor.getCityById(cityId);\n+        String desc = city.getDescription();\n+        String label = city.getLabel();\n+        return StringUtils.replace(desc, label, String.format(seoCity, label));\n+    }\n+\n+    public String createSeoTextforSuburb(int suburbId) {\n+        Suburb suburb = responceInterceptor.getSuburbById(suburbId);\n+        String desc = suburb.getDescription();\n+        String label = suburb.getLabel();\n+        return StringUtils.replace(desc, label, String.format(seoSuburb, label));\n+    }\n+\n+    public String createSeoTextforLocality(int localityId) {\n+        Locality locality = responceInterceptor.getLocalityById(localityId);\n+        String desc = locality.getDescription();\n+        String label = locality.getLabel();\n+        return StringUtils.replace(desc, label, String.format(seoLocality, label));\n+    }\n+\n+    // generates SEOstring to replace normal word\n+    public String createSeoTextforProject(int projectId) {\n+        Project project = responceInterceptor.getProjectById(projectId, true);\n+        String desc = project.getDescription();\n+        String label = project.getName();\n+        return StringUtils.replace(desc, label, String.format(seoProject, label));\n+    }\n+\n+    // Method To Replace SEO Text\n+    public long replaceSEOText() {\n+        // this is the universe of all the related\n+        // things(projects,builders,localitys,suburbs) of the city specified\n+        List<IgnoreWords> universe = new ArrayList<IgnoreWords>();\n+        StopWatch stpWatch = new StopWatch();\n+        stpWatch.start();\n+        // gets all the city's in database\n+        List<City> allCityLsit = getEntityList(\n+                selectorAllCitywithDescription,\n+                CITY_API_URL,\n+                City.class,\n+                1000,\n+                100000,\n+                null);\n+        // adding all city names to universe\n+        for (City city : allCityLsit) {\n+            universe.add(new IgnoreWords(city.getId(), \"CITY\", city.getLabel(), city.getOverviewUrl()));\n+        }\n+        for (City city : allCityLsit) {\n+           \n+            // adding city universe\n+            universe.addAll(createUniverseForCity(city.getId()));\n+            // changes city's description with SEO context\n+            String replaced = replaceBestSEO(city.getId(), city.getDescription(), universe);\n+            // for posting back in the database\n+            StringBuilder url = new StringBuilder(\n+                    PropertyReader.getRequiredPropertyAsString(PropertyKeys.PROPTIGER_URL)).append(URL_CITY_V1)\n+                    .append(\"/\").append(city.getId());\n+            city.setDescription(replaced);\n+            httpRequestUtil.postAndReturnInternalJsonRequest(URI.create(url.toString()), city, City.class);\n+            // This to be un commented for rest of the things to process in\n+            // future\n+            // changeForEveryThingInCity(universe,city.getId());\n+            \n+        }\n+        stpWatch.stop();\n+        return stpWatch.getTime();\n+\n+    }\n+\n+    private void changeForEveryThingInCity(List<IgnoreWords> universe, int cityId) {\n+        for (IgnoreWords ig : universe) {\n+            if (ig.getType() == \"BUILDER\") {\n+                Builder builder = responceInterceptor.getBuilderById(ig.getActualId(), true);\n+                String replaced = replaceBestSEO(cityId, builder.getDescription(), universe);\n+            }\n+            if (ig.getType() == \"PROJECT\") {\n+                Project project = responceInterceptor.getProjectById(ig.getActualId(), true);\n+                String replaced = replaceBestSEO(cityId, project.getDescription(), universe);\n+            }\n+            if (ig.getType() == \"SUBURB\") {\n+                Suburb suburb = responceInterceptor.getSuburbById(ig.getActualId(), true);\n+                String replaced = replaceBestSEO(cityId, suburb.getDescription(), universe);\n+            }\n+            if (ig.getType() == \"LOCALITY\") {\n+                Locality locality = responceInterceptor.getLocalityById(ig.getActualId(), true);\n+                String replaced = replaceBestSEO(cityId, locality.getDescription(), universe);\n+\n+            }\n+        }\n+    }\n+\n+    public String replaceBestSEO(int cityId, String descriptionToReplace, List<IgnoreWords> universe) {\n+\n+        // List<IgnoreWords> universe = createUniverseForCity(cityId);\n+        String originalDescription = new String(descriptionToReplace);\n+        String[] searchList = new String[universe.size()];\n+        String[] replacementList = new String[universe.size()];\n+\n+        for (int kk = 0; kk < universe.size(); kk++) {\n+            IgnoreWords igs = universe.get(kk);\n+            String key = igs.getTitle();\n+            String typ = igs.getType();\n+            String value;\n+\n+            if (typ.equals(\"CITY\")) {\n+\n+                value = String.format(seoCity, igs.getTitle());\n+                searchList[kk] = key;\n+                replacementList[kk] = value;\n+\n+            }\n+            if (typ.equals(\"LOCALITY\")) {\n+                value = String.format(seoLocality, igs.getTitle());\n+                searchList[kk] = key;\n+                replacementList[kk] = value;\n+                // break;\n+            }\n+            if (typ.equals(\"PROJECT\")) {\n+                value = String.format(seoProject, igs.getTitle());\n+                searchList[kk] = key;\n+                replacementList[kk] = value;\n+                // break;\n+            }\n+            if (typ.equals(\"SUBURB\")) {\n+                value = String.format(seoSuburb, igs.getTitle());\n+                searchList[kk] = key;\n+                replacementList[kk] = value;","path":"src/main/java/com/proptiger/seo/service/ContentCheckService.java","position":461,"original_position":461,"commit_id":"73f17d35d72504317d9d085bd2738678fc7662c5","original_commit_id":"73f17d35d72504317d9d085bd2738678fc7662c5","user":{"login":"mandeepdhir","id":6302084,"avatar_url":"https://avatars.githubusercontent.com/u/6302084?v=3","gravatar_id":"","url":"https://api.github.com/users/mandeepdhir","html_url":"https://github.com/mandeepdhir","followers_url":"https://api.github.com/users/mandeepdhir/followers","following_url":"https://api.github.com/users/mandeepdhir/following{/other_user}","gists_url":"https://api.github.com/users/mandeepdhir/gists{/gist_id}","starred_url":"https://api.github.com/users/mandeepdhir/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mandeepdhir/subscriptions","organizations_url":"https://api.github.com/users/mandeepdhir/orgs","repos_url":"https://api.github.com/users/mandeepdhir/repos","events_url":"https://api.github.com/users/mandeepdhir/events{/privacy}","received_events_url":"https://api.github.com/users/mandeepdhir/received_events","type":"User","site_admin":false},"body":"Constants","created_at":"2015-01-13T09:12:22Z","updated_at":"2015-01-13T09:12:22Z","html_url":"https://github.com/proptigercom/MIDL-SEO/pull/15#discussion_r22850212","pull_request_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/pulls/15","_links":{"self":{"href":"https://api.github.com/repos/proptigercom/MIDL-SEO/pulls/comments/22850212"},"html":{"href":"https://github.com/proptigercom/MIDL-SEO/pull/15#discussion_r22850212"},"pull_request":{"href":"https://api.github.com/repos/proptigercom/MIDL-SEO/pulls/15"}}},"pull_request":{"url":"https://api.github.com/repos/proptigercom/MIDL-SEO/pulls/15","id":27256289,"html_url":"https://github.com/proptigercom/MIDL-SEO/pull/15","diff_url":"https://github.com/proptigercom/MIDL-SEO/pull/15.diff","patch_url":"https://github.com/proptigercom/MIDL-SEO/pull/15.patch","issue_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/issues/15","number":15,"state":"open","locked":false,"title":"Develop","user":{"login":"tokalaproptiger","id":10348826,"avatar_url":"https://avatars.githubusercontent.com/u/10348826?v=3","gravatar_id":"","url":"https://api.github.com/users/tokalaproptiger","html_url":"https://github.com/tokalaproptiger","followers_url":"https://api.github.com/users/tokalaproptiger/followers","following_url":"https://api.github.com/users/tokalaproptiger/following{/other_user}","gists_url":"https://api.github.com/users/tokalaproptiger/gists{/gist_id}","starred_url":"https://api.github.com/users/tokalaproptiger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tokalaproptiger/subscriptions","organizations_url":"https://api.github.com/users/tokalaproptiger/orgs","repos_url":"https://api.github.com/users/tokalaproptiger/repos","events_url":"https://api.github.com/users/tokalaproptiger/events{/privacy}","received_events_url":"https://api.github.com/users/tokalaproptiger/received_events","type":"User","site_admin":false},"body":"This consists only changes of City Description Changes","created_at":"2015-01-13T09:05:28Z","updated_at":"2015-01-13T09:12:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ccbe4aa90928791d2ffa4c934c630dd950ee9dc4","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/pulls/15/commits","review_comments_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/pulls/15/comments","review_comment_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/pulls/comments/{number}","comments_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/issues/15/comments","statuses_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/statuses/73f17d35d72504317d9d085bd2738678fc7662c5","head":{"label":"tokalaproptiger:develop","ref":"develop","sha":"73f17d35d72504317d9d085bd2738678fc7662c5","user":{"login":"tokalaproptiger","id":10348826,"avatar_url":"https://avatars.githubusercontent.com/u/10348826?v=3","gravatar_id":"","url":"https://api.github.com/users/tokalaproptiger","html_url":"https://github.com/tokalaproptiger","followers_url":"https://api.github.com/users/tokalaproptiger/followers","following_url":"https://api.github.com/users/tokalaproptiger/following{/other_user}","gists_url":"https://api.github.com/users/tokalaproptiger/gists{/gist_id}","starred_url":"https://api.github.com/users/tokalaproptiger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tokalaproptiger/subscriptions","organizations_url":"https://api.github.com/users/tokalaproptiger/orgs","repos_url":"https://api.github.com/users/tokalaproptiger/repos","events_url":"https://api.github.com/users/tokalaproptiger/events{/privacy}","received_events_url":"https://api.github.com/users/tokalaproptiger/received_events","type":"User","site_admin":false},"repo":{"id":28906121,"name":"MIDL-SEO","full_name":"tokalaproptiger/MIDL-SEO","owner":{"login":"tokalaproptiger","id":10348826,"avatar_url":"https://avatars.githubusercontent.com/u/10348826?v=3","gravatar_id":"","url":"https://api.github.com/users/tokalaproptiger","html_url":"https://github.com/tokalaproptiger","followers_url":"https://api.github.com/users/tokalaproptiger/followers","following_url":"https://api.github.com/users/tokalaproptiger/following{/other_user}","gists_url":"https://api.github.com/users/tokalaproptiger/gists{/gist_id}","starred_url":"https://api.github.com/users/tokalaproptiger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tokalaproptiger/subscriptions","organizations_url":"https://api.github.com/users/tokalaproptiger/orgs","repos_url":"https://api.github.com/users/tokalaproptiger/repos","events_url":"https://api.github.com/users/tokalaproptiger/events{/privacy}","received_events_url":"https://api.github.com/users/tokalaproptiger/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tokalaproptiger/MIDL-SEO","description":"","fork":true,"url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO","forks_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/forks","keys_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/teams","hooks_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/hooks","issue_events_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/issues/events{/number}","events_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/events","assignees_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/assignees{/user}","branches_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/branches{/branch}","tags_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/tags","blobs_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/git/refs{/sha}","trees_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/statuses/{sha}","languages_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/languages","stargazers_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/stargazers","contributors_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/contributors","subscribers_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/subscribers","subscription_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/subscription","commits_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/commits{/sha}","git_commits_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/git/commits{/sha}","comments_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/comments{/number}","issue_comment_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/issues/comments/{number}","contents_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/contents/{+path}","compare_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/merges","archive_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/downloads","issues_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/issues{/number}","pulls_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/pulls{/number}","milestones_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/milestones{/number}","notifications_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/labels{/name}","releases_url":"https://api.github.com/repos/tokalaproptiger/MIDL-SEO/releases{/id}","created_at":"2015-01-07T08:42:24Z","updated_at":"2015-01-07T08:42:24Z","pushed_at":"2015-01-13T09:03:10Z","git_url":"git://github.com/tokalaproptiger/MIDL-SEO.git","ssh_url":"git@github.com:tokalaproptiger/MIDL-SEO.git","clone_url":"https://github.com/tokalaproptiger/MIDL-SEO.git","svn_url":"https://github.com/tokalaproptiger/MIDL-SEO","homepage":null,"size":148,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"proptigercom:develop","ref":"develop","sha":"3ad766f707c1b770a1a71ffd6be6713aceadd3d2","user":{"login":"proptigercom","id":6286505,"avatar_url":"https://avatars.githubusercontent.com/u/6286505?v=3","gravatar_id":"","url":"https://api.github.com/users/proptigercom","html_url":"https://github.com/proptigercom","followers_url":"https://api.github.com/users/proptigercom/followers","following_url":"https://api.github.com/users/proptigercom/following{/other_user}","gists_url":"https://api.github.com/users/proptigercom/gists{/gist_id}","starred_url":"https://api.github.com/users/proptigercom/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/proptigercom/subscriptions","organizations_url":"https://api.github.com/users/proptigercom/orgs","repos_url":"https://api.github.com/users/proptigercom/repos","events_url":"https://api.github.com/users/proptigercom/events{/privacy}","received_events_url":"https://api.github.com/users/proptigercom/received_events","type":"Organization","site_admin":false},"repo":{"id":27371738,"name":"MIDL-SEO","full_name":"proptigercom/MIDL-SEO","owner":{"login":"proptigercom","id":6286505,"avatar_url":"https://avatars.githubusercontent.com/u/6286505?v=3","gravatar_id":"","url":"https://api.github.com/users/proptigercom","html_url":"https://github.com/proptigercom","followers_url":"https://api.github.com/users/proptigercom/followers","following_url":"https://api.github.com/users/proptigercom/following{/other_user}","gists_url":"https://api.github.com/users/proptigercom/gists{/gist_id}","starred_url":"https://api.github.com/users/proptigercom/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/proptigercom/subscriptions","organizations_url":"https://api.github.com/users/proptigercom/orgs","repos_url":"https://api.github.com/users/proptigercom/repos","events_url":"https://api.github.com/users/proptigercom/events{/privacy}","received_events_url":"https://api.github.com/users/proptigercom/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/proptigercom/MIDL-SEO","description":"","fork":false,"url":"https://api.github.com/repos/proptigercom/MIDL-SEO","forks_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/forks","keys_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/keys{/key_id}","collaborators_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/teams","hooks_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/hooks","issue_events_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/issues/events{/number}","events_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/events","assignees_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/assignees{/user}","branches_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/branches{/branch}","tags_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/tags","blobs_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/git/refs{/sha}","trees_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/git/trees{/sha}","statuses_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/statuses/{sha}","languages_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/languages","stargazers_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/stargazers","contributors_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/contributors","subscribers_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/subscribers","subscription_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/subscription","commits_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/commits{/sha}","git_commits_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/git/commits{/sha}","comments_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/comments{/number}","issue_comment_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/issues/comments/{number}","contents_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/contents/{+path}","compare_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/compare/{base}...{head}","merges_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/merges","archive_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/downloads","issues_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/issues{/number}","pulls_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/pulls{/number}","milestones_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/milestones{/number}","notifications_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/labels{/name}","releases_url":"https://api.github.com/repos/proptigercom/MIDL-SEO/releases{/id}","created_at":"2014-12-01T09:19:28Z","updated_at":"2015-01-07T14:14:53Z","pushed_at":"2015-01-13T07:37:52Z","git_url":"git://github.com/proptigercom/MIDL-SEO.git","ssh_url":"git@github.com:proptigercom/MIDL-SEO.git","clone_url":"https://github.com/proptigercom/MIDL-SEO.git","svn_url":"https://github.com/proptigercom/MIDL-SEO","homepage":null,"size":534,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7,"mirror_url":null,"open_issues_count":4,"forks":7,"open_issues":4,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/proptigercom/MIDL-SEO/pulls/15"},"html":{"href":"https://github.com/proptigercom/MIDL-SEO/pull/15"},"issue":{"href":"https://api.github.com/repos/proptigercom/MIDL-SEO/issues/15"},"comments":{"href":"https://api.github.com/repos/proptigercom/MIDL-SEO/issues/15/comments"},"review_comments":{"href":"https://api.github.com/repos/proptigercom/MIDL-SEO/pulls/15/comments"},"review_comment":{"href":"https://api.github.com/repos/proptigercom/MIDL-SEO/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/proptigercom/MIDL-SEO/pulls/15/commits"},"statuses":{"href":"https://api.github.com/repos/proptigercom/MIDL-SEO/statuses/73f17d35d72504317d9d085bd2738678fc7662c5"}}}}