/* * Copyright 2015 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. * * 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.games.adventures; import org.apache.commons.io.IOUtils; import org.drools.core.util.IoUtils; import org.drools.games.adventures.model.Command; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.mvel2.MVEL; import org.mvel2.util.ParseTools; import org.mvel2.util.ReflectionUtil; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; public class GameEngine { KieSession ksession; Map<String, Map> data; public void createGame(KieContainer kc) { ksession = kc.newKieSession("TextAdventureKS"); Counter c = new Counter(); ksession.setGlobal("counter", c); Map vars = new HashMap(); vars.put("c", c); try { String mvelContent = new String(IOUtils.toByteArray(getClass().getResource("data.mvel").openStream()), IoUtils.UTF8_CHARSET); data = (Map<String, Map>) MVEL.executeExpression(MVEL.compileExpression(mvelContent), vars); } catch (IOException e) { throw new RuntimeException(e); } for (Object o : data.get("rooms").values()) { ksession.insert( o ); } for ( Object o : data.get( "doors" ).values() ) { ksession.insert( o ); } for ( Object o : data.get( "characters" ).values() ) { ksession.insert( o ); } for ( Object o : data.get( "items" ).values() ) { ksession.insert( o ); } // for ( Object o : data.get( "keys" ).values() ) { // ksession.insert( o ); // } // // for ( Object o : data.get( "locks" ).values() ) { // ksession.insert( o ); // } for ( Object o : data.get( "locations" ).values() ) { ksession.insert( o ); } } public Map<String, Map> getData() { return data; } public void receiveMessage(UserSession session, List cmdList) { try { Class<Command> cls = (Class<Command>) cmdList.get(0); Class[] constructorParamTypes = new Class[cmdList.size()-1]; for ( int i = 1; i < cmdList.size(); i++) { constructorParamTypes[i-1] = cmdList.get(i).getClass(); } Object[] args = cmdList.subList(1, cmdList.size() ).toArray(); Class[] params = new Class[args.length]; for ( int i = 0; i < params.length; i++ ) { params[i] = args[i].getClass(); } Command cmd = (Command) ParseTools.getBestConstructorCandidate(args, cls, true).newInstance(args); cmd.setSession( session ); ksession.insert( cmd ); ksession.fireAllRules(); } catch ( Exception e ) { e.printStackTrace(); session.getChannels().get( "output" ).send( "Unable to Execute Command: " + cmdList ); } } public KieSession getKieSession() { return ksession; } }