package com.indignado.logicbricks.utils.builders; import box2dLight.RayHandler; import com.badlogic.gdx.physics.box2d.World; import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.reflect.ClassReflection; import com.badlogic.gdx.utils.reflect.Constructor; import com.badlogic.gdx.utils.reflect.ReflectionException; import com.indignado.logicbricks.core.LogicBricksEngine; import com.indignado.logicbricks.utils.Log; import com.indignado.logicbricks.utils.builders.joints.JointBuilder; /** * @author Rubentxu. */ public class LBBuilders { private String tag = LBBuilders.class.getSimpleName(); private ObjectMap<Class<? extends BrickBuilder>, BrickBuilder> bricksBuilders; private EntityBuilder entityBuilder; private BodyBuilder bodyBuilder; private JointBuilder jointBuilder; private LightBuilder lightBuilder; public LBBuilders(LogicBricksEngine engine, World physics, RayHandler rayHandler) { bricksBuilders = new ObjectMap<>(); entityBuilder = new EntityBuilder(engine); bodyBuilder = new BodyBuilder(physics); jointBuilder = new JointBuilder(physics); lightBuilder = new LightBuilder(rayHandler); } public <B extends BrickBuilder> B getBrickBuilder(Class<B> clazzBuilder) { B builder = (B) bricksBuilders.get(clazzBuilder); if (builder == null) { synchronized (clazzBuilder) { try { Constructor constructor = findConstructor(clazzBuilder); builder = (B) constructor.newInstance((Object[]) null); bricksBuilders.put(clazzBuilder, builder); } catch (Exception e) { Log.debug(tag, "Error instance actuatorBuilder %s" + clazzBuilder.getSimpleName()); } } } return builder; } public EntityBuilder getEntityBuilder() { return entityBuilder; } public BodyBuilder getBodyBuilder() { return bodyBuilder; } public JointBuilder getJointBuilder() { return jointBuilder; } public LightBuilder getLightBuilder() { return lightBuilder; } private <B extends BrickBuilder> Constructor findConstructor(Class<B> type) { try { return ClassReflection.getConstructor(type, (Class[]) null); } catch (Exception ex1) { try { Constructor constructor = ClassReflection.getDeclaredConstructor(type, (Class[]) null); constructor.setAccessible(true); return constructor; } catch (ReflectionException ex2) { return null; } } } }