Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'releng.wtptools/api/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/violation/APIViolationScanner.java')
-rw-r--r--releng.wtptools/api/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/violation/APIViolationScanner.java527
1 files changed, 0 insertions, 527 deletions
diff --git a/releng.wtptools/api/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/violation/APIViolationScanner.java b/releng.wtptools/api/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/violation/APIViolationScanner.java
deleted file mode 100644
index 2c234beee..000000000
--- a/releng.wtptools/api/org.eclipse.wtp.releng.tools.component.core/src/org/eclipse/wtp/releng/tools/component/api/violation/APIViolationScanner.java
+++ /dev/null
@@ -1,527 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.wtp.releng.tools.component.api.violation;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jdt.core.util.ClassFormatException;
-import org.eclipse.wtp.releng.tools.component.CommandOptionParser;
-import org.eclipse.wtp.releng.tools.component.IClassVisitor;
-import org.eclipse.wtp.releng.tools.component.ILocation;
-import org.eclipse.wtp.releng.tools.component.ILocationVisitor;
-import org.eclipse.wtp.releng.tools.component.api.ClassUse;
-import org.eclipse.wtp.releng.tools.component.api.ComponentUse;
-import org.eclipse.wtp.releng.tools.component.api.ComponentXMLVisitor;
-import org.eclipse.wtp.releng.tools.component.api.Source;
-import org.eclipse.wtp.releng.tools.component.images.ImagesUtil;
-import org.eclipse.wtp.releng.tools.component.internal.ComponentDepends;
-import org.eclipse.wtp.releng.tools.component.internal.ComponentXML;
-import org.eclipse.wtp.releng.tools.component.internal.FileLocation;
-import org.eclipse.wtp.releng.tools.component.internal.Location;
-import org.eclipse.wtp.releng.tools.component.internal.Package;
-import org.eclipse.wtp.releng.tools.component.internal.Plugin;
-import org.eclipse.wtp.releng.tools.component.internal.Type;
-import org.eclipse.wtp.releng.tools.component.xsl.XSLUtil;
-
-public class APIViolationScanner implements IClassVisitor
-{
- private Collection src;
- private Collection api;
- private String outputDir;
- private Collection includes;
- private Collection excludes;
- private boolean classRefOnly;
- private boolean debug;
- private boolean html;
- private String xsl;
-
- public String getOutputDir()
- {
- return outputDir;
- }
-
- public void setOutputDir(String outputDir)
- {
- this.outputDir = addTrailingSeperator(outputDir);
- }
-
- public Collection getSrc()
- {
- return src;
- }
-
- public void setSrc(Collection src)
- {
- this.src = src;
- }
-
- public Collection getApi()
- {
- return api;
- }
-
- public void setApi(Collection api)
- {
- this.api = api;
- }
-
- public Collection getIncludes()
- {
- return includes;
- }
-
- public void setIncludes(Collection includes)
- {
- this.includes = includes;
- }
-
- public Collection getExcludes()
- {
- return excludes;
- }
-
- public void setExcludes(Collection excludes)
- {
- this.excludes = excludes;
- }
-
- public boolean isClassRefOnly()
- {
- return classRefOnly;
- }
-
- public void setClassRefOnly(boolean classRefOnly)
- {
- this.classRefOnly = classRefOnly;
- }
-
- public boolean isDebug()
- {
- return debug;
- }
-
- public void setDebug(boolean debug)
- {
- this.debug = debug;
- }
-
- public boolean isHtml()
- {
- return html;
- }
-
- public void setHtml(boolean html)
- {
- this.html = html;
- }
-
- public String getXsl()
- {
- return xsl;
- }
-
- public void setXsl(String xsl)
- {
- this.xsl = xsl;
- }
- private Map pluginId2CompXML = new HashMap();
-
- public void execute()
- {
- // Collect component.xml files
- for (Iterator i = api.iterator(); i.hasNext();)
- {
- String locationString = (String)i.next();
- ILocation apiLocation = Location.createLocation(new File(locationString));
- ComponentXMLVisitor compXMLVisitor = new ComponentXMLVisitor();
- if (apiLocation == null) {
- System.out.println("ERROR - Can't find location at: "+locationString);
- continue;
- }
- apiLocation.accept(compXMLVisitor);
- for (Iterator it = compXMLVisitor.getCompXMLs().iterator(); it.hasNext();)
- {
- ComponentXML compXML = (ComponentXML)it.next();
- for (Iterator it2 = compXML.getPlugins().iterator(); it2.hasNext();)
- {
- pluginId2CompXML.put(((Plugin)it2.next()).getId(), compXML);
- }
- }
- }
- for (Iterator it = src.iterator(); it.hasNext();)
- {
- // Visit all .class files
- visit1 = true;
- ILocation srcLocation = Location.createLocation(new File((String)it.next()));
- LibVisitor libVisitor = new LibVisitor();
- srcLocation.accept(libVisitor);
- libVisitor.setClassVisitor(this);
- // 1st visit is to recreate the plugin to packages map
- srcLocation.accept(libVisitor);
- visit1 = false;
- // 2nd visit is to scan .class for API violations
- srcLocation.accept(libVisitor);
- }
- try
- {
- if (cachedCompUse != null)
- cachedCompUse.save();
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
- if (isHtml())
- {
- ImagesUtil.copyAll(outputDir);
- genHTML();
- }
- }
-
- private void genHTML()
- {
- final StringBuffer summary = new StringBuffer();
- summary.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
- summary.append("<root>");
- ILocation outputLoc = Location.createLocation(new File(outputDir));
- outputLoc.accept(new ILocationVisitor()
- {
- public boolean accept(ILocation location)
- {
- if (location.getName().endsWith("api-violation.xml"))
- {
- try
- {
- XSLUtil.transform
- (
- xsl != null && xsl.length() > 0 ? Location.createLocation(new File(xsl)).getInputStream() : ClassLoader.getSystemResourceAsStream("org/eclipse/wtp/releng/tools/component/xsl/api-violation.xsl"),
- location.getInputStream(),
- new FileOutputStream(((FileLocation)location.createSibling("api-violation.html")).getFile())
- );
- }
- catch (Throwable e)
- {
- try
- {
- XSLUtil.transform
- (
- Platform.getBundle("org.eclipse.wtp.releng.tools.component.core").getResource("org/eclipse/wtp/releng/tools/component/xsl/api-violation.xsl").openStream(),
- location.getInputStream(),
- new FileOutputStream(((FileLocation)location.createSibling("api-violation.html")).getFile())
- );
- }
- catch (Throwable e2)
- {
- e2.printStackTrace();
- }
- }
- summary.append("<violation file=\"");
- summary.append(location.getAbsolutePath().substring(outputDir.length()));
- summary.append("\"/>");
- }
- return true;
- }
- });
- summary.append("</root>");
- try
- {
- XSLUtil.transform
- (
- ClassLoader.getSystemResourceAsStream("org/eclipse/wtp/releng/tools/component/xsl/api-violation-summary.xsl"),
- new ByteArrayInputStream(summary.toString().getBytes()),
- new FileOutputStream(new File(outputDir + "/api-violation-summary.html")),
- outputDir
- );
- }
- catch (Throwable e)
- {
- try
- {
- XSLUtil.transform
- (
- Platform.getBundle("org.eclipse.wtp.releng.tools.component.core").getResource("org/eclipse/wtp/releng/tools/component/xsl/api-violation-summary.xsl").openStream(),
- new ByteArrayInputStream(summary.toString().getBytes()),
- new FileOutputStream(new File(outputDir + "/api-violation-summary.html")),
- outputDir
- );
- }
- catch (Throwable e2)
- {
- e2.printStackTrace();
- }
- }
- }
-
- private boolean visit1 = true;
-
- public boolean visit(String pluginId, ILocation classLoc)
- {
- if (visit1)
- return visit1(pluginId, classLoc);
- else
- return visit2(pluginId, classLoc);
- }
- private Map pluginId2Pkgs = new HashMap();
-
- private boolean visit1(String pluginId, ILocation classLoc)
- {
- String className = classLoc.getName();
- className = className.substring(0, className.length() - ".class".length());
- className = className.replace('/', '.');
- className = className.replace('\\', '.');
- int i = className.lastIndexOf('.');
- String packageName = (i != -1) ? className.substring(0, i) : "";
- List pkgs = (List)pluginId2Pkgs.get(pluginId);
- if (pkgs == null)
- {
- pkgs = new ArrayList();
- pluginId2Pkgs.put(pluginId, pkgs);
- }
- if (!pkgs.contains(packageName))
- pkgs.add(packageName);
- return true;
- }
- private Class2Reference class2Ref = new Class2Reference();
-
- private boolean visit2(String pluginId, ILocation classLoc)
- {
- try
- {
- ComponentUse compUse = getComponentUse(pluginId);
- class2Ref.setIncludes(getIncludes());
- class2Ref.setExcludes(getExcludes());
- class2Ref.setClassRefOnly(isClassRefOnly());
- class2Ref.setDebug(isDebug());
- Source uses = class2Ref.visit(classLoc);
- // remove reference to classes in the same component
- removeSelfRefs(pluginId, uses);
- // remove valid API reference to classes in other components
- for (Iterator it = getDependCompXML(pluginId).iterator(); it.hasNext();)
- removeAPIUses((ComponentXML)it.next(), uses);
- if (!uses.getClassUses().isEmpty())
- compUse.addSource(uses);
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
- catch (ClassFormatException e)
- {
- throw new RuntimeException(e);
- }
- return true;
- }
-
- private void removeSelfRefs(String pluginId, Source source)
- {
- removeSelfRefs2(pluginId, source);
- ComponentXML compXML = (ComponentXML)pluginId2CompXML.get(pluginId);
- if (compXML != null)
- {
- for (Iterator it = compXML.getPlugins().iterator(); it.hasNext();)
- {
- String id = ((Plugin)it.next()).getId();
- if (!id.equals(pluginId))
- {
- removeSelfRefs2(id, source);
- }
- }
- }
- }
-
- private void removeSelfRefs2(String pluginId, Source source)
- {
- List pkgs = (List)pluginId2Pkgs.get(pluginId);
- if (pkgs != null)
- {
- for (Iterator it = new ArrayList(source.getClassUses()).iterator(); it.hasNext();)
- {
- ClassUse classUse = (ClassUse)it.next();
- String className = classUse.getName();
- int i = className.lastIndexOf('.');
- String packageName = (i != -1) ? className.substring(0, i) : "";
- if (pkgs.contains(packageName))
- source.removeClassUse(classUse);
- }
- }
- }
-
- private Collection getDependCompXML(String pluginId)
- {
- List compXMLs = new ArrayList();
- ComponentXML thisCompXML = (ComponentXML)pluginId2CompXML.get(pluginId);
- if (thisCompXML != null)
- {
- ComponentDepends depends = thisCompXML.getComponentDepends();
- boolean unrestricted = (depends != null) ? depends.isUnrestricted() : false;
- Collection compRefs = (depends != null) ? depends.getComponentRefs() : new ArrayList(0);
- for (Iterator it = pluginId2CompXML.values().iterator(); it.hasNext();)
- {
- ComponentXML compXML = (ComponentXML)it.next();
- if (compXML != thisCompXML)
- {
- if (unrestricted || compRefs.contains(compXML.getName()))
- {
- compXMLs.add(compXML);
- }
- }
- }
- }
- else
- {
- compXMLs.addAll(pluginId2CompXML.values());
- }
- return compXMLs;
- }
-
- private void removeAPIUses(ComponentXML compXML, Source source)
- {
- for (Iterator it = new ArrayList(source.getClassUses()).iterator(); it.hasNext();)
- {
- ClassUse classUse = (ClassUse)it.next();
- if (validateUse(compXML, classUse))
- {
- source.removeClassUse(classUse);
- }
- }
- }
-
- private boolean validateUse(ComponentXML compXML, ClassUse classUse)
- {
- String className = classUse.getName();
- int i = className.lastIndexOf('.');
- String packageName = (i != -1) ? className.substring(0, i) : "";
- String localName = (i != -1) ? className.substring(i + 1) : className;
- Package pkg = compXML.getPackage(packageName);
- if (pkg != null)
- {
- Type type = pkg.getType(localName);
- if (type != null)
- {
- if (!classUse.isReference() || type.isReference())
- if (!classUse.isSubclass() || type.isSubclass())
- if (!classUse.isImplement() || type.isImplement())
- if (!classUse.isInstantiate() || type.isInstantiate())
- return true;
- return false;
- }
- else
- {
- return pkg.isApi();
- }
- }
- return false;
- }
-
- private ComponentUse cachedCompUse;
-
- private ComponentUse getComponentUse(String pluginId) throws IOException
- {
- ComponentXML compXML = (ComponentXML)pluginId2CompXML.get(pluginId);
- String compId = (compXML != null) ? compXML.getName() : pluginId;
- if (cachedCompUse != null)
- {
- if (cachedCompUse.getName().equals(compId))
- {
- return cachedCompUse;
- }
- else
- {
- cachedCompUse.save();
- }
- }
- StringBuffer sb = new StringBuffer(outputDir);
- sb.append(compId);
- sb.append("/api-violation.xml");
- File file = new File(sb.toString());
- cachedCompUse = new ComponentUse();
- cachedCompUse.setName(compId);
- cachedCompUse.setLocation(new FileLocation(file));
- if (file.exists())
- {
- cachedCompUse.load();
- }
- return cachedCompUse;
- }
-
- protected String addTrailingSeperator(String s)
- {
- if (s != null && !s.endsWith("/") && !s.endsWith("\\"))
- {
- StringBuffer sb = new StringBuffer(s);
- sb.append('/');
- return sb.toString();
- }
- else
- {
- return s;
- }
- }
-
- public static void main(String[] args)
- {
- CommandOptionParser optionParser = new CommandOptionParser(args);
- Map options = optionParser.getOptions();
- Collection src = (Collection)options.get("src");
- Collection api = (Collection)options.get("api");
- Collection outputDir = (Collection)options.get("outputDir");
- Collection includes = (Collection)options.get("includes");
- Collection excludes = (Collection)options.get("excludes");
- Collection classRefOnly = (Collection)options.get("classRefOnly");
- Collection debug = (Collection)options.get("debug");
- Collection html = (Collection)options.get("html");
- Collection xsl = (Collection)options.get("xsl");
- if (src == null || api == null || outputDir == null || src.isEmpty() || api.isEmpty() || outputDir.isEmpty())
- {
- printUsage();
- System.exit(-1);
- }
- APIViolationScanner vioScanner = new APIViolationScanner();
- vioScanner.setSrc(src);
- vioScanner.setApi(api);
- vioScanner.setOutputDir((String)outputDir.iterator().next());
- vioScanner.setIncludes(includes);
- vioScanner.setExcludes(excludes);
- vioScanner.setClassRefOnly(classRefOnly != null);
- vioScanner.setDebug(debug != null);
- vioScanner.setHtml(html != null);
- vioScanner.setXsl(xsl != null && !xsl.isEmpty() ? (String)xsl.iterator().next() : null);
- vioScanner.execute();
- }
-
- private static void printUsage()
- {
- System.out.println("Usage: java org.eclipse.wtp.releng.tools.component.violation.APIViolationScanner -src <src> -api <api> -outputDir <outputDir> [-options]");
- System.out.println("");
- System.out.println("\t-src\t\t<src>\t\tlocation of a Eclipse-based product");
- System.out.println("\t-api\t\t<api>\t\tlocation of your component.xml");
- System.out.println("\t-outputDir\t<outputDir>\toutput directory of component.xml files");
- System.out.println("");
- System.out.println("where options include:");
- System.out.println("");
- System.out.println("\t-includes\t<includes>\tspace seperated packages to include");
- System.out.println("\t-excludes\t<excludes>\tspace seperated packages to exclude");
- System.out.println("\t-classRefOnly\t\t\ttreat all violations as class reference");
- System.out.println("\t-debug\t\t\t\tgenerate debug information (ex. line numbers)");
- System.out.println("\t-html\t\t\tgenerate HTML results");
- System.out.println("\t-xsl\t<xsl>\tuse your own stylesheet. You must specify the -html option");
- }
-} \ No newline at end of file

Back to the top