private List<BuildMessage> verifyClasses(final KieModuleMetaData kieModuleMetaData) { //At the end we are interested to ensure that external .jar files referenced as dependencies don't have // referential inconsistencies. We will at least provide a basic algorithm to ensure that if an external class // X references another external class Y, Y is also accessible by the class loader. return new ClassVerifier(kieModuleMetaData, getTypeSourceResolver(kieModuleMetaData)).verify(getWhiteList(kieModuleMetaData)); }
private void verifyClass(final String packageName, final String className) { try { final Class clazz = kieModuleMetaData.getClass(packageName, className); if (clazz != null) { if (TypeSource.JAVA_DEPENDENCY == typeSourceResolver.getTypeSource(clazz)) { verifyExternalClass(clazz); } } else { logger.warn(MessageFormat.format(ERROR_EXTERNAL_CLASS_VERIFICATION, toFQCN(packageName, className))); } } catch (Throwable e) { final String msg = MessageFormat.format(ERROR_EXTERNAL_CLASS_VERIFICATION, toFQCN(packageName, className), e.getMessage()); logger.warn(msg); logger.debug("This state is usually encountered when the Project references a class not on the classpath; e.g. in a Maven 'provided' scope or 'optional' dependency.", e); buildMessages.add(makeWarningMessage(msg)); } }
public List<BuildMessage> verify(WhiteList whiteList) { for (final String packageName : kieModuleMetaData.getPackages()) { if (whiteList.contains(packageName)) { for (final String className : kieModuleMetaData.getClasses(packageName)) { verifyClass(packageName, className); } } } return buildMessages; }
@Test public void testVerifyClass(){ WhiteList whiteList = new WhiteList(); whiteList.add("org.kie.workbench.common.services.backend.builder"); ClassVerifier classVerifier = new ClassVerifier(kieModuleMetaData, typeSourceResolver); List<BuildMessage> messages = classVerifier.verify(whiteList); assertEquals(messages.size(), 1); assertEquals("Verification of class org.kie.workbench.common.services.backend.builder.SomeClass failed and will not be available for authoring.\n" + "Underlying system error is: The access to the class is not allowed. Please check the necessary external dependencies for this project are configured correctly.", messages.get(0).getText()); } }