blob: 38c77594e68cf18dfa8e59a780394fb1fe66ec0e [file] [log] [blame]
/*
*
* 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.flex.compiler.ant.types;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DynamicElement;
import org.apache.tools.ant.types.Commandline;
import org.apache.flex.compiler.ant.FlexTask;
import org.apache.flex.compiler.ant.config.ConfigString;
import org.apache.flex.compiler.ant.config.NestedAttributeElement;
import org.apache.flex.compiler.ant.config.IOptionSource;
import org.apache.flex.compiler.ant.config.OptionSpec;
/**
* Supports the nested <metadata> tag.
*/
public final class Metadata implements IOptionSource, DynamicElement
{
private static final OptionSpec LOCALIZED_DESCRIPTION = new OptionSpec("metadata.localized-description");
private static final OptionSpec LOCALIZED_TITLE = new OptionSpec("metadata.localized-title");
private static final OptionSpec CONTRIBUTOR = new OptionSpec("metadata.contributor");
private static final OptionSpec CREATOR = new OptionSpec("metadata.creator");
private static final OptionSpec LANGUAGE = new OptionSpec("metadata.language");
private static final OptionSpec PUBLISHER = new OptionSpec("metadata.publisher");
public Metadata()
{
this(null);
}
public Metadata(FlexTask task)
{
date = new ConfigString(new OptionSpec("metadata", "date"));
description = new ConfigString(new OptionSpec("metadata", "description"));
title = new ConfigString(new OptionSpec("metadata", "title"));
nestedAttribs = new ArrayList<NestedAttributeElement>();
this.task = task;
}
private final ConfigString date;
private final ConfigString description;
private final ConfigString title;
private final ArrayList<NestedAttributeElement> nestedAttribs;
private final FlexTask task;
/*=======================================================================*
* Attributes *
*=======================================================================*/
public void setDate(String value)
{
date.set(value);
}
public void setDescription(String value)
{
description.set(value);
}
public void setTitle(String value)
{
title.set(value);
}
/*=======================================================================*
* Nested Elements
*=======================================================================*/
public NestedAttributeElement createContributor()
{
return createElem("name", CONTRIBUTOR);
}
public NestedAttributeElement createCreator()
{
return createElem("name", CREATOR);
}
public NestedAttributeElement createLanguage()
{
return createElem("code", LANGUAGE);
}
public NestedAttributeElement createPublisher()
{
return createElem("name", PUBLISHER);
}
public Object createDynamicElement(String name)
{
/*
* Name is checked against getAlias() because both of these options
* have prefixes. We don't want to allow something like:
*
* <metadata>
* <metadata.localized-title title="foo" lang="en" />
* </metadata>
*/
if (LOCALIZED_DESCRIPTION.matches(name))
{
return createElem(new String[] { "text", "lang" }, LOCALIZED_DESCRIPTION);
}
else if (LOCALIZED_TITLE.matches(name))
{
return createElem(new String[] { "title", "lang" }, LOCALIZED_TITLE);
}
else
{
throw new BuildException("Invalid element: " + name);
}
}
private NestedAttributeElement createElem(String attrib, OptionSpec spec)
{
NestedAttributeElement e = new NestedAttributeElement(attrib, spec, task);
nestedAttribs.add(e);
return e;
}
private NestedAttributeElement createElem(String[] attribs, OptionSpec spec)
{
NestedAttributeElement e = new NestedAttributeElement(attribs, spec, task);
nestedAttribs.add(e);
return e;
}
/*=======================================================================*
* IOptionSource interface *
*=======================================================================*/
public void addToCommandline(Commandline cmdline)
{
date.addToCommandline(cmdline);
description.addToCommandline(cmdline);
title.addToCommandline(cmdline);
Iterator<NestedAttributeElement> it = nestedAttribs.iterator();
while (it.hasNext())
{
((IOptionSource) it.next()).addToCommandline(cmdline);
}
}
}