diff --git a/sources/.project b/sources/.project index 1638d75b..e63cffa4 100644 --- a/sources/.project +++ b/sources/.project @@ -1,6 +1,6 @@ - codemetropolis-toolchain + codemetropolis-toolchain2 diff --git a/sources/codemetropolis-toolchain-commons/.classpath b/sources/codemetropolis-toolchain-commons/.classpath index e7a868fb..cd555fe2 100644 --- a/sources/codemetropolis-toolchain-commons/.classpath +++ b/sources/codemetropolis-toolchain-commons/.classpath @@ -18,12 +18,6 @@ - - - - - - diff --git a/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterLoader.java b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterLoader.java index 39579620..47cd9b4b 100644 --- a/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterLoader.java +++ b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterLoader.java @@ -5,6 +5,7 @@ import codemetropolis.toolchain.commons.cdf.converter.CdfConverter; import codemetropolis.toolchain.converter.sonarqube.SonarQubeConverter; import codemetropolis.toolchain.converter.sourcemeter.GraphConverter; +import codemetropolis.toolchain.converter.pmd.PmdConverter; public class ConverterLoader { @@ -16,6 +17,8 @@ public static CdfConverter load(ConverterType converterType, Map return new GraphConverter(params); case SONARQUBE: return new SonarQubeConverter(params); + case PMD: + return new PmdConverter(params); default: return null; } diff --git a/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterType.java b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterType.java index da4a69ad..c23dface 100644 --- a/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterType.java +++ b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterType.java @@ -2,5 +2,6 @@ public enum ConverterType { SOURCEMETER, - SONARQUBE + SONARQUBE, + PMD } diff --git a/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/pmd/PmdConverter.java b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/pmd/PmdConverter.java new file mode 100644 index 00000000..1c168f5c --- /dev/null +++ b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/pmd/PmdConverter.java @@ -0,0 +1,137 @@ +package codemetropolis.toolchain.converter.pmd; + +import java.io.File; +import java.io.IOException; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import codemetropolis.toolchain.commons.cdf.CdfElement; +import codemetropolis.toolchain.commons.cdf.CdfTree; +import codemetropolis.toolchain.commons.cdf.converter.CdfConverter; +import codemetropolis.toolchain.commons.exceptions.CodeMetropolisException; +import codemetropolis.toolchain.commons.cdf.CdfProperty; + +public class PmdConverter extends CdfConverter { + + int vCounter = 0; + + public PmdConverter(Map params) { + super(params); + } + + @Override + public CdfTree createElements(String source) throws CodeMetropolisException { + + vCounter = 0; + Document doc = loadXml(source); + CdfElement root = createElementsRecursively(doc); + CdfTree tree = new CdfTree(); + tree.setRoot(root); + return tree; + } + + public CdfElement createElementsRecursively(Node root) { + CdfElement element = null; + element = cdfConvert(root); + if (element != null) { + addProperties(element, root); + NodeList children = root.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + CdfElement e = createElementsRecursively(children.item(i)); + if (e != null) { + element.addChildElement(e); + } + } + } + return element; + + } + + public void addProperties(CdfElement elem, Node n) { + if (n.hasAttributes()) { + NamedNodeMap map = n.getAttributes(); + for (int i = 0; i < map.getLength(); i++) { + + elem.addProperty(map.item(i).getNodeName(), map.item(i).getNodeValue(), + convertType(map.item(i).getNodeValue())); + } + } + } + + public CdfElement cdfConvert(Node n) { + CdfElement elem = null; + switch (n.getNodeName()) { + case "violation": + elem = new CdfElement(("violation" + vCounter), "violation"); + vCounter++; + break; + case "file": + elem = new CdfElement(n.getAttributes().getNamedItem("name").getNodeValue(), "file"); + break; + case "#document": + case "pmd": + elem = new CdfElement(n.getNodeName(), "other"); + break; + default: + + break; + } + + return elem; + + } + + public CdfProperty.Type convertType(String str) { + + if (isNumeric(str)) + return CdfProperty.Type.INT; + else + return CdfProperty.Type.STRING; + + } + + public boolean isNumeric(String str) { + if (str.chars().allMatch(Character::isDigit)) + return true; + else + return false; + + } + + public Document parseXml(String source, DocumentBuilder dBuilder) { + File xmlFile = new File(source); + Document doc = null; + try { + doc = dBuilder.parse(xmlFile); + } catch (SAXException e) { + System.out.println("Parsing xml input has failed"); + } catch (IOException e) { + + System.out.println("Reading xml input has failed"); + } + return doc; + } + + public Document loadXml(String source) { + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + ; + DocumentBuilder dBuilder = null; + + try { + dBuilder = dbFactory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + System.out.println("Parse Configuration has failed"); + } + Document doc = parseXml(source, dBuilder); + return doc; + } +} diff --git a/sources/codemetropolis-toolchain-mapping/.classpath b/sources/codemetropolis-toolchain-mapping/.classpath index e7a868fb..af1430be 100644 --- a/sources/codemetropolis-toolchain-mapping/.classpath +++ b/sources/codemetropolis-toolchain-mapping/.classpath @@ -6,24 +6,12 @@ - - - - - - - - - - - - diff --git a/sources/codemetropolis-toolchain-placing/.classpath b/sources/codemetropolis-toolchain-placing/.classpath index e7a868fb..af1430be 100644 --- a/sources/codemetropolis-toolchain-placing/.classpath +++ b/sources/codemetropolis-toolchain-placing/.classpath @@ -6,24 +6,12 @@ - - - - - - - - - - - - diff --git a/sources/codemetropolis-toolchain-rendering/.classpath b/sources/codemetropolis-toolchain-rendering/.classpath index e7a868fb..cd555fe2 100644 --- a/sources/codemetropolis-toolchain-rendering/.classpath +++ b/sources/codemetropolis-toolchain-rendering/.classpath @@ -18,12 +18,6 @@ - - - - - -