Best Practices - Newsletter Nr. 3 - Properties an Services

Folgendes Beispiel zeigt das Auslesen von Properties an Services im CQ (Felix). Damit für einen Service in der Felix Console Properties konfiguriert werden können, muss die Property metatype = true an der Annotation @Component gesetzt werden. Damit der Service nicht in der Felix Console auftaucht, muss die Property entsprechend auf false stehen oder weggelassen werden. Es ist für die Übersicht in Projekten durchaus sinnvoll, genau zu überdenken, welche Services angezeigt werden müssen.

Eine weitere Fehlerquelle liegt im Auslesen der Properties. Hier sollte wie im Beispiel unten immer das PropertiesUtil verwendet werden, da dies alle Möglichkeiten, wie eine Property persistent abgelegt sein kann, beachtet und die Property immer ermitteln kann. Varianten, die auf verschiedene Typen prüfen, sind in jedem Falle zu vermeiden.

 

import java.util.Map;

import org.apache.felix.scr.annotations.Activate;

import org.apache.felix.scr.annotations.Component;

import org.apache.felix.scr.annotations.Modified;

import org.apache.felix.scr.annotations.Property;

import org.apache.felix.scr.annotations.Service;

import org.apache.sling.commons.osgi.PropertiesUtil;

 

@Component(metatype =true, immediate =true, label ="Projekt X - Service XY", description ="Dieser Service ist hoch konfigurabel")

@Service

publicclass Propertyconfigured {

    // simple example of a boolean property with default value "true"

    @Property(label ="Activated", description ="Enable or disable the Service.", boolValue =true)

    privatestaticfinal String ACTIVATION ="service.activate";

    // Complex example for a property in the form "anyString;anyIntLow;anyIntTop"

    // A colon is a better separator inside the property. So the configuration is presentable in xml

    @Property(label =" Complex", description ="[anyString;anyIntLow;anyIntTop]", cardinality = Integer.MAX_VALUE)

    privatestaticfinal String COMPLEX_PROPERTY ="service.complex";

    privateboolean activated;

    private String[] complex;

    @Activate

    @Modified

    protectedvoid activate(final Map<String, Object> properties){

        activated = PropertiesUtil.toBoolean(properties.get(ACTIVATION),true);

        complex = PropertiesUtil.toStringArray(properties.get(COMPLEX_PROPERTY),new String[0]);

    }

}

Ihr Ansprechpartner