/*
* Copyright 2008-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* 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.codehaus.griffon.runtime.groovy.util;
import griffon.util.ConfigReader;
import groovy.lang.Script;
import groovy.util.ConfigObject;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.net.URL;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.ResourceBundle;
import java.util.Set;
import static griffon.util.ConfigUtils.getConfigValue;
import static griffon.util.GriffonNameUtils.requireNonBlank;
import static java.util.Objects.requireNonNull;
/**
* @author Andres Almiray
* @since 2.0.0
*/
public class GroovyScriptResourceBundle extends ResourceBundle {
private static final String ERROR_READER_NULL = "Argument 'reader' must not be null";
private final ConfigObject config;
private final Set<String> keys = new LinkedHashSet<>();
private final String source;
public GroovyScriptResourceBundle(@Nonnull ConfigReader reader, @Nonnull URL location) {
this(requireNonNull(reader, ERROR_READER_NULL).parse(requireNonNull(location, "Argument 'location' must not be null")), location.toString());
}
public GroovyScriptResourceBundle(@Nonnull ConfigReader reader, @Nonnull Script script) {
this(requireNonNull(reader, ERROR_READER_NULL).parse(requireNonNull(script, "Argument 'script' must not be null")), script.getClass().getName());
}
public GroovyScriptResourceBundle(@Nonnull ConfigReader reader, @Nonnull String script) {
this(requireNonNull(reader, ERROR_READER_NULL).parse(requireNonBlank(script, "Argument 'script' must not be blank")), "<<INLINE SCRIPT>>");
}
public GroovyScriptResourceBundle(@Nonnull ConfigReader reader, @Nonnull Class<? extends Script> scriptClass) {
this(requireNonNull(reader, ERROR_READER_NULL).parse(requireNonNull(scriptClass, "Argument 'scriptClass' must not be null")), scriptClass.getName());
}
@SuppressWarnings("unchecked")
private GroovyScriptResourceBundle(@Nonnull ConfigObject config, @Nonnull String source) {
this.config = requireNonNull(config, "Argument 'config' must not be null");
this.source = source;
keys.addAll(this.config.flatten(new LinkedHashMap<>()).keySet());
}
@Nonnull
public String getSource() {
return source;
}
@Override
public String toString() {
return super.toString() + "[" + source + "]";
}
@Nullable
@Override
@SuppressWarnings("unchecked")
protected Object handleGetObject(@Nonnull String key) {
Object value = getConfigValue(config, requireNonBlank(key, "Argument 'key' must not be blank"), null);
if (null == value) return null;
if (value instanceof ConfigObject) {
return ((ConfigObject) value).isEmpty() ? null : value;
}
return value;
}
@Nonnull
@Override
public Enumeration<String> getKeys() {
final Iterator<String> keysIterator = keys.iterator();
return new Enumeration<String>() {
public boolean hasMoreElements() {
return keysIterator.hasNext();
}
public String nextElement() {
return keysIterator.next();
}
};
}
@Override
public Set<String> keySet() {
return new LinkedHashSet<>(keys);
}
}