Skip to content

Commit

Permalink
WINDUP-680: Java API Incorrectly Processes Interfaces & WINDUP-681: J…
Browse files Browse the repository at this point in the history
…ava API Should Provide Marker for Type: Interface, Class
  • Loading branch information
jsight committed Jul 7, 2015
1 parent 8f4fe90 commit 0469142
Show file tree
Hide file tree
Showing 26 changed files with 574 additions and 258 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -601,6 +601,9 @@ public boolean visit(TypeDeclaration node)
{
if (List.class.isAssignableFrom(clzInterfaces.getClass()))
{
TypeReferenceLocation typeReferenceLocation = node.isInterface() ? TypeReferenceLocation.INHERITANCE
: TypeReferenceLocation.IMPLEMENTS_TYPE;

List<?> clzInterfacesList = (List<?>) clzInterfaces;
for (Object clzInterface : clzInterfacesList)
{
Expand All @@ -612,7 +615,7 @@ public boolean visit(TypeDeclaration node)
{
ResolveClassnameResult result = resolveClassname(simpleType.getName().toString());
ResolutionStatus status = result.found ? ResolutionStatus.RECOVERED : ResolutionStatus.UNRESOLVED;
processTypeAsString(result.result, status, TypeReferenceLocation.IMPLEMENTS_TYPE,
processTypeAsString(result.result, status, typeReferenceLocation,
compilationUnit.getLineNumber(node.getStartPosition()),
compilationUnit.getColumnNumber(node.getStartPosition()),
node.getLength(), extractDefinitionLine(node.toString()));
Expand All @@ -627,8 +630,7 @@ public boolean visit(TypeDeclaration node)
while (!stack.isEmpty())
{
resolvedSuperInterface = stack.pop();
processTypeBinding(resolvedSuperInterface, ResolutionStatus.RESOLVED,
TypeReferenceLocation.IMPLEMENTS_TYPE,
processTypeBinding(resolvedSuperInterface, ResolutionStatus.RESOLVED, typeReferenceLocation,
compilationUnit.getLineNumber(node.getStartPosition()),
compilationUnit.getColumnNumber(node.getStartPosition()), node.getLength(),
extractDefinitionLine(node.toString()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,6 @@ public void testHelloWorld()
List<ClassReference> references = ASTProcessor.analyze(getLibraryPaths(), getSourcePaths(),
Paths.get("src/test/resources/testclasses/helloworld/HelloWorld.java"));

for (ClassReference reference : references)
{
System.out.println("Reference: " + reference);
}
Assert.assertTrue(references.contains(
new ClassReference("testclasses.helloworld.HelloWorld", ResolutionStatus.RESOLVED, TypeReferenceLocation.TYPE, 3, 0, 174,
"public class HelloWorld {")));
Expand Down Expand Up @@ -56,10 +52,6 @@ public void testSimpleMain()
List<ClassReference> references = ASTProcessor.analyze(getLibraryPaths(), getSourcePaths(),
Paths.get("src/test/resources/testclasses/simple/Main.java"));

for (ClassReference reference : references)
{
System.out.println("Reference: " + reference);
}
Assert.assertTrue(references.contains(
new ClassReference("testclasses.simple.MyBClass", ResolutionStatus.RESOLVED, TypeReferenceLocation.VARIABLE_DECLARATION, 9, 8,
28,
Expand All @@ -84,11 +76,6 @@ public void testMyBClass()
List<ClassReference> references = ASTProcessor.analyze(getLibraryPaths(), getSourcePaths(),
Paths.get("src/test/resources/testclasses/simple/MyBClass.java"));

for (ClassReference reference : references)
{
System.out.println("Reference: " + reference);
}

Assert.assertTrue(references.contains(
new ClassReference("testclasses.simple.MyBClass", ResolutionStatus.RESOLVED, TypeReferenceLocation.TYPE, 4, 0, 161,
"public class MyBClass extends MyAClass {")));
Expand All @@ -103,10 +90,6 @@ public void testMyAClass()
List<ClassReference> references = ASTProcessor.analyze(getLibraryPaths(), getSourcePaths(),
Paths.get("src/test/resources/testclasses/simple/MyAClass.java"));

for (ClassReference reference : references)
{
System.out.println("Reference: " + reference);
}
Assert.assertTrue(references.contains(
new ClassReference("testclasses.simple.MyAClass", ResolutionStatus.RESOLVED, TypeReferenceLocation.TYPE, 3, 0, 128,
"public class MyAClass implements SomeInterface {")));
Expand All @@ -122,10 +105,6 @@ public void testJavaLangReferences()
List<ClassReference> references = ASTProcessor.analyze(getLibraryPaths(), getSourcePaths(),
Paths.get("src/test/resources/testclasses/javalang/JavaLangReferences.java"));

for (ClassReference reference : references)
{
System.out.println("Reference: " + reference);
}
Assert.assertTrue(references.contains(
new ClassReference("testclasses.javalang.JavaLangReferences", ResolutionStatus.RESOLVED, TypeReferenceLocation.TYPE, 3, 0, 191,
"public class JavaLangReferences {")));
Expand All @@ -147,10 +126,6 @@ public void testWildcardImport()
{
List<ClassReference> references = ASTProcessor.analyze(getLibraryPaths(), getSourcePaths(),
Paths.get("src/test/resources/testclasses/simple/ExampleWildcardImport.java"));
for (ClassReference reference : references)
{
System.out.println("Reference: " + reference);
}

Assert.assertTrue(references.contains(new ClassReference("java.util.*", ResolutionStatus.RESOLVED, TypeReferenceLocation.IMPORT, 10, 7, 9,
"import java.util.*;")));
Expand All @@ -165,10 +140,6 @@ public void testNonImportedFQCN()
{
List<ClassReference> references = ASTProcessor.analyze(getLibraryPaths(), getSourcePaths(),
Paths.get("src/test/resources/testclasses/simple/FullNonImportedFQCNNotOnClasspath.java"));
for (ClassReference reference : references)
{
System.out.println("Reference: " + reference);
}

Assert.assertTrue(references.contains(new ClassReference("com.proprietary.Constants.MY_CONSTANT", ResolutionStatus.RECOVERED,
TypeReferenceLocation.VARIABLE_INITIALIZER,
Expand All @@ -177,4 +148,14 @@ public void testNonImportedFQCN()
TypeReferenceLocation.VARIABLE_INITIALIZER,
6, 4, 49, "private int foo2=OtherConstants.OTHER_CONSTANT;")));
}

@Test
public void testInterfaceExtension()
{
List<ClassReference> references = ASTProcessor.analyze(getLibraryPaths(), getSourcePaths(),
Paths.get("src/test/resources/testclasses/simple/EventServer.java"));

Assert.assertTrue(references.contains(new ClassReference("java.rmi.Remote", ResolutionStatus.RESOLVED, TypeReferenceLocation.INHERITANCE,
6, 0, 117, "public interface EventServer extends Remote {")));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package testclasses.simple;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface EventServer extends Remote
{
public String processEvent(String event) throws RemoteException;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package org.jboss.windup.reporting.rules.generation;

import java.util.HashMap;
import java.util.Map;

import org.jboss.windup.config.AbstractRuleProvider;
import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.config.metadata.MetadataBuilder;
import org.jboss.windup.config.operation.GraphOperation;
import org.jboss.windup.config.phase.ReportGenerationPhase;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.model.ProjectModel;
import org.jboss.windup.graph.model.WindupVertexFrame;
import org.jboss.windup.graph.service.WindupConfigurationService;
import org.jboss.windup.reporting.model.ApplicationReportModel;
import org.jboss.windup.reporting.model.TemplateType;
import org.jboss.windup.reporting.service.ApplicationReportService;
import org.jboss.windup.reporting.service.ReportService;
import org.ocpsoft.rewrite.config.Configuration;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
import org.ocpsoft.rewrite.context.EvaluationContext;

/**
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*/
public class CreateProblemCentricReportRuleProvider extends AbstractRuleProvider
{

public static final String TEMPLATE_PATH = "/reports/templates/problem-centric-report.ftl";

public CreateProblemCentricReportRuleProvider()
{
super(MetadataBuilder.forProvider(CreateProblemCentricReportRuleProvider.class)
.setPhase(ReportGenerationPhase.class));
}

@Override
public Configuration getConfiguration(GraphContext context)
{
return ConfigurationBuilder.begin()
.addRule()
.perform(new CreateProblemCentricReportOperation());
}

private class CreateProblemCentricReportOperation extends GraphOperation
{
@Override
public void perform(GraphRewrite event, EvaluationContext context)
{
// get all classifications
// get all hints
// group them by a title of some kind (classification and hint title)
// do something interesting with this information :)

ApplicationReportService applicationReportService = new ApplicationReportService(event.getGraphContext());
ApplicationReportModel report = applicationReportService.create();
report.setReportPriority(110);
report.setDisplayInApplicationReportIndex(true);
report.setReportName("Migration Issues");
report.setTemplatePath(TEMPLATE_PATH);
report.setTemplateType(TemplateType.FREEMARKER);

ProjectModel projectModel = WindupConfigurationService.getConfigurationModel(event.getGraphContext()).getInputPath().getProjectModel();
report.setProjectModel(projectModel);

Map<String, WindupVertexFrame> additionalData = new HashMap<>(4);
report.setRelatedResource(additionalData);

ReportService reportService = new ReportService(event.getGraphContext());
reportService.setUniqueFilename(report, "problem_centric_report", "html");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<!DOCTYPE html>
<html lang="en">

<#assign applicationReportIndexModel = reportModel.applicationReportIndexModel>

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>${reportModel.projectModel.name} - Migration Issues</title>
<link href="resources/css/bootstrap.min.css" rel="stylesheet">
<link href="resources/css/windup.css" rel="stylesheet" media="screen">
<link href="resources/css/windup.java.css" rel="stylesheet" media="screen">
</head>
<body role="document">
<!-- Navbar -->
<div class="navbar navbar-default navbar-fixed-top">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-responsive-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>

<div class="navbar-collapse collapse navbar-responsive-collapse">
<ul class="nav navbar-nav">
<#include "include/navbar.ftl">
</ul>
</div><!-- /.nav-collapse -->
</div>
<!-- / Navbar -->

<div class="container-fluid" role="main">
<div class="row">
<div class="page-header page-header-no-border">
<h1>Application Report <span class="slash">/</span><small style="margin-left: 20px; font-weight: 100;">${reportModel.projectModel.name}</small></h1>
</div>
</div>

<div class="row">
<!-- Breadcrumbs -->
<div class="container-fluid">
<ol class="breadcrumb top-menu">
<li><a href="../index.html">All Applications</a></li>
<#include "include/breadcrumbs.ftl">
</ol>
</div>
<!-- / Breadcrumbs -->
</div>

<div class="row">
Proprietary IBM JMS Class
</div>
<div class="row">
Number of incidents
</div>

<script src="resources/js/jquery-1.10.1.min.js"></script>
<script src="resources/js/bootstrap.min.js"></script>
</div>
</body>
</html>
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
@TypeValue(EjbRemoteServiceModel.TYPE)
public interface EjbRemoteServiceModel extends RemoteServiceModel
{
public static final String TYPE = "EjbRemoteService";
public static final String TYPE = "EjbRemoteService";
public static final String EJB_IMPLEMENTATION_CLASS = "ejbImplementationClass";
public static final String EJB_INTERFACE = "ejbRemoteInterface";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
package org.jboss.windup.rules.apps.javaee.model;

public enum EnvironmentReferenceTagType
{
RESOURCE_ENV_REF("resource-env-ref"), RESOURCE_REF("resource-ref"), EJB_REF("ejb-ref"), EJB_LOCAL_REF("ejb-local-ref"), MSG_DESTINATION_REF(
"message-destination-ref");

public enum EnvironmentReferenceTagType {
RESOURCE_ENV_REF("resource-env-ref"), RESOURCE_REF("resource-ref"), EJB_REF("ejb-ref"), EJB_LOCAL_REF("ejb-local-ref"), MSG_DESTINATION_REF("message-destination-ref");

private final String tag;

private EnvironmentReferenceTagType(String tag)
{
this.tag = tag;
}

public String getTag()
{
return tag;
}

public String toString() {

public String toString()
{
return name();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -84,19 +84,20 @@ private String getAnnotationLiteralValue(JavaAnnotationTypeReferenceModel model,

private void extractMetadata(GraphRewrite event, JavaTypeReferenceModel typeReference)
{
//sets to decompile
((SourceFileModel) typeReference.getFile()).setGenerateSourceReport(true);
// sets to decompile
((SourceFileModel) typeReference.getFile()).setGenerateSourceReport(true);
JavaAnnotationTypeReferenceModel jaxRSAnnotationTypeReference = (JavaAnnotationTypeReferenceModel) typeReference;

String pathName = getAnnotationLiteralValue(jaxRSAnnotationTypeReference, "value");

GraphService<JaxRSWebServiceModel> jaxRSService = new GraphService<>(event.getGraphContext(), JaxRSWebServiceModel.class);
JaxRSWebServiceModel jaxWebService = jaxRSService.create();
jaxWebService.setPath(pathName);

JavaClassModel jcm = getJavaClass(typeReference);
if(jcm != null) {
jaxWebService.setImplementationClass(jcm);
if (jcm != null)
{
jaxWebService.setImplementationClass(jcm);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,32 +91,34 @@ private void extractMetadata(GraphRewrite event, JavaTypeReferenceModel typeRefe

JavaClassModel jcm = getJavaClass(typeReference);

//first, find out if it implements an interface.
//TODO: handle the interface only case, where clients exist but no implementation
if(!jcm.getImplements().iterator().hasNext()) {
return;
// first, find out if it implements an interface.
// TODO: handle the interface only case, where clients exist but no implementation
if (!jcm.getInterfaces().iterator().hasNext())
{
return;
}
LOG.info("Processing: "+typeReference);
//sets to decompile
((SourceFileModel) typeReference.getFile()).setGenerateSourceReport(true);

LOG.info("Processing: " + typeReference);
// sets to decompile
((SourceFileModel) typeReference.getFile()).setGenerateSourceReport(true);
JavaAnnotationTypeReferenceModel jaxWsAnnotationTypeReference = (JavaAnnotationTypeReferenceModel) typeReference;

String endpointInterface = getAnnotationLiteralValue(jaxWsAnnotationTypeReference, "endpointInterface");


JaxWSWebServiceModel jaxWebService = jaxWsService.create();
if(StringUtils.isNotBlank(endpointInterface)) {
JavaClassModel epi = jcs.getOrCreatePhantom(endpointInterface);
for(JavaSourceFileModel source : jcs.getJavaSource(epi.getQualifiedName())) {
source.setGenerateSourceReport(true);
}
jaxWebService.setInterface(epi);
if (StringUtils.isNotBlank(endpointInterface))
{
JavaClassModel epi = jcs.getOrCreatePhantom(endpointInterface);
for (JavaSourceFileModel source : jcs.getJavaSource(epi.getQualifiedName()))
{
source.setGenerateSourceReport(true);
}
jaxWebService.setInterface(epi);
}

if(jcm != null) {
jaxWebService.setImplementationClass(jcm);

if (jcm != null)
{
jaxWebService.setImplementationClass(jcm);
}
}

Expand Down

0 comments on commit 0469142

Please sign in to comment.