This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-bnd-models.git
commit 54f9140750771741d4bbb0248bf7fce7062c881a Author: Stefan Seifert <[email protected]> AuthorDate: Thu Nov 3 15:48:00 2016 +0000 SLING-6048 bnd plugin for sling models git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1767910 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 56 ++++++++++++ .../sling/bnd/models/ModelsScannerPlugin.java | 100 +++++++++++++++++++++ 2 files changed, 156 insertions(+) diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..a949d52 --- /dev/null +++ b/pom.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + 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. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.sling</groupId> + <artifactId>sling</artifactId> + <version>29</version> + <relativePath /> + </parent> + + <artifactId>org.apache.sling.bnd.models</artifactId> + <packaging>jar</packaging> + <version>1.0.0-SNAPSHOT</version> + <name>Apache Sling Models bnd Plugin</name> + <description>This bnd plugin detected all Sling Models classes and adds a bundle header 'Sling-Model-Classes' containing their names.</description> + + <scm> + <connection>scm:svn:http://svn.apache.org/repos/asf/sling/trunk/tooling/bnd/models-bnd-plugin</connection> + <developerConnection>scm:svn:https://svn.apache.org/repos/asf/sling/trunk/tooling/bnd/models-bnd-plugin</developerConnection> + <url>http://svn.apache.org/viewvc/sling/trunk/tooling/bnd/models-bnd-plugin</url> + </scm> + + <dependencies> + <dependency> + <groupId>biz.aQute.bnd</groupId> + <artifactId>biz.aQute.bndlib</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>3.3.2</version> + <scope>compile</scope> + </dependency> + </dependencies> + +</project> diff --git a/src/main/java/org/apache/sling/bnd/models/ModelsScannerPlugin.java b/src/main/java/org/apache/sling/bnd/models/ModelsScannerPlugin.java new file mode 100644 index 0000000..07b4319 --- /dev/null +++ b/src/main/java/org/apache/sling/bnd/models/ModelsScannerPlugin.java @@ -0,0 +1,100 @@ +/* + * 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.sling.bnd.models; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; + +import aQute.bnd.osgi.Analyzer; +import aQute.bnd.osgi.Clazz; +import aQute.bnd.osgi.Clazz.QUERY; +import aQute.bnd.osgi.Instruction; +import aQute.bnd.service.AnalyzerPlugin; +import aQute.bnd.service.Plugin; +import aQute.service.reporter.Reporter; + +/** + * Scans the classpath of the bundle for Sling Models classes. + * All class names found are stored in a bundle header for processing them at runtime and reading their metadata. + */ +public class ModelsScannerPlugin implements AnalyzerPlugin, Plugin { + + private static final String MODELS_ANNOTATION_CLASS = "org.apache.sling.models.annotations.Model"; + + private static final String MODELS_PACKAGES_HEADER = "Sling-Model-Packages"; + private static final String MODELS_CLASSES_HEADER = "Sling-Model-Classes"; + + private Reporter reporter; + + @Override + public void setProperties(Map<String, String> map) throws Exception { + // ignore + } + + @Override + public void setReporter(Reporter reporter) { + this.reporter = reporter; + } + + @Override + public boolean analyzeJar(Analyzer analyzer) throws Exception { + + // process only if no models packages or class header was set + if (analyzer.get(MODELS_PACKAGES_HEADER) == null && analyzer.get(MODELS_CLASSES_HEADER) == null) { + + // get all annotation classes from this project with Configuration annotation + Collection<String> classNames = getClassesWithAnnotation(MODELS_ANNOTATION_CLASS, analyzer); + + // set bundle header containing all class names found + analyzer.set(MODELS_CLASSES_HEADER, StringUtils.join(classNames, ",")); + + } + + // we did not change any classes - no need to re-analyze + return false; + } + + /** + * Get all classes that implement the given annotation via bnd Analyzer. + * @param analyzer Analyzer + * @param annotation Annotation + * @return Class names + */ + private Collection<String> getClassesWithAnnotation(String annotationClassName, Analyzer analyzer) { + List<String> classNames = new ArrayList<>(); + Collection<Clazz> clazzes = analyzer.getClassspace().values(); + Instruction instruction = new Instruction(annotationClassName); + try { + for (Clazz clazz : clazzes) { + if (clazz.isAnnotation() && clazz.is(QUERY.ANNOTATED, instruction, analyzer)) { + classNames.add(clazz.getClassName().getFQN()); + } + } + } + catch (Exception ex) { + reporter.exception(ex, "Error querying for classes with annotation: " + annotationClassName); + } + return classNames; + } + +} -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
