This repository was archived by the owner on Mar 11, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
deadcode4j v1.5: Features
Sebastian Kirsch edited this page Jun 26, 2014
·
2 revisions
deadcode4j takes several approaches to analyze if a class is still in use or not:
- statical code analysis using Javassist, recognizing class dependencies1
- parsing Spring XML files: files ending with
.xmlare examined- each
beanelement'sclassattribute is treated as live code -
CXF endpoint definitions: each
endpointelement'simplementor/implementorClassattribute is treated as live code -
Quartz job definitions: each
propertyelement'sclassattribute is treated as live code if it has annameattribute ofjobClass -
Spring View resolvers: each
propertyelement'sclassattribute is treated as live code if it has annameattribute ofviewClass - recognizes Spring XML NamespaceHandlers as live code
- each
- recognizing classes annotated with those Spring annotations as live code:
org.springframework.context.annotation.Configurationorg.springframework.jmx.export.annotation.ManagedResourceorg.springframework.stereotype.Componentorg.springframework.stereotype.Controllerorg.springframework.stereotype.Serviceorg.springframework.stereotype.Repository
- parsing
web.xml- recognizing listed listeners, filters & servlets (according to the XSD files)
- look for the parameters defined by Spring's ContextLoader and FrameworkServlet:
contextClass&contextInitializerClasses, treating the configured classes as live code - if the
metadata-completeattribute isn't explicitly set tofalse:- implementations of
javax.servlet.ServletContainerInitializerare treated as live code - implementations of
org.springframework.web.WebApplicationInitializerare treated as live code
- implementations of
- parsing
*.tldfiles: recognizing custom tags, tag extra infos, listeners, tag library validators & EL functions - parsing
faces-config.xmlfiles: recognizing those element classes as live code:action-listener,application-factory,attribute-class,base-name,behavior-class,client-behavior-renderer-class,component-class,converter-class,converter-for-class,el-resolver,exception-handler-factory,external-context-factory,facelet-cache-factory,faces-config-value-classType,faces-context-factory,flash-factory,flow-handler-factory,key-class,lifecycle-factory,managed-bean-class,navigation-handler,partial-view-context-factory,phase-listener,property-class,property-resolver,referenced-bean-class,render-kit-class,render-kit-factory,renderer-class,resource-handler,source-class,state-manager,system-event-class,system-event-listener-class,tag-handler-delegate-factory,validator-class,value-class,variable-resolver,view-declaration-language-factory,view-handler,visit-context-factory - recognizing classes annotated with JEE annotations as live code:
javax.annotation.ManagedBeanjavax.inject.Namedjavax.persistence.metamodel.StaticMetamodel- JAXB annotation
javax.xml.bind.annotation.XmlRegistry - JAXB annotation
javax.xml.bind.annotation.XmlSchema -
JSF annotations
javax.faces.component.behavior.FacesBehavior,javax.faces.convert.FacesConverter,javax.faces.event.ListenerFor,javax.faces.event.ListenersFor,javax.faces.event.NamedEvent,javax.faces.render.FacesBehaviorRenderer,javax.faces.render.FacesRenderer,javax.faces.validator.FacesValidator,javax.faces.view.facelets.FaceletsResourceResolver
- parsing Spring Web Flow XML: files ending with
.xmlare examined- each
attributeelement'stypeattribute is treated as live code - each
evaluateelement'sresult-typeattribute is treated as live code - each
inputelement'stypeattribute is treated as live code - each
outputelement'stypeattribute is treated as live code - each
setelement'stypeattribute is treated as live code - each
varelement'sclassattribute is treated as live code
- each
- parsing Apache Tiles XML definition files: files ending with
.xmlare examined- each
definitionelement'spreparerattribute is treated as live code - each
beanelement'sclasstypeattribute is treated as live code - each
itemelement'sclasstypeattribute is treated as live code
- each
- processing Hibernate Annotations
- recognizing the
strategyvalue of theorg.hibernate.annotations.GenericGeneratorannotation as live code- issue a warning if a
@GenericGeneratoris defined more than once with the samename
- issue a warning if a
- recognizing classes annotated with
org.hibernate.annotations.GenericGeneratorthat are referenced by another class viajavax.persistence.GeneratedValueannotation'sgeneratorvalue as live code - recognizing the
typevalue of theorg.hibernate.annotations.Typeannotation as live code - recognizing classes annotated with a
org.hibernate.annotations.TypeDefthat are referenced by another class in the project as live code- issue a warning if a
@TypeDefis defined more than once with the samename
- issue a warning if a
- recognizing the
- recognizing
*Descriptorclasses being generated by Castor as live code - recognizing service classes defined within Axis
.wsddfiles as live code - recognizing aspects defined within
aop.xmlas live code; supports both AspectJ and AspectWerkz
- recognizing classes annotated with custom specified annotations as live code
- recognizing classes directly2 implementing custom specified interfaces as live code
- recognizing classes directly3 extending custom specified classes as live code
- custom XML file parsing: treating classes referenced in elements' text or attributes as live code
1 Inner classes are always recognized as being referenced by the outer class and vice versa (even static inner classes). This is not only true for the currently used Javassist, but also for BCEL. This suggests that this is an aspect of the JVM spec.
2 When examiningclass C extends B implements A, onlyBis recognized as implementingA; you can circumvent this by definingC extends B implements A
3 When examiningclass C extends B extends A, onlyBis recognized as subclass ofA; no circumvention here - create an issue if you think this is absolutely required!