/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.compiler.runtime.pipeline.impl; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.InputStream; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.drools.core.builder.conf.impl.JaxbConfigurationImpl; import org.drools.core.common.DefaultFactHandle; import org.drools.core.io.impl.BaseResource; import org.drools.core.io.impl.InputStreamResource; import org.drools.core.rule.ConsequenceMetaData.Field; import org.junit.Test; import org.kie.api.builder.Message; import org.kie.api.io.ResourceType; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.rule.FactHandle; import org.kie.internal.utils.KieHelper; import com.sun.tools.xjc.Options; public class DroolsJaxbHelperTest { private static final String simpleXsdRelativePath = "simple.xsd"; @Test public void testXsdModelInRule() { // DRL rule that references object created in XSD final String s1 = "package test; " + "global java.util.List list; " + "rule Init when " + "then " + " insert( new Sub() ); " + " insert( new Message() ); " + " insert( new Test() ); " + " insert( new Left() ); " + "end\n" + "rule CheckSub when " + " $s : Sub() " + "then " + " list.add( \"Sub\" ); " + "end\n" + "rule CheckMsg when " + " $s : Message() " + "then " + " list.add( \"Message\" ); " + "end\n "; KieHelper kh = new KieHelper(); kh.addContent( s1, ResourceType.DRL ); // XSD that defines "Sub" class InputStream simpleXsdStream = getClass().getResourceAsStream(simpleXsdRelativePath); assertNotNull( "Could not find resource: " + simpleXsdRelativePath, simpleXsdStream ); BaseResource xsdResource = new InputStreamResource(simpleXsdStream); Options xjcOptions = new Options(); xsdResource.setConfiguration(new JaxbConfigurationImpl(xjcOptions, "test-system-id")); kh.addResource( xsdResource, ResourceType.XSD ); // Verify that build succeeded assertEquals( 0, kh.verify().getMessages( Message.Level.ERROR ).size() ); assertEquals( 0, kh.verify().getMessages( Message.Level.WARNING ).size() ); // Run rules KieSession ks = kh.build().newKieSession(); List list = new ArrayList(); ks.setGlobal( "list", list ); ks.fireAllRules(); // Verify results assertEquals( 2, list.size() ); assertTrue( list.containsAll( asList("Sub", "Message") ) ); Collection<FactHandle> fhs = ks.getFactHandles(); Iterator<FactHandle> iter = fhs.iterator(); DefaultFactHandle subFh = null, msgFh = null, leftFh = null, testFh = null; while( iter.hasNext() ) { DefaultFactHandle dfh = (DefaultFactHandle) iter.next(); if( dfh.getObjectClassName().equals("test.Sub") ) { subFh = dfh; } else if( dfh.getObjectClassName().equals("test.Message") ) { msgFh = dfh; } else if( dfh.getObjectClassName().equals("test.Left") ) { leftFh = dfh; } else if( dfh.getObjectClassName().equals("test.Test") ) { testFh = dfh; } else { fail( "Unexpected FH class: " + dfh.getObjectClassName() ); } } assertNotNull( "No FactHandle for Sub found!", subFh ); assertNotNull( "No FactHandle for Message found!", msgFh ); Object xsdObj = subFh.getObject(); Class xsdClass = xsdObj.getClass(); try { Method m2 = xsdClass.getMethod( "getFld" ); assertNotNull( m2 ); assertEquals( String.class, m2.getReturnType() ); assertEquals( 0, xsdClass.getFields().length ); java.lang.reflect.Field[] declaredFields = xsdClass.getDeclaredFields(); assertEquals( 1, declaredFields.length ); assertEquals( "fld", declaredFields[0].getName() ); } catch ( Exception e ) { e.printStackTrace(); fail( e.getMessage() ); } // "Message" has attribute 'mixed="true"' which means only one field "content" xsdObj = msgFh.getObject(); xsdClass = xsdObj.getClass(); try { Method m2 = xsdClass.getMethod( "getContent" ); assertNotNull( m2 ); assertEquals( List.class, m2.getReturnType() ); assertEquals( 0, xsdClass.getFields().length ); java.lang.reflect.Field[] declaredFields = xsdClass.getDeclaredFields(); assertEquals( 1, declaredFields.length ); assertEquals( "content", declaredFields[0].getName() ); } catch ( Exception e ) { e.printStackTrace(); fail( e.getMessage() ); } } }