class StringSubstitutionEngine implements StringSubstitutor {

    @Override
    public void substituteComponents(List<String> components)
            throws StringSubstitutionException {
        if (!isValid(components)) {
            throw new StringSubstitutionException(_strings.get("missingComponentIdentifiers"));
        }
        for (String componentId : components) {
            Component component = findComponentById(componentId);
            if (component == null) {
                _logger.log(Level.INFO, SLogger.MISSING_COMPONENT, componentId);
                continue;
            }
            doSubstitution(component);
        }
    }

    public  StringSubstitutionEngine(InputStream inputStream);

}