| /* |
| * Copyright (c) 2017 CEA. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * CEA - initial API and implementation |
| */ |
| package org.eclipse.sensinact.gateway.generic; |
| |
| import org.eclipse.sensinact.gateway.api.core.AttributeBuilder; |
| import org.eclipse.sensinact.gateway.api.core.RequirementBuilder; |
| import org.eclipse.sensinact.gateway.common.bundle.Mediator; |
| import org.eclipse.sensinact.gateway.common.primitive.Name; |
| import org.eclipse.sensinact.gateway.core.ResourceConfig; |
| import org.eclipse.sensinact.gateway.generic.parser.AttributeDefinition; |
| import org.eclipse.sensinact.gateway.generic.parser.MethodDefinition; |
| import org.eclipse.sensinact.gateway.generic.parser.XmlResourceConfigHandler; |
| import org.eclipse.sensinact.gateway.util.xml.XMLUtil; |
| import org.xml.sax.InputSource; |
| import org.xml.sax.SAXException; |
| |
| import javax.xml.parsers.ParserConfigurationException; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.net.URL; |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| /** |
| * Extended {@link ExtResourceConfig} generated from an xml file |
| * |
| * @author <a href="mailto:christophe.munilla@cea.fr">Christophe Munilla</a> |
| */ |
| public class ExtResourceConfig extends ResourceConfig implements Iterable<MethodDefinition> { |
| /** |
| * Returns the array of BasisXmlResourceConfig described in the XML file whose |
| * string URL is passed as parameter |
| * |
| * @param mediator the associated {@link Mediator} |
| * @param xml the string XML file's URL describing a set of |
| * {@link ExtResourceConfig}s |
| * @return |
| * @throws ParserConfigurationException |
| * @throws SAXException |
| * @throws IOException |
| */ |
| public static XmlResourceConfigHandler loadFromXml(Mediator mediator, URL xml) throws ParserConfigurationException, SAXException, IOException { |
| if (xml != null) { |
| InputStream inputStream = xml.openStream(); |
| return ExtResourceConfig.loadFromXml(mediator, inputStream); |
| } |
| return null; |
| } |
| |
| /** |
| * @param mediator |
| * @param fileInputStream |
| * @return |
| */ |
| public static XmlResourceConfigHandler loadFromXml(Mediator mediator, InputStream inputStream) throws ParserConfigurationException, SAXException, IOException { |
| URL schema = ExtResourceConfig.class.getClassLoader().getResource("sensinact-resource.xsd"); |
| |
| XmlResourceConfigHandler handler = new XmlResourceConfigHandler(mediator); |
| try { |
| XMLUtil.parse(handler, schema, new InputSource(inputStream)); |
| return handler; |
| |
| } catch (Exception e) { |
| mediator.error(e, e.getMessage()); |
| } |
| return null; |
| } |
| |
| protected byte[] identifier; |
| protected byte subscriptionMode; |
| protected List<AttributeDefinition> attributeDefinitions; |
| protected List<MethodDefinition> methodDefinitions; |
| |
| /** |
| * Constructor |
| */ |
| public ExtResourceConfig() { |
| this(new ArrayList<AttributeDefinition>(),new ArrayList<MethodDefinition>()); |
| } |
| |
| public ExtResourceConfig(List<AttributeDefinition> attributeDefinitions, List<MethodDefinition> methodDefinitions) { |
| this.attributeDefinitions = attributeDefinitions; |
| this.methodDefinitions = methodDefinitions; |
| } |
| |
| /** |
| * Defines the command bytes array |
| * |
| * @param identifier the command bytes array |
| */ |
| public void setIdentifier(byte[] identifier) { |
| this.identifier = identifier; |
| } |
| |
| /** |
| * @inheritDoc |
| * @see ExtResourceConfig#identifier() |
| */ |
| public byte[] getIdentifier() { |
| return this.identifier; |
| } |
| |
| /** |
| * Defines the subscription mode handled by the |
| * {@link ResourceImpl} instances based on this |
| * ResourceConfig |
| * |
| * @param subscriptionMode the handled subscription mode(s) |
| */ |
| public void setSubscriptionMode(byte subscriptionMode) { |
| this.subscriptionMode = subscriptionMode; |
| } |
| |
| /** |
| * Returns the subscription mode handled by the |
| * {@link ResourceImpl} instances based on this |
| * ResourceConfig |
| * |
| * @return the handled subscription mode(s) |
| */ |
| public int getSubscriptionMode() { |
| return this.subscriptionMode; |
| } |
| |
| /** |
| * Returns the set of {@link AttributeBuilder}s for |
| * the configured {@link Resource} type |
| * |
| * @return the set of {@link AttributeBuilder}s for the |
| * configured {@link Resource} type |
| */ |
| @Override |
| public List<AttributeBuilder> getAttributeBuilders(String service) { |
| List<AttributeBuilder> builders = new ArrayList<AttributeBuilder>(); |
| builders.addAll(super.getAttributeBuilders(service)); |
| |
| Iterator<AttributeDefinition> iterator = this.attributeDefinitions.iterator(); |
| |
| while (iterator.hasNext()) { |
| AttributeDefinition attributeDefinition = iterator.next(); |
| if (!attributeDefinition.isTargeted(service)) { |
| continue; |
| } |
| int builderIndex = -1; |
| if ((builderIndex = builders.indexOf(new Name<AttributeBuilder>(attributeDefinition.getName()))) > -1) { |
| AttributeBuilder builder = builders.get(builderIndex); |
| List<RequirementBuilder> requirementBuilders = attributeDefinition.getRequirementBuilders(service); |
| int index = 0; |
| int length = requirementBuilders.size(); |
| for (; index < length; index++) { |
| requirementBuilders.get(index).apply(service, builder); |
| } |
| builder.addConstraints(attributeDefinition.getConstraints(service)); |
| builder.addMetadataBuilders(attributeDefinition.getMetadataBuilders()); |
| } else { |
| AttributeBuilder attributeBuilder = attributeDefinition.getAttributeBuilder(service); |
| if (attributeBuilder != null) { |
| builders.add(attributeBuilder); |
| } |
| } |
| } |
| return builders; |
| } |
| |
| /** |
| * @InheritedDoc |
| * @see java.lang.Iterable#iterator() |
| */ |
| @Override |
| public Iterator<MethodDefinition> iterator() { |
| return Collections.unmodifiableList(this.methodDefinitions).iterator(); |
| } |
| } |