Example usage for org.aspectj.weaver.loadtime.definition DocumentParser parse

List of usage examples for org.aspectj.weaver.loadtime.definition DocumentParser parse

Introduction

In this page you can find the example usage for org.aspectj.weaver.loadtime.definition DocumentParser parse.

Prototype

public static Definition parse(final URL url) throws Exception 

Source Link

Usage

From source file:org.eclipse.equinox.weaving.aspectj.loadtime.AspectAdminImpl.java

License:Open Source License

/**
 * Parse the aspect definition for the given bundle, if there is one.
 * /*from   w ww.j  ava  2 s.  com*/
 * @param bundle The bundle for which the aspect definition should be parsed
 */
protected void parseDefinitions(final Bundle bundle) {
    try {
        Definition allAspectsDefinition = null;
        final Set<String> exportedAspects = new LinkedHashSet<String>();
        final Set<Definition.ConcreteAspect> exportedConcreteAspects = new HashSet<Definition.ConcreteAspect>();
        final Map<String, Integer> policies = new HashMap<String, Integer>();
        final Set<String> exportedPackages = new HashSet<String>();

        // try to find aop.xml file
        final String aopXmlLocation = getDefinitionLocation(bundle);
        final URL aopXmlDef = bundle.getEntry(aopXmlLocation);
        if (aopXmlDef != null) {
            allAspectsDefinition = DocumentParser.parse(aopXmlDef);
        }

        // parse export package headers
        final Dictionary<?, ?> manifest = bundle.getHeaders(""); //$NON-NLS-1$
        final ManifestElement[] exports = ManifestElement.parseHeader(Constants.EXPORT_PACKAGE,
                (String) manifest.get(Constants.EXPORT_PACKAGE));

        for (int i = 0; exports != null && i < exports.length; i++) {
            final String packageName = exports[i].getValue();
            exportedPackages.add(packageName);

            // policies
            final String policy = exports[i].getDirective(ASPECT_POLICY_DIRECTIVE);
            if (policy != null && policy.trim().toLowerCase().equals(ASPECT_POLICY_DIRECTIVE_OPT_OUT)) {
                policies.put(packageName, AspectAdmin.ASPECT_POLICY_OPT_OUT);
            }
            if (policy != null && policy.trim().toLowerCase().equals(ASPECT_POLICY_DIRECTIVE_OPT_IN)) {
                policies.put(packageName, AspectAdmin.ASPECT_POLICY_OPT_IN);
            }

            // aspects
            final String allaspects = exports[i].getAttribute(ASPECTS_ATTRIBUTE);
            if (allaspects != null) {
                final String[] aspects = ManifestElement.getArrayFromList(allaspects);
                if (aspects != null) {
                    for (int j = 0; j < aspects.length; j++) {
                        exportedAspects.add(packageName + "." + aspects[j]); //$NON-NLS-1$
                    }
                }
            }
        }

        // add aop.xml declared aspects to the list of exported aspects if their packages are exported
        if (allAspectsDefinition != null && allAspectsDefinition.getAspectClassNames() != null) {
            final Iterator<?> iterator = allAspectsDefinition.getAspectClassNames().iterator();
            while (iterator.hasNext()) {
                final String aspect = (String) iterator.next();
                final String packageName = getPackage(aspect);
                if (exportedPackages.contains(packageName)) {
                    exportedAspects.add(aspect);
                }
            }
        }

        if (allAspectsDefinition != null && allAspectsDefinition.getConcreteAspects().size() > 0) {
            final Iterator<?> iterator = allAspectsDefinition.getConcreteAspects().iterator();
            while (iterator.hasNext()) {
                final Definition.ConcreteAspect concreteAspect = (Definition.ConcreteAspect) iterator.next();
                if (concreteAspect.name != null && exportedPackages.contains(getPackage(concreteAspect.name))) {
                    exportedConcreteAspects.add(concreteAspect);
                }
            }
        }

        if (allAspectsDefinition != null) {
            this.aspectDefinitions.put(bundle, allAspectsDefinition);
        }

        if (exportedAspects.size() > 0 || exportedConcreteAspects.size() > 0
                || (allAspectsDefinition != null && allAspectsDefinition.getWeaverOptions().length() > 0)) {
            final Definition exportedAspectsDefinition = new Definition();
            exportedAspectsDefinition.getAspectClassNames().addAll(exportedAspects);
            exportedAspectsDefinition.getConcreteAspects().addAll(exportedConcreteAspects);

            if (allAspectsDefinition != null && allAspectsDefinition.getWeaverOptions().trim().length() > 0) {
                exportedAspectsDefinition.appendWeaverOptions(allAspectsDefinition.getWeaverOptions());
            }

            this.aspectDefinitionsExported.put(bundle, exportedAspectsDefinition);
        }

        if (policies.size() > 0) {
            this.aspectPolicies.put(bundle, policies);
        }

    } catch (final Exception e) {
        e.printStackTrace();
    }
}