/* * Provided by CSTI Consulting * Following GNU LESSER GENERAL PUBLIC LICENSE * You may obtain more details at * * http://www.csticonsulting.com * Copyright (c) 2006-2011 Consultation CS-TI inc. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.salesmanager.central.cart; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.redfin.sitemapgenerator.SitemapIndexGenerator; import com.redfin.sitemapgenerator.WebSitemapGenerator; import com.salesmanager.central.BaseAction; import com.salesmanager.core.constants.ConfigurationConstants; import com.salesmanager.core.constants.LabelConstants; import com.salesmanager.core.constants.ShippingConstants; import com.salesmanager.core.entity.catalog.Category; import com.salesmanager.core.entity.catalog.Product; import com.salesmanager.core.entity.merchant.MerchantConfiguration; import com.salesmanager.core.entity.merchant.MerchantStore; import com.salesmanager.core.entity.reference.DynamicLabel; import com.salesmanager.core.entity.reference.Language; import com.salesmanager.core.service.ServiceFactory; import com.salesmanager.core.service.catalog.CatalogService; import com.salesmanager.core.service.merchant.ConfigurationRequest; import com.salesmanager.core.service.merchant.ConfigurationResponse; import com.salesmanager.core.service.merchant.MerchantService; import com.salesmanager.core.service.reference.ReferenceService; import com.salesmanager.core.util.DateUtil; import com.salesmanager.core.util.FileUtil; import com.salesmanager.core.util.ReferenceUtil; import com.salesmanager.core.util.UrlUtil; /** * This class manages SiteMap file * @author Carl Samson * */ public class SiteMapAction extends BaseAction { /** * Creates a sitemap */ public String execute() throws Exception { MerchantService mservice = (MerchantService)ServiceFactory.getService(ServiceFactory.MerchantService); CatalogService cservice = (CatalogService)ServiceFactory.getService(ServiceFactory.CatalogService); ReferenceService rservice = (ReferenceService)ServiceFactory.getService(ServiceFactory.ReferenceService); Map<Integer,Collection> categoriesMap = new HashMap(); Map<Integer,Collection<Product>> productsMap = new HashMap(); Map<Integer,Collection<DynamicLabel>> pagesMap = new HashMap(); //for each supported language MerchantStore store = mservice.getMerchantStore(super.getContext().getMerchantid().intValue()); Map langs = store.getGetSupportedLanguages(); if(langs==null) { //@todo return a message } for(Object o : langs.keySet()) { Integer lang = (Integer)o; Language l = (Language)langs.get(lang); //get all categories Map categories = cservice.getCategoriesByLang(store.getMerchantId(),l.getCode()); if(categories!=null && categories.size()>0) { List<Object> list = new ArrayList<Object>(categories.entrySet()); categoriesMap.put(l.getLanguageId(), list); } //get all products Collection products = cservice.getProductsByMerchantIdAndLanguageId(store.getMerchantId(),l.getLanguageId()); if(products!=null && products.size()>0) { productsMap.put(l.getLanguageId(), products); } //get pages Collection pages = rservice.getDynamicLabels(store.getMerchantId(),LabelConstants.STORE_FRONT_CUSTOM_PAGES,super.getLocale()); if(pages!=null && pages.size()>0) { pagesMap.put(l.getLanguageId(), pages); } } WebSitemapGenerator wsg; // generate pages //urls String baseUrl = FileUtil.getDefaultCataloguePageUrl(store, super.getServletRequest()); String siteMapUrl = new StringBuilder().append(UrlUtil.getUnsecuredDomain(super.getServletRequest())).append(FileUtil.getSiteMapUrl()).append(store.getMerchantId()).toString(); //dirs String siteMapDir = new StringBuilder().append(FileUtil.getSiteMapFilePath()).append("/").append(store.getMerchantId()).toString(); String index_file = new StringBuilder().append(FileUtil.getSiteMapFilePath()).append("/").append(store.getMerchantId()).append("/").append("sitemap.xml").toString(); SitemapIndexGenerator sig = new SitemapIndexGenerator(siteMapUrl, new File(index_file)); if(pagesMap.size()>0 || productsMap.size()>0 || categoriesMap.size()>0) { //check if folder exists File sm = new File(siteMapDir); boolean exists = sm.exists(); if(exists) {//delete sm.delete(); } boolean mkdir = sm.mkdir(); } if(pagesMap.size()>0) { for(Object o : langs.keySet()) {//languages Integer languageId = (Integer)o; Collection pages = (Collection)pagesMap.get(languageId); if(pages!=null && pages.size()>0) { wsg = WebSitemapGenerator.builder(baseUrl,new File(siteMapDir)).fileNamePrefix("pages_" + languageId).build(); for(Object oo : pages) { DynamicLabel l = (DynamicLabel)oo; wsg.addUrl(new StringBuilder().append(baseUrl).append("/content/").append(l.getDynamicLabelDescription().getSeUrl()).toString()); } wsg.write(); // generate pages sitemap sig.addUrl(siteMapUrl + "/pages_" + languageId + ".xml"); } } } if(productsMap.size()>0) { for(Object o : langs.keySet()) {//languages Integer languageId = (Integer)o; Collection products = (Collection)productsMap.get(languageId); if(products!=null && products.size()>0) { wsg = WebSitemapGenerator.builder(baseUrl,new File(siteMapDir)).fileNamePrefix("products_" + languageId).build(); int i = 1; for(Object oo : products) { if(i>50000) {break;} Product p = (Product)oo; wsg.addUrl(new StringBuilder().append(ReferenceUtil.buildCatalogUri(store)).append("/product/").append(p.getProductDescription().getSeUrl()).toString()); i++; } wsg.write(); // generate pages sitemap sig.addUrl(siteMapUrl + "/products_" + languageId + ".xml"); } } } if(categoriesMap.size()>0) { for(Object o : langs.keySet()) {//languages Integer languageId = (Integer)o; Collection categories = (Collection)categoriesMap.get(languageId); if(categories!=null && categories.size()>0) { wsg = WebSitemapGenerator.builder(baseUrl,new File(siteMapDir)).fileNamePrefix("categories_"+languageId).build(); int i = 1; for(Object oo : categories) { if(i>50000) {break;} Map.Entry entry = (Map.Entry)oo; Category c = (Category)entry.getValue(); if(c.getCategoryId()>0) { wsg.addUrl(new StringBuilder().append(ReferenceUtil.buildCatalogUri(store)).append("/category/").append(c.getCategoryDescription().getSeUrl()).toString()); } i++; } wsg.write(); // generate pages sitemap sig.addUrl(siteMapUrl + "/categories_" + languageId + ".xml"); } } } //for (int i = 0; i < 5; i++) // wsg.addUrl("http://www.example.com/foo"+i+".html"); //wsg = WebSitemapGenerator.builder("http://www.example.com", myDir).fileNamePrefix("bar").build(); //for (int i = 0; i < 5; i++) // wsg.addUrl("http://www.example.com/bar"+i+".html"); //wsg.write(); // generate sitemap index for foo + bar if(pagesMap.size()>0 || productsMap.size()>0 || categoriesMap.size()>0) { sig.write(); //write in configuration ConfigurationRequest req = new ConfigurationRequest(store.getMerchantId(),ConfigurationConstants.SITEMAP); ConfigurationResponse resp = mservice.getConfiguration(req); MerchantConfiguration conf = resp.getMerchantConfiguration(ConfigurationConstants.SITEMAP); if(conf==null) { conf = new MerchantConfiguration(); } conf.setConfigurationKey(ConfigurationConstants.SITEMAP); conf.setMerchantId(store.getMerchantId()); conf.setConfigurationValue(siteMapUrl + "/sitemap.xml"); conf.setConfigurationValue1(DateUtil.formatDate(new Date())); mservice.saveOrUpdateMerchantConfiguration(conf); super.setSuccessMessage(); } return SUCCESS; } }