blob: 224117efcb0f1c8d2d157c0cad40b30b5382634b [file] [log] [blame]
/*
* 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.felix.ipojo.handlers.event.publisher;
import org.apache.felix.ipojo.ConfigurationException;
import org.apache.felix.ipojo.handlers.event.EventUtil;
import org.apache.felix.ipojo.metadata.Element;
import org.apache.felix.ipojo.parser.ParseUtils;
/**
* Represent a publisher.
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
class EventAdminPublisherMetadata {
// Names of metadata attributes
/**
* The name attribute in the component metadata.
*/
public static final String NAME_ATTRIBUTE = "name";
/**
* The field attribute in the component metadata.
*/
public static final String FIELD_ATTRIBUTE = "field";
/**
* The topics attribute in the component metadata.
*/
public static final String TOPICS_ATTRIBUTE = "topics";
/**
* The synchronous attribute in the component metadata.
*/
public static final String SYNCHRONOUS_ATTRIBUTE = "synchronous";
/**
* The data key attribute in the component metadata.
*/
public static final String DATA_KEY_ATTRIBUTE = "data-key";
// Default values
/**
* The data key attribute's default value.
*/
public static final String DEFAULT_DATA_KEY_VALUE = "user.data";
/**
* The synchronous attribute's default value.
*/
public static final boolean DEFAULT_SYNCHRONOUS_VALUE = false;
/**
* The name which acts as an identifier.
*/
private final String m_name;
/**
* The name of the field representing the publisher in the component.
*/
private final String m_field;
/**
* Topics to which events are sent.
*/
private String[] m_topics;
/**
* Events sending mode.
*/
private final boolean m_synchronous;
/**
* The key where user data are stored in the event dictionary.
*/
private final String m_dataKey;
/**
* Constructs a publisher from its metadata description.
*
* @param publisher the publisher metadata description.
* @throws ConfigurationException if the configuration of the component or
* the instance is invalid.
*/
public EventAdminPublisherMetadata(Element publisher)
throws ConfigurationException {
/**
* Setup required attributes
*/
// NAME_ATTRIBUTE
if (publisher.containsAttribute(NAME_ATTRIBUTE)) {
m_name = publisher.getAttribute(NAME_ATTRIBUTE);
} else {
throw new ConfigurationException(
"Missing required attribute in component configuration : "
+ NAME_ATTRIBUTE);
}
// FIELD_ATTRIBUTE
if (publisher.containsAttribute(FIELD_ATTRIBUTE)) {
m_field = publisher.getAttribute(FIELD_ATTRIBUTE);
} else {
throw new ConfigurationException(
"Missing required attribute in component configuration : "
+ FIELD_ATTRIBUTE);
}
// TOPICS_ATTRIBUTE
if (publisher.containsAttribute(TOPICS_ATTRIBUTE)) {
setTopics(publisher.getAttribute(TOPICS_ATTRIBUTE));
} else {
m_topics = null;
// Nothing to do if TOPICS_ATTRIBUTE is not present as it can be
// overridden in the instance configuration.
}
/**
* Setup optional attributes
*/
// SYNCHRONOUS_ATTRIBUTE
if (publisher.containsAttribute(SYNCHRONOUS_ATTRIBUTE)) {
m_synchronous = "true".equalsIgnoreCase(publisher
.getAttribute(SYNCHRONOUS_ATTRIBUTE));
} else {
m_synchronous = DEFAULT_SYNCHRONOUS_VALUE;
}
// DATA_KEY_ATTRIBUTE
if (publisher.containsAttribute(DATA_KEY_ATTRIBUTE)) {
m_dataKey = publisher.getAttribute(DATA_KEY_ATTRIBUTE);
} else if (publisher.containsAttribute("data_key")) {
// XML Case
m_dataKey = publisher.getAttribute("data_key");
} else if (publisher.containsAttribute("dataKey")) {
// Annotation case.
m_dataKey = publisher.getAttribute("dataKey");
} else {
m_dataKey = DEFAULT_DATA_KEY_VALUE;
}
}
/**
* Sets the topics attribute of the publisher.
*
* @param topicsString the comma separated list of the topics on which
* events are sent
* @throws ConfigurationException the specified topic string is malformed
*/
public void setTopics(String topicsString) throws ConfigurationException {
String[] newTopics = ParseUtils.split(topicsString,
EventUtil.TOPIC_SEPARATOR);
// Check each topic is valid
for (int i = 0; i < newTopics.length; i++) {
String topic = newTopics[i];
if (!EventUtil.isValidTopic(topic)) {
throw new ConfigurationException("Invalid topic : \"" + topic
+ "\".");
}
}
m_topics = newTopics;
}
/**
* Checks that the required instance configurable attributes are all set.
*
* @throws ConfigurationException if a required attribute is missing
*/
public void check() throws ConfigurationException {
if (m_topics == null || m_topics.length == 0) {
throw new ConfigurationException(
"Missing required attribute in component or instance configuration : "
+ TOPICS_ATTRIBUTE);
}
}
/**
* Gets the name attribute of the publisher.
*
* @return the name
*/
public String getName() {
return m_name;
}
/**
* Gets the field attribute of the publisher.
*
* @return the field
*/
public String getField() {
return m_field;
}
/**
* Gets the topics attribute of the publisher.
*
* @return the topics
*/
public String[] getTopics() {
return m_topics;
}
/**
* Gets the synchronous attribute of the publisher.
*
* @return the synchronous mode
*/
public boolean isSynchronous() {
return m_synchronous;
}
/**
* Gets the dataKey attribute of the publisher.
*
* @return the data key
*/
public String getDataKey() {
return m_dataKey;
}
}