This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.hc.annotations-1.0.2 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-hc-annotations.git
commit 38738d56600c66ea2413326a60e25c1e3ec4718e Author: Bertrand Delacretaz <[email protected]> AuthorDate: Wed Jul 30 19:51:03 2014 +0000 SLING-3624 - move SlingHealthCheck annotation to a new annotations jar git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/healthcheck/annotations@1614748 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 57 +++++++++ .../sling/hc/annotations/SlingHealthCheck.java | 68 +++++++++++ .../hc/annotations/SlingHealthCheckProcessor.java | 134 +++++++++++++++++++++ ...felix.scrplugin.annotations.AnnotationProcessor | 1 + 4 files changed, 260 insertions(+) diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..13547ef --- /dev/null +++ b/pom.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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 http://maven.apache.org/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.sling</groupId> + <artifactId>sling</artifactId> + <version>19</version> + <relativePath>../../../../parent/pom.xml</relativePath> + </parent> + + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.hc.annotations</artifactId> + <packaging>jar</packaging> + <version>0.9.9-SNAPSHOT</version> + + <name>Apache Sling Health Check Annotations</name> + <inceptionYear>2013</inceptionYear> + + <description> + Sling Health Check Annotations + </description> + + <properties> + <sling.java.version>6</sling.java.version> + </properties> + + <scm> + <connection>scm:svn:http://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/healthcheck/annotations</connection> + <developerConnection>scm:svn:https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/healthcheck/annotations</developerConnection> + <url>http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/healthcheck/annotations</url> + </scm> + + <dependencies> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.compendium</artifactId> + </dependency> + <dependency> + <groupId>org.apache.felix</groupId> + <artifactId>org.apache.felix.scr.generator</artifactId> + <version>1.10.0</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.hc.core</artifactId> + <version>1.1.0</version> + <scope>provided</scope> + </dependency> + </dependencies> +</project> diff --git a/src/main/java/org/apache/sling/hc/annotations/SlingHealthCheck.java b/src/main/java/org/apache/sling/hc/annotations/SlingHealthCheck.java new file mode 100644 index 0000000..dcba01f --- /dev/null +++ b/src/main/java/org/apache/sling/hc/annotations/SlingHealthCheck.java @@ -0,0 +1,68 @@ +/* + * 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 SF 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.hc.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.apache.felix.scr.annotations.ConfigurationPolicy; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.CLASS) +public @interface SlingHealthCheck { + + /** Whether to generate a default SCR component tag. If set to false, a {@link org.apache.felix.scr.annotations.Component} annotation can be added manually + * with defined whatever configuration needed. */ + boolean generateComponent() default true; + + /** Whether to generate a default SCR service tag with "interface=org.apache.sling.hc.api.HealthCheck". If set to false, a + * {@link org.apache.felix.scr.annotations.Service} annotation can be added manually with defined whatever configuration needed. */ + boolean generateService() default true; + + /** Defines the name of the health check. */ + String name(); + + /** Defines the Component name also used as the PID for the Configuration Admin Service. Default value: Fully qualified name of the Java class. */ + String componentName() default ""; + + /** Whether Metatype Service data is generated or not. If this parameter is set to true Metatype Service data is generated in the <code>metatype.xml</code> + * file for this component. Otherwise no Metatype Service data is generated for this component. */ + boolean metatype() default true; + + /** Set the metatype factory pid property (only for non factory components). */ + boolean configurationFactory() default false; + + /** The component configuration policy */ + ConfigurationPolicy configurationPolicy() default ConfigurationPolicy.OPTIONAL; + + /** This is generally used as a title for the object described by the meta type. This name may be localized by prepending a % sign to the name. Default + * value: %<name>.name */ + String label() default ""; + + /** This is generally used as a description for the object described by the meta type. This name may be localized by prepending a % sign to the name. Default + * value: %<name>.description */ + String description() default ""; + + /** One ore more tags. + * <p> + * This attribute is converted to values for the <code>hc.tags</code> property. */ + String[] tags() default {}; + +} diff --git a/src/main/java/org/apache/sling/hc/annotations/SlingHealthCheckProcessor.java b/src/main/java/org/apache/sling/hc/annotations/SlingHealthCheckProcessor.java new file mode 100644 index 0000000..84562e4 --- /dev/null +++ b/src/main/java/org/apache/sling/hc/annotations/SlingHealthCheckProcessor.java @@ -0,0 +1,134 @@ +/* + * 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 SF 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.hc.annotations; + +import java.util.List; + +import org.apache.felix.scrplugin.SCRDescriptorException; +import org.apache.felix.scrplugin.SCRDescriptorFailureException; +import org.apache.felix.scrplugin.annotations.AnnotationProcessor; +import org.apache.felix.scrplugin.annotations.ClassAnnotation; +import org.apache.felix.scrplugin.annotations.ScannedClass; +import org.apache.felix.scrplugin.description.ClassDescription; +import org.apache.felix.scrplugin.description.ComponentConfigurationPolicy; +import org.apache.felix.scrplugin.description.ComponentDescription; +import org.apache.felix.scrplugin.description.PropertyDescription; +import org.apache.felix.scrplugin.description.PropertyType; +import org.apache.felix.scrplugin.description.PropertyUnbounded; +import org.apache.felix.scrplugin.description.ServiceDescription; +import org.apache.sling.hc.api.HealthCheck; + +/** Annotation processor for the SlingHealthCheck annotation. */ +public class SlingHealthCheckProcessor implements AnnotationProcessor { + + @Override + public void process(final ScannedClass scannedClass, final ClassDescription classDescription) throws SCRDescriptorException, SCRDescriptorFailureException { + final List<ClassAnnotation> servlets = scannedClass.getClassAnnotations(SlingHealthCheck.class.getName()); + scannedClass.processed(servlets); + + for (final ClassAnnotation cad : servlets) { + processHealthCheck(cad, classDescription); + } + } + + /** Processes the given healthcheck annotation. + * + * @param cad the annotation + * @param classDescription the class description */ + private void processHealthCheck(final ClassAnnotation cad, final ClassDescription classDescription) { + + final boolean generateComponent = cad.getBooleanValue("generateComponent", true); + final boolean metatype = cad.getBooleanValue("metatype", true); + + // generate ComponentDescription if required + if (generateComponent) { + final ComponentDescription cd = new ComponentDescription(cad); + cd.setName(cad.getStringValue("componentName", classDescription.getDescribedClass().getName())); + cd.setConfigurationPolicy(ComponentConfigurationPolicy.valueOf(cad.getEnumValue("configurationPolicy", + ComponentConfigurationPolicy.OPTIONAL.name()))); + cd.setSetMetatypeFactoryPid(cad.getBooleanValue("configurationFactory", false)); + + cd.setLabel(cad.getStringValue("label", null)); + cd.setDescription(cad.getStringValue("description", null)); + + cd.setCreateMetatype(metatype); + + classDescription.add(cd); + } + + // generate ServiceDescription if required + final boolean generateService = cad.getBooleanValue("generateService", true); + if (generateService) { + final ServiceDescription sd = new ServiceDescription(cad); + sd.addInterface(HealthCheck.class.getName()); + classDescription.add(sd); + } + + // generate PropertyDescriptions + generateStringArrPropertyDescriptor(cad, classDescription, metatype, "tags", HealthCheck.TAGS); + generateStringPropertyDescriptor(cad, classDescription, metatype, "name", HealthCheck.NAME); + } + + /** Generates a property descriptor of type {@link PropertyType#String[]} */ + private void generateStringArrPropertyDescriptor(final ClassAnnotation cad, final ClassDescription classDescription, + final boolean metatype, final String annotationName, final String propertyDescriptorName) { + + final String[] values = (String[]) cad.getValue(annotationName); + if (values == null) { + return; + } + + final PropertyDescription pd = new PropertyDescription(cad); + pd.setName(propertyDescriptorName); + pd.setMultiValue(values); + pd.setType(PropertyType.String); + pd.setUnbounded(PropertyUnbounded.ARRAY); + pd.setCardinality(Integer.MAX_VALUE); + if (metatype) { + pd.setPrivate(true); + } + classDescription.add(pd); + } + + + /** Generates a property descriptor of type {@link PropertyType#String} */ + private void generateStringPropertyDescriptor(final ClassAnnotation cad, final ClassDescription classDescription, + final boolean metatype, final String annotationName, final String propertyDescriptorName) { + + final String hcName = (String) cad.getValue(annotationName); + + final PropertyDescription pd = new PropertyDescription(cad); + pd.setName(propertyDescriptorName); + pd.setValue(hcName); + pd.setType(PropertyType.String); + if (metatype) { + pd.setPrivate(true); + } + classDescription.add(pd); + } + + @Override + public int getRanking() { + return 500; + } + + @Override + public String getName() { + return SlingHealthCheck.class.getName() + " annotation processor."; + } +} diff --git a/src/main/resources/META-INF/services/org.apache.felix.scrplugin.annotations.AnnotationProcessor b/src/main/resources/META-INF/services/org.apache.felix.scrplugin.annotations.AnnotationProcessor new file mode 100644 index 0000000..c463fbb --- /dev/null +++ b/src/main/resources/META-INF/services/org.apache.felix.scrplugin.annotations.AnnotationProcessor @@ -0,0 +1 @@ +org.apache.sling.hc.annotations.SlingHealthCheckProcessor \ No newline at end of file -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
