package polly.rx.core.orion; import java.util.ArrayList; import java.util.Collections; import java.util.List; import polly.rx.MyPlugin; import polly.rx.core.orion.model.Sector; import polly.rx.core.orion.pathplanning.PathPlanner; import polly.rx.parsing.ParseException; import de.skuzzle.polly.sdk.Types; import de.skuzzle.polly.sdk.Types.ListType; import de.skuzzle.polly.sdk.Types.StringType; import de.skuzzle.polly.sdk.User; public enum Orion implements UniverseFactory { INSTANCE; private ResourcePriceProvider priceProvider; private QuadrantProvider quadProvider; private WormholeProvider holeProvider; private VenadUserMapper userMapper; private QuadrantUpdater quadUpdater; private PortalProvider portalProvider; private PortalUpdater portalUpdater; private FleetTracker fleetTracker; private ShipProvider shipProvider; private AlienManager alienManager; private PathPlanner planner; private FleetHeatMap heatMap; public static void initialize(QuadrantProvider quadProvider, QuadrantUpdater quadUpdater, WormholeProvider holeProvider, PortalProvider portalProvider, AlienManager alienManager, PortalUpdater portalUpdater, FleetTracker fleetTracker, ResourcePriceProvider priceProvider, VenadUserMapper userMapper, FleetHeatMap heatMap) { ; if (INSTANCE.quadProvider != null) { throw new IllegalStateException("already initialized"); //$NON-NLS-1$ } else if (quadProvider == null) { throw new NullPointerException(QuadrantProvider.class.getSimpleName()); } else if (holeProvider == null) { throw new NullPointerException(WormholeProvider.class.getSimpleName()); } else if (quadUpdater == null) { throw new NullPointerException(QuadrantUpdater.class.getSimpleName()); } else if (portalProvider == null) { throw new NullPointerException(PortalProvider.class.getSimpleName()); } else if (portalUpdater == null) { throw new NullPointerException(PortalUpdater.class.getSimpleName()); } else if (fleetTracker == null) { throw new NullPointerException(FleetTracker.class.getSimpleName()); } else if (priceProvider == null) { throw new NullPointerException(ResourcePriceProvider.class.getSimpleName()); } else if (alienManager == null) { throw new NullPointerException(AlienManager.class.getSimpleName()); } else if (userMapper == null) { throw new NullPointerException(VenadUserMapper.class.getSimpleName()); } else if (heatMap == null) { throw new NullPointerException(FleetHeatMap.class.getSimpleName()); }// TODO: ship provider INSTANCE.quadProvider = quadProvider; INSTANCE.holeProvider = holeProvider; INSTANCE.quadUpdater = quadUpdater; INSTANCE.portalProvider = portalProvider; INSTANCE.portalUpdater = portalUpdater; INSTANCE.alienManager = alienManager; INSTANCE.fleetTracker = fleetTracker; INSTANCE.priceProvider = priceProvider; INSTANCE.userMapper = userMapper; INSTANCE.planner = new PathPlanner(quadProvider, holeProvider); INSTANCE.heatMap = heatMap; } private final boolean checkInitialized() { if (this.quadProvider == null) { throw new IllegalStateException("not initialized"); //$NON-NLS-1$ } return this.quadProvider != null; } @Override public WormholeProvider getWormholeProvider() { assert checkInitialized(); return this.holeProvider; } @Override public QuadrantProvider getQuadrantProvider() { assert checkInitialized(); return this.quadProvider; } @Override public QuadrantUpdater getQuadrantUpdater() { assert checkInitialized(); return this.quadUpdater; } @Override public PortalProvider getPortalProvider() { assert checkInitialized(); return this.portalProvider; } public PortalUpdater getPortalUpdater() { return this.portalUpdater; } public ResourcePriceProvider getPriceProvider() { return this.priceProvider; } public AlienManager getAlienManager() { assert checkInitialized(); return this.alienManager; } public ShipProvider getShipProvider() { checkInitialized(); return this.shipProvider; } public PathPlanner getPathPlanner() { assert checkInitialized(); return this.planner; } public FleetTracker getFleetTracker() { assert checkInitialized(); return this.fleetTracker; } public VenadUserMapper getUserMapper() { checkInitialized(); return this.userMapper; } public FleetHeatMap getHeatMap() { return this.heatMap; } public List<Sector> getPersonalPortals(User user) { if (user == null) { return Collections.emptyList(); } final Types portals = user.getAttribute(MyPlugin.PORTALS); if (portals instanceof ListType) { final ListType lt = (ListType) portals; final List<Sector> result = new ArrayList<>(lt.getElements().size()); for (final Types t : lt.getElements()) { final StringType st = (StringType) t; try { final Sector s = QuadrantUtils.parse(st.getValue()); result.add(s); } catch (final ParseException e) { e.printStackTrace(); throw new RuntimeException(e); } } return result; } return Collections.emptyList(); } }