/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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.apache.ant.s3;

import java.util.Objects;
import java.util.Properties;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.apache.tools.ant.DynamicElementNS;
import org.apache.tools.ant.Project;

/**
 * <p>
 * Structure to allow inline specification of properties.
 * </p>
 * <p>
 * Example: {pre}&lt;foo&gt;foo-value&lt;/foo&gt;
 * &lt;bar&gt;bar-value&lt;/bar&gt; &lt;baz&gt;baz -nextline-value&lt;/baz&gt;
 * {/pre}
 * </p>
 */
public class InlineProperties extends S3DataType implements DynamicElementNS {
    /**
     * Create a new {@link InlineProperties} instance.
     * 
     * @param project
     */
    public InlineProperties(final Project project) {
        super(project);
    }

    /**
     * Represents a single inline property.
     */
    public final class InlineProperty {
        private final String name;

        private InlineProperty(final String name) {
            this.name = name;
        }

        /**
         * Add text to this property.
         *
         * @param text
         *            to add
         */
        public void addText(final String text) {
            final String value;
            if (properties.containsKey(name)) {
                value = Stream.of(properties.getProperty(name), text).filter(Objects::nonNull)
                    .collect(Collectors.joining());
            } else {
                value = text;
            }
            properties.setProperty(name, value);
        }
    }

    /**
     * {@link Properties} object maintained by the {@link InlineProperties}.
     */
    final Properties properties = new Properties();

    /**
     * Handle the specified nested element.
     *
     * @param uri
     *            String URI
     * @param localName
     *            local element name
     * @param qName
     *            qualified name
     * @return InlineProperty
     */
    @Override
    public InlineProperty createDynamicElement(final String uri, final String localName, final String qName) {
        return new InlineProperty(localName);
    }
}