diff --git a/src/icc/ICCLinkFinder.java b/src/icc/ICCLinkFinder.java index 0c4dce9..360175e 100644 --- a/src/icc/ICCLinkFinder.java +++ b/src/icc/ICCLinkFinder.java @@ -1,33 +1,46 @@ package icc; +import java.util.HashSet; +import java.util.Set; + +import com.github.javaparser.ast.CompilationUnit; + import icc.data.ICCLinkFindingResults; import icc.visitors.ActivityVisitor; +import icc.visitors.ContentResolverVisitor; +import icc.visitors.ScopeAwareVisitor; import icc.visitors.ServiceVisitor; import icc.visitors.StaticBroadcastVisitor; import icc.visitors.SymbolTableVisitor; -import com.github.javaparser.ast.CompilationUnit; +/** + * This entity is the main entry-point for the ICC analysis. It is responsible + * for detecting ICC links according to a given compilation unit and a set of + * visitors. + */ +public class ICCLinkFinder { + /** + * Finds inter-component communication links for a compilation unit. + * + * @param cu + * The given compilation unit + * @return Analysis results represented as a {@link ICCLinkFindingResults} + */ + public static ICCLinkFindingResults findICCLinks(CompilationUnit cu) { + ICCLinkFindingResults results = new ICCLinkFindingResults(); + + Set visitors = new HashSet<>(); + visitors.add(new SymbolTableVisitor(results)); + visitors.add(new ActivityVisitor(results)); + visitors.add(new ServiceVisitor(results)); + visitors.add(new StaticBroadcastVisitor(results)); + visitors.add(new ContentResolverVisitor(results)); -public class ICCLinkFinder -{ - public static ICCLinkFindingResults findICCLinks(CompilationUnit cu) - { - ICCLinkFindingResults results = new ICCLinkFindingResults(); - - SymbolTableVisitor sTVisitor = new SymbolTableVisitor(results); - sTVisitor.visit(cu, null); - - ActivityVisitor activityVisitor = new ActivityVisitor(results); - activityVisitor.visit(cu, null); - - ServiceVisitor serviceVisitor = new ServiceVisitor(results); - serviceVisitor.visit(cu, null); + for (ScopeAwareVisitor visitor : visitors) { + visitor.visit(cu, null); + } + results.accessStats(); - StaticBroadcastVisitor staticBroadcastVisitor = new StaticBroadcastVisitor(results); - staticBroadcastVisitor.visit(cu, null); - - results.accessStats(); - - return results; - } + return results; + } } diff --git a/src/icc/visitors/ContentResolverVisitor.java b/src/icc/visitors/ContentResolverVisitor.java new file mode 100644 index 0000000..06c8f9f --- /dev/null +++ b/src/icc/visitors/ContentResolverVisitor.java @@ -0,0 +1,25 @@ +package icc.visitors; + +import java.util.List; + +import com.github.javaparser.ast.expr.Expression; +import com.github.javaparser.ast.expr.MethodCallExpr; + +import icc.data.ICCLinkFindingResults; + +public class ContentResolverVisitor extends BaseVisitor { + + public ContentResolverVisitor(ICCLinkFindingResults data) { + super(data); + } + + @Override + public void visit(MethodCallExpr n, Object arg) { + super.visit(n, arg); + String calleeName = n.getName(); + if ("query".equals(calleeName)) { + List calleeArguments = n.getArgs(); + System.out.println(calleeArguments); + } + } +} diff --git a/test-data/k9/k9-javafiles.txt b/test-data/k9/k9-javafiles.txt new file mode 100644 index 0000000..a68ffd1 --- /dev/null +++ b/test-data/k9/k9-javafiles.txt @@ -0,0 +1,161 @@ +./TracingPowerManager.java +./MessageHeader.java +./InsertableHtmlContent.java +./MimeBodyPart.java +./CheckBoxListPreference.java +./K9AccountReceptor.java +./Folder.java +./Apg.java +./AutoSyncSdk4.java +./AccountSetupAccountType.java +./MediaScannerNotifier.java +./Message.java +./ToggleScrollView.java +./TrustedSocketFactory.java +./EmailReceivedIntent.java +./ActivityListener.java +./ManageIdentities.java +./CountingOutputStream.java +./ContactsSdk3_4.java +./MimeHeader.java +./Prefs.java +./PgpData.java +./Part.java +./AccountSetupIncoming.java +./SizeFormatter.java +./MessageDateComparator.java +./BodyPart.java +./ColorPickerDialog.java +./Base64.java +./Address.java +./UnavailableStorageException.java +./MessageRetrievalListener.java +./LauncherShortcuts.java +./EditIdentity.java +./IAutoSync.java +./BaseAccount.java +./FontSizes.java +./MessageReference.java +./K9RemoteControl.java +./AttachmentProvider.java +./PushReceiver.java +./FontSizeSettings.java +./Body.java +./MailService.java +./SleepService.java +./WebDavStore.java +./Transport.java +./Flag.java +./Utility.java +./EOLConvertingOutputStream.java +./FolderInfoHolder.java +./AttachmentView.java +./BootReceiver.java +./FolderSettings.java +./WebDavTransport.java +./RemoteControlService.java +./MimeUtility.java +./Store.java +./SmtpTransport.java +./MessageWebView.java +./ColorPickerBox.java +./K9.java +./UnavailableAccountException.java +./Contacts.java +./Editor.java +./CoreReceiver.java +./ShutdownReceiver.java +./SpinnerHelper.java +./PeekableInputStream.java +./AuthenticationFailedException.java +./AccountReceiver.java +./None.java +./BinaryTempFileBody.java +./ImapStore.java +./PushService.java +./ImapSettings.java +./LocalStore.java +./SpinnerOption.java +./Regex.java +./TextBody.java +./Pop3Store.java +./FolderList.java +./ColorChip.java +./EmmaInstrumentation.java +./ContactsSdk5.java +./Iso2022JpToShiftJisInputStream.java +./K9PreferenceActivity.java +./AutoSyncSdk3.java +./AccountSetupNames.java +./MessagingListener.java +./PollService.java +./Identity.java +./FetchProfile.java +./StorageGoneReceiver.java +./Account.java +./Accounts.java +./AccountSetupCheckSettings.java +./Preferences.java +./ContactsSdk5p.java +./AccountSetupOutgoing.java +./MessagingException.java +./StorageReceiver.java +./AccountSetupBasics.java +./K9ListActivity.java +./SearchAccount.java +./ChooseIdentity.java +./Base64OutputStream.java +./LineWrapOutputStream.java +./ChooseAccount.java +./AccountSetupOptions.java +./NotificationSetting.java +./FinishListener.java +./Pusher.java +./MessageView.java +./CertificateValidationException.java +./ImapResponseParser.java +./LockableDatabase.java +./AccessibleWebView.java +./Search.java +./DecoderUtil.java +./AccessibleEmailContentActivity.java +./RemoteControlReceiver.java +./AutoSyncHelper.java +./MimeMultipart.java +./MessagingController.java +./TimePickerPreference.java +./AccountSetupComposition.java +./EmailAddressAdapter.java +./TrustManagerFactory.java +./Storage.java +./K9Activity.java +./DateFormatter.java +./K9ExpandableListActivity.java +./EmailAddressValidator.java +./MessagingControllerPushReceiver.java +./StatusOutputStream.java +./MessageRemovalListener.java +./ChooseFolder.java +./MessageList.java +./CoreService.java +./SearchModifier.java +./MessageProvider.java +./MessageInfoHolder.java +./StorageManager.java +./DomainNameChecker.java +./MessageHelper.java +./Multipart.java +./FolderListFilter.java +./SmtpDataStuffing.java +./SMSInstrumentedReceiver.java +./AutoSyncSdk5.java +./MessageCompose.java +./AccountStats.java +./FixedLengthInputStream.java +./HtmlConverter.java +./AccountSettings.java +./CryptoProvider.java +./ProgressListener.java +./InstrumentedActivity.java +./MimeMessage.java +./SearchSpecification.java diff --git a/tests/icc/visitors/ContentResolverVisitorTest.java b/tests/icc/visitors/ContentResolverVisitorTest.java new file mode 100644 index 0000000..78255d8 --- /dev/null +++ b/tests/icc/visitors/ContentResolverVisitorTest.java @@ -0,0 +1,24 @@ +package icc.visitors; + +import static org.junit.Assert.fail; + +import org.junit.Test; + +import com.github.javaparser.ast.CompilationUnit; + +import icc.data.ICCLinkFindingResults; + +public class ContentResolverVisitorTest { + + private static final CompilationUnit compilationUnit = Utils.generateCompilationUnit("Apg.java", + "test-data/k9/src"); + + @Test + public void test() { + ICCLinkFindingResults r = new ICCLinkFindingResults(); + ContentResolverVisitor visitor = new ContentResolverVisitor(r); + visitor.visit(compilationUnit, null); + fail("Not yet implemented"); + } + +} diff --git a/tests/icc/visitors/Utils.java b/tests/icc/visitors/Utils.java new file mode 100644 index 0000000..45f2e69 --- /dev/null +++ b/tests/icc/visitors/Utils.java @@ -0,0 +1,49 @@ +package icc.visitors; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +import com.github.javaparser.JavaParser; +import com.github.javaparser.ParseException; +import com.github.javaparser.ast.CompilationUnit; + +public class Utils { + + // TODO: This could be really reused in the main function. + + /** + * Generates a {@link CompilationUnit} based on the given file and its + * relative parent path. + *

+ * Example:

+ * CompilationUnit cu = generateCompilationUnit("Apg.java", "test-data/k9/src"); + *
+ *

+ * A Runtime Exception will halt the execution if: + *

    + *
  1. file is not well-formed (ie can't be correctly parsed) or
  2. + *
  3. file doesn't exists due to unreachable path
  4. + *
+ * + * @param fileName + * The file name + * @param parentDir + * Relative path to the source code + * @return A parsed compilation unit. + * + */ + public static CompilationUnit generateCompilationUnit(String fileName, String parentDir) { + CompilationUnit compilationUnit = null; + try { + FileInputStream toBeParsed = new FileInputStream(new File(parentDir, fileName)); + compilationUnit = JavaParser.parse(toBeParsed); + + } catch (FileNotFoundException e) { + throw new RuntimeException(String.format("File \"%s/%s\" couldn't be found!", parentDir, fileName)); + } catch (ParseException e) { + throw new RuntimeException(String.format("File named \"%s\" is not well-formed!", fileName)); + } + return compilationUnit; + } +}