package aQute.bnd.help;

import java.util.*;
import java.util.regex.*;

import aQute.lib.osgi.*;

public class Syntax implements Constants {
    final String                            header;
    final String                            lead;
    final String                            example;
    final Pattern                           pattern;
    final String                            values;
    final Syntax[]                          children;

    static Syntax                           version              = new Syntax(
                                                                         VERSION_ATTRIBUTE,
                                                                         "A version range to select the version of an export definition. The default value is 0.0.0 .",
                                                                         "version=\"[1.2,3.0)\"",
                                                                         null,
                                                                         Verifier.VERSIONRANGE);
    static Syntax                           bundle_symbolic_name = new Syntax(
                                                                         BUNDLE_SYMBOLIC_NAME_ATTRIBUTE,
                                                                         "The bundle symbolic name of the exporting bundle.",
                                                                         "bundle-symbolic-name=com.acme.foo.daffy",
                                                                         null,
                                                                         Verifier.SYMBOLICNAME);

    static Syntax                           bundle_version       = new Syntax(
                                                                         BUNDLE_VERSION_ATTRIBUTE,
                                                                         "a version range to select the bundle version of the exporting bundle. The default value is 0.0.0.",
                                                                         "bundle-version=1.3",
                                                                         null,
                                                                         Verifier.VERSIONRANGE);

    static Syntax                           path_version         = new Syntax(
                                                                         VERSION_ATTRIBUTE,
                                                                         "Specifies the range in the repository, project, or file",
                                                                         "version=project",
                                                                         "project,type",
                                                                         Pattern
                                                                                 .compile("project|type|"
                                                                                         + Verifier.VERSIONRANGE
                                                                                                 .toString()));

    @SuppressWarnings("deprecation")
	static Syntax[]                         syntaxes             = new Syntax[] {
            new Syntax(
                    BUNDLE_ACTIVATIONPOLICY,
                    "The Bundle-ActivationPolicy specifies how the framework should activate the bundle once started. ",
                    "Bundle-ActivationPolicy: lazy", "lazy", Pattern
                            .compile("lazy")),

            new Syntax(
                    BUNDLE_ACTIVATOR,
                    "The Bundle-Activator header specifies the name of the class used to start and stop the bundle. ",
                    "Bundle-Activator: com.acme.foo.Activator",
                    "${classes;implementing;org.osgi.framework.BundleActivator}",
                    Verifier.FQNPATTERN),
            new Syntax(
                    BUNDLE_CATEGORY,
                    "The Bundle-Category header holds a comma-separated list of category names",
                    "Bundle-Category: test",
                    "osgi,test,game,util,eclipse,netbeans,jdk,specification",
                    null),
            new Syntax(
                    BUNDLE_CLASSPATH,
                    "The Bundle-ClassPath header defines a comma-separated list of JAR file path names or directories (inside the bundle) containing classes and resources. The period (’.’) specifies the root directory of the bundle’s JAR. The period is also the default.",
                    "Bundle-Classpath: /lib/libnewgen.so, .", null,
                    Verifier.PATHPATTERN),
            new Syntax(
                    BUNDLE_CONTACTADDRESS,
                    "The Bundle-ContactAddress header provides the contact address of the vendor. ",
                    "Bundle-ContactAddress: 2400 Oswego Road, Austin, TX 74563",
                    null, null),
            new Syntax(
                    BUNDLE_COPYRIGHT,
                    "The Bundle-Copyright header contains the copyright specification for this bundle. ",
                    "Bundle-Copyright: OSGi (c) 2002", null, null),
            new Syntax(
                    BUNDLE_DESCRIPTION,
                    "The Bundle-Description header defines a short description of this bundle.",
                    "Bundle-Description: Ceci ce n'est pas une bundle", null,
                    null),

            new Syntax(
                    BUNDLE_DOCURL,
                    "The Bundle-DocURL headers must contain a URL pointing to documentation about this bundle.",
                    "Bundle-DocURL: http://www.aQute.biz/Code/Bnd", null,
                    Verifier.URLPATTERN),

            new Syntax(
                    BUNDLE_ICON,
                    "The optional Bundle-Icon header provides a list of (relative) URLs to icons representing this bundle in different sizes. ",
                    "Bundle-Icon: /icons/bnd.png;size=64", "/icons/bundle.png",
                    Verifier.URLPATTERN, new Syntax("size",
                            "Icons size in pixels, e.g. 64", "64",
                            "16,32,48,64,128", Verifier.NUMBERPATTERN)),

            new Syntax(
                    BUNDLE_LICENSE,
                    "The Bundle-License header provides an optional machine readable form of license information. The purpose of this header is to automate some of the license processing required by many organizations",
                    "Bundle License: http://www.opensource.org/licenses/jabberpl.php",
                    "http://www.apache.org/licenses/LICENSE-2.0,<<EXTERNAL>>",
                    Pattern.compile("(" + Verifier.URLPATTERN
                            + "|<<EXTERNAL>>)"), new Syntax(
                            DESCRIPTION_ATTRIBUTE,
                            "Human readable description of the license",
                            "description=\"Described the license here\"", null,
                            Verifier.ANYPATTERN), new Syntax(LINK_ATTRIBUTE,
                            "", "", null, Verifier.URLPATTERN)),
            new Syntax(
                    BUNDLE_LOCALIZATION,
                    "The Bundle-Localization header contains the location in the bundle where localization files can be found. The default value is OSGI-INF/l10n/bundle. Translations are by default therefore OSGI-INF/l10n/bundle_de.properties, OSGI-INF/l10n/bundle_nl.properties, etc.",
                    "Bundle-Localization: OSGI-INF/l10n/bundle",
                    "OSGI-INF/l10n/bundle", Verifier.URLPATTERN),
            new Syntax(
                    BUNDLE_MANIFESTVERSION,
                    "This header is set by bnd automatically to 2. The Bundle-ManifestVersion header defines that the bundle follows the rules of this specification. The Bundle-ManifestVersion header determines whether the bundle follows the rules of this specification.",
                    "# Bundle-ManifestVersion: 2", "2", Verifier.NUMBERPATTERN),
            new Syntax(
                    BUNDLE_NAME,
                    "This header will be derived from the  Bundle-SymbolicName if not set. The Bundle-Name header defines a readable name for this bundle. This should be a short, human-readable name that can contain spaces.",
                    "Bundle-Name: My Bundle", null, Verifier.ANYPATTERN),
            new Syntax(
                    BUNDLE_NATIVECODE,
                    "The Bundle-NativeCode header contains a specification of native code libraries contained in this bundle. ",
                    "Bundle-NativeCode: /lib/http.DLL; osname = QNX; osversion = 3.1",
                    null,
                    Verifier.PATHPATTERN,
                    new Syntax(OSNAME_ATTRIBUTE,
                            "The name of the operating system", "osname=MacOS",
                            Processor.join(Verifier.OSNAMES, ","),
                            Verifier.ANYPATTERN),
                    new Syntax(OSVERSION_ATTRIBUTE, "Operating System Version",
                            "osversion=3.1", null, Verifier.ANYPATTERN),
                    new Syntax(LANGUAGE_ATTRIBUTE, "Language ISO 639 code",
                            "language=nl", null, Verifier.ISO639),
                    new Syntax(PROCESSOR_ATTRIBUTE, "Processor name",
                            "processor=x86", Processor.join(
                                    Verifier.PROCESSORNAMES, ","),
                            Verifier.ANYPATTERN),
                    new Syntax(
                            SELECTION_FILTER_ATTRIBUTE,
                            "The value of this attribute must be a filter expression that indicates if the native code clause should be selected or not.",
                            "selection-filter=\"(com.acme.windowing=win32)\"",
                            null, Verifier.FILTERPATTERN)),
            new Syntax(
                    BUNDLE_REQUIREDEXECUTIONENVIRONMENT,
                    "The Bundle-RequiredExecutionEnvironment contains a comma-separated list of execution environments that must be present on the Service Platform.",
                    "Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundation-1.0",
                    Processor.join(Verifier.EES, ","), Verifier.ANYPATTERN),

            new Syntax(
                    BUNDLE_SYMBOLICNAME,
                    "The Bundle-SymbolicName header specifies a non-localizable name for this bundle. The bundle symbolic name together with a version must identify a  unique bundle. The bundle symbolic name should be based on the reverse  domain name convention",
                    "Bundle-SymbolicName: com.acme.foo.daffy;singleton:=true",
                    "${p}",
                    Verifier.SYMBOLICNAME,
                    new Syntax(
                            SINGLETON_DIRECTIVE,
                            " Indicates that the bundle can only have  a single version resolved.  A value of true indicates that the bundle is a singleton bundle. The default value is false. The Framework must resolve at most one  bundle when multiple versions of a singleton bundle with the same symbolic name are installed. Singleton bundles do not affect the resolution of non-singleton bundles with the same symbolic name.",
                            "false", "true,false", Verifier.TRUEORFALSEPATTERN),
                    new Syntax(
                            FRAGMENT_ATTACHMENT_DIRECTIVE,
                            "Defines how fragments are allowed to be attached, see the fragments in Fragment Bundles on page73. The following values are valid for this directive:",
                            "", "always|never|resolve-time", Pattern
                                    .compile("always|never|resolve-time")),
                    new Syntax(BLUEPRINT_WAIT_FOR_DEPENDENCIES_ATTRIBUTE, "",
                            "", "true,false", Verifier.TRUEORFALSEPATTERN),
                    new Syntax(BLUEPRINT_TIMEOUT_ATTRIBUTE, "", "",
                            "30000,60000,300000", Verifier.NUMBERPATTERN)),

            new Syntax(
                    BUNDLE_UPDATELOCATION,
                    "The Bundle-UpdateLocation header specifies a URL where an update for this bundle should come from. If the bundle is updated, this location should be used, if present, to retrieve the updated JAR file.",
                    "Bundle-UpdateLocation: http://www.acme.com/Firewall/bundle.jar",
                    null, Verifier.URLPATTERN),

            new Syntax(
                    BUNDLE_VENDOR,
                    "The Bundle-Vendor header contains a human-readable description of the bundle vendor. ",
                    "Bundle-Vendor: OSGi Alliance ", null, null),

            new Syntax(
                    BUNDLE_VERSION,
                    "The Bundle-Version header specifies the version of this bundle",
                    "Bundle-Version: 1.23.4.build200903221000", null,
                    Verifier.VERSION),

            new Syntax(
                    DYNAMICIMPORT_PACKAGE,
                    "The DynamicImport-Package header contains a comma-separated list of package names that should be dynamically imported when needed.",
                    "DynamicImport-Package: com.acme.plugin.*", "",
                    Verifier.WILDCARDNAMEPATTERN, version,
                    bundle_symbolic_name, bundle_version),

            new Syntax(
                    EXPORT_PACKAGE,
                    "The Export-Package header contains a declaration of exported packages.",
                    "Export-Package: org.osgi.util.tracker;version=1.3",
                    "${packages}",
                    null,
                    new Syntax(
                            NO_IMPORT_DIRECTIVE,
                            "By default, bnd makes all exports also imports. Adding a -noimport to an exported package will make it export only",
                            "-noimport:=true", "true,false",
                            Verifier.TRUEORFALSEPATTERN),
                    new Syntax(
                            USES_DIRECTIVE,
                            "Calculated by bnd: It is a comma-separated list of package names that are used by the exported package",
                            "Is calculated by bnd", null, null),
                    new Syntax(
                            MANDATORY_DIRECTIVE,
                            "A comma-separated list of attribute names. Note that the use of a comma in the value requires it to be enclosed in double quotes. A bundle importing the package must specify the mandatory attributes, with a value that matches, to resolve to the exported package",
                            "mandatory=\"bar,foo\"", null, null),
                    new Syntax(
                            INCLUDE_DIRECTIVE,
                            "A comma-separated list of class names that must be visible to an importer",
                            "include:=\"Qux*\"", null, null),
                    new Syntax(
                            EXCLUDE_DIRECTIVE,
                            "A comma-separated list of class names that must not be visible to an importer",
                            "exclude:=\"QuxImpl*,BarImpl\"", null,
                            Verifier.WILDCARDNAMEPATTERN), new Syntax(
                            IMPORT_DIRECTIVE, "Experimental", "", null, null)

            ),
            new Syntax(EXPORT_SERVICE, "Deprecated",
                    "Export-Service: org.osgi.service.log.LogService ",
                    "${classes;implementing;*}", null),
            new Syntax(
                    FRAGMENT_HOST,
                    "The Fragment-Host header defines the host bundle for this fragment.",
                    "Fragment-Host: org.eclipse.swt; bundle-version=\"[3.0.0,4.0.0)\"",
                    null,
                    null,
                    new Syntax(
                            EXTENSION_DIRECTIVE,
                            " Indicates this extension is a system or boot class path extension. It is only applicable when the Fragment-Host is the System Bundle",
                            "extension:=framework", "framework,bootclasspath",
                            Pattern.compile("framework|bootclasspath")),
                    bundle_version),
            new Syntax(
                    IMPORT_PACKAGE,
                    "This header is normally calculated by bnd, however, you can decorate packages or skip packages. The Import-Package header declares the imported packages for this bundle",
                    "Import-Package: !com.exotic.*, com.acme.foo;vendor=ACME, *",
                    "${exported_packages}",
                    Verifier.WILDCARDNAMEPATTERN,
                    new Syntax(
                            REMOVE_ATTRIBUTE_DIRECTIVE,
                            "Remove the given attributes from matching imported packages",
                            "-remove-attribute:=foo.*", null,
                            Verifier.WILDCARDNAMEPATTERN),
                    new Syntax(
                            RESOLUTION_DIRECTIVE,
                            "Indicates that the packages must be resolved if the value is mandatory, which is the default. If mandatory packages cannot be resolved, then the bundle must fail to resolve. A value of optional indicates that the packages are optional",
                            "resolution:=optional", "mandatory,optional",
                            Pattern.compile("mandatory|optional")

                    ), version, bundle_symbolic_name, bundle_version),

            new Syntax(
                    REQUIRE_BUNDLE,
                    "The Require-Bundle header specifies the required exports from another bundle.",
                    "Require-Bundle: com.acme.chess",
                    null,
                    Verifier.WILDCARDNAMEPATTERN,

                    new Syntax(
                            VISIBILITY_DIRECTIVE,
                            " If the value is private (Default), then all visible packages from the required bundles are not re-exported. If the value is reexport then bundles that require this bundle will transitively have access to these required bundle’s exported packages.",
                            "visibility:=private", "private,reexport", Pattern
                                    .compile("private|reexport")),

                    new Syntax(
                            RESOLUTION_DIRECTIVE,
                            "If the value is mandatory (default) then the required bundle must exist for this bundle to resolve. If the value is optional, the bundle will resolve even if the required bundle does not exist.",
                            "resolution:=optional", "mandatory,optional",
                            Pattern.compile("mandatory|optional")),

                    new Syntax(
                            SPLIT_PACKAGE_DIRECTIVE,
                            "Indicates how an imported package should be merged when it is split between different exporters. The default is merge-first with warning",
                            "-split-package:=merge-first",
                            "merge-first,merge-last,error,first",
                            Pattern
                                    .compile("merge-first|merge-last|error|first")),
                    bundle_version

            ),
            new Syntax(
                    BUILDPATH,
                    "Provides the class path for building the jar. The entries are references to the repository",
                    "-buildpath=osgi;version=4.1", "${repo;bsns}",
                    Verifier.SYMBOLICNAME, path_version),
            new Syntax(
                    BUMPPOLICY,
                    "Sets the version bump policy. This is a parameter to the ${version} macro.",
                    "-bumppolicy==+0", "==+,=+0,+00", Pattern
                            .compile("[=+-0][=+-0][=+-0]")),

            new Syntax(
                    CONDUIT,
                    "Allows a bnd file to point to files which will be returned when the bnd file is build",
                    "-conduit= jar/osgi.jar", null, null),

            new Syntax(
                    DEPENDSON,
                    "List of project names that this project directly depends on. These projects are always build ahead of this project",
                    "-dependson=org.acme.cm", "${projects}", null),

            new Syntax(DEPLOYREPO,
                    "Specifies to which repo the project should be deployed.",
                    "-deployrepo=cnf", "${repos}", null),

            new Syntax(
                    DONOTCOPY,
                    "Regular expression for names of files and directories that should not be copied when discovered",
                    "-donotcopy=(CVS|\\.svn)", null, null),

            new Syntax(
                    EXPORT_CONTENTS,
                    "Build the JAR in the normal way but use this header for the Export-Package header manifest generation, same format",
                    "-exportcontents=!*impl*,*;version=3.0", null, null),

            new Syntax(
                    FAIL_OK,
                    "Return with an ok status (0) even if the build generates errors",
                    "-failok=true", "true,false", Verifier.TRUEORFALSEPATTERN),

            new Syntax(
                    INCLUDE,
                    "Include files. If an entry starts with '-', it does not have to exist. If it starts with '~', it must not overwrite any existing properties",
                    "-include: -${java.user}/.bnd", null, null),

            new Syntax(
                    INCLUDERESOURCE,
                    "Include resources from the file system. You can specify a directory, or file. All files are copied to the root, unless a destination directory is indicated",
                    "-includeresource: lib=jar", null, null),

            new Syntax(
                    MAKE,
                    "Set patterns for make plugins. These patterns are used to find a plugin that can make a resource that can not be found.",
                    "-make: (*).jar;type=bnd;  recipe=\"bnd/$1.bnd\"", null,
                    null, new Syntax("type", "Type name for plugin",
                            "type=bnd", "bnd", null), new Syntax("recipe",
                            "Recipe for the plugin, can use back references",
                            "recipe=\"bnd/$1.bnd\"", "bnd", null)),

            new Syntax(
                    MANIFEST,
                    "Directly include a manifest, do not use the calculated manifest",
                    "-manifest = META-INF/MANIFEST.MF", null, null),

            new Syntax(NOEXTRAHEADERS, "Do not generate housekeeping headers",
                    "-noextraheaders", "true,false",
                    Verifier.TRUEORFALSEPATTERN),

            new Syntax(NOUSES,
                    "Do not calculate the uses: directive on exports",
                    "-nouses=true", "true,false", Verifier.TRUEORFALSEPATTERN),

            new Syntax(NOPE,
                    "Deprecated, use -nobundles. ",
                    "-nope=true", "true,false", Verifier.TRUEORFALSEPATTERN),

            new Syntax(
                    PEDANTIC,
                    "Warn about things that are not really wrong but still not right",
                    "-nope=true", "true,false", Verifier.TRUEORFALSEPATTERN),

            new Syntax(
                    PLUGIN,
                    "Define the plugins",
                    "-plugin=aQute.lib.spring.SpringComponent,aQute.lib.deployer.FileRepo;location=${repo}",
                    null, null),

            new Syntax(SERVICE_COMPONENT,
                    "The header for Declarative Services",
                    "Service-Component=com.acme.Foo?;activate='start'", null,
                    null),

            new Syntax(POM, "Generate a maven pom", "-pom=true", "true,false",
                    Verifier.TRUEORFALSEPATTERN),

            new Syntax(RELEASEREPO,
                    "Specifies to which repo the project should be released.",
                    "-releaserepo=cnf", "${repos}", null),

            new Syntax(REMOVEHEADERS,
                    "Remove all headers that match the regular expressions",
                    "-removeheaders=FOO_.*,Proprietary", null, null),
            new Syntax(
                    RESOURCEONLY,
                    "Normally bnd warns when the JAR does not contain any classes, this option suppresses this warning",
                    "-resourceonly=true", "true,false",
                    Verifier.TRUEORFALSEPATTERN),
            new Syntax(SOURCES, "Include sources in the jar", "-sources=true",
                    "true,false", Verifier.TRUEORFALSEPATTERN),
            new Syntax(
                    SOURCEPATH,
                    "List of directory names that used to source sources for -sources",
                    "-sourcepath:= src, test", null, null),
            new Syntax(
                    SUB,
                    "Build a set of bnd files that use this bnd file as a basis. The list of bnd file can be specified with wildcards",
                    "-sub=com.acme.*.bnd", null, null),
            new Syntax(
                    RUNPROPERTIES,
                    "Properties that are set as system properties before the framework is started",
                    "-runproperties= foo=3, bar=4", null, null),
            new Syntax(RUNSYSTEMPACKAGES,
                    "Add additional system packages to a framework run",
                    "-runsystempackages=com.acme.foo,javax.management", null,
                    null),
            new Syntax(
                    RUNBUNDLES,
                    "Add additional bundles, specified with their bsn and version like in -buildpath, that are started before the project is run",
                    "-runbundles=osgi;version=\"[4.1,4.2)\", junit.junit, com.acme.foo;version=project",
                    null, Verifier.SYMBOLICNAME, path_version),
            new Syntax(
                    RUNPATH,
                    "Additional JARs for the VM path, should include the framework",
                    "-runpath=org.eclipse.osgi;version=3.5", null, null,
                    path_version),
            new Syntax(
                    RUNVM,
                    "Additional arguments for the VM invokation. Keys that start with a - are added as options, otherwise they are treated as -D properties for the VM",
                    "-runvm=-Xmax=30", null, null),
            new Syntax(
                    VERSIONPOLICY,
                    "Provides a version policy to imports that are calculated from exports",
                    "-versionpolicy = \"[${version;==;${@}},${version;+;${@}})\"",
                    null, null)

                                                                 };

    public final static Map<String, Syntax> HELP                 = new HashMap<String, Syntax>();

    static {
        for (Syntax s : syntaxes) {
            HELP.put(s.header, s);
        }
    }

    public Syntax(String header, String lead, String example, String values,
            Pattern pattern, Syntax... children) {
        this.header = header;
        this.children = children;
        this.lead = lead;
        this.example = example;
        this.values = values;
        this.pattern = pattern;
    }

    public String getLead() {
        return lead;
    }

    public String getExample() {
        return example;
    }

    public String getValues() {
        return values;
    }

    public String getPattern() {
        return lead;
    }

    public Syntax[] getChildren() {
        return children;
    }

    public String getHeader() {
        return header;
    }

}
