/** * @return The uri of the block's family, including shape */ public BlockUri getFamilyUri() { if (!blockName.isEmpty()) { return new BlockUri(blockFamilyDefinition, shape, Name.EMPTY); } else { return this; } }
@Override public Block getBlockFor(BlockUri blockUri) { if (getURI().equals(blockUri.getFamilyUri()) && blockUri.getIdentifier().isEmpty()) { return block; } return null; }
public BlockUri(BlockUri parentUri, Name blockName) { this(parentUri.getBlockFamilyDefinitionUrn(), parentUri.getShapeUrn(), blockName); }
public BlockUri getShapelessUri() { if (!getIdentifier().isEmpty()) { return new BlockUri(blockFamilyDefinition, getIdentifier()); } else { return new BlockUri(blockFamilyDefinition); } } }
/** * List blocks that match searched string * * @param searchLowercase searched string * @return List of blocks that match searched string */ private List<String> findBlockMatches(String searchLowercase) { return assetManager.getAvailableAssets(BlockFamilyDefinition.class) .stream().<Optional<BlockFamilyDefinition>>map(urn -> assetManager.getAsset(urn, BlockFamilyDefinition.class)) .filter(def -> def.isPresent() && def.get().isLoadable() && matchesSearch(searchLowercase, def.get())) .map(r -> new BlockUri(r.get().getUrn()).toString()).collect(Collectors.toList()); }
private void processBlockRegistrations(NetData.NetMessage message) { for (NetData.BlockFamilyRegisteredMessage blockFamily : message.getBlockFamilyRegisteredList()) { if (blockFamily.getBlockIdCount() != blockFamily.getBlockUriCount()) { logger.error("Received block registration with mismatched id<->uri mapping"); } else if (blockFamily.getBlockUriCount() == 0) { logger.error("Received empty block registration"); } else { try { BlockUri family = new BlockUri(blockFamily.getBlockUri(0)).getFamilyUri(); Map<String, Integer> registrationMap = Maps.newHashMap(); for (int i = 0; i < blockFamily.getBlockIdCount(); ++i) { registrationMap.put(blockFamily.getBlockUri(i), blockFamily.getBlockId(i)); } blockManager.receiveFamilyRegistration(family, registrationMap); } catch (BlockUriParseException e) { logger.error("Received invalid block uri {}", blockFamily.getBlockUri(0)); } } } }
@Override public String toString() { return uri.toString(); }
@Override public Block getBlock(BlockUri uri) { if (uri.getShapeUrn().isPresent() && uri.getShapeUrn().get().equals(CUBE_SHAPE_URN)) { return getBlock(uri.getShapelessUri()); } Block block = registeredBlockInfo.get().blocksByUri.get(uri); if (block == null) { // Check if partially registered by getting the block family BlockFamily family = getBlockFamily(uri.getFamilyUri()); if (family != null) { block = family.getBlockFor(uri); } if (block == null) { return getAirBlock(); } } return block; }
@Override public BlockFamily getBlockFamily(BlockUri uri) { if (uri.getShapeUrn().isPresent() && uri.getShapeUrn().get().equals(CUBE_SHAPE_URN)) { return getBlockFamily(uri.getShapelessUri()); } BlockFamily family = registeredBlockInfo.get().registeredFamilyByUri.get(uri); if (family == null && generateNewIds) { Optional<BlockFamily> newFamily = loadFamily(uri); if (newFamily.isPresent()) { lock.lock(); try { for (Block block : newFamily.get().getBlocks()) { block.setId(getNextId()); } registerFamily(newFamily.get()); } catch (Exception ex) { // A family can fail to register if the block is missing uri or list of categories, // but can fail to register if the family throws an error for any reason logger.error("Failed to register block familiy '{}'", newFamily, ex); } finally { lock.unlock(); } return newFamily.get(); } } return family; }
private List<String> findBlockMatches(String searchLowercase) { return assetManager.getAvailableAssets(BlockFamilyDefinition.class) .stream().<Optional<BlockFamilyDefinition>>map(urn -> assetManager.getAsset(urn, BlockFamilyDefinition.class)) .filter(def -> def.isPresent() && def.get().isLoadable() && matchesSearch(searchLowercase, def.get())) .map(r -> new BlockUri(r.get().getUrn()).toString()).collect(Collectors.toList()); }
@Override public String convertToString(BlockFamily value) { Preconditions.checkNotNull(value, "'value' must not be null!"); return value.getURI().toString(); } }
/** * @return The uri of the block's family, excluding shape */ public BlockUri getRootFamilyUri() { if (!blockName.isEmpty() || shape.isPresent()) { return new BlockUri(blockFamilyDefinition); } else { return this; } }
public byte getConnections(BlockUri blockUri) { if (getURI().equals(blockUri.getFamilyUri())) { try { return Byte.parseByte(blockUri.getIdentifier().toString().toLowerCase(Locale.ENGLISH)); } catch (NumberFormatException e) { logger.error("can't find block with URI: {}", blockUri, e); } } return 0; }
@Override public String getAsString(Block item) { if (item == null) { return ""; } return item.getURI().toString(); }
private Optional<BlockFamily> loadFamily(BlockUri uri) { Optional<BlockFamilyDefinition> familyDef = assetManager.getAsset(uri.getBlockFamilyDefinitionUrn(), BlockFamilyDefinition.class); if (familyDef.isPresent() && familyDef.get().isLoadable()) { if (familyDef.get().isFreeform()) { ResourceUrn shapeUrn; if (uri.getShapeUrn().isPresent()) { shapeUrn = uri.getShapeUrn().get(); } else { shapeUrn = CUBE_SHAPE_URN; } Optional<BlockShape> shape = assetManager.getAsset(shapeUrn, BlockShape.class); if (shape.isPresent()) { return Optional.of(familyDef.get().createFamily(shape.get(), blockBuilder)); } } else if (!familyDef.get().isFreeform()) { return Optional.of(familyDef.get().createFamily(blockBuilder)); } } else { logger.error("Family not available: {}", uri); } return Optional.empty(); }
public Set<BlockUri> getFreeformBlockFamilies() { return assetManager.getAvailableAssets(BlockFamilyDefinition.class) .stream().<Optional<BlockFamilyDefinition>>map(urn -> assetManager.getAsset(urn, BlockFamilyDefinition.class)) .filter(def -> def.isPresent() && def.get().isLoadable() && def.get().isFreeform()) .map(r -> new BlockUri(r.get().getUrn())).collect(Collectors.toSet()); } }
@Override public Block getBlockFor(BlockUri blockUri) { if (getURI().equals(blockUri.getFamilyUri())) { try { Side side = Side.valueOf(blockUri.getIdentifier().toString().toUpperCase(Locale.ENGLISH)); return blocks.get(side); } catch (IllegalArgumentException e) { return null; } } return null; }
@Override public String toString() { String familyType = ""; RegisterBlockFamily registerInfo = this.getClass().getAnnotation(RegisterBlockFamily.class); if (registerInfo != null) { familyType = registerInfo.value(); } return "BlockFamily[" + familyType + "," + uri.toString() + "]"; } }
public Set<BlockUri> getAvailableBlockFamilies() { return assetManager.getAvailableAssets(BlockFamilyDefinition.class) .stream().<Optional<BlockFamilyDefinition>>map(urn -> assetManager.getAsset(urn, BlockFamilyDefinition.class)) .filter(def -> def.isPresent() && def.get().isLoadable() && !def.get().isFreeform()) .map(r -> new BlockUri(r.get().getUrn())).collect(Collectors.toSet()); }