001 /*
002 * Copyright 2008-2015 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.codehaus.griffon.runtime.groovy.util;
017
018 import griffon.util.ConfigReader;
019 import groovy.lang.Script;
020 import groovy.util.ConfigObject;
021
022 import javax.annotation.Nonnull;
023 import javax.annotation.Nullable;
024 import java.net.URL;
025 import java.util.ArrayList;
026 import java.util.Enumeration;
027 import java.util.Iterator;
028 import java.util.LinkedHashMap;
029 import java.util.List;
030 import java.util.ResourceBundle;
031
032 import static griffon.util.ConfigUtils.getConfigValue;
033 import static griffon.util.GriffonNameUtils.requireNonBlank;
034 import static java.util.Objects.requireNonNull;
035
036 /**
037 * @author Andres Almiray
038 * @since 2.0.0
039 */
040 public class GroovyScriptResourceBundle extends ResourceBundle {
041 private static final String ERROR_READER_NULL = "Argument 'reader' must not be null";
042 private final ConfigObject config;
043 private final List<String> keys = new ArrayList<>();
044 private final String source;
045
046 public GroovyScriptResourceBundle(@Nonnull ConfigReader reader, @Nonnull URL location) {
047 this(requireNonNull(reader, ERROR_READER_NULL).parse(requireNonNull(location, "Argument 'location' cannot ne null")), location.toString());
048 }
049
050 public GroovyScriptResourceBundle(@Nonnull ConfigReader reader, @Nonnull Script script) {
051 this(requireNonNull(reader, ERROR_READER_NULL).parse(requireNonNull(script, "Argument 'script' cannot ne null")), script.getClass().getName());
052 }
053
054 public GroovyScriptResourceBundle(@Nonnull ConfigReader reader, @Nonnull String script) {
055 this(requireNonNull(reader, ERROR_READER_NULL).parse(requireNonBlank(script, "Argument 'script' cannot ne blank")), "<<INLINE SCRIPT>>");
056 }
057
058 public GroovyScriptResourceBundle(@Nonnull ConfigReader reader, @Nonnull Class<? extends Script> scriptClass) {
059 this(requireNonNull(reader, ERROR_READER_NULL).parse(requireNonNull(scriptClass, "Argument 'scriptClass' cannot ne null")), scriptClass.getName());
060 }
061
062 @SuppressWarnings("unchecked")
063 private GroovyScriptResourceBundle(@Nonnull ConfigObject config, @Nonnull String source) {
064 this.config = requireNonNull(config, "Argument 'config' must not be null");
065 this.source = source;
066 keys.addAll(this.config.flatten(new LinkedHashMap<>()).keySet());
067 }
068
069 @Nonnull
070 public String getSource() {
071 return source;
072 }
073
074 @Override
075 public String toString() {
076 return super.toString() + "[" + source + "]";
077 }
078
079 @Nullable
080 @Override
081 @SuppressWarnings("unchecked")
082 protected Object handleGetObject(@Nonnull String key) {
083 Object value = getConfigValue(config, requireNonBlank(key, "Argument 'key' must not be blank"), null);
084 if (null == value) return null;
085 if (value instanceof ConfigObject) {
086 return ((ConfigObject) value).isEmpty() ? null : value;
087 }
088 return value;
089 }
090
091 @Nonnull
092 @Override
093 public Enumeration<String> getKeys() {
094 final Iterator<String> keysIterator = keys.iterator();
095 return new Enumeration<String>() {
096 public boolean hasMoreElements() {
097 return keysIterator.hasNext();
098 }
099
100 public String nextElement() {
101 return keysIterator.next();
102 }
103 };
104 }
105 }
|