package fr.openwide.maven.artifact.notifier.core.business.search.service; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.util.Collections; import java.util.List; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import com.google.common.collect.Lists; import fr.openwide.core.spring.util.StringUtils; import fr.openwide.maven.artifact.notifier.core.business.search.model.ArtifactBean; import fr.openwide.maven.artifact.notifier.core.business.search.model.PomBean; @Service("pomParserService") public class PomParserServiceImpl implements Serializable, IPomParserService { private static final long serialVersionUID = 6383714945788645661L; private static final Logger LOGGER = LoggerFactory.getLogger(PomParserServiceImpl.class); private static final String POM_ENCODING = "UTF-8"; @Override public PomBean parse(String xml) { if (StringUtils.hasText(xml)) { Document doc = Jsoup.parse(xml); return parse(doc); } return null; } @Override public PomBean parse(File in) { try { Document doc = Jsoup.parse(in, POM_ENCODING); return parse(doc); } catch (IOException e) { LOGGER.error("Unable to parse " + in.getName() + " file", e); } return null; } private String getGroupId(Document doc) { Elements groupIdElements = doc.select("project > groupId"); if (groupIdElements != null && groupIdElements.size() == 1) { return groupIdElements.get(0).text(); } groupIdElements = doc.select("project > parent > groupId"); if (groupIdElements != null && groupIdElements.size() == 1) { return groupIdElements.get(0).text(); } return null; } private String getArtifactId(Document doc) { Elements artificatIdElements = doc.select("project > artifactId"); if (artificatIdElements != null && artificatIdElements.size() == 1) { return artificatIdElements.get(0).text(); } return null; } private List<ArtifactBean> populate(Elements elements) { List<ArtifactBean> artifactList = Lists.newArrayList(); for (Element dependency : elements) { ArtifactBean artifactBean = new ArtifactBean(); for (Element child : dependency.children()) { if (child.nodeName().compareTo("groupid") == 0) { artifactBean.setGroupId(child.text()); } else if (child.nodeName().compareTo("artifactid") == 0) { artifactBean.setArtifactId(child.text()); } else if (child.nodeName().compareTo("type") == 0) { artifactBean.setType(child.text()); } } if (StringUtils.hasText(artifactBean.getGroupId()) && StringUtils.hasText(artifactBean.getArtifactId())) { artifactBean.setId(artifactBean.getGroupId() + ":" + artifactBean.getArtifactId()); artifactList.add(artifactBean); } } Collections.sort(artifactList); return artifactList; } private PomBean parse(Document doc) { PomBean pomBean = new PomBean(); pomBean.setGroupId(getGroupId(doc)); pomBean.setArtifactId(getArtifactId(doc)); pomBean.setDependencies(populate(doc.select("dependency:not(dependencyManagement dependencies dependency)"))); pomBean.setDependencyManagement(populate(doc.select("dependencyManagement > dependencies > dependency"))); pomBean.setPlugins(populate(doc.select("plugin:not(pluginManagement plugins plugin)"))); pomBean.setPluginManagement(populate(doc.select("pluginManagement > plugins > plugin"))); return pomBean; } }