/*
 * 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.props;

import java.net.URI;
import java.net.URL;

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

/**
 * PropertyEvaluator that resolves a reference against the current project.
 */
public class EncodeURLEvaluator extends StaticPrefixedEvaluator {
    /** Default prefix */
    public static final String DEFAULT_PREFIX = "encodeURL";

    /**
     * Create a new EncodeURLEvaluator.
     */
    public EncodeURLEvaluator() {
        super(DEFAULT_PREFIX);
    }

    /**
     * {@inheritDoc}
     * 
     * @see org.apache.ant.props.PrefixedEvaluator#evaluatePrefixed(java.lang.String,
     *      java.lang.String, org.apache.tools.ant.PropertyHelper)
     */
    protected Object evaluate(String property, String prefix, PropertyHelper propertyHelper) {
        try {
            URL url = new URL(property);
            URI uri = new URI(url.getProtocol(), url.getUserInfo(),
                     url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
            return uri.toASCIIString();
        } catch (Exception e) {
            propertyHelper.getProject().log("Encountered exception encoding URL text \""
                    + property + "\"; aborting", e, Project.MSG_ERR);
            return null;
        }
    }
}
