VoidForum/src/main/java/ru/bvn13/voidforum/services/SeoService.java

82 lines
3.0 KiB
Java

package ru.bvn13.voidforum.services;
import ru.bvn13.voidforum.models.Post;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.List;
@Service
public class SeoService {
public static final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
@Autowired
private AppSetting appSetting;
public String createSitemap(List<Post> posts) {
String slash = appSetting.getMainUri().trim().endsWith("/") ? "" : "/";
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element root = doc.createElement("urlset");
root.setAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");
doc.appendChild(root);
for(Post post : posts) {
Element url = doc.createElement("url");
//loc
Element loc = doc.createElement("loc");
loc.appendChild(doc.createTextNode(String.format("%s%sposts/%s", appSetting.getMainUri().trim(), slash, post.getPermalink() == null || post.getPermalink().isEmpty() ? post.getId() : post.getPermalink())));
url.appendChild(loc);
//lastmod
//yyyy-MM-dd'T'HH:mm:ss
Element lastMod = doc.createElement("lastmod");
lastMod.appendChild(doc.createTextNode(dateFormatter.format(post.getUpdatedAt())));
url.appendChild(lastMod);
//
Element changeFreq = doc.createElement("changefreq");
changeFreq.appendChild(doc.createTextNode("daily"));
url.appendChild(changeFreq);
root.appendChild(url);
}
// write the content into xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StringWriter sw = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(sw));
return sw.toString();
} catch (ParserConfigurationException e) {
e.printStackTrace();
return null;
} catch (TransformerException tfe) {
tfe.printStackTrace();
return null;
}
}
}