001 package com.hammurapi.review.util; 002 003 import java.io.File; 004 import java.util.ArrayList; 005 import java.util.HashMap; 006 import java.util.Iterator; 007 import java.util.List; 008 import java.util.Map; 009 import java.util.ServiceLoader; 010 011 import javax.xml.parsers.DocumentBuilderFactory; 012 import javax.xml.xpath.XPath; 013 import javax.xml.xpath.XPathConstants; 014 import javax.xml.xpath.XPathFactory; 015 016 import org.eclipse.emf.common.util.URI; 017 import org.eclipse.emf.ecore.EPackage.Registry; 018 import org.eclipse.emf.ecore.resource.Resource; 019 import org.eclipse.emf.ecore.resource.ResourceSet; 020 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; 021 import org.eclipse.emf.ecore.xmi.XMLResource; 022 import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; 023 import org.w3c.dom.Document; 024 import org.w3c.dom.Element; 025 import org.w3c.dom.Node; 026 import org.w3c.dom.NodeList; 027 028 import com.hammurapi.config.ConfigFactory; 029 import com.hammurapi.config.NamedObjectDefinition; 030 import com.hammurapi.config.runtime.PackageProvider; 031 import com.hammurapi.review.Inspector; 032 import com.hammurapi.review.InspectorCategory; 033 import com.hammurapi.review.InspectorSet; 034 import com.hammurapi.review.ReviewFactory; 035 036 /** 037 * Migrates rule set definitions from 5.x to 6 038 * @author Pavel Vlasov 039 * 040 */ 041 public class Migrator { 042 043 private static final String TYPE = "type"; 044 045 /** 046 * @param args 047 */ 048 public static void main(String[] args) throws Exception { 049 System.out.println("Usage: java [options] "+Migrator.class.getName()+" <source file> <target file>"); 050 Document input = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(args[0])); 051 052 ResourceSet resourceSet = new ResourceSetImpl(); 053 resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( 054 Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl()); 055 056 Registry registry = resourceSet.getPackageRegistry(); 057 Iterator<PackageProvider> ppit = ServiceLoader.load(PackageProvider.class, Migrator.class.getClassLoader()).iterator(); 058 while (ppit.hasNext()) { 059 ppit.next().registerPackages(registry); 060 } 061 062 InspectorSet inspectorSet = ReviewFactory.eINSTANCE.createInspectorSet(); 063 Element root = input.getDocumentElement(); 064 XPath xPath = XPathFactory.newInstance().newXPath(); 065 inspectorSet.setName(xPath.evaluate("name/text()", root)); 066 inspectorSet.setDescription(xPath.evaluate("description/text()", root)); 067 068 Map<List<String>, InspectorCategory> categoryMap = new HashMap<List<String>, InspectorCategory>(); 069 NodeList inspectors = (NodeList) xPath.evaluate("rules/rule", root, XPathConstants.NODESET); 070 for (int i=0, l=inspectors.getLength(); i<l; ++i) { 071 Inspector inspector = ReviewFactory.eINSTANCE.createInspector(); 072 inspectorSet.getInspectors().add(inspector); 073 Node iNode = inspectors.item(i); 074 inspector.setName(xPath.evaluate("name/text()", iNode)); 075 inspector.setDescription(xPath.evaluate("description/text()", iNode)); 076 077 List<String> categories = new ArrayList<String>(); 078 NodeList cnl = (NodeList) xPath.evaluate("category", iNode, XPathConstants.NODESET); 079 for (int j=0, cl=cnl.getLength(); j<cl; ++j) { 080 categories.add(xPath.evaluate("text()", cnl.item(j))); 081 } 082 if (!categories.isEmpty()) { 083 inspector.setCategory(getCategory(categories, categoryMap, inspectorSet)); 084 } 085 inspector.setSeverity(Integer.parseInt(xPath.evaluate("severity/text()", iNode))); 086 inspector.setType(((Element) iNode).getAttribute(TYPE)); 087 NodeList allChildren=iNode.getChildNodes(); 088 for (int j=0, cl=allChildren.getLength(); j<cl; ++j) { 089 Node pNode = allChildren.item(j); 090 if (pNode instanceof Element) { 091 String pName = pNode.getNodeName(); 092 if (!"name".equals(pName) && !"severity".equals(pName) && !"description".equals(pName) && !"category".equals(pName)) { 093 NamedObjectDefinition property = ConfigFactory.eINSTANCE.createNamedObjectDefinition(); 094 inspector.getProperty().add(property); 095 property.setName(pName); 096 Element pElement = (Element) pNode; 097 if (pElement.hasAttribute(TYPE)) { 098 property.setType(pElement.getAttribute(TYPE)); 099 } 100 property.setValue(xPath.evaluate("text()", pNode)); 101 } 102 } 103 } 104 } 105 106 Resource inspectorSetResource = resourceSet.createResource(URI.createFileURI(new File(args[1]).getAbsolutePath())); 107 if (inspectorSetResource instanceof XMLResource) { 108 ((XMLResource) inspectorSetResource).setEncoding("UTF-8"); 109 } 110 inspectorSetResource.getContents().add(inspectorSet); 111 inspectorSetResource.save(null); 112 } 113 114 private static InspectorCategory getCategory(List<String> categories, Map<List<String>, InspectorCategory> categoryMap, InspectorSet inspectorSet) { 115 InspectorCategory ret = categoryMap.get(categories); 116 if (ret==null) { 117 ret = ReviewFactory.eINSTANCE.createInspectorCategory(); 118 ret.setName(categories.get(categories.size()-1)); 119 if (categories.size()==1) { 120 inspectorSet.getCategories().add(ret); 121 } else { 122 List<String> pc = new ArrayList<String>(categories); 123 pc.remove(categories.size()-1); 124 getCategory(pc, categoryMap, inspectorSet).getSubCategory().add(ret); 125 } 126 categoryMap.put(categories, ret); 127 } 128 return ret; 129 } 130 131 }