/** * Copyright 2014-2017 Linagora, Université Joseph Fourier, Floralis * * The present code is developed in the scope of the joint LINAGORA - * Université Joseph Fourier - Floralis research program and is designated * as a "Result" pursuant to the terms and conditions of the LINAGORA * - Université Joseph Fourier - Floralis research program. Each copyright * holder of Results enumerated here above fully & independently holds complete * ownership of the complete Intellectual Property rights applicable to the whole * of said Results, and may freely exploit it in any manner which does not infringe * the moral rights of the other copyright holders. * * Licensed 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 net.roboconf.agent.internal; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.logging.Logger; import net.roboconf.core.agents.DataHelpers; import net.roboconf.core.utils.Utils; import net.roboconf.messaging.api.MessagingConstants; /** * @author Vincent Zurczak - Linagora */ public final class AgentProperties { private String applicationName, ipAddress, scopedInstancePath, domain; private Map<String,String> messagingConfiguration; /** * Constructor. */ AgentProperties() { // nothing } /** * @return the applicationName */ public String getApplicationName() { return this.applicationName; } /** * @param applicationName the applicationName to set */ public void setApplicationName( String applicationName ) { this.applicationName = applicationName; } /** * @return the domain */ public String getDomain() { return this.domain; } /** * @param domain the domain to set */ public void setDomain( String domain ) { this.domain = domain; } /** * @return the scopedInstancePath */ public String getScopedInstancePath() { return this.scopedInstancePath; } /** * @param scopedInstancePath the scopedInstancePath to set */ public void setScopedInstancePath( String scopedInstancePath ) { this.scopedInstancePath = scopedInstancePath; } /** * @return the ipAddress */ public String getIpAddress() { return this.ipAddress; } /** * @param ipAddress the ipAddress to set */ public void setIpAddress( String ipAddress ) { this.ipAddress = ipAddress; } /** * @return the messaging configuration. */ public Map<String, String> getMessagingConfiguration() { return this.messagingConfiguration; } /** * @param messagingConfiguration the messaging configuration to set. */ public void setMessagingConfiguration( Map<String, String> messagingConfiguration ) { this.messagingConfiguration = messagingConfiguration; } /** * Validates this bean. * @return null if no error was found, false otherwise */ public String validate() { String result = null; if( this.messagingConfiguration == null || this.messagingConfiguration.isEmpty()) result = "The message configuration cannot be null or empty."; else if( this.messagingConfiguration.get(MessagingConstants.MESSAGING_TYPE_PROPERTY) == null) result = "The message configuration does not contain the messaging type."; else if( Utils.isEmptyOrWhitespaces( this.applicationName )) result = "The application name cannot be null or empty."; else if( Utils.isEmptyOrWhitespaces( this.scopedInstancePath )) result = "The scoped instance's path cannot be null or empty."; return result; } /** * Creates a new bean from raw properties that will be parsed. * @param rawProperties a non-null string * @param logger a logger (not null) * @return a non-null bean * @throws IOException */ public static AgentProperties readIaasProperties( String rawProperties, Logger logger ) throws IOException { Properties props = new Properties(); if( rawProperties != null ) props = DataHelpers.readUserData( rawProperties ); return readIaasProperties( props ); } /** * Creates a new bean from properties. * @param props non-null properties * @return a non-null bean */ public static AgentProperties readIaasProperties( Properties props ) { // Given #213, we have to replace some characters escaped by AWS (and probably Openstack too). AgentProperties result = new AgentProperties(); result.setApplicationName( updatedField( props, DataHelpers.APPLICATION_NAME )); result.setScopedInstancePath( updatedField( props, DataHelpers.SCOPED_INSTANCE_PATH )); result.setDomain( updatedField( props, DataHelpers.DOMAIN )); final Map<String, String> messagingConfiguration = new LinkedHashMap<> (); List<String> toSkip = Arrays.asList( DataHelpers.APPLICATION_NAME, DataHelpers.DOMAIN, DataHelpers.SCOPED_INSTANCE_PATH ); for( String k : props.stringPropertyNames()) { if( ! toSkip.contains( k )) { // All other properties are considered messaging-specific. messagingConfiguration.put(k, updatedField( props, k )); } } result.setMessagingConfiguration(Collections.unmodifiableMap(messagingConfiguration)); return result; } /** * Gets a property and updates it to prevent escaped characters. * @param props the IAAS properties. * @param fieldName the name of the field to read. * @return an updated string */ private static String updatedField( Properties props, String fieldName ) { String property = props.getProperty( fieldName ); if( property != null ) property = property.replace( "\\:", ":" ); return property; } }