diff --git a/package.json b/package.json index 469dd8853..b8066551e 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,12 @@ "test": "lerna run test", "fix": "run-s fix:lerna fix:android", "fix:lerna": "lerna run fix", - "fix:android": "./scripts/google-java-format.sh fix", + "fix:android": "run-s 'java:format fix' java:pmd", "lint": "run-s lint:lerna lint:android", "lint:lerna": "lerna run lint", - "lint:android": "./scripts/google-java-format.sh lint", + "lint:android": "run-s 'java:format lint' java:pmd", + "java:format": "./scripts/google-java-format.sh", + "java:pmd": "./scripts/pmd.sh", "run-ios": "cd samples/react-native && yarn react-native run-ios", "run-android": "cd samples/react-native && yarn react-native run-android", "set-version-samples": "lerna run set-version" @@ -23,6 +25,7 @@ "google-java-format": "^1.4.0", "lerna": "^8.1.8", "npm-run-all2": "^6.2.2", + "pmd-bin": "^2.5.0", "prettier": "^2.0.5", "react-native-version": "^4.0.0", "replace-in-file": "^7.0.1" diff --git a/packages/core/android/src/main/java/io/sentry/react/RNSentryBreadcrumb.java b/packages/core/android/src/main/java/io/sentry/react/RNSentryBreadcrumb.java index a8041fe82..cc5bf0fb2 100644 --- a/packages/core/android/src/main/java/io/sentry/react/RNSentryBreadcrumb.java +++ b/packages/core/android/src/main/java/io/sentry/react/RNSentryBreadcrumb.java @@ -7,13 +7,17 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class RNSentryBreadcrumb { +public final class RNSentryBreadcrumb { + + private RNSentryBreadcrumb() { + throw new AssertionError("Utility class should not be instantiated"); + } @Nullable public static String getCurrentScreenFrom(ReadableMap from) { final @Nullable String maybeCategory = from.hasKey("category") ? from.getString("category") : null; - if (maybeCategory == null || !maybeCategory.equals("navigation")) { + if (maybeCategory == null || !"navigation".equals(maybeCategory)) { return null; } @@ -26,7 +30,7 @@ public static String getCurrentScreenFrom(ReadableMap from) { // getString might throw if cast to string fails (data.to is not enforced by TS to be a // string) return maybeData.hasKey("to") ? maybeData.getString("to") : null; - } catch (Throwable exception) { + } catch (Throwable exception) { // NOPMD - We don't want to crash in any case return null; } } diff --git a/packages/core/android/src/main/java/io/sentry/react/RNSentryMapConverter.java b/packages/core/android/src/main/java/io/sentry/react/RNSentryMapConverter.java index 6bfbbf5c7..467ffcd90 100644 --- a/packages/core/android/src/main/java/io/sentry/react/RNSentryMapConverter.java +++ b/packages/core/android/src/main/java/io/sentry/react/RNSentryMapConverter.java @@ -14,11 +14,15 @@ import java.util.Map; import org.jetbrains.annotations.Nullable; -public class RNSentryMapConverter { +public final class RNSentryMapConverter { public static final String NAME = "RNSentry.MapConverter"; private static final ILogger logger = new AndroidLogger(NAME); + private RNSentryMapConverter() { + throw new AssertionError("Utility class should not be instantiated"); + } + public static Object convertToWritable(@Nullable Object serialized) { if (serialized instanceof List) { WritableArray writable = Arguments.createArray(); diff --git a/packages/core/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java b/packages/core/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java index 16014c5de..ee24c634c 100644 --- a/packages/core/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java +++ b/packages/core/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java @@ -91,7 +91,7 @@ public class RNSentryModuleImpl { private static final ILogger logger = new AndroidLogger(NAME); private static final BuildInfoProvider buildInfo = new BuildInfoProvider(logger); private static final String modulesPath = "modules.json"; - private static final Charset UTF_8 = Charset.forName("UTF-8"); + private static final Charset UTF_8 = Charset.forName("UTF-8"); // NOPMD - Allow using UTF-8 private final ReactApplicationContext reactApplicationContext; private final PackageInfo packageInfo; @@ -270,7 +270,7 @@ public void initNativeSdk(final ReadableMap rnOptions, Promise promise) { if (null != ex && ex.getType().contains("JavascriptException")) { return null; } - } catch (Throwable ignored) { + } catch (Throwable ignored) { // NOPMD - We don't want to crash in any case // We do nothing } @@ -356,12 +356,12 @@ public void crash() { throw new RuntimeException("TEST - Sentry Client Crash (only works in release mode)"); } - public void addListener(String _eventType) { + public void addListener(String eventType) { // Is must be defined otherwise the generated interface from TS won't be fulfilled logger.log(SentryLevel.ERROR, "addListener of NativeEventEmitter can't be used on Android!"); } - public void removeListeners(double _id) { + public void removeListeners(double id) { // Is must be defined otherwise the generated interface from TS won't be fulfilled logger.log( SentryLevel.ERROR, "removeListeners of NativeEventEmitter can't be used on Android!"); @@ -369,17 +369,16 @@ public void removeListeners(double _id) { public void fetchModules(Promise promise) { final AssetManager assets = this.getReactApplicationContext().getResources().getAssets(); - try (final InputStream stream = - new BufferedInputStream(assets.open(RNSentryModuleImpl.modulesPath))) { + try (InputStream stream = new BufferedInputStream(assets.open(modulesPath))) { int size = stream.available(); byte[] buffer = new byte[size]; stream.read(buffer); stream.close(); - String modulesJson = new String(buffer, RNSentryModuleImpl.UTF_8); + String modulesJson = new String(buffer, UTF_8); promise.resolve(modulesJson); } catch (FileNotFoundException e) { promise.resolve(null); - } catch (Throwable e) { + } catch (Throwable e) { // NOPMD - We don't want to crash in any case logger.log(SentryLevel.WARNING, "Fetching JS Modules failed."); promise.resolve(null); } @@ -462,7 +461,7 @@ public void fetchNativeFrames(Promise promise) { map.putInt("frozenFrames", frozenFrames); promise.resolve(map); - } catch (Throwable ignored) { + } catch (Throwable ignored) { // NOPMD - We don't want to crash in any case logger.log(SentryLevel.WARNING, "Error fetching native frames."); promise.resolve(null); } @@ -493,7 +492,7 @@ public void captureEnvelope(String rawBytes, ReadableMap options, Promise promis try { InternalSentrySdk.captureEnvelope( bytes, !options.hasKey("hardCrashed") || !options.getBoolean("hardCrashed")); - } catch (Throwable e) { + } catch (Throwable e) { // NOPMD - We don't want to crash in any case logger.log(SentryLevel.ERROR, "Error while capturing envelope"); promise.resolve(false); } @@ -511,7 +510,7 @@ public void captureScreenshot(Promise promise) { final byte[] raw = takeScreenshotOnUiThread(activity); - if (raw == null) { + if (raw == null || raw.length == 0) { logger.log(SentryLevel.WARNING, "Screenshot is null, screen was not captured."); promise.resolve(null); return; @@ -550,7 +549,7 @@ private static byte[] takeScreenshotOnUiThread(Activity activity) { doneSignal.await(SCREENSHOT_TIMEOUT_SECONDS, SECONDS); } catch (InterruptedException e) { logger.log(SentryLevel.ERROR, "Screenshot process was interrupted."); - return null; + return new byte[0]; } return bytesWrapper[0]; @@ -627,7 +626,7 @@ public void setUser(final ReadableMap userKeys, final ReadableMap userDataKeys) } if (userDataKeys != null) { - HashMap userDataMap = new HashMap<>(); + Map userDataMap = new HashMap<>(); ReadableMapKeySetIterator it = userDataKeys.keySetIterator(); while (it.hasNextKey()) { String key = it.nextKey(); @@ -694,7 +693,7 @@ public void setContext(final String key, final ReadableMap context) { return; } - final HashMap contextHashMap = context.toHashMap(); + final Map contextHashMap = context.toHashMap(); scope.setContexts(key, contextHashMap); }); } @@ -726,7 +725,7 @@ public void enableNativeFramesTracking() { frameMetricsAggregator.add(currentActivity); logger.log(SentryLevel.INFO, "FrameMetricsAggregator installed."); - } catch (Throwable ignored) { + } catch (Throwable ignored) { // NOPMD - We don't want to crash in any case // throws ConcurrentModification when calling addOnFrameMetricsAvailableListener // this is a best effort since we can't reproduce it logger.log(SentryLevel.ERROR, "Error adding Activity to frameMetricsAggregator."); @@ -785,7 +784,7 @@ public WritableMap startProfiling(boolean platformProfilers) { } result.putBoolean("started", true); - } catch (Throwable e) { + } catch (Throwable e) { // NOPMD - We don't want to crash in any case result.putBoolean("started", false); result.putString("error", e.toString()); } @@ -825,7 +824,7 @@ public WritableMap stopProfiling() { androidProfile.putString("build_id", getProguardUuid()); result.putMap("androidProfile", androidProfile); } - } catch (Throwable e) { + } catch (Throwable e) { // NOPMD - We don't want to crash in any case result.putString("error", e.toString()); } finally { if (output != null) { @@ -834,7 +833,7 @@ public WritableMap stopProfiling() { if (!wasProfileSuccessfullyDeleted) { logger.log(SentryLevel.WARNING, "Profile not deleted from:" + output.getAbsolutePath()); } - } catch (Throwable e) { + } catch (Throwable e) { // NOPMD - We don't want to crash in any case logger.log(SentryLevel.WARNING, "Profile not deleted from:" + output.getAbsolutePath()); } } @@ -848,7 +847,7 @@ public WritableMap stopProfiling() { } isProguardDebugMetaLoaded = true; final @Nullable List debugMetaList = - (new AssetsDebugMetaLoader(this.getReactApplicationContext(), logger)).loadDebugMeta(); + new AssetsDebugMetaLoader(this.getReactApplicationContext(), logger).loadDebugMeta(); if (debugMetaList == null) { return null; } @@ -866,7 +865,7 @@ public WritableMap stopProfiling() { } private String readStringFromFile(File path) throws IOException { - try (final BufferedReader br = new BufferedReader(new FileReader(path)); ) { + try (BufferedReader br = new BufferedReader(new FileReader(path)); ) { final StringBuilder text = new StringBuilder(); String line; @@ -943,7 +942,7 @@ private void setEventEnvironmentTag(SentryEvent event, String environment) { private void addPackages(SentryEvent event, SdkVersion sdk) { SdkVersion eventSdk = event.getSdk(); if (eventSdk != null - && eventSdk.getName().equals("sentry.javascript.react-native") + && "sentry.javascript.react-native".equals(eventSdk.getName()) && sdk != null) { List sentryPackages = sdk.getPackages(); if (sentryPackages != null) { diff --git a/packages/core/android/src/main/java/io/sentry/react/RNSentryReactFragmentLifecycleTracer.java b/packages/core/android/src/main/java/io/sentry/react/RNSentryReactFragmentLifecycleTracer.java index 4f76fceb4..4ee870021 100644 --- a/packages/core/android/src/main/java/io/sentry/react/RNSentryReactFragmentLifecycleTracer.java +++ b/packages/core/android/src/main/java/io/sentry/react/RNSentryReactFragmentLifecycleTracer.java @@ -40,7 +40,7 @@ public void onFragmentViewCreated( @NotNull Fragment f, @NotNull View v, @Nullable Bundle savedInstanceState) { - if (!("com.swmansion.rnscreens.ScreenStackFragment".equals(f.getClass().getCanonicalName()))) { + if (!"com.swmansion.rnscreens.ScreenStackFragment".equals(f.getClass().getCanonicalName())) { logger.log( SentryLevel.DEBUG, "Fragment is not a ScreenStackFragment, won't listen for the first draw."); diff --git a/packages/core/android/src/main/java/io/sentry/react/RNSentryReplayBreadcrumbConverter.java b/packages/core/android/src/main/java/io/sentry/react/RNSentryReplayBreadcrumbConverter.java index b6629a815..6a3d2872a 100644 --- a/packages/core/android/src/main/java/io/sentry/react/RNSentryReplayBreadcrumbConverter.java +++ b/packages/core/android/src/main/java/io/sentry/react/RNSentryReplayBreadcrumbConverter.java @@ -13,8 +13,6 @@ import org.jetbrains.annotations.TestOnly; public final class RNSentryReplayBreadcrumbConverter extends DefaultReplayBreadcrumbConverter { - public RNSentryReplayBreadcrumbConverter() {} - @Override public @Nullable RRWebEvent convert(final @NotNull Breadcrumb breadcrumb) { if (breadcrumb.getCategory() == null) { @@ -22,22 +20,22 @@ public RNSentryReplayBreadcrumbConverter() {} } // Do not add Sentry Event breadcrumbs to replay - if (breadcrumb.getCategory().equals("sentry.event") - || breadcrumb.getCategory().equals("sentry.transaction")) { + if ("sentry.event".equals(breadcrumb.getCategory()) + || "sentry.transaction".equals(breadcrumb.getCategory())) { return null; } - if (breadcrumb.getCategory().equals("http")) { + if ("http".equals(breadcrumb.getCategory())) { // Drop native http breadcrumbs to avoid duplicates return null; } - if (breadcrumb.getCategory().equals("touch")) { + if ("touch".equals(breadcrumb.getCategory())) { return convertTouchBreadcrumb(breadcrumb); } - if (breadcrumb.getCategory().equals("navigation")) { + if ("navigation".equals(breadcrumb.getCategory())) { return convertNavigationBreadcrumb(breadcrumb); } - if (breadcrumb.getCategory().equals("xhr")) { + if ("xhr".equals(breadcrumb.getCategory())) { return convertNetworkBreadcrumb(breadcrumb); } @@ -46,8 +44,7 @@ public RNSentryReplayBreadcrumbConverter() {} // ignore native navigation breadcrumbs if (nativeBreadcrumb instanceof RRWebBreadcrumbEvent) { final RRWebBreadcrumbEvent rrWebBreadcrumb = (RRWebBreadcrumbEvent) nativeBreadcrumb; - if (rrWebBreadcrumb.getCategory() != null - && rrWebBreadcrumb.getCategory().equals("navigation")) { + if ("navigation".equals(rrWebBreadcrumb.getCategory())) { return null; } } @@ -69,8 +66,7 @@ public RNSentryReplayBreadcrumbConverter() {} rrWebBreadcrumb.setCategory("ui.tap"); - rrWebBreadcrumb.setMessage( - RNSentryReplayBreadcrumbConverter.getTouchPathMessage(breadcrumb.getData("path"))); + rrWebBreadcrumb.setMessage(getTouchPathMessage(breadcrumb.getData("path"))); setRRWebEventDefaultsFrom(rrWebBreadcrumb, breadcrumb); return rrWebBreadcrumb; @@ -83,7 +79,7 @@ public RNSentryReplayBreadcrumbConverter() {} } final @NotNull List path = (List) maybePath; - if (path.size() == 0) { + if (path.isEmpty()) { return null; } @@ -145,7 +141,7 @@ public RNSentryReplayBreadcrumbConverter() {} return null; } - final HashMap data = new HashMap<>(); + final Map data = new HashMap<>(); if (breadcrumb.getData("method") instanceof String) { data.put("method", breadcrumb.getData("method")); } diff --git a/performance-tests/TestAppPlain/android/app/src/debug/java/com/testappplain/ReactNativeFlipper.java b/performance-tests/TestAppPlain/android/app/src/debug/java/com/testappplain/ReactNativeFlipper.java index a05be4fe9..51dec8827 100644 --- a/performance-tests/TestAppPlain/android/app/src/debug/java/com/testappplain/ReactNativeFlipper.java +++ b/performance-tests/TestAppPlain/android/app/src/debug/java/com/testappplain/ReactNativeFlipper.java @@ -25,7 +25,7 @@ import com.facebook.react.modules.network.NetworkingModule; import okhttp3.OkHttpClient; -public class ReactNativeFlipper { +public class ReactNativeFlipper { // NOPMD - Default RN Template public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { if (FlipperUtils.shouldEnableFlipper(context)) { final FlipperClient client = AndroidFlipperClient.getInstance(context); diff --git a/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/MainApplication.java b/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/MainApplication.java index 978e2bd40..3417a18c8 100644 --- a/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/MainApplication.java +++ b/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/MainApplication.java @@ -65,7 +65,7 @@ public void onCreate() { * @param context * @param reactInstanceManager */ - private static void initializeFlipper( + private static void initializeFlipper( // NOPMD - Default RN Template Context context, ReactInstanceManager reactInstanceManager) { if (BuildConfig.DEBUG) { try { @@ -79,11 +79,11 @@ private static void initializeFlipper( .invoke(null, context, reactInstanceManager); } catch (ClassNotFoundException e) { e.printStackTrace(); - } catch (NoSuchMethodException e) { + } catch (NoSuchMethodException e) { // NOPMD - Default RN Template e.printStackTrace(); - } catch (IllegalAccessException e) { + } catch (IllegalAccessException e) { // NOPMD - Default RN Template e.printStackTrace(); - } catch (InvocationTargetException e) { + } catch (InvocationTargetException e) { // NOPMD - Default RN Template e.printStackTrace(); } } diff --git a/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/newarchitecture/MainApplicationReactNativeHost.java b/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/newarchitecture/MainApplicationReactNativeHost.java index 3d93c35fe..3434f270d 100644 --- a/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/newarchitecture/MainApplicationReactNativeHost.java +++ b/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/newarchitecture/MainApplicationReactNativeHost.java @@ -44,7 +44,8 @@ public boolean getUseDeveloperSupport() { @Override protected List getPackages() { - List packages = new PackageList(this).getPackages(); + List packages = // NOPMD - Default RN Template + new PackageList(this).getPackages(); // Packages that cannot be autolinked yet can be added manually here, for example: // packages.add(new MyReactNativePackage()); // TurboModules must also be loaded here providing a valid TurboReactPackage implementation: diff --git a/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/newarchitecture/components/MainComponentsRegistry.java b/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/newarchitecture/components/MainComponentsRegistry.java index 9685b5669..e31cbd69e 100644 --- a/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/newarchitecture/components/MainComponentsRegistry.java +++ b/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/newarchitecture/components/MainComponentsRegistry.java @@ -14,7 +14,7 @@ * `newArchEnabled` property). Is ignored otherwise. */ @DoNotStrip -public class MainComponentsRegistry { +public class MainComponentsRegistry { // NOPMD - Default RN Template static { SoLoader.loadLibrary("fabricjni"); } diff --git a/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java b/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java index 8177ac8c1..a30d98ff7 100644 --- a/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java +++ b/performance-tests/TestAppPlain/android/app/src/main/java/com/testappplain/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java @@ -18,7 +18,7 @@ public class MainApplicationTurboModuleManagerDelegate extends ReactPackageTurboModuleManagerDelegate { - private static volatile boolean sIsSoLibraryLoaded; + private static volatile boolean sIsSoLibraryLoaded; // NOPMD - Default RN Template protected MainApplicationTurboModuleManagerDelegate( ReactApplicationContext reactApplicationContext, List packages) { diff --git a/performance-tests/TestAppSentry/android/app/src/debug/java/com/testappsentry/ReactNativeFlipper.java b/performance-tests/TestAppSentry/android/app/src/debug/java/com/testappsentry/ReactNativeFlipper.java index 1090ad980..126873145 100644 --- a/performance-tests/TestAppSentry/android/app/src/debug/java/com/testappsentry/ReactNativeFlipper.java +++ b/performance-tests/TestAppSentry/android/app/src/debug/java/com/testappsentry/ReactNativeFlipper.java @@ -25,7 +25,7 @@ import com.facebook.react.modules.network.NetworkingModule; import okhttp3.OkHttpClient; -public class ReactNativeFlipper { +public class ReactNativeFlipper { // NOPMD - Default RN Template public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { if (FlipperUtils.shouldEnableFlipper(context)) { final FlipperClient client = AndroidFlipperClient.getInstance(context); diff --git a/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/MainApplication.java b/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/MainApplication.java index c5c2b2656..de25c6949 100644 --- a/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/MainApplication.java +++ b/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/MainApplication.java @@ -65,7 +65,7 @@ public void onCreate() { * @param context * @param reactInstanceManager */ - private static void initializeFlipper( + private static void initializeFlipper( // NOPMD - Default RN Template Context context, ReactInstanceManager reactInstanceManager) { if (BuildConfig.DEBUG) { try { @@ -79,11 +79,11 @@ private static void initializeFlipper( .invoke(null, context, reactInstanceManager); } catch (ClassNotFoundException e) { e.printStackTrace(); - } catch (NoSuchMethodException e) { + } catch (NoSuchMethodException e) { // NOPMD - Default RN Template e.printStackTrace(); - } catch (IllegalAccessException e) { + } catch (IllegalAccessException e) { // NOPMD - Default RN Template e.printStackTrace(); - } catch (InvocationTargetException e) { + } catch (InvocationTargetException e) { // NOPMD - Default RN Template e.printStackTrace(); } } diff --git a/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/newarchitecture/MainApplicationReactNativeHost.java b/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/newarchitecture/MainApplicationReactNativeHost.java index 95acea007..43bb6f70b 100644 --- a/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/newarchitecture/MainApplicationReactNativeHost.java +++ b/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/newarchitecture/MainApplicationReactNativeHost.java @@ -44,7 +44,8 @@ public boolean getUseDeveloperSupport() { @Override protected List getPackages() { - List packages = new PackageList(this).getPackages(); + List packages = // NOPMD - Default RN Template + new PackageList(this).getPackages(); // Packages that cannot be autolinked yet can be added manually here, for example: // packages.add(new MyReactNativePackage()); // TurboModules must also be loaded here providing a valid TurboReactPackage implementation: diff --git a/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/newarchitecture/components/MainComponentsRegistry.java b/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/newarchitecture/components/MainComponentsRegistry.java index c8bdeaf2a..9e4080b38 100644 --- a/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/newarchitecture/components/MainComponentsRegistry.java +++ b/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/newarchitecture/components/MainComponentsRegistry.java @@ -14,7 +14,7 @@ * `newArchEnabled` property). Is ignored otherwise. */ @DoNotStrip -public class MainComponentsRegistry { +public class MainComponentsRegistry { // NOPMD - Default RN Template static { SoLoader.loadLibrary("fabricjni"); } diff --git a/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java b/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java index 7f35da462..4ff41fbca 100644 --- a/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java +++ b/performance-tests/TestAppSentry/android/app/src/main/java/com/testappsentry/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java @@ -18,7 +18,7 @@ public class MainApplicationTurboModuleManagerDelegate extends ReactPackageTurboModuleManagerDelegate { - private static volatile boolean sIsSoLibraryLoaded; + private static volatile boolean sIsSoLibraryLoaded; // NOPMD - Default RN Template protected MainApplicationTurboModuleManagerDelegate( ReactApplicationContext reactApplicationContext, List packages) { diff --git a/samples/react-native/android/app/src/main/java/io/sentry/reactnative/sample/AssetsModule.java b/samples/react-native/android/app/src/main/java/io/sentry/reactnative/sample/AssetsModule.java index f5cba7960..e4dcbdaac 100644 --- a/samples/react-native/android/app/src/main/java/io/sentry/reactnative/sample/AssetsModule.java +++ b/samples/react-native/android/app/src/main/java/io/sentry/reactnative/sample/AssetsModule.java @@ -6,6 +6,7 @@ import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableNativeArray; +import java.io.IOException; import java.io.InputStream; public class AssetsModule extends ReactContextBaseJavaModule { @@ -21,13 +22,12 @@ public String getName() { @ReactMethod public void getExampleAssetData(Promise promise) { + InputStream stream = null; try { - InputStream stream = - this.getReactApplicationContext().getResources().getAssets().open("logo_mini.png"); + stream = this.getReactApplicationContext().getResources().getAssets().open("logo_mini.png"); int size = stream.available(); byte[] buffer = new byte[size]; stream.read(buffer); - stream.close(); WritableArray array = new WritableNativeArray(); for (int i = 0; i < size; i++) { array.pushInt(buffer[i]); @@ -35,6 +35,14 @@ public void getExampleAssetData(Promise promise) { promise.resolve(array); } catch (Exception e) { promise.reject(e); + } finally { + try { + if (stream != null) { + stream.close(); + } + } catch (IOException e) { + promise.reject(e); + } } } } diff --git a/scripts/pmd.sh b/scripts/pmd.sh new file mode 100755 index 000000000..6da881555 --- /dev/null +++ b/scripts/pmd.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +echo "Running PMD for Java files" + +npx pmd check \ + -d samples/react-native/android/app/src \ + -d packages/core/android \ + -d performance-tests/TestAppPlain/android/app/src \ + -d performance-tests/TestAppSentry/android/app/src \ + -R rulesets/java/quickstart.xml \ + -f text diff --git a/yarn.lock b/yarn.lock index bb995130a..8dead489e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14341,6 +14341,16 @@ __metadata: languageName: node linkType: hard +"find-java-home@npm:^1.2.2": + version: 1.2.2 + resolution: "find-java-home@npm:1.2.2" + dependencies: + which: ~1.0.5 + winreg: ~1.2.2 + checksum: 8d211909fb1cb7484a7b9ff857d9a6ec17f7e3f3322485ed8d189a8e8e597947e1924130e8ed854c0b8c155816631bca94cf9bcf774be2bae4ba6ee506a7464e + languageName: node + linkType: hard + "find-up@npm:^2.0.0": version: 2.1.0 resolution: "find-up@npm:2.1.0" @@ -20588,7 +20598,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.0.0-alpha.8, node-fetch@npm:^2.2.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7": +"node-fetch@npm:^2.0.0-alpha.8, node-fetch@npm:^2.2.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.6, node-fetch@npm:^2.6.7": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -20647,6 +20657,19 @@ __metadata: languageName: node linkType: hard +"node-java-connector@npm:1.1.1": + version: 1.1.1 + resolution: "node-java-connector@npm:1.1.1" + dependencies: + find-java-home: ^1.2.2 + node-fetch: ^2.6.6 + tar: ^6.1.11 + typescript: ^4.5.5 + yauzl: ^2.10.0 + checksum: e4853abdc7161a588ab316955e7a957d82d6d7a98305db386160c066708c518a9f9392a3d56fbfb8def8b69633a5de3d0c1645f733e9ef3ad9a18a2beae181dc + languageName: node + linkType: hard + "node-machine-id@npm:1.1.12": version: 1.1.12 resolution: "node-machine-id@npm:1.1.12" @@ -22004,6 +22027,17 @@ __metadata: languageName: node linkType: hard +"pmd-bin@npm:^2.5.0": + version: 2.5.0 + resolution: "pmd-bin@npm:2.5.0" + dependencies: + node-java-connector: 1.1.1 + bin: + pmd: pmd + checksum: c758bbeae89517d1ce1cf0a01401891d01cd9982c9bb98c85ef782cadde6e9bb1d038cd820aaf19df24a27d6d161dea94f27236966227438aeefd9e0d5322b52 + languageName: node + linkType: hard + "pngjs@npm:^3.3.0": version: 3.4.0 resolution: "pngjs@npm:3.4.0" @@ -24518,6 +24552,7 @@ __metadata: google-java-format: ^1.4.0 lerna: ^8.1.8 npm-run-all2: ^6.2.2 + pmd-bin: ^2.5.0 prettier: ^2.0.5 react-native-version: ^4.0.0 replace-in-file: ^7.0.1 @@ -26569,7 +26604,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:4.9.5, typescript@npm:^4.0.0, typescript@npm:^4.9.5": +"typescript@npm:4.9.5, typescript@npm:^4.0.0, typescript@npm:^4.5.5, typescript@npm:^4.9.5": version: 4.9.5 resolution: "typescript@npm:4.9.5" bin: @@ -26619,7 +26654,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@4.9.5#~builtin, typescript@patch:typescript@npm%3A^4.0.0#~builtin, typescript@patch:typescript@npm%3A^4.9.5#~builtin": +"typescript@patch:typescript@4.9.5#~builtin, typescript@patch:typescript@^4.5.5#~builtin, typescript@patch:typescript@npm%3A^4.0.0#~builtin, typescript@patch:typescript@npm%3A^4.9.5#~builtin": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=289587" bin: @@ -27524,6 +27559,15 @@ __metadata: languageName: node linkType: hard +"which@npm:~1.0.5": + version: 1.0.9 + resolution: "which@npm:1.0.9" + bin: + which: ./bin/which + checksum: 645debd713715e7dd1d33ad7b118b4c7fb98d2f961497791f5460e802e550c8d8895c282c28afa44a538d4f6242db130f50c82f0b97aaddbc6e0120a324160df + languageName: node + linkType: hard + "wide-align@npm:1.1.5, wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" @@ -27533,6 +27577,13 @@ __metadata: languageName: node linkType: hard +"winreg@npm:~1.2.2": + version: 1.2.5 + resolution: "winreg@npm:1.2.5" + checksum: 4bc0f8328ec814bdc7a6029354aebfdf090469d9f31fcaa85c3536b07289c3346d5606552351848bd9bd0af71a58c4a3cfa63760d842c9da1a8a99b9d2d443ab + languageName: node + linkType: hard + "winston-transport@npm:^4.5.0": version: 4.7.1 resolution: "winston-transport@npm:4.7.1"