Initial contribution
This commit is contained in:
		
							parent
							
								
									7b5cc4fa59
								
							
						
					
					
						commit
						11d9ce37aa
					
				
					 580 changed files with 155133 additions and 162 deletions
				
			
		
							
								
								
									
										33
									
								
								src/tools/config/CMakeLists.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/tools/config/CMakeLists.txt
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
#
 | 
			
		||||
# Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
#
 | 
			
		||||
# This program and the accompanying materials are made available under the
 | 
			
		||||
# terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
# http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
# v. 1.0 which is available at
 | 
			
		||||
# http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
#
 | 
			
		||||
# SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
#
 | 
			
		||||
find_package(Java 1.8 REQUIRED)
 | 
			
		||||
include(UseJava)
 | 
			
		||||
set(CONFJAR_TARGET "${CMAKE_PROJECT_NAME_SMALL}conf")
 | 
			
		||||
 | 
			
		||||
set(CMAKE_JAVA_COMPILE_FLAGS "-source" "1.8" "-target" "1.8")
 | 
			
		||||
 | 
			
		||||
# Oddly enough, add_jar can't deal with a resource having an absolute path (experienced on Windows), so
 | 
			
		||||
# generate into the list-dir.
 | 
			
		||||
configure_file("metaconfig.xml.in" "${CMAKE_CURRENT_LIST_DIR}/metaconfig.xml" @ONLY)
 | 
			
		||||
 | 
			
		||||
file(GLOB_RECURSE JAVA_SOURCES LIST_DIRECTORIES true *.java)
 | 
			
		||||
 | 
			
		||||
set(RESOURCES metaconfig.xml metaconfig.xsd resources/ptlogoc16.png resources/ptlogoc24.png resources/ptlogoc32.png resources/ptlogoc48.png)
 | 
			
		||||
add_jar(${CONFJAR_TARGET} ${JAVA_SOURCES} ${RESOURCES} ENTRY_POINT org.eclipse.cyclonedds.config.SpliceConfig)
 | 
			
		||||
 | 
			
		||||
#add_test(NAME TestHelloWorld COMMAND ${Java_JAVA_EXECUTABLE} -cp ${_jarFile} HelloWorld)
 | 
			
		||||
 | 
			
		||||
install(
 | 
			
		||||
  FILES "${CMAKE_CURRENT_BINARY_DIR}/${CONFJAR_TARGET}.jar"
 | 
			
		||||
  DESTINATION "${CMAKE_INSTALL_TOOLSDIR}"
 | 
			
		||||
  PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
 | 
			
		||||
  COMPONENT dev)
 | 
			
		||||
							
								
								
									
										1160
									
								
								src/tools/config/metaconfig.xml.in
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1160
									
								
								src/tools/config/metaconfig.xml.in
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										289
									
								
								src/tools/config/metaconfig.xsd
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										289
									
								
								src/tools/config/metaconfig.xsd
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,289 @@
 | 
			
		|||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!--
 | 
			
		||||
  Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 | 
			
		||||
  This program and the accompanying materials are made available under the
 | 
			
		||||
  terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
  http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
  v. 1.0 which is available at
 | 
			
		||||
  http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 | 
			
		||||
  SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
-->
 | 
			
		||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
 | 
			
		||||
    <xs:element name="attributeLong">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="minimum" type="xs:long"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="maximum" type="xs:long"/>
 | 
			
		||||
                <xs:element name="default" type="xs:long"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
            <xs:attribute name="name" type="xs:string" use="required"/>
 | 
			
		||||
            <xs:attribute name="required" type="xs:boolean" use="required"/>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
     <xs:element name="attributeSize">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="minimum" type="xs:string"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="maximum" type="xs:string"/>
 | 
			
		||||
                <xs:element name="default" type="xs:string"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
            <xs:attribute name="name" type="xs:string" use="required"/>
 | 
			
		||||
            <xs:attribute name="required" type="xs:boolean" use="required"/>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="attributeString">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element name="maxLength" type="xs:unsignedInt"/>
 | 
			
		||||
                <xs:element name="default" type="xs:string"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
            <xs:attribute name="name" type="xs:string" use="required"/>
 | 
			
		||||
            <xs:attribute name="required" type="xs:boolean" use="required"/>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="attributeBoolean">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element name="default" type="xs:boolean"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="attributeEnum">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:choice maxOccurs="unbounded">
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element maxOccurs="unbounded" name="value" type="xs:string"/>
 | 
			
		||||
                <xs:element name="default" type="xs:string"/>
 | 
			
		||||
            </xs:choice>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="attributeDouble">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="minimum" type="xs:double"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="maximum" type="xs:double"/>
 | 
			
		||||
                <xs:element name="default" type="xs:double"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="attributeFloat">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="minimum" type="xs:float"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="maximum" type="xs:float"/>
 | 
			
		||||
                <xs:element name="default" type="xs:float"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="attributeInt">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="minimum" type="xs:int"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="maximum" type="xs:int"/>
 | 
			
		||||
                <xs:element name="default" type="xs:int"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="comment" type="xs:string"/>
 | 
			
		||||
    <xs:element name="element">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:choice maxOccurs="unbounded">
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element ref="attributeString"/>
 | 
			
		||||
                <xs:element ref="leafSize"/>
 | 
			
		||||
                <xs:element ref="leafEmpty"/>
 | 
			
		||||
                <xs:element ref="leafString"/>
 | 
			
		||||
                <xs:element ref="leafEnum"/>
 | 
			
		||||
                <xs:element ref="leafBoolean"/>
 | 
			
		||||
                <xs:element ref="leafInt"/>
 | 
			
		||||
                <xs:element ref="element"/>
 | 
			
		||||
                <xs:element ref="leafFloat"/>
 | 
			
		||||
            </xs:choice>
 | 
			
		||||
            <xs:attribute name="name" type="xs:string" use="required"/>
 | 
			
		||||
            <xs:attribute name="minOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
            <xs:attribute name="maxOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="leafBoolean">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element name="default" type="xs:boolean"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
            <xs:attribute name="name" type="xs:string" use="required"/>
 | 
			
		||||
            <xs:attribute name="minOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
            <xs:attribute name="maxOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="leafEmpty">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:choice maxOccurs="unbounded">
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element ref="attributeLong"/>
 | 
			
		||||
                <xs:element ref="attributeString"/>
 | 
			
		||||
                <xs:element ref="attributeBoolean"/>
 | 
			
		||||
                <xs:element ref="attributeDouble"/>
 | 
			
		||||
                <xs:element ref="attributeEnum"/>
 | 
			
		||||
                <xs:element ref="attributeFloat"/>
 | 
			
		||||
                <xs:element ref="attributeInt"/>
 | 
			
		||||
                <xs:element ref="attributeSize"/>
 | 
			
		||||
            </xs:choice>
 | 
			
		||||
            <xs:attribute name="name" type="xs:string" use="required"/>
 | 
			
		||||
            <xs:attribute name="minOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
            <xs:attribute name="maxOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="leafEnum">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:choice maxOccurs="unbounded">
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element maxOccurs="unbounded" name="value" type="xs:string"/>
 | 
			
		||||
                <xs:element name="default" type="xs:string"/>
 | 
			
		||||
            </xs:choice>
 | 
			
		||||
            <xs:attribute name="name" type="xs:string" use="required"/>
 | 
			
		||||
            <xs:attribute name="minOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
            <xs:attribute name="maxOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="leafFloat">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="minimum" type="xs:decimal"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="maximum" type="xs:decimal"/>
 | 
			
		||||
                <xs:element name="default" type="xs:decimal"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
            <xs:attribute name="name" type="xs:string" use="required"/>
 | 
			
		||||
            <xs:attribute name="minOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
            <xs:attribute name="maxOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="leafDouble">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="minimum" type="xs:double"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="maximum" type="xs:double"/>
 | 
			
		||||
                <xs:element name="default" type="xs:double"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="leafLong">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="minimum" type="xs:long"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="maximum" type="xs:long"/>
 | 
			
		||||
                <xs:element name="default" type="xs:long"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="leafSize">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="minimum" type="xs:string"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="maximum" type="xs:string"/>
 | 
			
		||||
                <xs:element name="default" type="xs:string"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="leafInt">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="minimum" type="xs:unsignedInt"/>
 | 
			
		||||
                <xs:element minOccurs="0" name="maximum" type="xs:unsignedInt"/>
 | 
			
		||||
                <xs:element name="default" type="xs:unsignedInt"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
            <xs:attribute name="name" type="xs:string" use="required"/>
 | 
			
		||||
            <xs:attribute name="minOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
            <xs:attribute name="maxOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="leafString">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all>
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element name="maxLength" type="xs:unsignedInt"/>
 | 
			
		||||
                <xs:element name="default" type="xs:string"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
            <xs:attribute name="name" type="xs:string" use="required"/>
 | 
			
		||||
            <xs:attribute name="minOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
            <xs:attribute name="maxOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="rootElement">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:all minOccurs="1" maxOccurs="1">
 | 
			
		||||
                <xs:element ref="element"/>
 | 
			
		||||
            </xs:all>
 | 
			
		||||
            <xs:attribute name="name" type="xs:string" use="required"/>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="service">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:choice maxOccurs="unbounded">
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element ref="attributeLong"/>
 | 
			
		||||
                <xs:element ref="attributeString"/>
 | 
			
		||||
                <xs:element ref="leafInt"/>
 | 
			
		||||
                <xs:element ref="leafFloat"/>
 | 
			
		||||
                <xs:element ref="leafString"/>
 | 
			
		||||
                <xs:element ref="leafEnum"/>
 | 
			
		||||
                <xs:element ref="leafEmpty"/>
 | 
			
		||||
                <xs:element ref="leafSize"/>
 | 
			
		||||
                <xs:element ref="element"/>
 | 
			
		||||
            </xs:choice>
 | 
			
		||||
            <xs:attribute name="type" use="required">
 | 
			
		||||
                <xs:simpleType>
 | 
			
		||||
                    <xs:restriction base="xs:NMTOKEN">
 | 
			
		||||
                        <xs:enumeration value="CMSOAPService"/>
 | 
			
		||||
                        <xs:enumeration value="DurabilityService"/>
 | 
			
		||||
                        <xs:enumeration value="NetworkingService"/>
 | 
			
		||||
                        <xs:enumeration value="SpliceService"/>
 | 
			
		||||
                        <xs:enumeration value="UserClockService"/>
 | 
			
		||||
                    </xs:restriction>
 | 
			
		||||
                </xs:simpleType>
 | 
			
		||||
            </xs:attribute>
 | 
			
		||||
            <xs:attribute name="minOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
            <xs:attribute name="maxOccurrences" type="xs:unsignedInt" use="optional"/>
 | 
			
		||||
            <xs:attribute name="isRootService" type="xs:boolean"/>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="serviceCommon">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:choice maxOccurs="unbounded">
 | 
			
		||||
                <xs:element minOccurs="0" ref="comment"/>
 | 
			
		||||
                <xs:element ref="attributeLong"/>
 | 
			
		||||
                <xs:element ref="attributeString"/>
 | 
			
		||||
                <xs:element ref="leafInt"/>
 | 
			
		||||
                <xs:element ref="leafFloat"/>
 | 
			
		||||
                <xs:element ref="leafString"/>
 | 
			
		||||
                <xs:element ref="leafEnum"/>
 | 
			
		||||
                <xs:element ref="leafEmpty"/>
 | 
			
		||||
                <xs:element ref="leafSize"/>
 | 
			
		||||
                <xs:element ref="element"/>
 | 
			
		||||
            </xs:choice>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
    <xs:element name="splice_meta_config">
 | 
			
		||||
        <xs:complexType>
 | 
			
		||||
            <xs:sequence>
 | 
			
		||||
                <xs:element ref="rootElement"/>
 | 
			
		||||
                <xs:element ref="serviceCommon"/>
 | 
			
		||||
                <xs:element maxOccurs="unbounded" ref="service"/>
 | 
			
		||||
            </xs:sequence>
 | 
			
		||||
            <xs:attribute name="version" type="xs:decimal" use="required"/>
 | 
			
		||||
        </xs:complexType>
 | 
			
		||||
    </xs:element>
 | 
			
		||||
</xs:schema>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.common.controller;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a result for assignment of a value to a certain field.
 | 
			
		||||
 * 
 | 
			
		||||
 * @date Nov 25, 2004
 | 
			
		||||
 */
 | 
			
		||||
public class AssignmentResult{
 | 
			
		||||
    private boolean valid;
 | 
			
		||||
    private String errorMessage;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a new AssignMentResult.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param _success true if validation succeeded, false otherwise.
 | 
			
		||||
     * @param _errorMessage null when validation succeeded, the failure
 | 
			
		||||
     *                      reason otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    public AssignmentResult(boolean _success, String _errorMessage){
 | 
			
		||||
        valid = _success;
 | 
			
		||||
        errorMessage = _errorMessage;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides access to errorMessage.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return Returns the errorMessage.
 | 
			
		||||
     */
 | 
			
		||||
    public String getErrorMessage() {
 | 
			
		||||
        return errorMessage;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides access to valid.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return Returns the valid.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isValid() {
 | 
			
		||||
        return valid;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										551
									
								
								src/tools/config/org/eclipse/cyclonedds/common/util/Config.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										551
									
								
								src/tools/config/org/eclipse/cyclonedds/common/util/Config.java
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,551 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
/**
 | 
			
		||||
 * Contains all SPLICE DDS C&M Tooling utilities.
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.common.util;
 | 
			
		||||
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.FileNotFoundException;
 | 
			
		||||
import java.io.FileOutputStream;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.net.URI;
 | 
			
		||||
import java.net.URISyntaxException;
 | 
			
		||||
import java.util.Iterator;
 | 
			
		||||
import java.util.Properties;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.view.CommonFileChooser;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Supplies a generic configuration utility for all kinds of applications.
 | 
			
		||||
 * Before using the load or loadDefault function must be called.
 | 
			
		||||
 * 
 | 
			
		||||
 * @date Oct 25, 2004
 | 
			
		||||
 */
 | 
			
		||||
public class Config {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The current configuration.
 | 
			
		||||
     */
 | 
			
		||||
    private Properties config = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The location of the configuration.
 | 
			
		||||
     */
 | 
			
		||||
    private File configFile = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The validator.
 | 
			
		||||
     */
 | 
			
		||||
    private ConfigValidator validator = null;
 | 
			
		||||
 | 
			
		||||
    private CommonFileChooser chooser = null;
 | 
			
		||||
 | 
			
		||||
    private static volatile Config instance       = null;
 | 
			
		||||
 | 
			
		||||
    private static Color warningColor = null;
 | 
			
		||||
    private static Color errorColor = null;
 | 
			
		||||
    private static Color sensitiveColor = null;
 | 
			
		||||
    private static Color inactiveColor = null;
 | 
			
		||||
    private static Color activeColor = null;
 | 
			
		||||
    private static Color inputColor = null;
 | 
			
		||||
    private static Color incorrectColor = null;
 | 
			
		||||
 | 
			
		||||
    private Config(){}
 | 
			
		||||
 | 
			
		||||
    public static Config getInstance(){
 | 
			
		||||
        if(instance == null){
 | 
			
		||||
            instance = new Config();
 | 
			
		||||
        }
 | 
			
		||||
        return instance;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Assigns the supplied validator to the configuration. It will use this
 | 
			
		||||
     * validator when calling: - load --> call validateValue on each found key.
 | 
			
		||||
     * - loadDefault --> call validateValue on each found key. - getProperty ->
 | 
			
		||||
     * call getDefaultValue when a supplied kay has no value. - setProperty -->
 | 
			
		||||
     * call isValueValid on the supplied key/value combination.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param _validator
 | 
			
		||||
     *            The validator to assign.
 | 
			
		||||
     */
 | 
			
		||||
    public void setValidator(ConfigValidator _validator){
 | 
			
		||||
        validator = _validator;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides access to the current configuration validator.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return The current validator or null if none has been assigned.
 | 
			
		||||
     */
 | 
			
		||||
    public ConfigValidator getValidator(){
 | 
			
		||||
        return validator;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides access to the current configuration properties.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return The current config properties or null if none has been assigned.
 | 
			
		||||
     */
 | 
			
		||||
    public Properties getConfig() {
 | 
			
		||||
        return config;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Loads the release information from a file named RELEASEINFO located in
 | 
			
		||||
     * the etc directory of the installation.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return true if the release information could be loaded, false otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean loadReleaseInfo(){
 | 
			
		||||
        FileInputStream fis = null;
 | 
			
		||||
        if (config == null){
 | 
			
		||||
            config = new Properties ();
 | 
			
		||||
        }
 | 
			
		||||
        boolean result = true;
 | 
			
		||||
        String homeDir = System.getenv("OSPL_HOME");
 | 
			
		||||
        String separator = System.getProperty("file.separator");
 | 
			
		||||
        File releaseFile = new File (homeDir + separator + "etc" + separator + "RELEASEINFO");
 | 
			
		||||
        if(releaseFile.exists()) {
 | 
			
		||||
            try {
 | 
			
		||||
                fis = new FileInputStream(releaseFile);
 | 
			
		||||
                config.load(fis);
 | 
			
		||||
            } catch (FileNotFoundException e) {
 | 
			
		||||
                result = false;
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                result = false;
 | 
			
		||||
            } finally {
 | 
			
		||||
                if (fis != null) {
 | 
			
		||||
                    try {
 | 
			
		||||
                        fis.close();
 | 
			
		||||
                    } catch (IOException ie) {
 | 
			
		||||
                        result = false;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // If we don't have a value for the version property then try
 | 
			
		||||
        // to load the value from the development tree RELEASE file
 | 
			
		||||
        String version = config.getProperty("PACKAGE_VERSION");
 | 
			
		||||
        if (version == null) {
 | 
			
		||||
            releaseFile = new File (homeDir + separator + "release_info" + separator + "RELEASE");
 | 
			
		||||
            if(releaseFile.exists()) {
 | 
			
		||||
                try {
 | 
			
		||||
                    fis = new FileInputStream(releaseFile);
 | 
			
		||||
                    config.load(fis);
 | 
			
		||||
                } catch (FileNotFoundException e) {
 | 
			
		||||
                    result = false;
 | 
			
		||||
                } catch (IOException e) {
 | 
			
		||||
                    result = false;
 | 
			
		||||
                } finally {
 | 
			
		||||
                    if (fis != null) {
 | 
			
		||||
                        try {
 | 
			
		||||
                            fis.close();
 | 
			
		||||
                        } catch (IOException ie) {
 | 
			
		||||
                            result = false;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if(!result){
 | 
			
		||||
            config = null;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Loads the default configuration. This located in the home directory of
 | 
			
		||||
     * the user in the '.splice_tooling.properties' file.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return true if the default configuration could be loaded, false
 | 
			
		||||
     *         otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean loadDefault(){
 | 
			
		||||
        String key, value;
 | 
			
		||||
        boolean result = true;
 | 
			
		||||
        String homeDir = System.getProperty("user.home");
 | 
			
		||||
        String separator = System.getProperty("file.separator");
 | 
			
		||||
        config = new Properties();
 | 
			
		||||
        FileInputStream fis = null;
 | 
			
		||||
 | 
			
		||||
        // Load the release information so that we have the PACKAGE_VERSION property.
 | 
			
		||||
        result = loadReleaseInfo();
 | 
			
		||||
 | 
			
		||||
        if (result) {
 | 
			
		||||
            String version = config.getProperty("PACKAGE_VERSION");
 | 
			
		||||
            if (version != null) {
 | 
			
		||||
                version = version.replaceAll("\"", "");
 | 
			
		||||
                version = new String ("." + version);
 | 
			
		||||
            } else {
 | 
			
		||||
                version = new String ("");
 | 
			
		||||
            }
 | 
			
		||||
            configFile = new File(homeDir + separator + ".ospl_tooling.properties" + version);
 | 
			
		||||
        } else {
 | 
			
		||||
            configFile = new File(homeDir + separator + ".ospl_tooling.properties");
 | 
			
		||||
            // Reset the result flag.
 | 
			
		||||
            result = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(!(configFile.exists())) {
 | 
			
		||||
            try {
 | 
			
		||||
                configFile.createNewFile();
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                result = false;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            try {
 | 
			
		||||
                fis = new FileInputStream(configFile);
 | 
			
		||||
                config.load(fis);
 | 
			
		||||
                Properties newConfig = new Properties(config);
 | 
			
		||||
                if(validator != null){
 | 
			
		||||
                    Iterator<Object> iter = config.keySet().iterator();
 | 
			
		||||
 | 
			
		||||
                    while(iter.hasNext()){
 | 
			
		||||
                        key = (String)iter.next();
 | 
			
		||||
                        value = config.getProperty(key);
 | 
			
		||||
                        value = validator.getValidatedValue(key, value);
 | 
			
		||||
 | 
			
		||||
                        if(value == null){
 | 
			
		||||
                            newConfig.remove(key);
 | 
			
		||||
                        } else {
 | 
			
		||||
                            newConfig.setProperty(key, value);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                config = newConfig;
 | 
			
		||||
            } catch (FileNotFoundException e) {
 | 
			
		||||
                result = false;
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                result = false;
 | 
			
		||||
            } finally {
 | 
			
		||||
                if (fis != null) {
 | 
			
		||||
                    try {
 | 
			
		||||
                        fis.close();
 | 
			
		||||
                    } catch (IOException ie) {
 | 
			
		||||
                        result = false;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if(!result){
 | 
			
		||||
            config = null;
 | 
			
		||||
            configFile = null;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Loads the configuration from the supplied URI.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param uri
 | 
			
		||||
     *            The URI to load the configuration from.
 | 
			
		||||
     * @return true if the configuration was successfully loaded, false
 | 
			
		||||
     *         otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean load(String uri) {
 | 
			
		||||
        String value;
 | 
			
		||||
        boolean result = false;
 | 
			
		||||
        FileInputStream fis = null;
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            uri = uri.replaceAll(" ", "%20");
 | 
			
		||||
            URI location = new URI(uri);
 | 
			
		||||
            configFile = new File(location);
 | 
			
		||||
            config = new Properties();
 | 
			
		||||
            fis = new FileInputStream(configFile);
 | 
			
		||||
            config.load(fis);
 | 
			
		||||
            Properties newConfig = new Properties();
 | 
			
		||||
            if(validator != null){
 | 
			
		||||
 | 
			
		||||
                for (Object key : config.keySet()) {
 | 
			
		||||
                    value = config.getProperty((String) key);
 | 
			
		||||
                    value = validator.getValidatedValue((String) key, value);
 | 
			
		||||
                    if (value != null) {
 | 
			
		||||
                        newConfig.setProperty((String) key, value);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            config.putAll(newConfig);
 | 
			
		||||
            result = true;
 | 
			
		||||
        } catch (FileNotFoundException e1) {
 | 
			
		||||
            Report.getInstance().writeErrorLog("Configuration file could not be found.");
 | 
			
		||||
        } catch (IOException e1) {
 | 
			
		||||
            Report.getInstance().writeErrorLog("Configuration file could not be read.");
 | 
			
		||||
        } catch (URISyntaxException e) {
 | 
			
		||||
            Report.getInstance().writeErrorLog("Supplied URI not valid.");
 | 
			
		||||
        } finally {
 | 
			
		||||
            if (fis != null) {
 | 
			
		||||
                try {
 | 
			
		||||
                    fis.close();
 | 
			
		||||
                } catch (IOException ie) {
 | 
			
		||||
                    Report.getInstance().writeErrorLog("Configuration file could not be read.");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides access to the value of the supplied property.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param key
 | 
			
		||||
     *            The name of the property.
 | 
			
		||||
     * @return The value of the property or null if it was not available.
 | 
			
		||||
     */
 | 
			
		||||
    public String getProperty(String key){
 | 
			
		||||
        String result = null;
 | 
			
		||||
 | 
			
		||||
        if(config != null){
 | 
			
		||||
            if(config.containsKey(key)){
 | 
			
		||||
                result = config.getProperty(key);
 | 
			
		||||
            } else if(validator != null){
 | 
			
		||||
                result = validator.getDefaultValue(key);
 | 
			
		||||
 | 
			
		||||
                if(result != null){
 | 
			
		||||
                    config.setProperty(key, result);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Assigns the supplied value to the supplied property.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param key
 | 
			
		||||
     *            The name of the property.
 | 
			
		||||
     * @param value
 | 
			
		||||
     *            The value of the property.
 | 
			
		||||
     * @return true if it could be assigned, false otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean setProperty(String key, String value){
 | 
			
		||||
        boolean result = false;
 | 
			
		||||
 | 
			
		||||
        if(config != null){
 | 
			
		||||
            if(validator != null){
 | 
			
		||||
                result = validator.isValueValid(key, value);
 | 
			
		||||
 | 
			
		||||
                if(result){
 | 
			
		||||
                    config.setProperty(key, value);
 | 
			
		||||
                    this.store();
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                config.setProperty(key, value);
 | 
			
		||||
                this.store();
 | 
			
		||||
            }
 | 
			
		||||
            result = true;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isPropertyValid(String key, String value){
 | 
			
		||||
        boolean result = false;
 | 
			
		||||
 | 
			
		||||
        if((config != null) && (validator != null)){
 | 
			
		||||
            result = validator.isValueValid(key, value);
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Removes the supplied property from the configuration.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param key
 | 
			
		||||
     *            The name of the property to remove.
 | 
			
		||||
     * @return true if succeeded, false otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean removeProperty(String key){
 | 
			
		||||
        boolean result = false;
 | 
			
		||||
 | 
			
		||||
        if(config != null){
 | 
			
		||||
            Object value = config.remove(key);
 | 
			
		||||
 | 
			
		||||
            if(value != null){
 | 
			
		||||
                result = true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Prints the configuration to screen.
 | 
			
		||||
     */
 | 
			
		||||
    public void list(){
 | 
			
		||||
        if(config != null){
 | 
			
		||||
            config.list(System.out);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Stores the configuration to disk.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return true if succeeded, false otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean store(){
 | 
			
		||||
        boolean result = false;
 | 
			
		||||
        FileOutputStream fos = null;
 | 
			
		||||
 | 
			
		||||
        if(config != null){
 | 
			
		||||
            try {
 | 
			
		||||
                fos = new FileOutputStream(configFile);
 | 
			
		||||
                config.store(fos, null);
 | 
			
		||||
                result = true;
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                Report.getInstance().writeErrorLog("Configuration could not be saved.");
 | 
			
		||||
            } finally {
 | 
			
		||||
                if (fos != null) {
 | 
			
		||||
                    try {
 | 
			
		||||
                        fos.close();
 | 
			
		||||
                    } catch (IOException ie) {
 | 
			
		||||
                        Report.getInstance().writeErrorLog("Configuration could not be saved.");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Stores the configuration to the supplied uri.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return true if succeeded, false otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean store(String uri){
 | 
			
		||||
        boolean result = false;
 | 
			
		||||
        FileOutputStream fos = null;
 | 
			
		||||
 | 
			
		||||
        if(config != null){
 | 
			
		||||
            try {
 | 
			
		||||
                Report.getInstance().writeInfoLog("Storing configuration to URI: " +
 | 
			
		||||
                        configFile.toURI().getScheme() +
 | 
			
		||||
                        configFile.toURI().getPath() + ".");
 | 
			
		||||
                uri = uri.replaceAll(" ", "%20");
 | 
			
		||||
                URI outURI = new URI(uri);
 | 
			
		||||
                File outFile = new File(outURI);
 | 
			
		||||
                boolean fileCreated = true;
 | 
			
		||||
 | 
			
		||||
                if(!(outFile.exists())){
 | 
			
		||||
                    fileCreated = outFile.createNewFile();
 | 
			
		||||
                }
 | 
			
		||||
                if (fileCreated) {
 | 
			
		||||
                    fos = new FileOutputStream(outFile);
 | 
			
		||||
                    config.store(fos, null);
 | 
			
		||||
                } else {
 | 
			
		||||
                    Report.getInstance().writeErrorLog("Configuration could not be saved. file could not be created");
 | 
			
		||||
                    result = false;
 | 
			
		||||
                }
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                Report.getInstance().writeErrorLog("Configuration could not be saved.");
 | 
			
		||||
            } catch (URISyntaxException e) {
 | 
			
		||||
                Report.getInstance().writeErrorLog("Configuration could not be saved.");
 | 
			
		||||
            } finally {
 | 
			
		||||
                if (fos != null) {
 | 
			
		||||
                    try {
 | 
			
		||||
                        fos.close();
 | 
			
		||||
                    } catch (IOException ie) {
 | 
			
		||||
                        Report.getInstance().writeErrorLog("Configuration could not be saved.");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public CommonFileChooser getFileChooser(){
 | 
			
		||||
        if(this.chooser == null){
 | 
			
		||||
            this.chooser = new CommonFileChooser(".");
 | 
			
		||||
        }
 | 
			
		||||
        return this.chooser;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Color getErrorColor(){
 | 
			
		||||
        if(errorColor == null){
 | 
			
		||||
            int r = Integer.parseInt("a0", 16);
 | 
			
		||||
            int g = Integer.parseInt("20", 16);
 | 
			
		||||
            int b = Integer.parseInt("20", 16);
 | 
			
		||||
 | 
			
		||||
            r = Integer.parseInt("ff", 16);
 | 
			
		||||
            g = Integer.parseInt("40", 16);
 | 
			
		||||
            b = Integer.parseInt("40", 16);
 | 
			
		||||
 | 
			
		||||
            errorColor = new Color(r, g, b);
 | 
			
		||||
        }
 | 
			
		||||
        return errorColor;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Color getWarningColor(){
 | 
			
		||||
        if(warningColor == null){
 | 
			
		||||
            int r = Integer.parseInt("c0", 16);
 | 
			
		||||
            int g = Integer.parseInt("80", 16);
 | 
			
		||||
            int b = Integer.parseInt("00", 16);
 | 
			
		||||
            warningColor = new Color(r, g, b);
 | 
			
		||||
        }
 | 
			
		||||
        return warningColor;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Color getSensitiveColor(){
 | 
			
		||||
        if(sensitiveColor == null){
 | 
			
		||||
            int r = Integer.parseInt("70", 16);
 | 
			
		||||
            int g = Integer.parseInt("e0", 16);
 | 
			
		||||
            int b = Integer.parseInt("70", 16);
 | 
			
		||||
            sensitiveColor = new Color(r, g, b);
 | 
			
		||||
        }
 | 
			
		||||
        return sensitiveColor;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Color getInactiveColor(){
 | 
			
		||||
        if(inactiveColor == null){
 | 
			
		||||
            int r = Integer.parseInt("70", 16);
 | 
			
		||||
            int g = Integer.parseInt("70", 16);
 | 
			
		||||
            int b = Integer.parseInt("7a", 16);
 | 
			
		||||
            inactiveColor = new Color(r, g, b);
 | 
			
		||||
        }
 | 
			
		||||
        return inactiveColor;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Color getActiveColor(){
 | 
			
		||||
        if(activeColor == null){
 | 
			
		||||
            int r = Integer.parseInt("50", 16);
 | 
			
		||||
            int g = Integer.parseInt("90", 16);
 | 
			
		||||
            int b = Integer.parseInt("50", 16);
 | 
			
		||||
            activeColor = new Color(r, g, b);
 | 
			
		||||
        }
 | 
			
		||||
        return activeColor;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Color getInputColor(){
 | 
			
		||||
        if(inputColor == null){
 | 
			
		||||
            int r = Integer.parseInt("f0", 16);
 | 
			
		||||
            int g = Integer.parseInt("90", 16);
 | 
			
		||||
            int b = Integer.parseInt("00", 16);
 | 
			
		||||
            inputColor = new Color(r, g, b);
 | 
			
		||||
        }
 | 
			
		||||
        return inputColor;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Color getIncorrectColor(){
 | 
			
		||||
        if(incorrectColor == null){
 | 
			
		||||
            int r = Integer.parseInt("ff", 16);
 | 
			
		||||
            int g = Integer.parseInt("40", 16);
 | 
			
		||||
            int b = Integer.parseInt("40", 16);
 | 
			
		||||
            incorrectColor = new Color(r, g, b);
 | 
			
		||||
        }
 | 
			
		||||
        return incorrectColor;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,32 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.common.util;
 | 
			
		||||
 | 
			
		||||
public class ConfigModeIntializer {
 | 
			
		||||
    
 | 
			
		||||
    public static final String COMMUNITY = "COMMUNITY";
 | 
			
		||||
    public static final String COMMERCIAL = "COMMERCIAL";
 | 
			
		||||
    public static final int  COMMUNITY_MODE = 1;
 | 
			
		||||
    public static final int  COMMERCIAL_MODE = 2;
 | 
			
		||||
    public static final int  COMMUNITY_MODE_FILE_OPEN = 3;
 | 
			
		||||
    public static final int LITE_MODE = 4;
 | 
			
		||||
    public static int  CONFIGURATOR_MODE = COMMERCIAL_MODE;
 | 
			
		||||
 | 
			
		||||
    public static void setMode(int mode) {
 | 
			
		||||
        CONFIGURATOR_MODE = mode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getMode() {
 | 
			
		||||
        return CONFIGURATOR_MODE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,55 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.common.util;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Interface that provides routines for validating configuration. 
 | 
			
		||||
 * Implementations of this interface can guarantee that the configuration for 
 | 
			
		||||
 * an application will be correct.
 | 
			
		||||
 * 
 | 
			
		||||
 * @date Jan 12, 2005 
 | 
			
		||||
 */
 | 
			
		||||
public interface ConfigValidator {
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the correct value for the supplied key. This function
 | 
			
		||||
     * checks if the supplied value is valid. If so, return that value. If not
 | 
			
		||||
     * return a valid one. The Config component calls this routine for each
 | 
			
		||||
     * key it finds when loading a configuration file.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param key The key in the configuration.
 | 
			
		||||
     * @param value The value as it has been found in the confuration file.
 | 
			
		||||
     * @return A correct value for that key. If null is returned, the Config 
 | 
			
		||||
     *         component will remove the key from the configuration.
 | 
			
		||||
     */
 | 
			
		||||
    public String getValidatedValue(String key, String value);
 | 
			
		||||
 
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the default value for the supplied key. This function is called
 | 
			
		||||
     * by the Config component when an application asks for a property that has
 | 
			
		||||
     * not been defined.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param key The key where to resolve the default value of. 
 | 
			
		||||
     * @return The default value for the supplied key.
 | 
			
		||||
     */
 | 
			
		||||
    public String getDefaultValue(String key);
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks whether the supplied key/value combination is valid. The Config
 | 
			
		||||
     * component calls this function when an application sets a property in the
 | 
			
		||||
     * configuration.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param key The key of the property.
 | 
			
		||||
     * @param value The value of the property.
 | 
			
		||||
     * @return If the combination is valid; true and false otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isValueValid(String key, String value);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,169 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.common.util;
 | 
			
		||||
 | 
			
		||||
import java.awt.Component;
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.FileNotFoundException;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.StringTokenizer;
 | 
			
		||||
import java.util.logging.LogManager;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JOptionPane;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Base class for tooling initializers. Its responsibilities are to initialize
 | 
			
		||||
 * logging facilities according to commandline parameters and to validate
 | 
			
		||||
 * whether the correct Java Vitual Machine version is used.
 | 
			
		||||
 * 
 | 
			
		||||
 * @date Sep 1, 2004
 | 
			
		||||
 */
 | 
			
		||||
public class Initializer {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the application, using the configuration that is supplied as
 | 
			
		||||
     * argument. If the supplied file does not exist or no argument was
 | 
			
		||||
     * supplied, the default is used. The default is:
 | 
			
		||||
     * <USER_HOME>/.splice_tooling.properties.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param args
 | 
			
		||||
     *            The list of arguments supplied by the user. Only the first
 | 
			
		||||
     *            argument is used, the rest will be ignored. The first argument
 | 
			
		||||
     *            must supply the location of a java properties file.
 | 
			
		||||
     */
 | 
			
		||||
    public void initializeConfig(String[] args, ConfigValidator validator){
 | 
			
		||||
        boolean result = false;
 | 
			
		||||
 | 
			
		||||
        Config.getInstance().setValidator(validator);
 | 
			
		||||
 | 
			
		||||
        if(args.length > 0){
 | 
			
		||||
             Report.getInstance().writeInfoLog("Reading configuration from " + args[0] + ".");
 | 
			
		||||
            result = Config.getInstance().load(args[0]);
 | 
			
		||||
 | 
			
		||||
            if(!result){
 | 
			
		||||
                 Report.getInstance().writeInfoLog("Applying default configuration.");
 | 
			
		||||
                result = Config.getInstance().loadDefault();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            result = Config.getInstance().loadDefault();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(!result){
 | 
			
		||||
             Report.getInstance().writeInfoLog("Default configuration could not be read.");
 | 
			
		||||
        } else {
 | 
			
		||||
            String loggingFileName = Config.getInstance().getProperty("logging");
 | 
			
		||||
 | 
			
		||||
            if(loggingFileName != null){
 | 
			
		||||
                FileInputStream is = null;
 | 
			
		||||
                try {
 | 
			
		||||
                    is = new FileInputStream(loggingFileName);
 | 
			
		||||
                    LogManager.getLogManager().readConfiguration(is);
 | 
			
		||||
                }
 | 
			
		||||
                catch (FileNotFoundException e) {
 | 
			
		||||
                     Report.getInstance().writeInfoLog("Specified logging config file not found. Logging is disabled.");
 | 
			
		||||
                    LogManager.getLogManager().reset();
 | 
			
		||||
                }
 | 
			
		||||
                catch (SecurityException e) {
 | 
			
		||||
                     Report.getInstance().writeInfoLog("Specified logging config file not valid. Logging is disabled.");
 | 
			
		||||
                    LogManager.getLogManager().reset();
 | 
			
		||||
                }
 | 
			
		||||
                catch (IOException e) {
 | 
			
		||||
                     Report.getInstance().writeInfoLog("Specified logging config file not valid. Logging is disabled.");
 | 
			
		||||
                    LogManager.getLogManager().reset();
 | 
			
		||||
                } finally {
 | 
			
		||||
                    if (is != null) {
 | 
			
		||||
                        try {
 | 
			
		||||
                            is.close();
 | 
			
		||||
                        } catch (IOException ie) {
 | 
			
		||||
                             Report.getInstance().writeInfoLog("Specified logging config file not valid. Logging is disabled.");
 | 
			
		||||
                            LogManager.getLogManager().reset();
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                LogManager.getLogManager().reset();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates whether a compatible Java virtual machine is used.
 | 
			
		||||
     * 
 | 
			
		||||
     * The version of Java must be >= 1.4 and should be >= 1.5.0. If the
 | 
			
		||||
     * used version is &st; 1.4, the application exits with an error message. If
 | 
			
		||||
     * 1.4 &st;= version &st; 1.5, false is returned, but the application
 | 
			
		||||
     * proceeds.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return true, if java version >= 1.5 and false otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean validateJVMVersion(){
 | 
			
		||||
        int token;
 | 
			
		||||
        boolean result = true;
 | 
			
		||||
 | 
			
		||||
        String version = System.getProperty("java.version");
 | 
			
		||||
        StringTokenizer tokenizer = new StringTokenizer(version, ".");
 | 
			
		||||
 | 
			
		||||
	if(tokenizer.hasMoreTokens()){
 | 
			
		||||
             token = Integer.parseInt(tokenizer.nextToken());
 | 
			
		||||
 | 
			
		||||
            if(token < 1){
 | 
			
		||||
                this.printVersionErrorAndExit(version);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if(tokenizer.hasMoreTokens()){
 | 
			
		||||
                token = Integer.parseInt(tokenizer.nextToken());
 | 
			
		||||
 | 
			
		||||
                if(token < 4){
 | 
			
		||||
                    this.printVersionErrorAndExit(version);
 | 
			
		||||
                } else if(token == 4){
 | 
			
		||||
                    result = false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else{
 | 
			
		||||
                this.printVersionErrorAndExit(version);
 | 
			
		||||
                result = false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else{
 | 
			
		||||
            this.printVersionErrorAndExit(version);
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Prints JVM version demands as well as the used version and exits the
 | 
			
		||||
     * application.
 | 
			
		||||
     */
 | 
			
		||||
    private void printVersionErrorAndExit(String version){
 | 
			
		||||
        System.err.println("Your Java version is '" + version + "', but version >= '1.4' is required.\nBailing out...");
 | 
			
		||||
        System.exit(0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays a Java version warning.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param parent
 | 
			
		||||
     *            The GUI parent which must be used as parent for displaying the
 | 
			
		||||
     *            message. If the supplied component == null, the version
 | 
			
		||||
     *            warning is displayed on standard out (System.out).
 | 
			
		||||
     */
 | 
			
		||||
    public void showVersionWarning(Component parent){
 | 
			
		||||
        if(parent != null){
 | 
			
		||||
            JOptionPane.showMessageDialog(parent, "You are using Java version " + System.getProperty("java.version") + ",\nbut version >= 1.5.0 is recommended.", "Warning", JOptionPane.WARNING_MESSAGE);
 | 
			
		||||
        } else{
 | 
			
		||||
            System.err.println("You are using Java version " + System.getProperty("java.version")
 | 
			
		||||
                    + ",\nbut version >= 1.5.0 is recommended.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										124
									
								
								src/tools/config/org/eclipse/cyclonedds/common/util/Report.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								src/tools/config/org/eclipse/cyclonedds/common/util/Report.java
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,124 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.common.util;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.logging.FileHandler;
 | 
			
		||||
import java.util.logging.Handler;
 | 
			
		||||
import java.util.logging.Level;
 | 
			
		||||
import java.util.logging.LogManager;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
import java.util.logging.SimpleFormatter;
 | 
			
		||||
 | 
			
		||||
public class Report {
 | 
			
		||||
 | 
			
		||||
    private static Report reportObject = new Report();
 | 
			
		||||
    static Logger         errorLog;
 | 
			
		||||
    static Logger         infoLog;
 | 
			
		||||
 | 
			
		||||
    private String        errorLogFile  = null;
 | 
			
		||||
    private int           errorSize     = 0;
 | 
			
		||||
    private int           errorCount    = 0;
 | 
			
		||||
    private boolean       errorAppend  = false;
 | 
			
		||||
 | 
			
		||||
    private String        infoLogFile   = null;
 | 
			
		||||
    private int           infoSize      = 0;
 | 
			
		||||
    private int           infoCount     = 0;
 | 
			
		||||
    private boolean       infoAppend   = false;
 | 
			
		||||
 | 
			
		||||
    private Handler       errorHandler;
 | 
			
		||||
    private Handler       infoHandler;
 | 
			
		||||
 | 
			
		||||
    private boolean       consoleOutput = false;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * A private Constructor prevents any other class from instantiating.
 | 
			
		||||
     *
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    private Report() {
 | 
			
		||||
        errorLog = Logger.getAnonymousLogger();
 | 
			
		||||
        infoLog = Logger.getAnonymousLogger();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Report getInstance() {
 | 
			
		||||
        return reportObject;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void initializeInfo(String infoLogFile, int size, int nrOfLogFiles, boolean append) {
 | 
			
		||||
        this.infoLogFile = infoLogFile;
 | 
			
		||||
        this.infoSize = size;
 | 
			
		||||
        this.infoCount = nrOfLogFiles;
 | 
			
		||||
        this.infoAppend = append;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void initializeError(String errorLogFile, int size, int nrOfLogFiles, boolean append) {
 | 
			
		||||
        this.errorLogFile = errorLogFile;
 | 
			
		||||
        this.errorSize = size;
 | 
			
		||||
        this.errorCount = nrOfLogFiles;
 | 
			
		||||
        this.errorAppend = append;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void initializeConsole() {
 | 
			
		||||
        consoleOutput = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void writeInfoLog(String message) {
 | 
			
		||||
        if (!consoleOutput) {
 | 
			
		||||
            if (infoHandler == null && infoLogFile != null) {
 | 
			
		||||
                try {
 | 
			
		||||
                    infoHandler = new FileHandler(infoLogFile, infoSize, infoCount, infoAppend);
 | 
			
		||||
                    infoHandler.setFormatter(new SimpleFormatter());
 | 
			
		||||
                    infoLog.addHandler(infoHandler);
 | 
			
		||||
                    LogManager logManager = LogManager.getLogManager();
 | 
			
		||||
                    logManager.reset();
 | 
			
		||||
                } catch (IOException e) {
 | 
			
		||||
                    System.err.println("Could not redirect error and/or info output.");
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            infoLog.info(message);
 | 
			
		||||
        } else {
 | 
			
		||||
            System.out.println(message);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void writeErrorLog(String message) {
 | 
			
		||||
        if (!consoleOutput) {
 | 
			
		||||
            if (errorHandler == null && errorLogFile != null) {
 | 
			
		||||
                try {
 | 
			
		||||
                    errorHandler = new FileHandler(errorLogFile, errorSize, errorCount, errorAppend);
 | 
			
		||||
                    errorHandler.setFormatter(new SimpleFormatter());
 | 
			
		||||
                    errorLog.addHandler(errorHandler);
 | 
			
		||||
                    LogManager logManager = LogManager.getLogManager();
 | 
			
		||||
                    logManager.reset();
 | 
			
		||||
                } catch (IOException e) {
 | 
			
		||||
                    System.err.println("Could not redirect error and/or info output.");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            errorLog.log(Level.SEVERE, message);
 | 
			
		||||
        } else {
 | 
			
		||||
            System.err.println(message);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void CloseHandlers() {
 | 
			
		||||
        if (errorHandler != null) {
 | 
			
		||||
            errorHandler.close();
 | 
			
		||||
        }
 | 
			
		||||
        if (infoHandler != null) {
 | 
			
		||||
            infoHandler.close();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,88 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.common.view;
 | 
			
		||||
 | 
			
		||||
import java.awt.BorderLayout;
 | 
			
		||||
import java.awt.Component;
 | 
			
		||||
import java.awt.Container;
 | 
			
		||||
import java.awt.event.WindowAdapter;
 | 
			
		||||
import java.awt.event.WindowEvent;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JDialog;
 | 
			
		||||
import javax.swing.JFileChooser;
 | 
			
		||||
import javax.swing.JFrame;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 
 | 
			
		||||
 * 
 | 
			
		||||
 * @date Apr 14, 2005 
 | 
			
		||||
 */
 | 
			
		||||
public class CommonFileChooser extends JFileChooser {
 | 
			
		||||
    private static final long serialVersionUID = -1440579455652851165L;
 | 
			
		||||
    private int returnCode;
 | 
			
		||||
    private JDialog dialog = null;
 | 
			
		||||
    
 | 
			
		||||
    public CommonFileChooser(String path){
 | 
			
		||||
        super(path);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private JDialog getDialog(){
 | 
			
		||||
        if(this.dialog == null){
 | 
			
		||||
            JFrame f = null;
 | 
			
		||||
            this.dialog = new JDialog(f, "", true);
 | 
			
		||||
            Container contentPane = this.dialog.getContentPane();
 | 
			
		||||
            contentPane.setLayout(new BorderLayout());
 | 
			
		||||
            contentPane.add(this, BorderLayout.CENTER);
 | 
			
		||||
 | 
			
		||||
            this.dialog.addWindowListener(new WindowAdapter() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void windowClosing(WindowEvent e) {
 | 
			
		||||
                    returnCode = CANCEL_OPTION;
 | 
			
		||||
                    dialog.setVisible(false);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            this.dialog.pack();
 | 
			
		||||
        }
 | 
			
		||||
        return this.dialog;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void fireActionPerformed(String command) {
 | 
			
		||||
        super.fireActionPerformed(command);
 | 
			
		||||
        
 | 
			
		||||
        JDialog myDialog = this.getDialog();
 | 
			
		||||
 | 
			
		||||
        if(APPROVE_SELECTION.equals(command)){
 | 
			
		||||
            returnCode = APPROVE_OPTION;
 | 
			
		||||
            myDialog.setVisible(false);
 | 
			
		||||
        } else if(CANCEL_SELECTION.equals(command)){
 | 
			
		||||
            returnCode = CANCEL_OPTION;
 | 
			
		||||
            myDialog.setVisible(false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public int showDialog(Component parent, String title){
 | 
			
		||||
        JDialog myDialog = this.getDialog();
 | 
			
		||||
 | 
			
		||||
        if(parent != null){
 | 
			
		||||
            myDialog.setLocationRelativeTo(parent);
 | 
			
		||||
        }
 | 
			
		||||
        if(title != null){
 | 
			
		||||
            myDialog.setTitle(title);
 | 
			
		||||
        }
 | 
			
		||||
        myDialog.setVisible(true);
 | 
			
		||||
        myDialog.toFront();
 | 
			
		||||
        
 | 
			
		||||
        return returnCode;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,324 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
/**
 | 
			
		||||
 * Contains all SPLICE DDS C&M Tooling common view components. 
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.common.view;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JComponent;
 | 
			
		||||
import javax.swing.JFrame;
 | 
			
		||||
import javax.swing.JTextField;
 | 
			
		||||
import javax.swing.JPanel;
 | 
			
		||||
import javax.swing.JButton;
 | 
			
		||||
 | 
			
		||||
import java.awt.FlowLayout;
 | 
			
		||||
import java.awt.event.*;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class represents a generic dialog window and is meant to provide a fast and
 | 
			
		||||
 * simple way of constructing dialog windows. 
 | 
			
		||||
 * 
 | 
			
		||||
 * The window contains a status bar and
 | 
			
		||||
 * 'OK' and 'Cancel' buttons. By providing NameValuePanel objects, the user can
 | 
			
		||||
 * fill the dialog window with as many fields as he wishes. 
 | 
			
		||||
 */
 | 
			
		||||
public class DialogWindow extends JFrame {    
 | 
			
		||||
    private static final long serialVersionUID = -4875672779193998620L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The constructor of this object. It initializes the window.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param _controller The controller where to sent actions to. 'cancel' 
 | 
			
		||||
     * for the Cancel button and _action for the OK button
 | 
			
		||||
     * @param _fields Array of name/value pairs that must be showed in the dialog window.
 | 
			
		||||
     * @param _action The action that the controller expects when the user clicks th OK button.
 | 
			
		||||
     * @param _title The title of the dialog window that will be shown in the top.
 | 
			
		||||
     */
 | 
			
		||||
    public DialogWindow(ActionListener _controller, NameValuePanel[] _fields, String _action, String _title) {
 | 
			
		||||
        super();
 | 
			
		||||
        controller = _controller;
 | 
			
		||||
        action = _action;
 | 
			
		||||
        fields = _fields;
 | 
			
		||||
        title = _title;
 | 
			
		||||
        fieldNameMapping = new HashMap<String, NameValuePanel>(_fields.length);
 | 
			
		||||
        initialize();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    DialogWindow(ActionListener _controller, String _action, String _title){
 | 
			
		||||
        super();
 | 
			
		||||
        controller = _controller;
 | 
			
		||||
        action = _action;
 | 
			
		||||
        title = _title;
 | 
			
		||||
        fields = null;
 | 
			
		||||
        fieldNameMapping = new HashMap<String, NameValuePanel>();
 | 
			
		||||
        initialize();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes the dialog window. 
 | 
			
		||||
     */
 | 
			
		||||
    void initialize() {
 | 
			
		||||
        this.setSize(1200, 1600);
 | 
			
		||||
        this.setContentPane(getJContentPane());
 | 
			
		||||
        this.setResizable(false);
 | 
			
		||||
        this.setTitle(title);
 | 
			
		||||
        this.addWindowListener(new WindowAdapter() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void windowClosing(WindowEvent e) {
 | 
			
		||||
                controller.actionPerformed(
 | 
			
		||||
                    new ActionEvent(cancelButton, 0, "cancel"));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        this.pack();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes the root content pane
 | 
			
		||||
     * 
 | 
			
		||||
     * @return The created or already existing content pane.
 | 
			
		||||
     */
 | 
			
		||||
    JPanel getJContentPane() {
 | 
			
		||||
        if (jContentPane == null) {
 | 
			
		||||
            jContentPane = new JPanel();
 | 
			
		||||
            java.awt.GridLayout layGridLayout15 = new java.awt.GridLayout();
 | 
			
		||||
            
 | 
			
		||||
            if(fields != null){
 | 
			
		||||
                layGridLayout15.setRows(fields.length);    
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            layGridLayout15.setColumns(1);
 | 
			
		||||
            layGridLayout15.setHgap(0);
 | 
			
		||||
            layGridLayout15.setVgap(5);
 | 
			
		||||
            JPanel inputPanel = new JPanel();
 | 
			
		||||
            inputPanel.setLayout(layGridLayout15);
 | 
			
		||||
            jContentPane.setLayout(new java.awt.BorderLayout());
 | 
			
		||||
            
 | 
			
		||||
            if(fields != null){
 | 
			
		||||
                for(int i=0; i<fields.length; i++){
 | 
			
		||||
                    String label = fields[i].getName();
 | 
			
		||||
                    JComponent editor = fields[i].getField();
 | 
			
		||||
                     
 | 
			
		||||
                    if(editor instanceof JTextField){
 | 
			
		||||
                        ((JTextField)editor).setActionCommand(action);
 | 
			
		||||
                        ((JTextField)editor).addActionListener(controller);
 | 
			
		||||
                        editor.addFocusListener(new FocusListener() {
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void focusGained(FocusEvent e) {
 | 
			
		||||
                                JTextField source = (JTextField)(e.getSource());
 | 
			
		||||
                                source.selectAll();
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void focusLost(FocusEvent e) {
 | 
			
		||||
                                JTextField source = (JTextField)(e.getSource());
 | 
			
		||||
                                source.select(0, 0);
 | 
			
		||||
                            }
 | 
			
		||||
                        });
 | 
			
		||||
                    }
 | 
			
		||||
                    fieldNameMapping.put(label, fields[i]);
 | 
			
		||||
                    inputPanel.add(fields[i], null);  
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            jContentPane.add(inputPanel, java.awt.BorderLayout.NORTH);
 | 
			
		||||
            jContentPane.add(getButtonPanel(), java.awt.BorderLayout.CENTER);
 | 
			
		||||
            jContentPane.add(getStatusPanel(), java.awt.BorderLayout.SOUTH);
 | 
			
		||||
        }
 | 
			
		||||
        return jContentPane;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
	/**
 | 
			
		||||
     * This method initializes the status panel
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @return The created or already existing status panel.
 | 
			
		||||
	 */
 | 
			
		||||
	StatusPanel getStatusPanel() {
 | 
			
		||||
		if(statusPanel == null) {
 | 
			
		||||
			statusPanel = new StatusPanel(250, "Please provide input.", false, false);
 | 
			
		||||
		}
 | 
			
		||||
		return statusPanel;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
     * This method initializes the buttonPanel that contains the OK and Cancel button.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @return The created or already existing buttonPanel.
 | 
			
		||||
	 */
 | 
			
		||||
	JPanel getButtonPanel() {
 | 
			
		||||
		if(buttonPanel == null) {
 | 
			
		||||
			buttonPanel = new JPanel();
 | 
			
		||||
            FlowLayout layFlowLayout = new FlowLayout(FlowLayout.RIGHT);
 | 
			
		||||
            buttonPanel.setLayout(layFlowLayout);
 | 
			
		||||
            buttonPanel.add(getOkButton(), null);
 | 
			
		||||
			buttonPanel.add(getCancelButton(), null);
 | 
			
		||||
		}
 | 
			
		||||
		return buttonPanel;
 | 
			
		||||
	}
 | 
			
		||||
    
 | 
			
		||||
	/**
 | 
			
		||||
     * This method initializes the cancelButton
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @return The created or already existing Cancel button.
 | 
			
		||||
	 */
 | 
			
		||||
	JButton getCancelButton() {
 | 
			
		||||
		if(cancelButton == null) {
 | 
			
		||||
			cancelButton = new JButton();
 | 
			
		||||
			cancelButton.setText("Cancel");
 | 
			
		||||
            cancelButton.setMnemonic('C');
 | 
			
		||||
            cancelButton.setActionCommand("cancel");
 | 
			
		||||
            cancelButton.addActionListener(controller);
 | 
			
		||||
            cancelButton.setPreferredSize(new java.awt.Dimension(100, 20));
 | 
			
		||||
		}
 | 
			
		||||
		return cancelButton;
 | 
			
		||||
	}
 | 
			
		||||
    
 | 
			
		||||
	/**
 | 
			
		||||
     * This method initializes the OK button.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @return The created or already existing OK button.
 | 
			
		||||
	 */
 | 
			
		||||
	JButton getOkButton() {
 | 
			
		||||
		if(okButton == null) {
 | 
			
		||||
			okButton = new JButton();
 | 
			
		||||
			okButton.setText("Ok");
 | 
			
		||||
            okButton.setMnemonic('O');
 | 
			
		||||
            okButton.setActionCommand(action);
 | 
			
		||||
            okButton.addActionListener(controller);
 | 
			
		||||
            okButton.setPreferredSize(new java.awt.Dimension(100, 20));
 | 
			
		||||
            this.getRootPane().setDefaultButton(okButton);
 | 
			
		||||
		}
 | 
			
		||||
		return okButton;
 | 
			
		||||
	}
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Sets the status message in the status panel of the dialog window.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param message The message to show in the status panel.
 | 
			
		||||
     * @param persistent true if the message should be shown until the next
 | 
			
		||||
     * call to this operation, false if it should disappear after a few seconds.
 | 
			
		||||
     */
 | 
			
		||||
    public void setStatus(String message, boolean persistent){
 | 
			
		||||
        statusPanel.setStatus(message, persistent);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides access to all values in the input fields.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return The map of values. The key is the name of the field <fieldName, value>.
 | 
			
		||||
     */
 | 
			
		||||
    public HashMap<String, Object> getValues() {
 | 
			
		||||
        HashMap<String, Object> values = new HashMap<String, Object>();
 | 
			
		||||
        
 | 
			
		||||
        for(int i=0; i<fields.length; i++){
 | 
			
		||||
            values.put(fields[i].getName(), fields[i].getValue());
 | 
			
		||||
        }
 | 
			
		||||
        return values;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides access to the value of a field.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param fieldName The fieldName of the field to get the value of.
 | 
			
		||||
     * @return The value of the field.
 | 
			
		||||
     */
 | 
			
		||||
    public Object getValue(String fieldName){
 | 
			
		||||
        NameValuePanel nv = fieldNameMapping.get(fieldName);
 | 
			
		||||
        
 | 
			
		||||
        if(nv == null){
 | 
			
		||||
            return "";
 | 
			
		||||
        }
 | 
			
		||||
        return nv.getValue();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks if all fields have compatible values in.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return true if all fields have a compatible value, false otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isInputValid(){
 | 
			
		||||
        NameValuePanel nvp = null;
 | 
			
		||||
        Object test = null;
 | 
			
		||||
        Collection<NameValuePanel> f = fieldNameMapping.values();
 | 
			
		||||
        Iterator<NameValuePanel> fIter = f.iterator();
 | 
			
		||||
        
 | 
			
		||||
        while(fIter.hasNext()){
 | 
			
		||||
            nvp = fIter.next();
 | 
			
		||||
            test = nvp.getValue();
 | 
			
		||||
            if(test == null || test.equals("")){
 | 
			
		||||
                if(!(nvp.isEmptyInputAllowed())){
 | 
			
		||||
                    return false;
 | 
			
		||||
                } 
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public NameValuePanel getField(String name){
 | 
			
		||||
        return fieldNameMapping.get(name);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public NameValuePanel[] getFields(){
 | 
			
		||||
        return fields;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The root pane of the dialog window.
 | 
			
		||||
     */
 | 
			
		||||
    javax.swing.JPanel jContentPane     = null;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The status panel.
 | 
			
		||||
     */
 | 
			
		||||
    StatusPanel statusPanel      = null;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The panel where the 'OK' and 'Cancel' buttons are placed on.
 | 
			
		||||
     */
 | 
			
		||||
    JPanel buttonPanel      = null;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The 'Cancel' button.
 | 
			
		||||
     */
 | 
			
		||||
    JButton cancelButton    = null;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The 'OK' button.
 | 
			
		||||
     */
 | 
			
		||||
    JButton okButton        = null;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The controller (mvC), where the action command will be sent to when the
 | 
			
		||||
     * user clicks the OK button.
 | 
			
		||||
     */
 | 
			
		||||
    ActionListener controller           = null;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The title of the dialog window.
 | 
			
		||||
     */
 | 
			
		||||
    String title                        = null;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The action string that must be sent to the controller 
 | 
			
		||||
     * when the 'OK' button is clicked.
 | 
			
		||||
     */
 | 
			
		||||
    String action                       = null;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The name/value pairs that are shown in the window.
 | 
			
		||||
     */
 | 
			
		||||
    NameValuePanel[] fields             = null;  
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Fields in the window <String, NameValuePanel>
 | 
			
		||||
     */
 | 
			
		||||
    HashMap<String, NameValuePanel> fieldNameMapping = null;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,106 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.common.view;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JFrame;
 | 
			
		||||
import javax.swing.ToolTipManager;
 | 
			
		||||
 | 
			
		||||
/**  
 | 
			
		||||
 * Abstract class that is typically extended from by main windows of an
 | 
			
		||||
 * application. It offers a StatusPanel, which is capable of displaying 
 | 
			
		||||
 * the current status and implements the ModelListener interface to be able
 | 
			
		||||
 * to be attached to ModelRegister components and receive updates from it. This
 | 
			
		||||
 * class has been defined abstract because only descendants of this class may
 | 
			
		||||
 * exist.
 | 
			
		||||
 * 
 | 
			
		||||
 * @date Sep 1, 2004
 | 
			
		||||
 */
 | 
			
		||||
public abstract class MainWindow extends JFrame {
 | 
			
		||||
    private static final long serialVersionUID = 5540350112074790669L;
 | 
			
		||||
    protected StatusPanel statusPanel    = null;
 | 
			
		||||
    
 | 
			
		||||
	/**
 | 
			
		||||
	 * This is the default constructor
 | 
			
		||||
	 */
 | 
			
		||||
	public MainWindow() {
 | 
			
		||||
		super();
 | 
			
		||||
        ToolTipManager tm = ToolTipManager.sharedInstance();
 | 
			
		||||
        tm.setInitialDelay(100);
 | 
			
		||||
		this.setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
 | 
			
		||||
        this.setSize(800, 600);
 | 
			
		||||
	}
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes statusPanel.  
 | 
			
		||||
     *  
 | 
			
		||||
     * @return The status panel of the window.
 | 
			
		||||
     */    
 | 
			
		||||
    protected StatusPanel getStatusPanel() {
 | 
			
		||||
        if (statusPanel == null) {
 | 
			
		||||
            statusPanel = new StatusPanel(300, "Ready", true, true);
 | 
			
		||||
        }
 | 
			
		||||
        return statusPanel;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Sends a message to the statusPanel and sets the progress.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param message The message to show in the statusbar.
 | 
			
		||||
     * @param persistent true if the message must be shown until a new call to
 | 
			
		||||
     *                   this function, or false when it should automatically be
 | 
			
		||||
     *                   removed after certain amount of time.
 | 
			
		||||
     * @param busy Sets the progress monitor of the statusbar.
 | 
			
		||||
     */
 | 
			
		||||
    public void setStatus(String message, boolean persistent, boolean busy){
 | 
			
		||||
        statusPanel.setStatus(message, persistent, busy);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Sends a message to the statusPanel.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param message The message to show in the statusbar.
 | 
			
		||||
     * @param persistent true if the message must be shown until a new call to
 | 
			
		||||
     *                   this function, or false when it should automatically be
 | 
			
		||||
     *                   removed after certain amount of time.
 | 
			
		||||
     */
 | 
			
		||||
    public void setStatus(String message, boolean persistent){
 | 
			
		||||
        statusPanel.setStatus(message, persistent);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides access to the current status.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return The currently shown status.
 | 
			
		||||
     */
 | 
			
		||||
    public String getStatus(){
 | 
			
		||||
        return statusPanel.getStatus();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Disables the view component. 
 | 
			
		||||
     * 
 | 
			
		||||
     * This is done when a dialog is shown and the user must
 | 
			
		||||
     * provide input before proceeding.
 | 
			
		||||
     */
 | 
			
		||||
    public void disableView(){
 | 
			
		||||
        this.setEnabled(false);
 | 
			
		||||
        this.setFocusable(false);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Enables the view component.
 | 
			
		||||
     */
 | 
			
		||||
    public void enableView(){
 | 
			
		||||
        this.setFocusable(true);
 | 
			
		||||
        this.setEnabled(true);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,149 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.common.view;
 | 
			
		||||
 | 
			
		||||
import javax.swing.*;
 | 
			
		||||
 | 
			
		||||
import java.awt.Dimension;
 | 
			
		||||
import java.awt.FlowLayout;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class is meant to provide a standard generic input panel that
 | 
			
		||||
 * contains a label and a input field. 
 | 
			
		||||
 * 
 | 
			
		||||
 * Input fields that are currently supported are: 
 | 
			
		||||
 * - textfields 
 | 
			
		||||
 * - comboboxes.
 | 
			
		||||
 */
 | 
			
		||||
public abstract class NameValuePanel extends JPanel {
 | 
			
		||||
    private static final long serialVersionUID = 8693880375019883969L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates an input panel with a label and a textfield.
 | 
			
		||||
     * @param _fieldName The name of the field that is also used as label.
 | 
			
		||||
     * @param _emptyInputAllowed Boolean that specifies if empty input is allowed when 
 | 
			
		||||
     *                           submitted.
 | 
			
		||||
     */
 | 
			
		||||
    public NameValuePanel(
 | 
			
		||||
            String fieldName, 
 | 
			
		||||
            Object defaultValue, 
 | 
			
		||||
            boolean emptyInputAllowed, 
 | 
			
		||||
            Dimension labelDim, 
 | 
			
		||||
            Dimension fieldDim)
 | 
			
		||||
    {
 | 
			
		||||
        super();
 | 
			
		||||
        if(labelDim != null){
 | 
			
		||||
            this.labelDim = labelDim;
 | 
			
		||||
            
 | 
			
		||||
            if(this.labelDim.height != 20){
 | 
			
		||||
                this.labelDim.height = 20;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            this.labelDim = new Dimension(100, 20);
 | 
			
		||||
        }
 | 
			
		||||
        if(fieldDim != null){
 | 
			
		||||
            this.fieldDim = fieldDim;
 | 
			
		||||
            
 | 
			
		||||
            if(this.fieldDim.height != 20){
 | 
			
		||||
                this.fieldDim.height = 20;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            this.fieldDim = new Dimension(230, 20);
 | 
			
		||||
        }
 | 
			
		||||
        this.fieldName = fieldName;
 | 
			
		||||
        this.emptyInputAllowed = emptyInputAllowed;
 | 
			
		||||
        this.defaultValue = defaultValue;
 | 
			
		||||
        this.initLayout();
 | 
			
		||||
        this.initLabel();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the layout (FlowLayout is used).
 | 
			
		||||
     */
 | 
			
		||||
    protected void initLayout(){
 | 
			
		||||
        FlowLayout layFlowLayout = new FlowLayout(FlowLayout.LEFT);
 | 
			
		||||
        layFlowLayout.setVgap(0);
 | 
			
		||||
        this.setLayout(layFlowLayout);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the label.
 | 
			
		||||
     * 
 | 
			
		||||
     * The fieldName is also used as label text.
 | 
			
		||||
     */
 | 
			
		||||
    protected void initLabel(){
 | 
			
		||||
        JLabel label =  new JLabel();
 | 
			
		||||
        label.setText(fieldName);
 | 
			
		||||
        label.setPreferredSize(labelDim);
 | 
			
		||||
        this.add(label);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides access to the name of the field.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return The name of the field.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getName(){
 | 
			
		||||
        return fieldName;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides access to the emptyInputIsAllowed boolean.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return true if the field may be empty when submitted, false otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    public boolean isEmptyInputAllowed(){
 | 
			
		||||
        return emptyInputAllowed;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides access to the editor component for the field value.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return The editor component for the field value.
 | 
			
		||||
     */
 | 
			
		||||
    public JComponent getField(){
 | 
			
		||||
        return field;
 | 
			
		||||
    }
 | 
			
		||||
        
 | 
			
		||||
    public abstract Object getValue();
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public abstract void setEnabled(boolean enabled);
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The name of the field.
 | 
			
		||||
     */
 | 
			
		||||
    protected String fieldName    = null;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The input field.
 | 
			
		||||
     */
 | 
			
		||||
    protected JComponent field    = null;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The label Dimension.
 | 
			
		||||
     */
 | 
			
		||||
    protected Dimension labelDim = null;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The field Dimension.
 | 
			
		||||
     */
 | 
			
		||||
    protected Dimension fieldDim = null;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Boolean that specifies if empy input is allowed for this field.
 | 
			
		||||
     */
 | 
			
		||||
    protected boolean emptyInputAllowed;
 | 
			
		||||
    
 | 
			
		||||
    protected Object defaultValue = null;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,392 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.common.view;
 | 
			
		||||
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
import java.awt.event.ActionEvent;
 | 
			
		||||
import java.awt.event.ActionListener;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JLabel;
 | 
			
		||||
import javax.swing.JPanel;
 | 
			
		||||
import javax.swing.JProgressBar;
 | 
			
		||||
import javax.swing.SwingUtilities;
 | 
			
		||||
import javax.swing.Timer;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.Config;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class provides a standard statusbar that can be placed in a window at
 | 
			
		||||
 * any place.
 | 
			
		||||
 */
 | 
			
		||||
public class StatusPanel extends JPanel {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = -6861447244439379176L;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new StatusPanel that can be used to provide information about
 | 
			
		||||
     * the status of the application of a certain action. The StatusPanel
 | 
			
		||||
     * optionally provides a connection light and a progressbar.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param width
 | 
			
		||||
     *            The width of the panel.
 | 
			
		||||
     * @param _defaultText
 | 
			
		||||
     *            The default text of the panel.
 | 
			
		||||
     * @param showConnectionLight
 | 
			
		||||
     *            Whether or not to display a connection light.
 | 
			
		||||
     * @param showProgressBar
 | 
			
		||||
     *            Whether or not to display a progressbar.
 | 
			
		||||
     */
 | 
			
		||||
    public StatusPanel(int width, String _defaultText,
 | 
			
		||||
            boolean showConnectionLight, boolean showProgressBar) {
 | 
			
		||||
        super();
 | 
			
		||||
        this.setLayout(new java.awt.BorderLayout());
 | 
			
		||||
        defaultText = _defaultText;
 | 
			
		||||
 | 
			
		||||
        if (defaultText == null) {
 | 
			
		||||
            defaultText = "";
 | 
			
		||||
        }
 | 
			
		||||
        defaultBg = this.getBackground();
 | 
			
		||||
        status = new JLabel();
 | 
			
		||||
        status.setText(defaultText);
 | 
			
		||||
        status.setToolTipText(defaultText);
 | 
			
		||||
        java.awt.GridLayout layGridLayout2 = new java.awt.GridLayout();
 | 
			
		||||
        layGridLayout2.setRows(1);
 | 
			
		||||
        layGridLayout2.setColumns(1);
 | 
			
		||||
 | 
			
		||||
        if (showConnectionLight && showProgressBar) {
 | 
			
		||||
            progressBar = new JProgressBar(0, 10);
 | 
			
		||||
            progressBar.setBorderPainted(false);
 | 
			
		||||
            progressBar.setPreferredSize(new java.awt.Dimension(
 | 
			
		||||
                    width / 10 + 10, 10));
 | 
			
		||||
 | 
			
		||||
            JPanel temp = new JPanel();
 | 
			
		||||
            temp.setLayout(new java.awt.BorderLayout());
 | 
			
		||||
            temp.setBorder(javax.swing.BorderFactory
 | 
			
		||||
                    .createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
 | 
			
		||||
 | 
			
		||||
            statusPanel = new JPanel();
 | 
			
		||||
            statusPanel.setLayout(layGridLayout2);
 | 
			
		||||
            statusPanel.setPreferredSize(new java.awt.Dimension(width - 20
 | 
			
		||||
                    - (width / 10) - 10, 20));
 | 
			
		||||
            statusPanel.setMinimumSize(new java.awt.Dimension(50, 20));
 | 
			
		||||
            statusPanel.add(status);
 | 
			
		||||
 | 
			
		||||
            temp.add(statusPanel, java.awt.BorderLayout.CENTER);
 | 
			
		||||
            temp.add(progressBar, java.awt.BorderLayout.EAST);
 | 
			
		||||
 | 
			
		||||
            connectionPanel = new JPanel();
 | 
			
		||||
            connectionPanel.setPreferredSize(new java.awt.Dimension(20, 10));
 | 
			
		||||
            connectionPanel
 | 
			
		||||
                    .setBorder(javax.swing.BorderFactory.createCompoundBorder(
 | 
			
		||||
                            javax.swing.BorderFactory
 | 
			
		||||
                                    .createCompoundBorder(
 | 
			
		||||
                                            javax.swing.BorderFactory
 | 
			
		||||
                                                    .createLineBorder(
 | 
			
		||||
                                                            connectionPanel
 | 
			
		||||
                                                                    .getBackground(),
 | 
			
		||||
                                                            2),
 | 
			
		||||
                                            javax.swing.BorderFactory
 | 
			
		||||
                                                    .createEtchedBorder(javax.swing.border.EtchedBorder.RAISED)),
 | 
			
		||||
                            javax.swing.BorderFactory
 | 
			
		||||
                                    .createBevelBorder(javax.swing.border.BevelBorder.LOWERED)));
 | 
			
		||||
            connectionPanel.setBackground(disconnectedColor);
 | 
			
		||||
            connectionPanel.setToolTipText("Not connected.");
 | 
			
		||||
 | 
			
		||||
            this.add(temp, java.awt.BorderLayout.CENTER);
 | 
			
		||||
            this.add(connectionPanel, java.awt.BorderLayout.EAST);
 | 
			
		||||
            this.setPreferredSize(new java.awt.Dimension(width, 20));
 | 
			
		||||
        } else if (showProgressBar) {
 | 
			
		||||
            progressBar = new JProgressBar(0, 10);
 | 
			
		||||
            progressBar.setBorderPainted(false);
 | 
			
		||||
            progressBar.setPreferredSize(new java.awt.Dimension(
 | 
			
		||||
                    width / 10 + 10, 10));
 | 
			
		||||
 | 
			
		||||
            statusPanel = new JPanel();
 | 
			
		||||
            statusPanel.setLayout(layGridLayout2);
 | 
			
		||||
            statusPanel.setPreferredSize(new java.awt.Dimension(width
 | 
			
		||||
                    - (width / 10) - 10, 20));
 | 
			
		||||
            statusPanel.setMinimumSize(new java.awt.Dimension(50, 20));
 | 
			
		||||
            statusPanel.add(status);
 | 
			
		||||
 | 
			
		||||
            this.setBorder(javax.swing.BorderFactory
 | 
			
		||||
                    .createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
 | 
			
		||||
            this.setPreferredSize(new java.awt.Dimension(width, 20));
 | 
			
		||||
            this.add(statusPanel, java.awt.BorderLayout.CENTER);
 | 
			
		||||
            this.add(progressBar, java.awt.BorderLayout.EAST);
 | 
			
		||||
        } else if (showConnectionLight) {
 | 
			
		||||
            statusPanel = new JPanel();
 | 
			
		||||
            statusPanel.setLayout(layGridLayout2);
 | 
			
		||||
            statusPanel.setBorder(javax.swing.BorderFactory
 | 
			
		||||
                    .createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
 | 
			
		||||
            statusPanel
 | 
			
		||||
                    .setPreferredSize(new java.awt.Dimension(width - 20, 20));
 | 
			
		||||
            statusPanel.setMinimumSize(new java.awt.Dimension(50, 20));
 | 
			
		||||
            statusPanel.add(status);
 | 
			
		||||
 | 
			
		||||
            connectionPanel = new JPanel();
 | 
			
		||||
            connectionPanel.setPreferredSize(new java.awt.Dimension(20, 10));
 | 
			
		||||
            connectionPanel
 | 
			
		||||
                    .setBorder(javax.swing.BorderFactory.createCompoundBorder(
 | 
			
		||||
                            javax.swing.BorderFactory
 | 
			
		||||
                                    .createCompoundBorder(
 | 
			
		||||
                                            javax.swing.BorderFactory
 | 
			
		||||
                                                    .createLineBorder(
 | 
			
		||||
                                                            connectionPanel
 | 
			
		||||
                                                                    .getBackground(),
 | 
			
		||||
                                                            2),
 | 
			
		||||
                                            javax.swing.BorderFactory
 | 
			
		||||
                                                    .createEtchedBorder(javax.swing.border.EtchedBorder.RAISED)),
 | 
			
		||||
                            javax.swing.BorderFactory
 | 
			
		||||
                                    .createBevelBorder(javax.swing.border.BevelBorder.LOWERED)));
 | 
			
		||||
            connectionPanel.setBackground(disconnectedColor);
 | 
			
		||||
            connectionPanel.setToolTipText("Not connected.");
 | 
			
		||||
 | 
			
		||||
            this.add(statusPanel, java.awt.BorderLayout.CENTER);
 | 
			
		||||
            this.add(connectionPanel, java.awt.BorderLayout.EAST);
 | 
			
		||||
            this.setPreferredSize(new java.awt.Dimension(width, 20));
 | 
			
		||||
        } else {
 | 
			
		||||
            this.setLayout(layGridLayout2);
 | 
			
		||||
            this.setBorder(javax.swing.BorderFactory
 | 
			
		||||
                    .createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
 | 
			
		||||
            this.setPreferredSize(new java.awt.Dimension(width, 20));
 | 
			
		||||
            this.setMinimumSize(new java.awt.Dimension(100, 20));
 | 
			
		||||
            this.add(status);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sets the connection light to green when connected and to red if not.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param connected
 | 
			
		||||
     *            Whether or not the application has a connection.
 | 
			
		||||
     * @param toolTip
 | 
			
		||||
     *            The tooltip that must be displayed when the user moves the
 | 
			
		||||
     *            mouse over the connection light.
 | 
			
		||||
     */
 | 
			
		||||
    public synchronized void setConnected(boolean connected, String toolTip) {
 | 
			
		||||
        if (connectionPanel != null) {
 | 
			
		||||
            final boolean con = connected;
 | 
			
		||||
            final String tt = toolTip;
 | 
			
		||||
 | 
			
		||||
            Runnable runner = new Runnable() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void run() {
 | 
			
		||||
                    if (con) {
 | 
			
		||||
                        connectionPanel.setBackground(connectedColor);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        connectionPanel.setBackground(disconnectedColor);
 | 
			
		||||
                    }
 | 
			
		||||
                    connectionPanel.setToolTipText(tt);
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
            SwingUtilities.invokeLater(runner);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sets the status message to the supplied message and sets the progressbar
 | 
			
		||||
     * to indeterminate mode or resets it. This is done by calling the
 | 
			
		||||
     * setStatus(String, boolean) method as well as the setBusy method.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param message
 | 
			
		||||
     *            The message to set.
 | 
			
		||||
     * @param persistent
 | 
			
		||||
     *            Whether or not the message should never be removed or not.
 | 
			
		||||
     * @param busy
 | 
			
		||||
     *            Whether or not the progressbar must be set in indeterminate
 | 
			
		||||
     *            mode or not.
 | 
			
		||||
     */
 | 
			
		||||
    public synchronized void setStatus(String msg, boolean persistent,
 | 
			
		||||
            boolean busy) {
 | 
			
		||||
        if (msg == null) {
 | 
			
		||||
            msg = "";
 | 
			
		||||
        }
 | 
			
		||||
        final String message = msg;
 | 
			
		||||
        final boolean b = busy;
 | 
			
		||||
        final boolean p = persistent;
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
         * Runnable runner = new Runnable() { public void run(){
 | 
			
		||||
         */
 | 
			
		||||
        String myMsg = message;
 | 
			
		||||
 | 
			
		||||
        if ("".equals(message)) {
 | 
			
		||||
            myMsg = defaultText;
 | 
			
		||||
        }
 | 
			
		||||
        if (message.startsWith("Error:")) {
 | 
			
		||||
            if (statusPanel != null) {
 | 
			
		||||
                statusPanel.setBackground(errorColor);
 | 
			
		||||
 | 
			
		||||
                if (progressBar != null) {
 | 
			
		||||
                    progressBar.setBackground(errorColor);
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                setBackground(errorColor);
 | 
			
		||||
            }
 | 
			
		||||
            myMsg = message.substring(6);
 | 
			
		||||
        } else if (message.startsWith("Warning:")) {
 | 
			
		||||
            if (statusPanel != null) {
 | 
			
		||||
                statusPanel.setBackground(warningColor);
 | 
			
		||||
 | 
			
		||||
                if (progressBar != null) {
 | 
			
		||||
                    progressBar.setBackground(warningColor);
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                setBackground(warningColor);
 | 
			
		||||
            }
 | 
			
		||||
            myMsg = message.substring(8);
 | 
			
		||||
        } else { // Standard message
 | 
			
		||||
            if (statusPanel != null) {
 | 
			
		||||
                statusPanel.setBackground(defaultBg);
 | 
			
		||||
 | 
			
		||||
                if (progressBar != null) {
 | 
			
		||||
                    progressBar.setBackground(defaultBg);
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                setBackground(defaultBg);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        status.setText(" " + myMsg);
 | 
			
		||||
        status.setToolTipText(myMsg);
 | 
			
		||||
        setBusy(b);
 | 
			
		||||
 | 
			
		||||
        synchronized (this) {
 | 
			
		||||
            if (!p) {
 | 
			
		||||
                Timer persistentTimer = new Timer(persistentTime,
 | 
			
		||||
                        new ActionListener() {
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void actionPerformed(ActionEvent e) {
 | 
			
		||||
                                long currentTime = System.currentTimeMillis();
 | 
			
		||||
                                synchronized (org.eclipse.cyclonedds.common.view.StatusPanel.this) {
 | 
			
		||||
                                    if (((currentTime - lastMessageTime) < persistentTime)
 | 
			
		||||
                                            || (!lastPersistent)) {
 | 
			
		||||
                                        /*
 | 
			
		||||
                                         * New message has arrived, ignore
 | 
			
		||||
                                         * reset.
 | 
			
		||||
                                         */
 | 
			
		||||
                                    } else {
 | 
			
		||||
                                        setStatus(defaultText, false, false);
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        });
 | 
			
		||||
                persistentTimer.setRepeats(false);
 | 
			
		||||
                lastMessageTime = System.currentTimeMillis();
 | 
			
		||||
                persistentTimer.start();
 | 
			
		||||
                lastPersistent = true;
 | 
			
		||||
            } else {
 | 
			
		||||
                lastPersistent = false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        /*
 | 
			
		||||
         * }
 | 
			
		||||
         * 
 | 
			
		||||
         * }; runner.run(); SwingUtilities.invokeLater(runner);
 | 
			
		||||
         */
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Changes the status message. If the message starts with "Error:" the
 | 
			
		||||
     * background color will become red and the "Error:" part of the string will
 | 
			
		||||
     * not be shown. If the message starts with "Warning:" the background color
 | 
			
		||||
     * will become yellow and the "Warning:" part of the string will not be
 | 
			
		||||
     * displayed.
 | 
			
		||||
     * 
 | 
			
		||||
     * @param message
 | 
			
		||||
     *            The new status message.
 | 
			
		||||
     * @param persistent
 | 
			
		||||
     *            If true, the message will not be changed into the standard
 | 
			
		||||
     *            text after a few seconds, but stay there until this function
 | 
			
		||||
     *            is called again.
 | 
			
		||||
     */
 | 
			
		||||
    public synchronized void setStatus(String message, boolean persistent) {
 | 
			
		||||
        this.setStatus(message, persistent, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sets the progressbar status. When true, the progressbar will go into
 | 
			
		||||
     * inderminate mode and display 'busy...', when false the progressbar will
 | 
			
		||||
     * leave indeterminate mode and display 'ready'
 | 
			
		||||
     * 
 | 
			
		||||
     * @param busy
 | 
			
		||||
     *            When true, the progressbar will go into inderminate mode
 | 
			
		||||
     */
 | 
			
		||||
    private synchronized void setBusy(boolean busy) {
 | 
			
		||||
        if (progressBar != null) {
 | 
			
		||||
            if (busy) {
 | 
			
		||||
                progressBar.setBorderPainted(true);
 | 
			
		||||
                progressBar.setStringPainted(true);
 | 
			
		||||
                progressBar.setString("busy..");
 | 
			
		||||
            } else {
 | 
			
		||||
                progressBar.setBorderPainted(false);
 | 
			
		||||
                progressBar.setStringPainted(false);
 | 
			
		||||
                progressBar.setString(null);
 | 
			
		||||
            }
 | 
			
		||||
            progressBar.setIndeterminate(busy);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides access to the current status.
 | 
			
		||||
     * 
 | 
			
		||||
     * @return The currently displayed status.
 | 
			
		||||
     */
 | 
			
		||||
    public synchronized String getStatus() {
 | 
			
		||||
        return status.getText();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static final int persistentTime = 4000;
 | 
			
		||||
 | 
			
		||||
    private long lastMessageTime;
 | 
			
		||||
 | 
			
		||||
    private boolean lastPersistent = false;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The current status message.
 | 
			
		||||
     */
 | 
			
		||||
    private JLabel status = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The default message.
 | 
			
		||||
     */
 | 
			
		||||
    private String defaultText = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The default background color
 | 
			
		||||
     */
 | 
			
		||||
    private Color defaultBg = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Panel that holds the connection light. Green if connected, red if not
 | 
			
		||||
     * connected.
 | 
			
		||||
     */
 | 
			
		||||
    private JPanel connectionPanel = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Progressbar that can be used to provide the user with progress
 | 
			
		||||
     * information.
 | 
			
		||||
     */
 | 
			
		||||
    private JProgressBar progressBar = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Panel that holds the status label.
 | 
			
		||||
     */
 | 
			
		||||
    private JPanel statusPanel = null;
 | 
			
		||||
 | 
			
		||||
    private final Color connectedColor = Config.getActiveColor();
 | 
			
		||||
 | 
			
		||||
    private final Color errorColor = Config.getErrorColor();
 | 
			
		||||
 | 
			
		||||
    private final Color warningColor = Config.getWarningColor();
 | 
			
		||||
 | 
			
		||||
    private final Color disconnectedColor = Config.getErrorColor();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,77 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.Initializer;
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.Report;
 | 
			
		||||
import org.eclipse.cyclonedds.config.swing.ConfigWindow;
 | 
			
		||||
 | 
			
		||||
public class SpliceConfig extends Initializer {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Starts Splice Tuner. This function is the main class of Splice Tuner;
 | 
			
		||||
     * - It checks for the right version of the JVM, this must be 1.5.0.
 | 
			
		||||
     * - It passes on the commandline arguments. Arguments that are supported
 | 
			
		||||
     *   are:
 | 
			
		||||
     *      -# <java_properties_file>
 | 
			
		||||
     *
 | 
			
		||||
     * @param args These are passed on to the initialize function of the
 | 
			
		||||
     *             SpliceTuner object.
 | 
			
		||||
     */
 | 
			
		||||
    public static void main(String[] args) {
 | 
			
		||||
        boolean redirect = true;
 | 
			
		||||
        boolean uriSet = false;
 | 
			
		||||
        String[] args2;
 | 
			
		||||
        String uri = null;
 | 
			
		||||
 | 
			
		||||
        SpliceConfig t = new SpliceConfig();
 | 
			
		||||
        t.validateJVMVersion();
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < args.length; i++) {
 | 
			
		||||
            if ("-noredirect".equals(args[i])) {
 | 
			
		||||
                redirect = false;
 | 
			
		||||
            } else if (args[i].toLowerCase().startsWith("-uri=")) {
 | 
			
		||||
                uri = args[i].substring(5); /* '-uri=' is 5 characters */
 | 
			
		||||
                uriSet = true;
 | 
			
		||||
            } else {
 | 
			
		||||
                args2 = new String[1];
 | 
			
		||||
                args2[0] = args[i];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (redirect) {
 | 
			
		||||
            /*
 | 
			
		||||
             * initialize logging with a max size of 10M with a max history of
 | 
			
		||||
             * 10 runs and do not append
 | 
			
		||||
             */
 | 
			
		||||
            Report.getInstance().initializeInfo("cycloneddsconf-info.log", 10000000, 10, false);
 | 
			
		||||
            Report.getInstance().initializeError("cycloneddsconf-error.log", 10000000, 10, false);
 | 
			
		||||
        } else {
 | 
			
		||||
            Report.getInstance().initializeConsole();
 | 
			
		||||
            System.out.println("No redirect.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Runtime.getRuntime().addShutdownHook(new Thread() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void run() {
 | 
			
		||||
                Report.getInstance().CloseHandlers();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        ConfigWindow cw = null;
 | 
			
		||||
        if (uriSet) {
 | 
			
		||||
            cw = new ConfigWindow(uri);
 | 
			
		||||
        } else {
 | 
			
		||||
            cw = new ConfigWindow();
 | 
			
		||||
        }
 | 
			
		||||
        cw.setVisible(true);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,70 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.data;
 | 
			
		||||
 | 
			
		||||
import org.w3c.dom.Attr;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaAttribute;
 | 
			
		||||
 | 
			
		||||
public class DataAttribute extends DataNode {
 | 
			
		||||
    private DataValue value;
 | 
			
		||||
    
 | 
			
		||||
    public DataAttribute(MetaAttribute metadata, Attr node, Object value) throws DataException {
 | 
			
		||||
        super(metadata, node);
 | 
			
		||||
        
 | 
			
		||||
        if(!node.getNodeName().equals(metadata.getName())){
 | 
			
		||||
            throw new DataException("Metadata and data do not match.");
 | 
			
		||||
        }
 | 
			
		||||
        this.value = new DataValue(metadata.getValue(), node, value);
 | 
			
		||||
        this.value.setParent(this);
 | 
			
		||||
        this.value.setOwner(this.getOwner());
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public DataAttribute(MetaAttribute metadata, Attr node) throws DataException {
 | 
			
		||||
        super(metadata, node);
 | 
			
		||||
        
 | 
			
		||||
        if(!node.getNodeName().equals(metadata.getName())){
 | 
			
		||||
            throw new DataException("Metadata and data do not match.");
 | 
			
		||||
        }
 | 
			
		||||
        Object defaultValue = metadata.getValue().getDefaultValue();
 | 
			
		||||
        this.value = new DataValue(metadata.getValue(), node, defaultValue);
 | 
			
		||||
        this.value.setParent(this);
 | 
			
		||||
        this.value.setOwner(this.getOwner());
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setOwner(DataConfiguration owner) {
 | 
			
		||||
        super.setOwner(owner);
 | 
			
		||||
        this.value.setOwner(owner);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public DataValue getDataValue(){
 | 
			
		||||
        return this.value;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void testSetValue(Object value) throws DataException{
 | 
			
		||||
        this.value.testSetValue(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setValue(Object value) throws DataException{
 | 
			
		||||
        DataValue tmpValue = this.value;
 | 
			
		||||
        this.value.setValue(value);
 | 
			
		||||
        tmpValue.setParent(null);
 | 
			
		||||
        tmpValue.setOwner(null);
 | 
			
		||||
        this.value.setParent(this);
 | 
			
		||||
        this.value.setOwner(this.owner);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public Object getValue(){
 | 
			
		||||
        return this.value.getValue();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.data;
 | 
			
		||||
 | 
			
		||||
public interface DataConfigurationListener {
 | 
			
		||||
    public void valueChanged(DataValue data, Object oldValue, Object newValue);
 | 
			
		||||
    
 | 
			
		||||
    public void nodeAdded(DataElement parent, DataNode nodeAdded);
 | 
			
		||||
    
 | 
			
		||||
    public void nodeRemoved(DataElement parent, DataNode nodeRemoved);
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,220 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.data;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.ConfigModeIntializer;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaAttribute;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaNode;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValue;
 | 
			
		||||
import org.w3c.dom.Attr;
 | 
			
		||||
import org.w3c.dom.Element;
 | 
			
		||||
import org.w3c.dom.Node;
 | 
			
		||||
import org.w3c.dom.NodeList;
 | 
			
		||||
import org.w3c.dom.Text;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public class DataElement extends DataNode {
 | 
			
		||||
    private ArrayList<DataNode> children = null;
 | 
			
		||||
    
 | 
			
		||||
    public DataElement(MetaElement metadata, Element node) throws DataException {
 | 
			
		||||
        super(metadata, node);
 | 
			
		||||
        
 | 
			
		||||
        if(!node.getNodeName().equals(metadata.getName())){
 | 
			
		||||
            throw new DataException("Metadata and data do not match.");
 | 
			
		||||
        }
 | 
			
		||||
        this.children = new ArrayList<DataNode>();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    protected DataNode addChild(DataNode node, int addToDOM, String value) throws DataException {
 | 
			
		||||
        /*
 | 
			
		||||
         * addToDOM values: 0 = do not add (false) 1 = append (true) 2 = replace
 | 
			
		||||
         * (this is done when the user choose to repair the value)
 | 
			
		||||
         */
 | 
			
		||||
        int count;
 | 
			
		||||
        MetaNode nodeMeta;
 | 
			
		||||
        
 | 
			
		||||
        if(node == null){
 | 
			
		||||
            throw new DataException("Cannot add null child.");
 | 
			
		||||
        } else if(this.children.contains(node)){
 | 
			
		||||
            throw new DataException("Element already contains this child.");
 | 
			
		||||
        } else if(!this.isNodeChildCandidate(node)){
 | 
			
		||||
            throw new DataException("Node cannot be added to this element.");
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        nodeMeta = node.getMetadata();
 | 
			
		||||
        count = 0;
 | 
			
		||||
        
 | 
			
		||||
        for(DataNode child: this.children){
 | 
			
		||||
            if(child instanceof DataValue){
 | 
			
		||||
                if(node instanceof DataValue){
 | 
			
		||||
                    throw new DataException("Element " + 
 | 
			
		||||
                            ((MetaElement)this.metadata).getName() + 
 | 
			
		||||
                            " already contains this child: " + 
 | 
			
		||||
                            ((DataValue)node).getValue() + " with value: " + 
 | 
			
		||||
                            ((DataValue)child).getValue());
 | 
			
		||||
                }
 | 
			
		||||
            } else if(child instanceof DataElement){
 | 
			
		||||
                if(node instanceof DataElement){
 | 
			
		||||
                    if(child.getMetadata().equals(nodeMeta)){
 | 
			
		||||
                        count++;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } else if(child instanceof DataAttribute){
 | 
			
		||||
                if(node instanceof DataAttribute){
 | 
			
		||||
                    if(child.getMetadata().equals(nodeMeta)){
 | 
			
		||||
                        throw new DataException("Element already contains attribute: " 
 | 
			
		||||
                                + ((MetaAttribute)nodeMeta).getName());
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } 
 | 
			
		||||
        
 | 
			
		||||
        if(nodeMeta instanceof MetaElement){
 | 
			
		||||
            if (nodeMeta.getVersion().equals(ConfigModeIntializer.COMMERCIAL) 
 | 
			
		||||
                    && (ConfigModeIntializer.CONFIGURATOR_MODE == ConfigModeIntializer.COMMUNITY_MODE || ConfigModeIntializer.CONFIGURATOR_MODE == ConfigModeIntializer.COMMUNITY_MODE_FILE_OPEN)) {
 | 
			
		||||
                addToDOM = 0;
 | 
			
		||||
            }
 | 
			
		||||
            if(count == ((MetaElement)nodeMeta).getMaxOccurrences()){
 | 
			
		||||
                throw new DataException("Maximum number of occurrences for " + 
 | 
			
		||||
                        ((MetaElement)nodeMeta).getName()+ " reached.");
 | 
			
		||||
            } else if (addToDOM == 1) {
 | 
			
		||||
                ((Element) this.node).appendChild(node.getNode());
 | 
			
		||||
                Text textNode = this.owner.getDocument().createTextNode("\n");
 | 
			
		||||
                this.node.appendChild(textNode);
 | 
			
		||||
            } else if (addToDOM == 2) {
 | 
			
		||||
                replaceChild(node.getNode(), value);
 | 
			
		||||
                Text textNode = this.owner.getDocument().createTextNode("\n");
 | 
			
		||||
                this.node.appendChild(textNode);
 | 
			
		||||
            }
 | 
			
		||||
        } else if(nodeMeta instanceof MetaAttribute){
 | 
			
		||||
            if (nodeMeta.getVersion().equals(ConfigModeIntializer.COMMERCIAL)
 | 
			
		||||
                    && (ConfigModeIntializer.CONFIGURATOR_MODE == ConfigModeIntializer.COMMUNITY_MODE || ConfigModeIntializer.CONFIGURATOR_MODE == ConfigModeIntializer.COMMUNITY_MODE_FILE_OPEN)) {
 | 
			
		||||
                addToDOM = 0;
 | 
			
		||||
            }
 | 
			
		||||
            if (addToDOM == 1) {
 | 
			
		||||
                ((Element)this.node).setAttributeNode((Attr)node.getNode());
 | 
			
		||||
            }
 | 
			
		||||
        } else if(nodeMeta instanceof MetaValue){
 | 
			
		||||
            if (addToDOM == 1) {
 | 
			
		||||
                ((Element)this.node).appendChild(node.getNode());
 | 
			
		||||
                assert this.owner != null;
 | 
			
		||||
                assert this.owner.getDocument() != null;
 | 
			
		||||
            } else if (addToDOM == 2) {
 | 
			
		||||
                replaceChild(node.getNode(), value);
 | 
			
		||||
                Text textNode = this.owner.getDocument().createTextNode("\n");
 | 
			
		||||
                this.node.appendChild(textNode);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this.children.add(node);
 | 
			
		||||
        node.setParent(this);
 | 
			
		||||
        node.setOwner(this.owner);
 | 
			
		||||
        
 | 
			
		||||
        return node;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void replaceChild(Node node, String value) {
 | 
			
		||||
        NodeList nodeList = ((Element) this.node).getChildNodes();
 | 
			
		||||
        boolean finished = false;
 | 
			
		||||
        for (int i = 0, len = nodeList.getLength(); i < len && !finished; i++) {
 | 
			
		||||
            Node n = nodeList.item(i);
 | 
			
		||||
            if (n.getNodeValue().equals(value)) {
 | 
			
		||||
                ((Element) this.node).replaceChild(node, n);
 | 
			
		||||
                finished = true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setOwner(DataConfiguration owner) {
 | 
			
		||||
        super.setOwner(owner);
 | 
			
		||||
        
 | 
			
		||||
        for(DataNode child: this.children){
 | 
			
		||||
            child.setOwner(owner);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public DataNode addChild(DataNode node) throws DataException{
 | 
			
		||||
        return addChild(node, 1, null);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void removeChild(DataNode node) throws DataException{
 | 
			
		||||
        int count;
 | 
			
		||||
        MetaNode nodeMeta;
 | 
			
		||||
        
 | 
			
		||||
        if(node == null){
 | 
			
		||||
            throw new DataException("Cannot remove null child.");
 | 
			
		||||
        } else if(!(this.children.contains(node))){
 | 
			
		||||
            throw new DataException("Element does not contain this child.");
 | 
			
		||||
        }
 | 
			
		||||
        nodeMeta = node.getMetadata();
 | 
			
		||||
        count = 0;
 | 
			
		||||
        
 | 
			
		||||
        for(DataNode child: this.children){
 | 
			
		||||
            if(child.getMetadata().equals(nodeMeta)){
 | 
			
		||||
                count++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if(nodeMeta instanceof MetaElement){
 | 
			
		||||
            if(count == ((MetaElement)nodeMeta).getMinOccurrences()){
 | 
			
		||||
                throw new DataException("Minimum number of occurrences for " + 
 | 
			
		||||
                        ((MetaElement)nodeMeta).getName()+ " reached.");
 | 
			
		||||
            } else if (ConfigModeIntializer.CONFIGURATOR_MODE == ConfigModeIntializer.COMMERCIAL_MODE) {
 | 
			
		||||
                ((Element) this.node).removeChild(node.getNode());
 | 
			
		||||
            } else {
 | 
			
		||||
                if (!nodeMeta.getVersion().equals(
 | 
			
		||||
                        ConfigModeIntializer.COMMERCIAL)) {
 | 
			
		||||
                    if (!node.getOwner().getCommercialServices()
 | 
			
		||||
                            .contains(node.getNode())) {
 | 
			
		||||
                        ((Element) this.node).removeChild(node.getNode());
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else if(nodeMeta instanceof MetaAttribute){
 | 
			
		||||
            if(((MetaAttribute)nodeMeta).isRequired()){
 | 
			
		||||
                throw new DataException("Cannot remove required attribute " + 
 | 
			
		||||
                        ((MetaAttribute)nodeMeta).getName()+ ".");
 | 
			
		||||
            } else if (ConfigModeIntializer.CONFIGURATOR_MODE == ConfigModeIntializer.COMMERCIAL_MODE) {
 | 
			
		||||
                ((Element) this.node)
 | 
			
		||||
                        .removeAttributeNode((Attr) node.getNode());
 | 
			
		||||
            } else {
 | 
			
		||||
                if (!nodeMeta.getVersion().equals(
 | 
			
		||||
                        ConfigModeIntializer.COMMERCIAL)) {
 | 
			
		||||
                    ((Element)this.node).removeAttributeNode((Attr)node.getNode());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            ((Element)this.node).removeChild(node.getNode());
 | 
			
		||||
        }
 | 
			
		||||
        this.children.remove(node);
 | 
			
		||||
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public DataNode[] getChildren(){
 | 
			
		||||
        return this.children.toArray(new DataNode[this.children.size()]);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private boolean isNodeChildCandidate(DataNode node){
 | 
			
		||||
        MetaNode nodeMeta    = node.getMetadata();
 | 
			
		||||
        MetaNode[] metaNodes = ((MetaElement)this.metadata).getChildren();
 | 
			
		||||
        
 | 
			
		||||
        for(MetaNode mn: metaNodes){
 | 
			
		||||
            if(mn.equals(nodeMeta)){
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.data;
 | 
			
		||||
 | 
			
		||||
public class DataException extends Exception {
 | 
			
		||||
    private static final long serialVersionUID = 7787444897071114498L;
 | 
			
		||||
 | 
			
		||||
    public DataException(String message){
 | 
			
		||||
        super(message);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,73 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.data;
 | 
			
		||||
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaNode;
 | 
			
		||||
import org.w3c.dom.Node;
 | 
			
		||||
 | 
			
		||||
public abstract class DataNode {
 | 
			
		||||
    protected MetaNode metadata;
 | 
			
		||||
    protected Node node;
 | 
			
		||||
    protected DataNode parent;
 | 
			
		||||
    protected DataConfiguration owner;
 | 
			
		||||
    private HashSet<DataNode>   dependencies = null;
 | 
			
		||||
    
 | 
			
		||||
    public DataNode(MetaNode metadata, Node node) throws DataException {
 | 
			
		||||
        if(metadata == null){
 | 
			
		||||
            throw new DataException("Invalid metadata.");
 | 
			
		||||
        } else if(node == null){
 | 
			
		||||
            throw new DataException("Invalid data.");
 | 
			
		||||
        }
 | 
			
		||||
        this.metadata = metadata;
 | 
			
		||||
        this.node     = node;
 | 
			
		||||
        this.parent   = null;
 | 
			
		||||
        this.owner    = null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void addDependency(DataNode dv) {
 | 
			
		||||
        if (dependencies == null) {
 | 
			
		||||
            dependencies = new HashSet<DataNode>();
 | 
			
		||||
        }
 | 
			
		||||
        dependencies.add(dv);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public HashSet<DataNode> getDependencies() {
 | 
			
		||||
        return dependencies;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public MetaNode getMetadata() {
 | 
			
		||||
        return this.metadata;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Node getNode() {
 | 
			
		||||
        return this.node;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public DataConfiguration getOwner() {
 | 
			
		||||
        return this.owner;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setOwner(DataConfiguration owner) {
 | 
			
		||||
        this.owner = owner;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    protected void setParent(DataNode node){
 | 
			
		||||
        this.parent = node;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public DataNode getParent(){
 | 
			
		||||
        return this.parent;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,296 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.data;
 | 
			
		||||
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaConfiguration;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValue;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValueBoolean;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValueDouble;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValueEnum;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValueFloat;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValueInt;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValueLong;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValueNatural;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValueSize;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValueString;
 | 
			
		||||
import org.w3c.dom.Attr;
 | 
			
		||||
import org.w3c.dom.Text;
 | 
			
		||||
 | 
			
		||||
public class DataValue extends DataNode {
 | 
			
		||||
    private Object value;
 | 
			
		||||
    private HashSet<DataValue> DVdependencies = null;
 | 
			
		||||
 | 
			
		||||
    public DataValue(MetaValue metadata, Attr parent, Object value) throws DataException {
 | 
			
		||||
        super(metadata, parent);
 | 
			
		||||
        this.setValue(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public DataValue(MetaValue metadata, Text text) throws DataException {
 | 
			
		||||
        super(metadata, text);
 | 
			
		||||
        this.setValue(this.node.getNodeValue());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Object getValue(){
 | 
			
		||||
        return this.value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void addDataValueDependency(DataValue dv) {
 | 
			
		||||
        if (DVdependencies == null) {
 | 
			
		||||
            DVdependencies = new HashSet<DataValue>();
 | 
			
		||||
        }
 | 
			
		||||
        DVdependencies.add(dv);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public HashSet<DataValue> getDataValueDependencies() {
 | 
			
		||||
        return DVdependencies;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void testSetValue(Object value) throws DataException {
 | 
			
		||||
        try{
 | 
			
		||||
            if (!isEnvironmentVar(value)) {
 | 
			
		||||
                if(this.metadata instanceof MetaValueBoolean){
 | 
			
		||||
                    if(value instanceof String){
 | 
			
		||||
                        this.value = Boolean.parseBoolean((String)value);
 | 
			
		||||
                    } else if(!(value instanceof Boolean)){
 | 
			
		||||
                        throw new NumberFormatException();
 | 
			
		||||
                    }
 | 
			
		||||
                } else if(this.metadata instanceof MetaValueDouble){
 | 
			
		||||
                    Double tempValue;
 | 
			
		||||
                    MetaValueNatural mv = (MetaValueNatural)this.metadata;
 | 
			
		||||
 | 
			
		||||
                    if(value instanceof String){
 | 
			
		||||
                        tempValue = Double.parseDouble((String)value);
 | 
			
		||||
                    } else if(!(value instanceof Double)){
 | 
			
		||||
                        throw new NumberFormatException();
 | 
			
		||||
                    } else {
 | 
			
		||||
                        tempValue = (Double)value;
 | 
			
		||||
                    }
 | 
			
		||||
                    Object min = mv.getMinValue();
 | 
			
		||||
                    Object max = mv.getMaxValue();
 | 
			
		||||
 | 
			
		||||
                    if(tempValue.compareTo((Double)min) < 0){
 | 
			
		||||
                        throw new DataException("<" + this.node.getParentNode().getNodeName() + "> Value: " + tempValue
 | 
			
		||||
                                + "<" + min);
 | 
			
		||||
                    } else if(tempValue.compareTo((Double)max) > 0){
 | 
			
		||||
                        throw new DataException("<" + this.node.getParentNode().getNodeName() + "> Value: " + tempValue
 | 
			
		||||
                                + ">" + max);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if(this.metadata instanceof MetaValueEnum){
 | 
			
		||||
                    if(value instanceof String){
 | 
			
		||||
                        String tmp;
 | 
			
		||||
                        String[] values = ((MetaValueEnum)this.metadata).getPosValues();
 | 
			
		||||
                        boolean valid   = false;
 | 
			
		||||
 | 
			
		||||
                        for(int i=0; i<values.length && !valid; i++){
 | 
			
		||||
                            tmp = values[i];
 | 
			
		||||
 | 
			
		||||
                            if(tmp.equalsIgnoreCase((String)value)){
 | 
			
		||||
                                valid = true;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if(!valid){
 | 
			
		||||
                            throw new DataException("Illegal Enum value found: " + value);
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        throw new NumberFormatException();
 | 
			
		||||
                    }
 | 
			
		||||
                } else if(this.metadata instanceof MetaValueFloat){
 | 
			
		||||
                    Float tempValue;
 | 
			
		||||
                    MetaValueNatural mv = (MetaValueNatural)this.metadata;
 | 
			
		||||
 | 
			
		||||
                    if(value instanceof String){
 | 
			
		||||
                        tempValue = Float.parseFloat((String)value);
 | 
			
		||||
                    } else if(!(value instanceof Float)){
 | 
			
		||||
                        throw new NumberFormatException();
 | 
			
		||||
                    } else {
 | 
			
		||||
                        tempValue = (Float)value;
 | 
			
		||||
                    }
 | 
			
		||||
                    Object min = mv.getMinValue();
 | 
			
		||||
                    Object max = mv.getMaxValue();
 | 
			
		||||
 | 
			
		||||
                    if(tempValue.compareTo((Float)min) < 0){
 | 
			
		||||
                        throw new DataException("<" + this.node.getParentNode().getNodeName() + "> Value: " + tempValue
 | 
			
		||||
                                + " < " + min);
 | 
			
		||||
                    } else if(tempValue.compareTo((Float)max) > 0){
 | 
			
		||||
                        throw new DataException("<" + this.node.getParentNode().getNodeName() + "> Value: " + tempValue
 | 
			
		||||
                                + " > " + max);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if(this.metadata instanceof MetaValueInt){
 | 
			
		||||
                    Integer tempValue;
 | 
			
		||||
                    MetaValueNatural mv = (MetaValueNatural)this.metadata;
 | 
			
		||||
 | 
			
		||||
                    if(value instanceof String){
 | 
			
		||||
                        tempValue = Integer.parseInt((String)value);
 | 
			
		||||
                    } else if(!(value instanceof Integer)){
 | 
			
		||||
                        throw new NumberFormatException();
 | 
			
		||||
                    } else {
 | 
			
		||||
                        tempValue = (Integer)value;
 | 
			
		||||
                    }
 | 
			
		||||
                    Object min = mv.getMinValue();
 | 
			
		||||
                    Object max = mv.getMaxValue();
 | 
			
		||||
 | 
			
		||||
                    if(tempValue.compareTo((Integer)min) < 0){
 | 
			
		||||
                        throw new DataException("<" + this.node.getParentNode().getNodeName() + "> Value: " + tempValue
 | 
			
		||||
                                + "<" + min);
 | 
			
		||||
                    } else if(tempValue.compareTo((Integer)max) > 0){
 | 
			
		||||
                        throw new DataException("<" + this.node.getParentNode().getNodeName() + "> Value: " + tempValue
 | 
			
		||||
                                + ">" + max);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if(this.metadata instanceof MetaValueLong){
 | 
			
		||||
                    Long tempValue;
 | 
			
		||||
                    MetaValueNatural mv = (MetaValueNatural)this.metadata;
 | 
			
		||||
 | 
			
		||||
                    if(value instanceof String){
 | 
			
		||||
                        tempValue = Long.parseLong((String)value);
 | 
			
		||||
                    } else if(!(value instanceof Long)){
 | 
			
		||||
                        throw new NumberFormatException();
 | 
			
		||||
                    } else {
 | 
			
		||||
                        tempValue = (Long)value;
 | 
			
		||||
                    }
 | 
			
		||||
                    Object min = mv.getMinValue();
 | 
			
		||||
                    Object max = mv.getMaxValue();
 | 
			
		||||
 | 
			
		||||
                    if(tempValue.compareTo((Long)min) < 0){
 | 
			
		||||
                        throw new DataException("<" + this.node.getParentNode().getNodeName() + "> Value: " + tempValue
 | 
			
		||||
                                + "<" + min);
 | 
			
		||||
                    } else if(tempValue.compareTo((Long)max) > 0){
 | 
			
		||||
                        throw new DataException("<" + this.node.getParentNode().getNodeName() + "> Value: " + tempValue
 | 
			
		||||
                                + ">" + max);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if(this.metadata instanceof MetaValueSize){
 | 
			
		||||
                    Long tempValue;
 | 
			
		||||
                    MetaValueNatural mv = (MetaValueNatural)this.metadata;
 | 
			
		||||
 | 
			
		||||
                    if(value instanceof String){
 | 
			
		||||
                        tempValue = MetaConfiguration.createLongValuefromSizeValue((String)value);
 | 
			
		||||
                    } else if(!(value instanceof Long)){
 | 
			
		||||
                        throw new NumberFormatException();
 | 
			
		||||
                    } else {
 | 
			
		||||
                        tempValue = (Long)value;
 | 
			
		||||
                    }
 | 
			
		||||
                    Object min = mv.getMinValue();
 | 
			
		||||
                    Object max = mv.getMaxValue();
 | 
			
		||||
 | 
			
		||||
                    if(tempValue.compareTo((Long)min) < 0){
 | 
			
		||||
                        throw new DataException("<" + this.node.getParentNode().getNodeName() + "> Value: " + tempValue
 | 
			
		||||
                                + "<" + min);
 | 
			
		||||
                    } else if(tempValue.compareTo((Long)max) > 0){
 | 
			
		||||
                        throw new DataException("<" + this.node.getParentNode().getNodeName() + "> Value: " + tempValue
 | 
			
		||||
                                + ">" + max);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if(this.metadata instanceof MetaValueString){
 | 
			
		||||
                    if(value instanceof String){
 | 
			
		||||
                        String strValue = (String)value;
 | 
			
		||||
 | 
			
		||||
                        if(strValue.startsWith("${") && strValue.endsWith("}")){
 | 
			
		||||
                            /*Environment variable, this is ok*/
 | 
			
		||||
                        } else {
 | 
			
		||||
                            int length = strValue.length();
 | 
			
		||||
                            int maxLength = ((MetaValueString)this.metadata).getMaxLength();
 | 
			
		||||
 | 
			
		||||
                            if((maxLength != 0) && (length > maxLength)){
 | 
			
		||||
                                throw new DataException("<" + this.node.getParentNode().getNodeName() + "> String length: "
 | 
			
		||||
                                        + length + ">" + maxLength);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        /*
 | 
			
		||||
                         * check if we got a domain service name element of service
 | 
			
		||||
                         * tag name element
 | 
			
		||||
                         */
 | 
			
		||||
                        if (this.getOwner() != null && this.getOwner().getServiceNames().contains(this)) {
 | 
			
		||||
                            if (!this.getValue().equals(value)) {
 | 
			
		||||
                                for (DataValue dv : this.getOwner().getServiceNames()) {
 | 
			
		||||
                                    if (dv.getValue().equals(value)) {
 | 
			
		||||
                                        throw new DataException("Name [" + value + "] is already used by another service");
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    } else if(value == null){
 | 
			
		||||
                        throw new DataException("Null pointer string");
 | 
			
		||||
                    } else {
 | 
			
		||||
                        throw new NumberFormatException();
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    throw new DataException("Found unknown metadata." +
 | 
			
		||||
                            this.metadata.getClass().toString().substring(
 | 
			
		||||
                                this.metadata.getClass().toString().lastIndexOf(
 | 
			
		||||
                                        '.') + 10));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } catch(NumberFormatException nfe){
 | 
			
		||||
            if(value == null){
 | 
			
		||||
                throw new DataException("Found null pointer for data.");
 | 
			
		||||
            }
 | 
			
		||||
            throw new DataException("Expected '"
 | 
			
		||||
                    + this.metadata
 | 
			
		||||
                            .getClass()
 | 
			
		||||
                            .toString()
 | 
			
		||||
                            .substring(
 | 
			
		||||
                                    this.metadata.getClass().toString()
 | 
			
		||||
                                            .lastIndexOf('.') + 10)
 | 
			
		||||
                    + "', but found '"
 | 
			
		||||
                    + value.getClass()
 | 
			
		||||
                            .toString()
 | 
			
		||||
                            .substring(
 | 
			
		||||
                                    value.getClass().toString()
 | 
			
		||||
                                            .lastIndexOf('.') + 1) + "'.");
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isEnvironmentVar(Object value) {
 | 
			
		||||
        boolean result = false;
 | 
			
		||||
        if (value instanceof String && ((String) value).startsWith("${") && ((String) value).endsWith("}")) {
 | 
			
		||||
            result = true;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setValue(Object value) throws DataException {
 | 
			
		||||
        this.testSetValue(value);
 | 
			
		||||
 | 
			
		||||
        this.value = value;
 | 
			
		||||
        /*testSetValue succeeded*/
 | 
			
		||||
        if(this.node instanceof Attr){
 | 
			
		||||
            ((Attr)this.node).setValue(this.value.toString());
 | 
			
		||||
        } else if(this.node instanceof Text){
 | 
			
		||||
            ((Text)this.node).replaceWholeText(this.value.toString());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (DVdependencies != null) {
 | 
			
		||||
            for (DataValue dv : DVdependencies) {
 | 
			
		||||
                Object oldValue = dv.getValue();
 | 
			
		||||
                dv.value = value;
 | 
			
		||||
                /* testSetValue succeeded */
 | 
			
		||||
                if (dv.node instanceof Attr) {
 | 
			
		||||
                    ((Attr) dv.node).setValue(dv.value.toString());
 | 
			
		||||
                } else if (dv.node instanceof Text) {
 | 
			
		||||
                    ((Text) dv.node).replaceWholeText(dv.value.toString());
 | 
			
		||||
                }
 | 
			
		||||
                dv.getOwner().notifyValueChanged(dv, oldValue, value);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void resetValue(){
 | 
			
		||||
        try {
 | 
			
		||||
            this.setValue(((MetaValue)this.metadata).getDefaultValue());
 | 
			
		||||
        } catch (DataException e) {
 | 
			
		||||
            assert false: "Default value cannot be applied.";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,96 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
public class MetaAttribute extends MetaNode {
 | 
			
		||||
    private String name;
 | 
			
		||||
    private boolean required;
 | 
			
		||||
    private MetaValue value;
 | 
			
		||||
    
 | 
			
		||||
    public MetaAttribute(String doc, String name, boolean required,
 | 
			
		||||
            MetaValue value, String version, String dimension) {
 | 
			
		||||
        super(doc, version, dimension);
 | 
			
		||||
        this.name = name;
 | 
			
		||||
        this.required = required;
 | 
			
		||||
        this.value = value;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public boolean isRequired(){
 | 
			
		||||
        return this.required;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getName() {
 | 
			
		||||
        return this.name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setName(String name) {
 | 
			
		||||
        this.name = name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public MetaValue getValue() {
 | 
			
		||||
        return this.value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setValue(MetaValue value) {
 | 
			
		||||
        this.value = value;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals(Object object){
 | 
			
		||||
        MetaAttribute ma;
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(object instanceof MetaAttribute){
 | 
			
		||||
            ma = (MetaAttribute)object;
 | 
			
		||||
            
 | 
			
		||||
            if(this.name.equals(ma.getName())){
 | 
			
		||||
                if(this.required == ma.isRequired()){
 | 
			
		||||
                    if(this.value.equals(ma.getValue())){
 | 
			
		||||
                       result = true;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        result = false;
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    result = false;
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                result = false;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode() {
 | 
			
		||||
        int var_gen_code;
 | 
			
		||||
        int hash = 13;
 | 
			
		||||
        var_gen_code = required ? 1 : 0;
 | 
			
		||||
        var_gen_code += (null == value ? 0 : value.hashCode());
 | 
			
		||||
        var_gen_code += (null == name ? 0 : name.hashCode());
 | 
			
		||||
        hash = 31 * hash + var_gen_code;
 | 
			
		||||
        return hash;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString(){
 | 
			
		||||
        String result = "";
 | 
			
		||||
        result += "\nAttribute\n";
 | 
			
		||||
        result += "-Name: " + this.name + "\n";
 | 
			
		||||
        result += "-Required: " + this.required + "\n";
 | 
			
		||||
        result += "-Version: " + this.version + "\n";
 | 
			
		||||
        result += "-Value: " + value.toString();
 | 
			
		||||
        
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,138 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
public class MetaElement extends MetaNode {
 | 
			
		||||
    private String name;
 | 
			
		||||
    private int minOccurrences;
 | 
			
		||||
    private int maxOccurrences;
 | 
			
		||||
    private ArrayList<MetaNode> children;
 | 
			
		||||
    
 | 
			
		||||
    public MetaElement(String doc, String name, int minOccurrences,
 | 
			
		||||
            int maxOccurrences, ArrayList<MetaNode> children, String version,
 | 
			
		||||
            String dimension) {
 | 
			
		||||
        super(doc, version, dimension);
 | 
			
		||||
        this.name = name;
 | 
			
		||||
        this.minOccurrences = minOccurrences;
 | 
			
		||||
        this.maxOccurrences = maxOccurrences;
 | 
			
		||||
        this.children = children;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getMaxOccurrences() {
 | 
			
		||||
        return this.maxOccurrences;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getMinOccurrences() {
 | 
			
		||||
        return this.minOccurrences;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getName() {
 | 
			
		||||
        return this.name;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public boolean addChild(MetaNode child){
 | 
			
		||||
        return this.children.add(child);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean removeChild(MetaNode child){
 | 
			
		||||
        return this.children.remove(child);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public MetaNode[] getChildren(){
 | 
			
		||||
        return this.children.toArray(new MetaNode[this.children.size()]);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals(Object object){
 | 
			
		||||
        boolean result;
 | 
			
		||||
        MetaElement me;
 | 
			
		||||
        
 | 
			
		||||
        if(object instanceof MetaElement){
 | 
			
		||||
            me = (MetaElement)object;
 | 
			
		||||
            
 | 
			
		||||
            if(this.name.equals(me.getName())){
 | 
			
		||||
                MetaNode[] meChildren = me.getChildren();
 | 
			
		||||
                MetaNode[] children = this.getChildren();
 | 
			
		||||
                
 | 
			
		||||
                if(this.maxOccurrences != me.getMaxOccurrences()){
 | 
			
		||||
                    result = false;
 | 
			
		||||
                } else if(this.minOccurrences != me.getMinOccurrences()){
 | 
			
		||||
                    result = false;
 | 
			
		||||
                } else if(meChildren.length != children.length){
 | 
			
		||||
                    result = false;
 | 
			
		||||
                } else {
 | 
			
		||||
                    result = true;
 | 
			
		||||
                    
 | 
			
		||||
                    for(int i=0; i<children.length && result; i++){
 | 
			
		||||
                        if(!(meChildren[i].equals(children[i]))){
 | 
			
		||||
                            result = false;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                result = false;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode() {
 | 
			
		||||
        int var_gen_code;
 | 
			
		||||
        int hash = 13;
 | 
			
		||||
        var_gen_code = minOccurrences;
 | 
			
		||||
        var_gen_code += maxOccurrences;
 | 
			
		||||
        var_gen_code += (null == children ? 0 : children.hashCode());
 | 
			
		||||
        var_gen_code += (null == name ? 0 : name.hashCode());
 | 
			
		||||
        hash = 31 * hash + var_gen_code;
 | 
			
		||||
        return hash;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString(){
 | 
			
		||||
        StringBuffer buf = new StringBuffer();
 | 
			
		||||
        buf.append("\nElement\n");
 | 
			
		||||
        buf.append("-Name: " + this.name + "\n");
 | 
			
		||||
        buf.append("-Version: " + this.version + "\n");
 | 
			
		||||
        buf.append("-MinOcccurrences: " + this.minOccurrences + "\n");
 | 
			
		||||
        buf.append("-MaxOcccurrences: " + this.maxOccurrences + "\n");
 | 
			
		||||
        if(this.children.size() > 0){
 | 
			
		||||
            buf.append("-Children: ");
 | 
			
		||||
            for(MetaNode child: children){
 | 
			
		||||
                buf.append(child.toString().replaceAll("\n", "\n\t"));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return buf.toString();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public boolean hasElementChildren(){
 | 
			
		||||
        for(MetaNode mn: this.getChildren()){
 | 
			
		||||
            if(mn instanceof MetaElement){
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public boolean hasValueChildren(){
 | 
			
		||||
        for(MetaNode mn: this.getChildren()){
 | 
			
		||||
            if(mn instanceof MetaValue){
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
public class MetaException extends Exception {
 | 
			
		||||
    private static final long serialVersionUID = 4459748108068852410L;
 | 
			
		||||
    private MetaExceptionType type;
 | 
			
		||||
    
 | 
			
		||||
    public MetaException(String message, MetaExceptionType type) {
 | 
			
		||||
        super(message);
 | 
			
		||||
        this.type = type;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public MetaException(String message) {
 | 
			
		||||
        super(message);
 | 
			
		||||
        this.type = MetaExceptionType.META_ERROR;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public MetaExceptionType getType() {
 | 
			
		||||
        return this.type;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
public enum MetaExceptionType {
 | 
			
		||||
    META_ERROR, META_UNSUPPORTED, META_CONFIG_PARSE_ERROR
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,40 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
public abstract class MetaNode {
 | 
			
		||||
    String doc;
 | 
			
		||||
    String version;
 | 
			
		||||
    String dimension;
 | 
			
		||||
    
 | 
			
		||||
    public MetaNode(String doc, String version, String dimension) {
 | 
			
		||||
        this.doc = doc;
 | 
			
		||||
        this.version = version;
 | 
			
		||||
        this.dimension = dimension;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getDoc() {
 | 
			
		||||
        return doc;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setDoc(String doc) {
 | 
			
		||||
        this.doc = doc;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public String getVersion() {
 | 
			
		||||
        return this.version;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getDimension() {
 | 
			
		||||
        return this.dimension;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,67 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.ConfigModeIntializer;
 | 
			
		||||
 | 
			
		||||
public abstract class MetaValue extends MetaNode {
 | 
			
		||||
    Object defaultValue;
 | 
			
		||||
    
 | 
			
		||||
    public MetaValue(String doc, Object defaultValue, String dimension) {
 | 
			
		||||
        super(doc, ConfigModeIntializer.COMMUNITY, dimension);
 | 
			
		||||
        this.defaultValue = defaultValue;
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Object getDefaultValue() {
 | 
			
		||||
        return this.defaultValue;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public abstract boolean setDefaultValue(Object defaultValue); 
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString(){
 | 
			
		||||
        return "Value (" + defaultValue.getClass().toString().substring(defaultValue.getClass().toString().lastIndexOf('.') + 1) + ") DefaultValue: " + defaultValue.toString();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals(Object object){
 | 
			
		||||
        boolean result;
 | 
			
		||||
        MetaValue mv;
 | 
			
		||||
        
 | 
			
		||||
        if(object instanceof MetaValue){
 | 
			
		||||
            mv = (MetaValue)object;
 | 
			
		||||
            if((this.defaultValue == null) || (mv.getDefaultValue() == null)){
 | 
			
		||||
                if(this.defaultValue != mv.getDefaultValue()){
 | 
			
		||||
                    result = false;
 | 
			
		||||
                } else {
 | 
			
		||||
                    result = true;
 | 
			
		||||
                }
 | 
			
		||||
            } else if(this.defaultValue.equals(mv.getDefaultValue())){
 | 
			
		||||
                result = true;
 | 
			
		||||
            } else {
 | 
			
		||||
                result = false;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode() {
 | 
			
		||||
        int var_gen_code;
 | 
			
		||||
        int hash = 13;
 | 
			
		||||
        var_gen_code = (null == defaultValue ? 0 : defaultValue.hashCode());
 | 
			
		||||
        hash = 31 * hash + var_gen_code;
 | 
			
		||||
        return hash;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
public class MetaValueBoolean extends MetaValue {
 | 
			
		||||
 | 
			
		||||
    public MetaValueBoolean(String doc, Boolean defaultValue, String dimension) {
 | 
			
		||||
        super(doc, defaultValue, dimension);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setDefaultValue(Object defaultValue) {
 | 
			
		||||
        boolean result = false;
 | 
			
		||||
        
 | 
			
		||||
        if(defaultValue instanceof Boolean){
 | 
			
		||||
            this.defaultValue = defaultValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,58 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
public class MetaValueDouble extends MetaValueNatural {
 | 
			
		||||
    public MetaValueDouble(String doc, Double defaultValue, Double maxValue,
 | 
			
		||||
            Double minValue, String dimension) {
 | 
			
		||||
        super(doc, defaultValue, maxValue, minValue, dimension);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setMaxValue(Object maxValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(maxValue instanceof Double){
 | 
			
		||||
            this.maxValue = maxValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setMinValue(Object minValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(minValue instanceof Double){
 | 
			
		||||
            this.minValue = minValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setDefaultValue(Object defaultValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(defaultValue instanceof Double){
 | 
			
		||||
            this.defaultValue = defaultValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,96 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
public class MetaValueEnum extends MetaValue {
 | 
			
		||||
    private ArrayList<String> posValues;
 | 
			
		||||
    
 | 
			
		||||
    public MetaValueEnum(String doc, String defaultValue,
 | 
			
		||||
            ArrayList<String> posValues, String dimension) {
 | 
			
		||||
        super(doc, defaultValue, dimension);
 | 
			
		||||
        assert(defaultValue != null);
 | 
			
		||||
        
 | 
			
		||||
        this.posValues = new ArrayList<String>();
 | 
			
		||||
        
 | 
			
		||||
        if(posValues != null){
 | 
			
		||||
            this.posValues.addAll(posValues);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        if(!this.posValues.contains(defaultValue)){
 | 
			
		||||
            this.posValues.add(defaultValue);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String[] getPosValues() {
 | 
			
		||||
        return this.posValues.toArray(new String[this.posValues.size()]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean setPosValues(ArrayList<String> posValues) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if((posValues != null) && (posValues.size() > 0)){
 | 
			
		||||
            this.posValues.clear();
 | 
			
		||||
            this.posValues.addAll(posValues);
 | 
			
		||||
            
 | 
			
		||||
            if(!posValues.contains(defaultValue)){
 | 
			
		||||
                this.defaultValue = this.posValues.get(0);
 | 
			
		||||
            }
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public boolean addPosValue(String value){
 | 
			
		||||
        return this.posValues.add(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean removePosValue(String value){
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(!defaultValue.equals(value)){
 | 
			
		||||
            result = this.posValues.remove(value);
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setDefaultValue(Object defaultValue) {
 | 
			
		||||
        boolean result = false;
 | 
			
		||||
        
 | 
			
		||||
        if(defaultValue instanceof String){
 | 
			
		||||
            this.defaultValue = defaultValue;
 | 
			
		||||
            
 | 
			
		||||
            if(!this.posValues.contains(defaultValue)){
 | 
			
		||||
                result = this.addPosValue((String)defaultValue);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode() {
 | 
			
		||||
        int var_gen_code;
 | 
			
		||||
        int hash = 13;
 | 
			
		||||
        var_gen_code = (null == defaultValue ? 0 : defaultValue.hashCode());
 | 
			
		||||
        var_gen_code += (null == posValues ? 0 : posValues.hashCode());
 | 
			
		||||
        hash = 31 * hash + var_gen_code;
 | 
			
		||||
        return hash;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,58 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
public class MetaValueFloat extends MetaValueNatural {
 | 
			
		||||
    public MetaValueFloat(String doc, Float defaultValue, Float maxValue,
 | 
			
		||||
            Float minValue, String dimension) {
 | 
			
		||||
        super(doc, defaultValue, maxValue, minValue, dimension);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setMaxValue(Object maxValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(maxValue instanceof Float){
 | 
			
		||||
            this.maxValue = maxValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setMinValue(Object minValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(minValue instanceof Float){
 | 
			
		||||
            this.minValue = minValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setDefaultValue(Object defaultValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(defaultValue instanceof Float){
 | 
			
		||||
            this.defaultValue = defaultValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,59 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
public class MetaValueInt extends MetaValueNatural {
 | 
			
		||||
 | 
			
		||||
    public MetaValueInt(String doc, Integer defaultValue, Integer maxValue,
 | 
			
		||||
            Integer minValue, String dimension) {
 | 
			
		||||
        super(doc, defaultValue, maxValue, minValue, dimension);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setMaxValue(Object maxValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(maxValue instanceof Integer){
 | 
			
		||||
            this.maxValue = maxValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setMinValue(Object minValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(minValue instanceof Integer){
 | 
			
		||||
            this.minValue = minValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setDefaultValue(Object defaultValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(defaultValue instanceof Integer){
 | 
			
		||||
            this.defaultValue = defaultValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,58 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
public class MetaValueLong extends MetaValueNatural {
 | 
			
		||||
    public MetaValueLong(String doc, Long defaultValue, Long maxValue,
 | 
			
		||||
            Long minValue, String dimension) {
 | 
			
		||||
        super(doc, defaultValue, maxValue, minValue, dimension);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setMaxValue(Object maxValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(maxValue instanceof Long){
 | 
			
		||||
            this.maxValue = maxValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setMinValue(Object minValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(minValue instanceof Long){
 | 
			
		||||
            this.minValue = minValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setDefaultValue(Object defaultValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
        
 | 
			
		||||
        if(defaultValue instanceof Long){
 | 
			
		||||
            this.defaultValue = defaultValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,92 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
public abstract class MetaValueNatural extends MetaValue {
 | 
			
		||||
    Object maxValue;
 | 
			
		||||
    Object minValue;
 | 
			
		||||
    
 | 
			
		||||
    public MetaValueNatural(String doc, Object defaultValue, Object maxValue,
 | 
			
		||||
            Object minValue, String dimension) {
 | 
			
		||||
        super(doc, defaultValue, dimension);
 | 
			
		||||
        this.minValue = minValue;
 | 
			
		||||
        this.maxValue = maxValue;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Object getMaxValue() {
 | 
			
		||||
        return this.maxValue;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Object getMinValue() {
 | 
			
		||||
        return this.minValue;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals(Object object){
 | 
			
		||||
        MetaValueNatural mn;
 | 
			
		||||
        boolean result = super.equals(object);
 | 
			
		||||
        
 | 
			
		||||
        if(result){
 | 
			
		||||
            if(object instanceof MetaValueNatural){
 | 
			
		||||
                mn = (MetaValueNatural)object;
 | 
			
		||||
                
 | 
			
		||||
                if((mn.getMaxValue() == null) && (this.maxValue != null)){
 | 
			
		||||
                    result = false;
 | 
			
		||||
                } else if((mn.getMaxValue() != null) && (this.maxValue == null)){
 | 
			
		||||
                    result = false;
 | 
			
		||||
                } else if( ((mn.getMaxValue() == null) && (this.maxValue == null)) ||
 | 
			
		||||
                           ((mn.getMaxValue().equals(this.maxValue))))
 | 
			
		||||
                {
 | 
			
		||||
                    if((mn.getMinValue() == null) && (this.minValue != null)){
 | 
			
		||||
                        result = false;
 | 
			
		||||
                    } else if((mn.getMinValue() != null) && (this.minValue == null)){
 | 
			
		||||
                        result = false;
 | 
			
		||||
                    } else if( ((mn.getMinValue() == null) && (this.minValue == null)) ||
 | 
			
		||||
                               ((mn.getMinValue().equals(this.minValue))))
 | 
			
		||||
                    {
 | 
			
		||||
                        result = true;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        result = false;
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    result = false;
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                result = false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode() {
 | 
			
		||||
        int var_gen_code;
 | 
			
		||||
        int hash = 13;
 | 
			
		||||
        var_gen_code = (null == maxValue ? 0 : maxValue.hashCode());
 | 
			
		||||
        var_gen_code += (null == minValue ? 0 : minValue.hashCode());
 | 
			
		||||
        hash = 31 * hash + var_gen_code;
 | 
			
		||||
        return hash;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public abstract boolean setMaxValue(Object maxValue);
 | 
			
		||||
    
 | 
			
		||||
    public abstract boolean setMinValue(Object minValue);
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString(){
 | 
			
		||||
        String result = super.toString();
 | 
			
		||||
        
 | 
			
		||||
        result += ", MaxValue: " + maxValue.toString() + ", MinValue: " + minValue.toString();
 | 
			
		||||
        
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,58 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
public class MetaValueSize extends MetaValueNatural {
 | 
			
		||||
    public MetaValueSize(String doc, Long defaultValue, Long maxValue,
 | 
			
		||||
            Long minValue, String dimension) {
 | 
			
		||||
        super(doc, defaultValue, maxValue, minValue, dimension);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setMaxValue(Object maxValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
 | 
			
		||||
        if(maxValue instanceof Long){
 | 
			
		||||
            this.maxValue = maxValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setMinValue(Object minValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
 | 
			
		||||
        if(minValue instanceof Long){
 | 
			
		||||
            this.minValue = minValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setDefaultValue(Object defaultValue) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
 | 
			
		||||
        if(defaultValue instanceof Long){
 | 
			
		||||
            this.defaultValue = defaultValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,50 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.meta;
 | 
			
		||||
 | 
			
		||||
public class MetaValueString extends MetaValue {
 | 
			
		||||
    private int maxLength;
 | 
			
		||||
    
 | 
			
		||||
    public MetaValueString(String doc, String defaultValue, int maxLength,
 | 
			
		||||
            String dimension) {
 | 
			
		||||
        super(doc, defaultValue, dimension);
 | 
			
		||||
        this.maxLength = maxLength;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getMaxLength() {
 | 
			
		||||
        return this.maxLength;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setMaxLength(int maxLength) {
 | 
			
		||||
        this.maxLength = maxLength;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setDefaultValue(Object defaultValue) {
 | 
			
		||||
        boolean result = false;
 | 
			
		||||
        
 | 
			
		||||
        if(defaultValue instanceof String){
 | 
			
		||||
            this.defaultValue = defaultValue;
 | 
			
		||||
            result = true;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode() {
 | 
			
		||||
        int var_gen_code;
 | 
			
		||||
        int hash = 13;
 | 
			
		||||
        var_gen_code = (null == defaultValue ? 0 : defaultValue.hashCode());
 | 
			
		||||
        var_gen_code += maxLength;
 | 
			
		||||
        hash = 31 * hash + var_gen_code;
 | 
			
		||||
        return hash;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,83 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.awt.datatransfer.DataFlavor;
 | 
			
		||||
import java.awt.datatransfer.Transferable;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.net.URI;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JComponent;
 | 
			
		||||
import javax.swing.TransferHandler;
 | 
			
		||||
 | 
			
		||||
@SuppressWarnings("serial")
 | 
			
		||||
public class ConfigTransferHandler extends TransferHandler {
 | 
			
		||||
    private final ConfigWindow view;
 | 
			
		||||
    
 | 
			
		||||
    public ConfigTransferHandler(ConfigWindow view){
 | 
			
		||||
        this.view = view;
 | 
			
		||||
    }
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
 | 
			
		||||
        for(DataFlavor flavor: transferFlavors){
 | 
			
		||||
            if(flavor.equals(DataFlavor.javaFileListFlavor)){
 | 
			
		||||
                view.setStatus("Drag here to open " + 
 | 
			
		||||
                        flavor.getHumanPresentableName() + " file.", false);
 | 
			
		||||
                return true;
 | 
			
		||||
            } else if(flavor.equals(DataFlavor.stringFlavor)){
 | 
			
		||||
                view.setStatus("Drag here to open " + 
 | 
			
		||||
                        flavor.getHumanPresentableName() + " file.", false);
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        view.setStatus("Warning: Unsupported type.", false);
 | 
			
		||||
        
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean importData(JComponent comp, Transferable t) {
 | 
			
		||||
        if (!canImport(comp, t.getTransferDataFlavors())) {
 | 
			
		||||
            view.setStatus("Warning: Unsupported type", false);
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        try{
 | 
			
		||||
            if(t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)){
 | 
			
		||||
                @SuppressWarnings("unchecked")
 | 
			
		||||
                List<File> files = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
 | 
			
		||||
                
 | 
			
		||||
                if(files.size() == 1){
 | 
			
		||||
                    File file = files.get(0);
 | 
			
		||||
                    view.getController().handleOpen(file);
 | 
			
		||||
                } else {
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            } else if(t.isDataFlavorSupported(DataFlavor.stringFlavor)){
 | 
			
		||||
                String str = (String) t.getTransferData(DataFlavor.stringFlavor);
 | 
			
		||||
                
 | 
			
		||||
                if(str.startsWith("file:/")){
 | 
			
		||||
                    File f = new File(new URI(str));
 | 
			
		||||
                    view.getController().handleOpen(f);
 | 
			
		||||
                } else {
 | 
			
		||||
                    view.setStatus("Warning: Unsupported file.", false);
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                view.setStatus("Warning: Unsupported drag-and-drop type", false);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            view.setStatus("Warning: " + e.getMessage(), false);
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,96 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataAttribute;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataNode;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaAttribute;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaNode;
 | 
			
		||||
 | 
			
		||||
public class ConfigUtil {
 | 
			
		||||
    public static String getExtendedDataElementString(DataElement element){
 | 
			
		||||
        String firstAttrChild;
 | 
			
		||||
        DataNode[] children;
 | 
			
		||||
        String name;
 | 
			
		||||
        String result = null;
 | 
			
		||||
        
 | 
			
		||||
        if(element != null){
 | 
			
		||||
            children = element.getChildren();
 | 
			
		||||
            firstAttrChild = null;
 | 
			
		||||
            
 | 
			
		||||
            for(int j=0; (j<children.length) && (firstAttrChild == null); j++){
 | 
			
		||||
                if(children[j] instanceof DataAttribute){
 | 
			
		||||
                    name = ((MetaAttribute)children[j].getMetadata()).getName();
 | 
			
		||||
                    
 | 
			
		||||
                    if("name".equalsIgnoreCase(name)){
 | 
			
		||||
                        firstAttrChild = "[" + ((MetaAttribute)children[j].getMetadata()).getName() + "=";
 | 
			
		||||
                        firstAttrChild += ((DataAttribute)children[j]).getValue() + "]";
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            for(int j=0; (j<children.length) && (firstAttrChild == null); j++){
 | 
			
		||||
                if(children[j] instanceof DataAttribute){
 | 
			
		||||
                    firstAttrChild = "[" + ((MetaAttribute)children[j].getMetadata()).getName() + "=";
 | 
			
		||||
                    firstAttrChild += ((DataAttribute)children[j]).getValue() + "]";
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if(firstAttrChild == null){
 | 
			
		||||
                firstAttrChild = "";
 | 
			
		||||
            }
 | 
			
		||||
            result = ((MetaElement)element.getMetadata()).getName() + firstAttrChild; 
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public static String getDataElementString(DataElement element){
 | 
			
		||||
        String result = null;
 | 
			
		||||
        
 | 
			
		||||
        if(element != null){
 | 
			
		||||
            result = ((MetaElement)element.getMetadata()).getName();
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public static String getExtendedMetaElementString(MetaElement element){
 | 
			
		||||
        String firstAttrChild;
 | 
			
		||||
        MetaNode[] children;
 | 
			
		||||
        String result = null;
 | 
			
		||||
        
 | 
			
		||||
        if(element != null){
 | 
			
		||||
            children = element.getChildren();
 | 
			
		||||
            firstAttrChild = null;
 | 
			
		||||
            
 | 
			
		||||
            for(int j=0; (j<children.length) && (firstAttrChild == null); j++){
 | 
			
		||||
                if(children[j] instanceof MetaAttribute){
 | 
			
		||||
                    firstAttrChild = "[" + ((MetaAttribute)children[j]).getName() + "]";
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if(firstAttrChild == null){
 | 
			
		||||
                firstAttrChild = "";
 | 
			
		||||
            }
 | 
			
		||||
            result = element.getName() + firstAttrChild; 
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public static String getMetaElementString(MetaElement element){
 | 
			
		||||
        String result = null;
 | 
			
		||||
        
 | 
			
		||||
        if(element != null){
 | 
			
		||||
            result = element.getName();
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,667 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.awt.BorderLayout;
 | 
			
		||||
import java.awt.Cursor;
 | 
			
		||||
import java.awt.Event;
 | 
			
		||||
import java.awt.Image;
 | 
			
		||||
import java.awt.Toolkit;
 | 
			
		||||
import java.awt.event.ActionEvent;
 | 
			
		||||
import java.awt.event.KeyEvent;
 | 
			
		||||
import java.awt.event.WindowAdapter;
 | 
			
		||||
import java.awt.event.WindowEvent;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.net.URL;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JFrame;
 | 
			
		||||
import javax.swing.JMenu;
 | 
			
		||||
import javax.swing.JMenuBar;
 | 
			
		||||
import javax.swing.JMenuItem;
 | 
			
		||||
import javax.swing.JPanel;
 | 
			
		||||
import javax.swing.JTabbedPane;
 | 
			
		||||
import javax.swing.KeyStroke;
 | 
			
		||||
import javax.swing.SwingUtilities;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.ConfigModeIntializer;
 | 
			
		||||
import org.eclipse.cyclonedds.common.view.MainWindow;
 | 
			
		||||
import org.eclipse.cyclonedds.common.view.StatusPanel;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataConfiguration;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataConfigurationListener;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataNode;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataValue;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaNode;
 | 
			
		||||
 | 
			
		||||
public class ConfigWindow extends MainWindow implements DataConfigurationListener {
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
    private JPanel jContentPane = null;
 | 
			
		||||
    private ConfigWindowController controller = null;
 | 
			
		||||
    private JMenuBar configMenuBar = null;
 | 
			
		||||
    private JTabbedPane mainTabbedPane = null;
 | 
			
		||||
    private JMenu fileMenu = null;
 | 
			
		||||
    private JMenu editMenu = null;
 | 
			
		||||
    private JMenu addServiceMenu = null;
 | 
			
		||||
    private JMenu removeServiceMenu = null;
 | 
			
		||||
    private JMenuItem newItem = null;
 | 
			
		||||
    private JMenuItem openItem = null;
 | 
			
		||||
    private JMenuItem saveItem = null;
 | 
			
		||||
    private JMenuItem closeItem = null;
 | 
			
		||||
    private JMenuItem saveAsItem = null;
 | 
			
		||||
    private JMenuItem exitItem = null;
 | 
			
		||||
    private JMenuItem printItem = null;
 | 
			
		||||
    private JMenu helpMenu = null;
 | 
			
		||||
    private JMenuItem helpContentsItem = null;
 | 
			
		||||
    private DataConfiguration config = null;
 | 
			
		||||
    private List<Image> appLogos = null;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private DataNodePopup popupSupport = null;
 | 
			
		||||
    private ConfigTransferHandler transferHandler = null;
 | 
			
		||||
 | 
			
		||||
    private String windowTitle = "Configurator";
 | 
			
		||||
    public static final String    OSPL_WINDOW_TITLE      = "Vortex OpenSplice Configurator";
 | 
			
		||||
    public static final String    LITE_WINDOW_TITLE      = "Vortex DDS Configurator";
 | 
			
		||||
 | 
			
		||||
    public static final String    OSPL_SERVICE_LABEL = "Service";
 | 
			
		||||
    public static final String    LITE_SERVICE_LABEL = "Component";
 | 
			
		||||
 | 
			
		||||
    public static String    SERVICE_LABEL;
 | 
			
		||||
    public static String    SERVICE_TEXT;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This is the default constructor
 | 
			
		||||
     */
 | 
			
		||||
    public ConfigWindow() {
 | 
			
		||||
        super();
 | 
			
		||||
        initialize();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ConfigWindow(String uri) {
 | 
			
		||||
        super();
 | 
			
		||||
        initialize();
 | 
			
		||||
        controller.handleOpenFromUri(uri);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public DataConfiguration getConfig() {
 | 
			
		||||
        return config;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setDataConfiguration(DataConfiguration config){
 | 
			
		||||
        DataElement[] services;
 | 
			
		||||
        
 | 
			
		||||
        if(this.config != null){
 | 
			
		||||
            this.config.removeDataConfigurationListener(this);
 | 
			
		||||
            int count = mainTabbedPane.getComponentCount();
 | 
			
		||||
            
 | 
			
		||||
            for(int i=0; i < count; i++){
 | 
			
		||||
                mainTabbedPane.remove(0);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this.config = config;
 | 
			
		||||
        
 | 
			
		||||
        if(this.config != null){
 | 
			
		||||
            this.config.addDataConfigurationListener(this);
 | 
			
		||||
            services  = config.getServices();
 | 
			
		||||
            
 | 
			
		||||
            for(int i=0; i < services.length; i++){
 | 
			
		||||
                ServicePanel servicePanel = new ServicePanel(services[i], this.statusPanel);
 | 
			
		||||
                servicePanel.setTransferHandler(transferHandler);
 | 
			
		||||
                mainTabbedPane.addTab(
 | 
			
		||||
                        ConfigUtil.getExtendedDataElementString(services[i]), 
 | 
			
		||||
                        servicePanel);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this.updateMenus();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public void nodeAdded(DataElement parent, DataNode nodeAdded) {
 | 
			
		||||
        this.updateMenus();
 | 
			
		||||
        
 | 
			
		||||
        if(parent.equals(this.config.getRootElement())){
 | 
			
		||||
            if(nodeAdded instanceof DataElement){
 | 
			
		||||
                final DataElement service = (DataElement)nodeAdded;
 | 
			
		||||
                
 | 
			
		||||
                Runnable worker = new Runnable(){
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void run(){
 | 
			
		||||
                        ServicePanel servicePanel = new ServicePanel(service, statusPanel);
 | 
			
		||||
                        servicePanel.setTransferHandler(transferHandler);
 | 
			
		||||
                        mainTabbedPane.addTab(
 | 
			
		||||
                                ConfigUtil.getExtendedDataElementString(service), 
 | 
			
		||||
                                servicePanel);
 | 
			
		||||
                    }
 | 
			
		||||
                };
 | 
			
		||||
                SwingUtilities.invokeLater(worker);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void nodeRemoved(DataElement parent, DataNode nodeRemoved) {
 | 
			
		||||
        this.updateMenus();
 | 
			
		||||
        
 | 
			
		||||
        if(parent.equals(this.config.getRootElement())){
 | 
			
		||||
            if(nodeRemoved instanceof DataElement){
 | 
			
		||||
                final DataElement service = (DataElement)nodeRemoved;
 | 
			
		||||
                
 | 
			
		||||
                Runnable worker = new Runnable(){
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void run(){
 | 
			
		||||
                        ServicePanel servicePanel;
 | 
			
		||||
                        boolean found = false;
 | 
			
		||||
                        
 | 
			
		||||
                        for(int i=0; (i<mainTabbedPane.getTabCount()) && (!found); i++){
 | 
			
		||||
                            servicePanel = (ServicePanel)mainTabbedPane.getComponentAt(i);
 | 
			
		||||
                            
 | 
			
		||||
                            if(servicePanel.getService().equals(service)){
 | 
			
		||||
                                mainTabbedPane.removeTabAt(i);
 | 
			
		||||
                                found = true;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                };
 | 
			
		||||
                SwingUtilities.invokeLater(worker);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void valueChanged(DataValue data, Object oldValue, Object newValue) {
 | 
			
		||||
        ServicePanel servicePanel;
 | 
			
		||||
        
 | 
			
		||||
        for(int i=0; i<this.mainTabbedPane.getTabCount(); i++){
 | 
			
		||||
            servicePanel = (ServicePanel)this.mainTabbedPane.getComponentAt(i);
 | 
			
		||||
            this.mainTabbedPane.setTitleAt(i, 
 | 
			
		||||
                    ConfigUtil.getExtendedDataElementString(
 | 
			
		||||
                            servicePanel.getService()));
 | 
			
		||||
        }
 | 
			
		||||
        this.updateMenus();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public DataConfiguration getDataConfiguration(){
 | 
			
		||||
        return this.config;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public void disableView(){
 | 
			
		||||
        ServicePanel sp;
 | 
			
		||||
        
 | 
			
		||||
        this.setEnabled(false);
 | 
			
		||||
        this.setFocusable(false);
 | 
			
		||||
        
 | 
			
		||||
        for(int i=0; i<this.mainTabbedPane.getComponentCount(); i++){
 | 
			
		||||
            sp = (ServicePanel)this.mainTabbedPane.getComponentAt(i);
 | 
			
		||||
            sp.getConfigurationTable().getEditor().stopCellEditing();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setActionsEnabled(boolean enabled){
 | 
			
		||||
        ServicePanel sp;
 | 
			
		||||
        if(enabled){
 | 
			
		||||
            this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 | 
			
		||||
        } else {
 | 
			
		||||
            this.setCursor(new Cursor(Cursor.WAIT_CURSOR));
 | 
			
		||||
        }
 | 
			
		||||
        for(int i=0; i<this.mainTabbedPane.getComponentCount(); i++){
 | 
			
		||||
            sp = (ServicePanel)this.mainTabbedPane.getComponentAt(i);
 | 
			
		||||
            sp.setEnabled(enabled);
 | 
			
		||||
        }
 | 
			
		||||
        this.updateMenus();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Enables the view component.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enableView(){
 | 
			
		||||
        this.setFocusable(true);
 | 
			
		||||
        this.setEnabled(true);
 | 
			
		||||
        this.toFront();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public ConfigWindowController getController(){
 | 
			
		||||
        return this.controller;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setWindowTitle (int configMode) {
 | 
			
		||||
        if (configMode == ConfigModeIntializer.LITE_MODE) {
 | 
			
		||||
            this.windowTitle = LITE_WINDOW_TITLE;
 | 
			
		||||
        } else {
 | 
			
		||||
            this.windowTitle = OSPL_WINDOW_TITLE;
 | 
			
		||||
        }
 | 
			
		||||
        super.setTitle(this.windowTitle);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void updateMenus(){
 | 
			
		||||
        this.getAddServiceMenu().removeAll();
 | 
			
		||||
        this.getRemoveServiceMenu().removeAll();
 | 
			
		||||
        
 | 
			
		||||
        if(this.config != null){
 | 
			
		||||
            if(this.config.isUpToDate()){
 | 
			
		||||
                this.getSaveItem().setEnabled(false);
 | 
			
		||||
            } else {
 | 
			
		||||
                this.getSaveItem().setEnabled(true);
 | 
			
		||||
            }
 | 
			
		||||
            this.getSaveAsItem().setEnabled(true);
 | 
			
		||||
            this.getPrintItem().setEnabled(true);
 | 
			
		||||
            this.getCloseItem().setEnabled(true);
 | 
			
		||||
            this.getAddServiceMenu().setEnabled(true);
 | 
			
		||||
            this.getRemoveServiceMenu().setEnabled(true);
 | 
			
		||||
            
 | 
			
		||||
            MetaNode[] mn = ((MetaElement)config.getRootElement().getMetadata()).getChildren();
 | 
			
		||||
            
 | 
			
		||||
            for(MetaNode m: mn){
 | 
			
		||||
                if(m instanceof MetaElement){
 | 
			
		||||
                    this.getAddServiceMenu().add(this.getAddServiceItem((MetaElement)m));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            for(DataElement e: config.getServices()){
 | 
			
		||||
                this.getRemoveServiceMenu().add(this.getRemoveServiceItem(e));
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            this.getSaveItem().setEnabled(false);
 | 
			
		||||
            this.getSaveAsItem().setEnabled(false);
 | 
			
		||||
            this.getPrintItem().setEnabled(false);
 | 
			
		||||
            this.getCloseItem().setEnabled(false);
 | 
			
		||||
            this.getAddServiceMenu().setEnabled(false);
 | 
			
		||||
            this.getRemoveServiceMenu().setEnabled(false);
 | 
			
		||||
        }
 | 
			
		||||
        this.updateTitle();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private void updateTitle(){
 | 
			
		||||
        File f;
 | 
			
		||||
        String title;
 | 
			
		||||
        if(this.config != null){
 | 
			
		||||
            f = config.getFile();
 | 
			
		||||
            
 | 
			
		||||
            if(f != null){
 | 
			
		||||
                title = this.windowTitle + " | " + f.getAbsolutePath();
 | 
			
		||||
            } else {
 | 
			
		||||
                title = this.windowTitle + " | <NoName>";
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            title = this.windowTitle;
 | 
			
		||||
        }
 | 
			
		||||
        this.setTitle(title);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private DataNodeMenuItem getAddServiceItem(MetaElement service){
 | 
			
		||||
        int curOcc = 0;
 | 
			
		||||
        DataNodeMenuItem item = new DataNodeMenuItem(
 | 
			
		||||
                                        service.getName(),
 | 
			
		||||
                                        this.config.getRootElement(), service);
 | 
			
		||||
        
 | 
			
		||||
        for(DataElement s: config.getServices()){
 | 
			
		||||
            if(s.getMetadata().equals(service)){
 | 
			
		||||
                curOcc++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if(curOcc < service.getMaxOccurrences()){
 | 
			
		||||
            item.setEnabled(true);
 | 
			
		||||
        } else {
 | 
			
		||||
            item.setEnabled(false);
 | 
			
		||||
        }
 | 
			
		||||
        item.setActionCommand("addService");
 | 
			
		||||
        item.addActionListener(this.popupSupport);
 | 
			
		||||
        return item;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private DataNodeMenuItem getRemoveServiceItem(DataElement service){
 | 
			
		||||
        int curOcc = 0;
 | 
			
		||||
        MetaElement metaService = (MetaElement)service.getMetadata();
 | 
			
		||||
        DataNodeMenuItem item = new DataNodeMenuItem(
 | 
			
		||||
                            ConfigUtil.getExtendedDataElementString(service),
 | 
			
		||||
                            service, null);
 | 
			
		||||
        
 | 
			
		||||
        for(DataElement s: config.getServices()){
 | 
			
		||||
            if(s.getMetadata().equals(metaService)){
 | 
			
		||||
                curOcc++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if(curOcc > metaService.getMinOccurrences()){
 | 
			
		||||
            item.setEnabled(true);
 | 
			
		||||
        } else {
 | 
			
		||||
            item.setEnabled(false);
 | 
			
		||||
        }
 | 
			
		||||
        item.setActionCommand("removeService");
 | 
			
		||||
        item.addActionListener(this.popupSupport); 
 | 
			
		||||
        return item;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes this
 | 
			
		||||
     * 
 | 
			
		||||
     * @return void
 | 
			
		||||
     */
 | 
			
		||||
    private void initialize() {
 | 
			
		||||
        this.setSize(800, 600);
 | 
			
		||||
        this.controller = new ConfigWindowController(this);
 | 
			
		||||
        // setServiceLabel relies on the
 | 
			
		||||
        // ConfigModeIntializer.CONFIGURATOR_MODE variable which
 | 
			
		||||
        // has been set during construction of ConfigWndowController
 | 
			
		||||
        this.setServiceLabel();
 | 
			
		||||
        this.popupSupport = new DataNodePopup();
 | 
			
		||||
        this.transferHandler = new ConfigTransferHandler(this);
 | 
			
		||||
        this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
 | 
			
		||||
        this.setJMenuBar(getConfigMenuBar());
 | 
			
		||||
        this.setLocationRelativeTo(this.getParent());
 | 
			
		||||
        this.setContentPane(getJContentPane());
 | 
			
		||||
        
 | 
			
		||||
        this.addWindowListener(new WindowAdapter() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void windowClosing(WindowEvent e) {
 | 
			
		||||
                controller.actionPerformed(
 | 
			
		||||
                    new ActionEvent(exitItem, 0, "exit"));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        this.updateMenus();
 | 
			
		||||
        this.setAppLogo();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set the proper service label to be used throughout the configurator UI.
 | 
			
		||||
     * Ospl uses the label "Service" while Lite uses the label "Component"
 | 
			
		||||
     * (since the concept of service does not really exist)
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    private void setServiceLabel(){
 | 
			
		||||
        if (ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.LITE_MODE){
 | 
			
		||||
            SERVICE_LABEL = OSPL_SERVICE_LABEL;
 | 
			
		||||
            SERVICE_TEXT = OSPL_SERVICE_LABEL.toLowerCase();
 | 
			
		||||
        } else {
 | 
			
		||||
            SERVICE_LABEL = LITE_SERVICE_LABEL;
 | 
			
		||||
            SERVICE_TEXT = LITE_SERVICE_LABEL.toLowerCase();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes jContentPane
 | 
			
		||||
     * 
 | 
			
		||||
     * @return javax.swing.JPanel
 | 
			
		||||
     */
 | 
			
		||||
    private JPanel getJContentPane() {
 | 
			
		||||
        if (jContentPane == null) {
 | 
			
		||||
            jContentPane = new JPanel();
 | 
			
		||||
            jContentPane.setLayout(new BorderLayout());
 | 
			
		||||
            jContentPane.add(getMainTabbedPane(), BorderLayout.CENTER);
 | 
			
		||||
            jContentPane.add(getStatusPanel(), BorderLayout.SOUTH);
 | 
			
		||||
        }
 | 
			
		||||
        return jContentPane;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes statusPanel.  
 | 
			
		||||
     *  
 | 
			
		||||
     * @return The status panel of the window.
 | 
			
		||||
     */    
 | 
			
		||||
    @Override
 | 
			
		||||
    protected StatusPanel getStatusPanel() {
 | 
			
		||||
        if (statusPanel == null) {
 | 
			
		||||
            statusPanel = new StatusPanel(300, "Ready", false, true);
 | 
			
		||||
        }
 | 
			
		||||
        return statusPanel;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes configMenuBar	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JMenuBar	
 | 
			
		||||
     */
 | 
			
		||||
    private JMenuBar getConfigMenuBar() {
 | 
			
		||||
        if (configMenuBar == null) {
 | 
			
		||||
            configMenuBar = new JMenuBar();
 | 
			
		||||
            configMenuBar.add(getFileMenu());
 | 
			
		||||
            configMenuBar.add(getEditMenu());
 | 
			
		||||
            configMenuBar.add(getHelpMenu());
 | 
			
		||||
        }
 | 
			
		||||
        return configMenuBar;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes mainTabbedPane	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JTabbedPane	
 | 
			
		||||
     */
 | 
			
		||||
    private JTabbedPane getMainTabbedPane() {
 | 
			
		||||
        if (mainTabbedPane == null) {
 | 
			
		||||
            mainTabbedPane = new JTabbedPane();
 | 
			
		||||
            mainTabbedPane.setTransferHandler(this.transferHandler);
 | 
			
		||||
        }
 | 
			
		||||
        return mainTabbedPane;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes fileMenu	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JMenu	
 | 
			
		||||
     */
 | 
			
		||||
    private JMenu getFileMenu() {
 | 
			
		||||
        if (fileMenu == null) {
 | 
			
		||||
            fileMenu = new JMenu();
 | 
			
		||||
            fileMenu.setText("File");
 | 
			
		||||
            fileMenu.setMnemonic(KeyEvent.VK_F);
 | 
			
		||||
            fileMenu.add(getNewItem());
 | 
			
		||||
            fileMenu.add(getOpenItem());
 | 
			
		||||
            fileMenu.add(getCloseItem());
 | 
			
		||||
            fileMenu.addSeparator();
 | 
			
		||||
            fileMenu.add(getSaveItem());
 | 
			
		||||
            fileMenu.add(getSaveAsItem());
 | 
			
		||||
            fileMenu.addSeparator();
 | 
			
		||||
            fileMenu.add(getPrintItem());
 | 
			
		||||
            fileMenu.addSeparator();
 | 
			
		||||
            fileMenu.add(getExitItem());
 | 
			
		||||
        }
 | 
			
		||||
        return fileMenu;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private JMenu getEditMenu(){
 | 
			
		||||
        if (editMenu == null){
 | 
			
		||||
            editMenu = new JMenu();
 | 
			
		||||
            editMenu.setText("Edit");
 | 
			
		||||
            editMenu.setMnemonic(KeyEvent.VK_E);
 | 
			
		||||
            editMenu.add(getAddServiceMenu());
 | 
			
		||||
            editMenu.add(getRemoveServiceMenu());
 | 
			
		||||
        }
 | 
			
		||||
        return editMenu;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private JMenu getHelpMenu(){
 | 
			
		||||
        if (helpMenu == null){
 | 
			
		||||
            helpMenu = new JMenu();
 | 
			
		||||
            helpMenu.setText("Help");
 | 
			
		||||
            helpMenu.setMnemonic(KeyEvent.VK_H);
 | 
			
		||||
            helpMenu.add(getHelpContentsItem());
 | 
			
		||||
        }
 | 
			
		||||
        return helpMenu;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private JMenuItem getHelpContentsItem(){
 | 
			
		||||
        if (helpContentsItem == null){
 | 
			
		||||
            helpContentsItem = new JMenuItem();
 | 
			
		||||
            helpContentsItem.setText("Help Contents");
 | 
			
		||||
            helpContentsItem.setMnemonic(KeyEvent.VK_C);
 | 
			
		||||
            helpContentsItem.setActionCommand("help");
 | 
			
		||||
            helpContentsItem.addActionListener(getController());
 | 
			
		||||
            helpContentsItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, Event.CTRL_MASK, false));
 | 
			
		||||
        }
 | 
			
		||||
        return helpContentsItem;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private JMenu getAddServiceMenu(){
 | 
			
		||||
        if (addServiceMenu == null){
 | 
			
		||||
            addServiceMenu = new JMenu();
 | 
			
		||||
            addServiceMenu.setText("Add " + SERVICE_LABEL);
 | 
			
		||||
            addServiceMenu.setMnemonic(KeyEvent.VK_A);
 | 
			
		||||
        }
 | 
			
		||||
        return addServiceMenu;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private JMenu getRemoveServiceMenu(){
 | 
			
		||||
        if (removeServiceMenu == null){
 | 
			
		||||
            removeServiceMenu = new JMenu();
 | 
			
		||||
            removeServiceMenu.setText("Remove " + SERVICE_LABEL);
 | 
			
		||||
            removeServiceMenu.setMnemonic(KeyEvent.VK_R);
 | 
			
		||||
        }
 | 
			
		||||
        return removeServiceMenu;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes newItem	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JMenuItem	
 | 
			
		||||
     */
 | 
			
		||||
    private JMenuItem getNewItem() {
 | 
			
		||||
        if (newItem == null) {
 | 
			
		||||
            newItem = new JMenuItem();
 | 
			
		||||
            newItem.setText("New...");
 | 
			
		||||
            newItem.setMnemonic(KeyEvent.VK_N);
 | 
			
		||||
            newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, Event.CTRL_MASK, false));
 | 
			
		||||
            newItem.setActionCommand("new");
 | 
			
		||||
            newItem.addActionListener(controller);
 | 
			
		||||
        }
 | 
			
		||||
        return newItem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes openItem	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JMenuItem	
 | 
			
		||||
     */
 | 
			
		||||
    private JMenuItem getOpenItem() {
 | 
			
		||||
        if (openItem == null) {
 | 
			
		||||
            openItem = new JMenuItem();
 | 
			
		||||
            openItem.setText("Open...");
 | 
			
		||||
            openItem.setMnemonic(KeyEvent.VK_O);
 | 
			
		||||
            openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Event.CTRL_MASK, false));
 | 
			
		||||
            openItem.setActionCommand("open");
 | 
			
		||||
            openItem.addActionListener(controller);
 | 
			
		||||
        }
 | 
			
		||||
        return openItem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes saveItem	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JMenuItem	
 | 
			
		||||
     */
 | 
			
		||||
    private JMenuItem getSaveItem() {
 | 
			
		||||
        if (saveItem == null) {
 | 
			
		||||
            saveItem = new JMenuItem();
 | 
			
		||||
            saveItem.setText("Save");
 | 
			
		||||
            saveItem.setMnemonic(KeyEvent.VK_S);
 | 
			
		||||
            saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK, false));
 | 
			
		||||
            saveItem.setActionCommand("save");
 | 
			
		||||
            saveItem.addActionListener(controller);
 | 
			
		||||
        }
 | 
			
		||||
        return saveItem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes closeItem	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JMenuItem	
 | 
			
		||||
     */
 | 
			
		||||
    private JMenuItem getCloseItem() {
 | 
			
		||||
        if (closeItem == null) {
 | 
			
		||||
            closeItem = new JMenuItem();
 | 
			
		||||
            closeItem.setText("Close");
 | 
			
		||||
            closeItem.setMnemonic(KeyEvent.VK_C);
 | 
			
		||||
            closeItem.setActionCommand("close");
 | 
			
		||||
            closeItem.addActionListener(controller);
 | 
			
		||||
        }
 | 
			
		||||
        return closeItem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes saveAsItem	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JMenuItem	
 | 
			
		||||
     */
 | 
			
		||||
    private JMenuItem getSaveAsItem() {
 | 
			
		||||
        if (saveAsItem == null) {
 | 
			
		||||
            saveAsItem = new JMenuItem();
 | 
			
		||||
            saveAsItem.setText("Save As...");
 | 
			
		||||
            saveAsItem.setMnemonic(KeyEvent.VK_A);
 | 
			
		||||
            saveAsItem.setActionCommand("save_as");
 | 
			
		||||
            saveAsItem.addActionListener(controller);
 | 
			
		||||
        }
 | 
			
		||||
        return saveAsItem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes exitItem	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JMenuItem	
 | 
			
		||||
     */
 | 
			
		||||
    private JMenuItem getExitItem() {
 | 
			
		||||
        if (exitItem == null) {
 | 
			
		||||
            exitItem = new JMenuItem();
 | 
			
		||||
            exitItem.setText("Exit");
 | 
			
		||||
            exitItem.setMnemonic(KeyEvent.VK_X);
 | 
			
		||||
            exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, Event.ALT_MASK, false));
 | 
			
		||||
            exitItem.setActionCommand("exit");
 | 
			
		||||
            exitItem.addActionListener(controller);
 | 
			
		||||
        }
 | 
			
		||||
        return exitItem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes printItem	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JMenuItem	
 | 
			
		||||
     */
 | 
			
		||||
    private JMenuItem getPrintItem() {
 | 
			
		||||
        if (printItem == null) {
 | 
			
		||||
            printItem = new JMenuItem();
 | 
			
		||||
            printItem.setText("Print...");
 | 
			
		||||
            printItem.setMnemonic(KeyEvent.VK_P);
 | 
			
		||||
            printItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, Event.CTRL_MASK, false));
 | 
			
		||||
            printItem.setActionCommand("print");
 | 
			
		||||
            printItem.addActionListener(controller);
 | 
			
		||||
        }
 | 
			
		||||
        return printItem;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set the Logo image to be used in Configurator's window and taskbar button.
 | 
			
		||||
     */
 | 
			
		||||
    private void setAppLogo() {
 | 
			
		||||
        if (appLogos == null) {
 | 
			
		||||
            try {
 | 
			
		||||
                List<URL> imgUrls = new ArrayList<URL>(4);
 | 
			
		||||
                // Expected location of the icons in tuner jar
 | 
			
		||||
                URL url = getClass().getResource("/resources/ptlogoc16.png");
 | 
			
		||||
                imgUrls.add(url != null ? url : getClass().getResource("/ptlogoc16.png"));
 | 
			
		||||
                url = getClass().getResource("/resources/ptlogoc24.png");
 | 
			
		||||
                imgUrls.add(url != null ? url : getClass().getResource("/ptlogoc24.png"));
 | 
			
		||||
                url = getClass().getResource("/resources/ptlogoc32.png");
 | 
			
		||||
                imgUrls.add(url != null ? url : getClass().getResource("/ptlogoc32.png"));
 | 
			
		||||
                url = getClass().getResource("/resources/ptlogoc48.png");
 | 
			
		||||
                imgUrls.add(url != null ? url : getClass().getResource("/ptlogoc48.png"));
 | 
			
		||||
 | 
			
		||||
                appLogos = new ArrayList<Image>(4);
 | 
			
		||||
                for (URL imgUrl : imgUrls) {
 | 
			
		||||
                    if (imgUrl != null) {
 | 
			
		||||
                        appLogos.add(Toolkit.getDefaultToolkit().getImage(imgUrl));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                this.setIconImages(appLogos);
 | 
			
		||||
            } catch (Exception e) {}
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,658 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.awt.event.ActionEvent;
 | 
			
		||||
import java.awt.event.ActionListener;
 | 
			
		||||
import java.awt.event.WindowAdapter;
 | 
			
		||||
import java.awt.event.WindowEvent;
 | 
			
		||||
import java.awt.print.PrinterJob;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
 | 
			
		||||
import javax.print.attribute.HashPrintRequestAttributeSet;
 | 
			
		||||
import javax.print.attribute.PrintRequestAttributeSet;
 | 
			
		||||
import javax.print.attribute.standard.Copies;
 | 
			
		||||
import javax.print.attribute.standard.MediaSizeName;
 | 
			
		||||
import javax.swing.JFileChooser;
 | 
			
		||||
import javax.swing.JOptionPane;
 | 
			
		||||
import javax.swing.SwingUtilities;
 | 
			
		||||
import javax.swing.filechooser.FileFilter;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.ConfigModeIntializer;
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.Report;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataConfiguration;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataException;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaConfiguration;
 | 
			
		||||
 | 
			
		||||
public class ConfigWindowController implements ActionListener {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private final ConfigWindow view;
 | 
			
		||||
    private HelpWindow helpView;
 | 
			
		||||
    private boolean closeInProgress;
 | 
			
		||||
    private boolean exitInProgress;
 | 
			
		||||
    private boolean newInProgress;
 | 
			
		||||
    private boolean openInProgress;
 | 
			
		||||
    private File curFile;
 | 
			
		||||
    private final JFileChooser openFileChooser;
 | 
			
		||||
    private final JFileChooser saveFileChooser;
 | 
			
		||||
 | 
			
		||||
    public ConfigWindowController(ConfigWindow view){
 | 
			
		||||
        this.view               = view;
 | 
			
		||||
        this.closeInProgress    = false;
 | 
			
		||||
        this.exitInProgress     = false;
 | 
			
		||||
        this.newInProgress      = false;
 | 
			
		||||
        this.openInProgress     = false;
 | 
			
		||||
        this.openFileChooser    = new JFileChooser();
 | 
			
		||||
        this.saveFileChooser    = new JFileChooser();
 | 
			
		||||
        this.curFile            = null;
 | 
			
		||||
        this.helpView           = null;
 | 
			
		||||
 | 
			
		||||
        // Initialize the MetaConfiguration. This is done so the Configurator can know for
 | 
			
		||||
        // which product its meant for, according to the meta config file.
 | 
			
		||||
        MetaConfiguration.getInstance();
 | 
			
		||||
        view.setWindowTitle(ConfigModeIntializer.CONFIGURATOR_MODE);
 | 
			
		||||
 | 
			
		||||
        String osplHome         = System.getenv("OSPL_HOME");
 | 
			
		||||
        File f                  = null;
 | 
			
		||||
        String fileSep          = System.getProperty("file.separator");
 | 
			
		||||
 | 
			
		||||
        if(osplHome == null){
 | 
			
		||||
            f = new File(System.getProperty("user.dir") + fileSep);
 | 
			
		||||
        } else {
 | 
			
		||||
            f = new File(osplHome + fileSep + "etc" + fileSep + "config" + fileSep);
 | 
			
		||||
 | 
			
		||||
            if((!f.exists()) || (!f.isDirectory())){
 | 
			
		||||
                f = new File(osplHome + fileSep + "etc" + fileSep);
 | 
			
		||||
 | 
			
		||||
                if((!f.exists()) || (!f.isDirectory())){
 | 
			
		||||
                    f = new File(System.getProperty("user.dir") + fileSep);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this.openFileChooser.setCurrentDirectory(f);
 | 
			
		||||
        this.openFileChooser.setDialogTitle("Open configuration");
 | 
			
		||||
        this.openFileChooser.setMultiSelectionEnabled(false);
 | 
			
		||||
        this.openFileChooser.setFileFilter(new ConfigChooseFilter());
 | 
			
		||||
        this.openFileChooser.setAcceptAllFileFilterUsed(false);
 | 
			
		||||
        this.openFileChooser.setApproveButtonText("Open");
 | 
			
		||||
 | 
			
		||||
        this.saveFileChooser.setCurrentDirectory(f);
 | 
			
		||||
        this.saveFileChooser.setDialogTitle("Save configuration");
 | 
			
		||||
        this.saveFileChooser.setMultiSelectionEnabled(false);
 | 
			
		||||
        this.saveFileChooser.setFileFilter(new ConfigChooseFilter());
 | 
			
		||||
        this.saveFileChooser.setAcceptAllFileFilterUsed(false);
 | 
			
		||||
        this.saveFileChooser.setApproveButtonText("Save");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void actionPerformed(ActionEvent e) {
 | 
			
		||||
        String command = e.getActionCommand();
 | 
			
		||||
 | 
			
		||||
        try{
 | 
			
		||||
            if("exit".equals(command)){
 | 
			
		||||
                this.exitInProgress = true;
 | 
			
		||||
                this.handleConditionalSave();
 | 
			
		||||
            } else if("close".equals(command)){
 | 
			
		||||
                this.closeInProgress = true;
 | 
			
		||||
                this.handleConditionalSave();
 | 
			
		||||
            } else if("save".equals(command)){
 | 
			
		||||
                this.handleSave(false);
 | 
			
		||||
            } else if("save_as".equals(command)){
 | 
			
		||||
                this.handleSave(true);
 | 
			
		||||
            } else if("new".equals(command)){
 | 
			
		||||
                this.newInProgress = true;
 | 
			
		||||
                this.handleConditionalSave();
 | 
			
		||||
            } else if("open".equals(command)){
 | 
			
		||||
                this.openInProgress = true;
 | 
			
		||||
                this.handleConditionalSave();
 | 
			
		||||
            } else if("print".equals(command)){
 | 
			
		||||
                this.handlePrint();
 | 
			
		||||
            } else if("help".equals(command)){
 | 
			
		||||
                this.handleHelp();
 | 
			
		||||
            } else if("cancel".equals(command)){
 | 
			
		||||
                this.handleCancel();
 | 
			
		||||
            } else {
 | 
			
		||||
                this.handleSetStatus("Warning: Command '" + command + "' not implemented.", false, false);
 | 
			
		||||
            }
 | 
			
		||||
        } catch(Exception ex){
 | 
			
		||||
            this.handleSetStatus("Error: " + ex.getMessage(), false, false);
 | 
			
		||||
            this.printStackTrace(ex);
 | 
			
		||||
            this.handleSetEnabled(true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleConditionalSave(){
 | 
			
		||||
        DataConfiguration config  = view.getDataConfiguration();
 | 
			
		||||
 | 
			
		||||
        if(config == null){
 | 
			
		||||
            this.handleNextAction();
 | 
			
		||||
        } else if(config.isUpToDate()){
 | 
			
		||||
            this.handleNextAction();
 | 
			
		||||
        } else {
 | 
			
		||||
            int answer = JOptionPane.showConfirmDialog(
 | 
			
		||||
                    this.view,
 | 
			
		||||
                    "Configuration has changed. Save changes?",
 | 
			
		||||
                    "Close configuration",
 | 
			
		||||
                    JOptionPane.YES_NO_CANCEL_OPTION);
 | 
			
		||||
 | 
			
		||||
            if(answer == JOptionPane.YES_OPTION){
 | 
			
		||||
                this.handleSave(false);
 | 
			
		||||
            } else if(answer == JOptionPane.NO_OPTION){
 | 
			
		||||
                this.handleNextAction();
 | 
			
		||||
            } else {
 | 
			
		||||
                this.handleCancel();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handlePrint(){
 | 
			
		||||
        final DataConfiguration config = view.getDataConfiguration();
 | 
			
		||||
 | 
			
		||||
        if(config == null){
 | 
			
		||||
            this.handleSetStatus("No configuration to print.", false);
 | 
			
		||||
        } else {
 | 
			
		||||
            this.handleSetStatus("Printing configuration...", true);
 | 
			
		||||
            this.handleSetEnabled(false);
 | 
			
		||||
 | 
			
		||||
            Runnable worker = new Runnable(){
 | 
			
		||||
                @Override
 | 
			
		||||
                public void run(){
 | 
			
		||||
                    try {
 | 
			
		||||
                        PrinterJob pjob = PrinterJob.getPrinterJob();
 | 
			
		||||
                        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
 | 
			
		||||
                        aset.add(MediaSizeName.ISO_A4);
 | 
			
		||||
                        aset.add(new Copies(1));
 | 
			
		||||
                        boolean doPrint = pjob.printDialog(aset);
 | 
			
		||||
 | 
			
		||||
                        if(doPrint){
 | 
			
		||||
                            /*
 | 
			
		||||
                            if(currentDialog != null){
 | 
			
		||||
                                currentDialog.setStatus(null, true);
 | 
			
		||||
                            }
 | 
			
		||||
                            DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
 | 
			
		||||
                            Doc doc = new SimpleDoc(config.toString(), flavor, null);
 | 
			
		||||
                            DocPrintJob docPrintJob = pjob.getPrintService().createPrintJob();
 | 
			
		||||
                            docPrintJob.print(doc, aset);
 | 
			
		||||
                            handleSetStatus("Configuration printed.", true);
 | 
			
		||||
                            */
 | 
			
		||||
                            view.setStatus("Warning: Printing not supported yet.", false);
 | 
			
		||||
                            handleSetEnabled(true);
 | 
			
		||||
                        } else {
 | 
			
		||||
                            handleCancel();
 | 
			
		||||
                        }
 | 
			
		||||
                    } catch (Exception e) {
 | 
			
		||||
                        view.setStatus("Error:" + e.getMessage(), false);
 | 
			
		||||
                        handleSetEnabled(true);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
            SwingUtilities.invokeLater(worker);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleExit(){
 | 
			
		||||
        this.exitInProgress = false;
 | 
			
		||||
        view.dispose();
 | 
			
		||||
        System.exit(0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void handleOpen(File file){
 | 
			
		||||
        this.curFile = file;
 | 
			
		||||
        this.openInProgress = true;
 | 
			
		||||
        this.handleConditionalSave();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleOpen(){
 | 
			
		||||
        openInProgress = false;
 | 
			
		||||
        File file = null;
 | 
			
		||||
 | 
			
		||||
        if(this.curFile != null){
 | 
			
		||||
            file = this.curFile;
 | 
			
		||||
        } else {
 | 
			
		||||
            int returnVal = this.openFileChooser.showOpenDialog(this.view);
 | 
			
		||||
 | 
			
		||||
            if (returnVal == JFileChooser.APPROVE_OPTION) {
 | 
			
		||||
                file = this.openFileChooser.getSelectedFile();
 | 
			
		||||
            } else {
 | 
			
		||||
                this.handleSetStatus("No file opened", false, false);
 | 
			
		||||
                this.handleNextAction();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(file != null){
 | 
			
		||||
            final File f = file;
 | 
			
		||||
            this.handleSetEnabled(false);
 | 
			
		||||
            view.setStatus("Opening configuration from " + f.getAbsolutePath() + "...", true, true);
 | 
			
		||||
            view.repaint();
 | 
			
		||||
 | 
			
		||||
            Runnable worker = new Runnable(){
 | 
			
		||||
                @Override
 | 
			
		||||
                public void run(){
 | 
			
		||||
                    view.setDataConfiguration(null);
 | 
			
		||||
                    DataConfiguration config = null;
 | 
			
		||||
 | 
			
		||||
                    try {
 | 
			
		||||
                        if (ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.COMMERCIAL_MODE &&
 | 
			
		||||
                                ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.LITE_MODE) {
 | 
			
		||||
                            ConfigModeIntializer.setMode(ConfigModeIntializer.COMMUNITY_MODE_FILE_OPEN);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        config = new DataConfiguration(f, false);
 | 
			
		||||
                    } catch (DataException e) {
 | 
			
		||||
                        Report.getInstance().writeInfoLog("ConfigWindowController handleOpen\n" + e.getMessage());
 | 
			
		||||
                        if (ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.LITE_MODE) {
 | 
			
		||||
                            if (ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.COMMERCIAL_MODE) {
 | 
			
		||||
                                ConfigModeIntializer.setMode(ConfigModeIntializer.COMMUNITY_MODE);
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            int answer = JOptionPane.showConfirmDialog(
 | 
			
		||||
                                    view,
 | 
			
		||||
                                    "The configuration is not valid.\nReason: " +
 | 
			
		||||
                                    e.getMessage() +
 | 
			
		||||
                                    "\nTry automatic repairing?",
 | 
			
		||||
                                    "Invalid configuration",
 | 
			
		||||
                                    JOptionPane.YES_NO_OPTION);
 | 
			
		||||
 | 
			
		||||
                            if(answer == JOptionPane.YES_OPTION){
 | 
			
		||||
                                try {
 | 
			
		||||
                                    config = new DataConfiguration(f, true);
 | 
			
		||||
 | 
			
		||||
                                    view.setStatus("Configuration repaired successfully.", false);
 | 
			
		||||
                                } catch (DataException e1) {
 | 
			
		||||
                                    JOptionPane.showMessageDialog(view,
 | 
			
		||||
                                            "Configuration could not be repaired.\nReason: '" +
 | 
			
		||||
                                            e.getMessage() + "'"
 | 
			
		||||
                                            , "Error", JOptionPane.ERROR_MESSAGE);
 | 
			
		||||
                                    handleSetStatus("Configuration could not be repaired.", false);
 | 
			
		||||
                                    handleNextAction();
 | 
			
		||||
                                }
 | 
			
		||||
                            } else if(answer == JOptionPane.NO_OPTION){
 | 
			
		||||
                                handleSetStatus("Configuration not opened.", false);
 | 
			
		||||
                                handleNextAction();
 | 
			
		||||
                            }
 | 
			
		||||
                        } else {
 | 
			
		||||
                            JOptionPane.showConfirmDialog(
 | 
			
		||||
                                    view,
 | 
			
		||||
                                    "The configuration is not valid.\nReason: " +
 | 
			
		||||
                                    e.getMessage(),
 | 
			
		||||
                                    "Invalid configuration",
 | 
			
		||||
                                    JOptionPane.PLAIN_MESSAGE);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    if(config != null){
 | 
			
		||||
                        view.setDataConfiguration(config);
 | 
			
		||||
                        view.setStatus("Configuration opened.", false);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        view.setStatus("Configuration could not be opened.", false);
 | 
			
		||||
                    }
 | 
			
		||||
                    handleNextAction();
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
            SwingUtilities.invokeLater(worker);
 | 
			
		||||
        }
 | 
			
		||||
        this.curFile = null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void handleOpenFromUri(String uri) {
 | 
			
		||||
        openInProgress = false;
 | 
			
		||||
        File file = null;
 | 
			
		||||
 | 
			
		||||
        if (uri.startsWith("file://")) {
 | 
			
		||||
            /* strip off file:// */
 | 
			
		||||
            uri = uri.substring(7);
 | 
			
		||||
        }
 | 
			
		||||
        file = new File(uri);
 | 
			
		||||
 | 
			
		||||
        final File f = file;
 | 
			
		||||
        this.handleSetEnabled(false);
 | 
			
		||||
        view.setStatus("Opening configuration from " + f.getAbsolutePath()
 | 
			
		||||
                + "...", true, true);
 | 
			
		||||
        view.repaint();
 | 
			
		||||
 | 
			
		||||
        Runnable worker = new Runnable() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void run() {
 | 
			
		||||
                view.setDataConfiguration(null);
 | 
			
		||||
                DataConfiguration config = null;
 | 
			
		||||
 | 
			
		||||
                try {
 | 
			
		||||
                    if (ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.COMMERCIAL_MODE &&
 | 
			
		||||
                            ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.LITE_MODE) {
 | 
			
		||||
                        ConfigModeIntializer
 | 
			
		||||
                                .setMode(ConfigModeIntializer.COMMUNITY_MODE_FILE_OPEN);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    config = new DataConfiguration(f, false);
 | 
			
		||||
                } catch (DataException e) {
 | 
			
		||||
                    Report.getInstance().writeInfoLog(
 | 
			
		||||
                            "ConfigWindowController handleOpen\n"
 | 
			
		||||
                                    + e.getMessage());
 | 
			
		||||
                    if (ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.COMMERCIAL_MODE &&
 | 
			
		||||
                            ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.LITE_MODE) {
 | 
			
		||||
                        ConfigModeIntializer
 | 
			
		||||
                                .setMode(ConfigModeIntializer.COMMUNITY_MODE);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    int answer = JOptionPane.showConfirmDialog(
 | 
			
		||||
                            view,
 | 
			
		||||
                            "The configuration is not valid.\nReason: "
 | 
			
		||||
                                    + e.getMessage()
 | 
			
		||||
                                    + "\nTry automatic repairing?",
 | 
			
		||||
                            "Invalid configuration", JOptionPane.YES_NO_OPTION);
 | 
			
		||||
 | 
			
		||||
                    if (answer == JOptionPane.YES_OPTION) {
 | 
			
		||||
                        try {
 | 
			
		||||
                            config = new DataConfiguration(f, true);
 | 
			
		||||
                            view.setStatus(
 | 
			
		||||
                                    "Configuration repaired successfully.",
 | 
			
		||||
                                    false);
 | 
			
		||||
                        } catch (DataException e1) {
 | 
			
		||||
                            JOptionPane.showMessageDialog(view,
 | 
			
		||||
                                    "Configuration could not be repaired.\nReason: '"
 | 
			
		||||
                                            + e.getMessage() + "'", "Error",
 | 
			
		||||
                                    JOptionPane.ERROR_MESSAGE);
 | 
			
		||||
                            handleSetStatus(
 | 
			
		||||
                                    "Configuration could not be repaired.",
 | 
			
		||||
                                    false);
 | 
			
		||||
                            handleNextAction();
 | 
			
		||||
                        }
 | 
			
		||||
                    } else if (answer == JOptionPane.NO_OPTION) {
 | 
			
		||||
                        handleSetStatus("Configuration not opened.", false);
 | 
			
		||||
                        handleNextAction();
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (config != null) {
 | 
			
		||||
                    view.setDataConfiguration(config);
 | 
			
		||||
                    view.setStatus("Configuration opened.", false);
 | 
			
		||||
                    handleNextAction();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        SwingUtilities.invokeLater(worker);
 | 
			
		||||
        this.curFile = null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleSave(boolean alwaysAskFile){
 | 
			
		||||
        int returnVal;
 | 
			
		||||
        File file;
 | 
			
		||||
        int answer;
 | 
			
		||||
        String path;
 | 
			
		||||
        boolean proceed = false;
 | 
			
		||||
 | 
			
		||||
        final DataConfiguration config = view.getDataConfiguration();
 | 
			
		||||
 | 
			
		||||
        if(config == null){
 | 
			
		||||
            this.handleCancel("Warning: No configuration to save.");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.handleSetEnabled(false);
 | 
			
		||||
 | 
			
		||||
        if((!alwaysAskFile) && (config.getFile() != null)){
 | 
			
		||||
            this.handleSetStatus("Saving configuration to: " + config.getFile().getAbsolutePath() + "...", true);
 | 
			
		||||
 | 
			
		||||
            Runnable worker = new Runnable(){
 | 
			
		||||
                @Override
 | 
			
		||||
                public void run(){
 | 
			
		||||
                    try {
 | 
			
		||||
                        config.store(true);
 | 
			
		||||
                        view.setStatus("Configuration saved.", false, false);
 | 
			
		||||
                        handleNextAction();
 | 
			
		||||
                    } catch (DataException e) {
 | 
			
		||||
                        handleSetStatus("Error: Cannot save configuration to: " +
 | 
			
		||||
                                            config.getFile().getAbsolutePath(),
 | 
			
		||||
                                            false);
 | 
			
		||||
                        handleNextAction();
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
            SwingUtilities.invokeLater(worker);
 | 
			
		||||
        } else {
 | 
			
		||||
            try{
 | 
			
		||||
                do {
 | 
			
		||||
                    answer = JOptionPane.CANCEL_OPTION;
 | 
			
		||||
                    saveFileChooser.setSelectedFile(config.getFile());
 | 
			
		||||
                    returnVal = this.saveFileChooser.showSaveDialog(this.view);
 | 
			
		||||
 | 
			
		||||
                    if (returnVal == JFileChooser.APPROVE_OPTION) {
 | 
			
		||||
                        file = this.saveFileChooser.getSelectedFile();
 | 
			
		||||
                        path = file.getAbsolutePath();
 | 
			
		||||
 | 
			
		||||
                        if(!path.endsWith(ConfigChooseFilter.CONFIG_SUFFIX)){
 | 
			
		||||
                            path = path + ConfigChooseFilter.CONFIG_SUFFIX;
 | 
			
		||||
                            file = new File(path);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        this.handleSetStatus("Saving configuration to: " + file.getAbsolutePath() + "...", true);
 | 
			
		||||
 | 
			
		||||
                        if(file.equals(config.getFile())){
 | 
			
		||||
                            proceed = true;
 | 
			
		||||
                        } else if (file.exists()){
 | 
			
		||||
                            answer = JOptionPane.showConfirmDialog(
 | 
			
		||||
                                    this.view,
 | 
			
		||||
                                    "The file '" + path + "' already exists. Overwrite?",
 | 
			
		||||
                                    "File already exists",
 | 
			
		||||
                                    JOptionPane.YES_NO_CANCEL_OPTION);
 | 
			
		||||
 | 
			
		||||
                            if(answer == JOptionPane.YES_OPTION){
 | 
			
		||||
                                proceed = true;
 | 
			
		||||
                                config.setFile(file);
 | 
			
		||||
                            } else if(answer == JOptionPane.NO_OPTION){
 | 
			
		||||
                                proceed = false;
 | 
			
		||||
                            } else {
 | 
			
		||||
                                proceed = false;
 | 
			
		||||
                                this.handleNextAction();
 | 
			
		||||
                            }
 | 
			
		||||
                        } else {
 | 
			
		||||
                            config.setFile(file);
 | 
			
		||||
                            proceed = true;
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        proceed = false;
 | 
			
		||||
                        this.handleNextAction();
 | 
			
		||||
                    }
 | 
			
		||||
                } while(answer == JOptionPane.NO_OPTION);
 | 
			
		||||
 | 
			
		||||
                if(proceed){
 | 
			
		||||
                    this.handleSetStatus("Saving configuration to: " + config.getFile().getAbsolutePath() + "...", true);
 | 
			
		||||
 | 
			
		||||
                    Runnable worker = new Runnable(){
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void run(){
 | 
			
		||||
                            try {
 | 
			
		||||
                                config.store(true);
 | 
			
		||||
                                view.setStatus("Configuration saved.", false, false);
 | 
			
		||||
                                handleNextAction();
 | 
			
		||||
                            } catch (DataException e) {
 | 
			
		||||
                                view.setStatus("Error:" + e.getMessage(), false);
 | 
			
		||||
                                handleSetEnabled(true);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    };
 | 
			
		||||
                    SwingUtilities.invokeLater(worker);
 | 
			
		||||
                }
 | 
			
		||||
            } catch (DataException e) {
 | 
			
		||||
                this.handleSetStatus("Error: " + e.getMessage(), false);
 | 
			
		||||
                handleSetEnabled(true);
 | 
			
		||||
            } catch(Exception exc){
 | 
			
		||||
                this.handleSetStatus("Error: " + exc.getMessage(), false);
 | 
			
		||||
                handleSetEnabled(true);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleHelp(){
 | 
			
		||||
        if(helpView != null){
 | 
			
		||||
            helpView.toFront();
 | 
			
		||||
        } else {
 | 
			
		||||
            view.setStatus("Opening help for configuration...", true, true);
 | 
			
		||||
            this.handleSetEnabled(false);
 | 
			
		||||
 | 
			
		||||
            Runnable worker = new Runnable(){
 | 
			
		||||
                @Override
 | 
			
		||||
                public void run(){
 | 
			
		||||
                    MetaConfiguration metaConfig = MetaConfiguration.getInstance();
 | 
			
		||||
                    if (metaConfig != null) {
 | 
			
		||||
                        helpView = new HelpWindow(metaConfig);
 | 
			
		||||
                        helpView.setLocationRelativeTo(view);
 | 
			
		||||
                        view.setStatus("Help pane openened.", false, false);
 | 
			
		||||
                        handleSetEnabled(true);
 | 
			
		||||
                        helpView.addWindowListener(new WindowAdapter(){
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void windowClosed(WindowEvent e) {
 | 
			
		||||
                                helpView = null;
 | 
			
		||||
                            }
 | 
			
		||||
                        });
 | 
			
		||||
                        helpView.setVisible(true);
 | 
			
		||||
                        helpView.toFront();
 | 
			
		||||
                    } else {
 | 
			
		||||
                        view.setStatus("Failed to open the configuration help", true, false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
            SwingUtilities.invokeLater(worker);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleNew(){
 | 
			
		||||
        view.setStatus("Creating new configuration...", true, true);
 | 
			
		||||
        this.handleSetEnabled(false);
 | 
			
		||||
 | 
			
		||||
        Runnable worker = new Runnable(){
 | 
			
		||||
            @Override
 | 
			
		||||
            public void run(){
 | 
			
		||||
                view.setDataConfiguration(null);
 | 
			
		||||
                newInProgress = false;
 | 
			
		||||
                if (ConfigModeIntializer.CONFIGURATOR_MODE == ConfigModeIntializer.COMMUNITY_MODE_FILE_OPEN) {
 | 
			
		||||
                    ConfigModeIntializer.setMode(ConfigModeIntializer.COMMUNITY_MODE);
 | 
			
		||||
                }
 | 
			
		||||
                try {
 | 
			
		||||
                    DataConfiguration config = new DataConfiguration();
 | 
			
		||||
                    view.setDataConfiguration(config);
 | 
			
		||||
                    view.setStatus("New configuration created.", false, false);
 | 
			
		||||
                } catch (DataException e) {
 | 
			
		||||
 | 
			
		||||
                    view.setStatus("Error: Could not create new configuration.", false, false);
 | 
			
		||||
                }
 | 
			
		||||
                handleSetEnabled(true);
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        SwingUtilities.invokeLater(worker);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleClose(){
 | 
			
		||||
        view.setStatus("Closing configuration...", true, true);
 | 
			
		||||
        this.handleSetEnabled(false);
 | 
			
		||||
 | 
			
		||||
        Runnable worker = new Runnable(){
 | 
			
		||||
            @Override
 | 
			
		||||
            public void run(){
 | 
			
		||||
                view.setDataConfiguration(null);
 | 
			
		||||
                closeInProgress = false;
 | 
			
		||||
                view.setStatus("Configuration closed.", false);
 | 
			
		||||
                handleSetEnabled(true);
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        SwingUtilities.invokeLater(worker);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleNextAction(){
 | 
			
		||||
        if(closeInProgress){
 | 
			
		||||
            handleClose();
 | 
			
		||||
        } else if(exitInProgress){
 | 
			
		||||
            exitInProgress = false;
 | 
			
		||||
            handleExit();
 | 
			
		||||
        } else if(newInProgress){
 | 
			
		||||
            handleNew();
 | 
			
		||||
        } else if(openInProgress){
 | 
			
		||||
            handleOpen();
 | 
			
		||||
        } else  {
 | 
			
		||||
            handleSetEnabled(true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleCancel(){
 | 
			
		||||
        view.setStatus("Action cancelled.", false);
 | 
			
		||||
        this.handleSetEnabled(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleCancel(String message){
 | 
			
		||||
        view.setStatus(message, false);
 | 
			
		||||
        this.handleSetEnabled(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleSetEnabled(boolean enabled){
 | 
			
		||||
        if(enabled){
 | 
			
		||||
            this.view.enableView();
 | 
			
		||||
        } else {
 | 
			
		||||
            this.view.disableView();
 | 
			
		||||
        }
 | 
			
		||||
        this.view.setActionsEnabled(enabled);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleSetStatus(String message, boolean persistent, boolean busy){
 | 
			
		||||
        this.view.setStatus(message, persistent, busy);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleSetStatus(String message, boolean persistent){
 | 
			
		||||
        this.view.setStatus(message, persistent, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void printStackTrace(Exception exception){
 | 
			
		||||
        StackTraceElement[] elements = exception.getStackTrace();
 | 
			
		||||
        StringBuffer buf = new StringBuffer();
 | 
			
		||||
        buf.append("The following exception occurred: \n");
 | 
			
		||||
 | 
			
		||||
        for(int i=0; i<elements.length; i++){
 | 
			
		||||
            buf.append(elements[i].getFileName() + ", " +
 | 
			
		||||
                    elements[i].getMethodName() + ", " +
 | 
			
		||||
                    elements[i].getLineNumber() + "\n");
 | 
			
		||||
        }
 | 
			
		||||
        String error = buf.toString();
 | 
			
		||||
        Report.getInstance().writeErrorLog(error);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static class ConfigChooseFilter extends FileFilter{
 | 
			
		||||
        private static String description = null;
 | 
			
		||||
        public static final String CONFIG_SUFFIX = ".xml";
 | 
			
		||||
 | 
			
		||||
        public ConfigChooseFilter(){
 | 
			
		||||
            if (ConfigModeIntializer.CONFIGURATOR_MODE == ConfigModeIntializer.LITE_MODE) {
 | 
			
		||||
                ConfigChooseFilter.description = "Cyclone DDS config files (*" +
 | 
			
		||||
                        ConfigChooseFilter.CONFIG_SUFFIX + ")";
 | 
			
		||||
            } else {
 | 
			
		||||
                ConfigChooseFilter.description = "OpenSplice config files (*" +
 | 
			
		||||
                        ConfigChooseFilter.CONFIG_SUFFIX + ")";
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public boolean accept(File f) {
 | 
			
		||||
            if (f.isDirectory()) {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if(f.getName().endsWith(ConfigChooseFilter.CONFIG_SUFFIX)){
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public String getDescription() {
 | 
			
		||||
            return ConfigChooseFilter.description;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,84 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.awt.Point;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JPopupMenu;
 | 
			
		||||
import javax.swing.JTable;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.view.StatusPanel;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataNode;
 | 
			
		||||
 | 
			
		||||
public class DataElementTable extends JTable implements DataNodePopupSupport {
 | 
			
		||||
    private static final long serialVersionUID = 3904871676109190600L;
 | 
			
		||||
    private final DataElementTableCellRenderer renderer;
 | 
			
		||||
    private final DataElementTableModel model;
 | 
			
		||||
    private final DataElementTableModelEditor editor;
 | 
			
		||||
    private DataNodePopup popupController;
 | 
			
		||||
    private final StatusPanel status;
 | 
			
		||||
    
 | 
			
		||||
    public DataElementTable(DataNodePopup popup, DataElement element, StatusPanel status){
 | 
			
		||||
        super();
 | 
			
		||||
        this.model = new DataElementTableModel();
 | 
			
		||||
        this.editor = new DataElementTableModelEditor(model);
 | 
			
		||||
        this.renderer = new DataElementTableCellRenderer(model);
 | 
			
		||||
        this.editor.setStatusListener(status);
 | 
			
		||||
        this.model.setElement(element);
 | 
			
		||||
        this.status = status;
 | 
			
		||||
        this.setModel(model);
 | 
			
		||||
        this.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
 | 
			
		||||
        this.getTableHeader().setReorderingAllowed(false);
 | 
			
		||||
        this.setSurrendersFocusOnKeystroke(true);
 | 
			
		||||
        this.getColumnModel().getColumn(1).setCellEditor(editor);
 | 
			
		||||
        this.getColumnModel().getColumn(1).setCellRenderer(renderer);
 | 
			
		||||
        
 | 
			
		||||
        if(popup == null){
 | 
			
		||||
            this.popupController = new DataNodePopup();
 | 
			
		||||
        } else {
 | 
			
		||||
            this.popupController = popup;
 | 
			
		||||
        }
 | 
			
		||||
        this.popupController.registerPopupSupport(this);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setStatusListener(StatusPanel  status){
 | 
			
		||||
        this.editor.setStatusListener(status);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public DataNode getDataNodeAt(int row){
 | 
			
		||||
        this.getSelectionModel().setSelectionInterval(row, row);
 | 
			
		||||
        return this.model.getNodeAt(row);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public DataNode getDataNodeAt(int x, int y) {
 | 
			
		||||
        int row = this.rowAtPoint(new Point(x, y));
 | 
			
		||||
        return this.getDataNodeAt(row);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void showPopup(JPopupMenu popup, int x, int y) {
 | 
			
		||||
        popup.show(this, x, y);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setStatus(String message, boolean persistent, boolean busy) {
 | 
			
		||||
        if(this.status != null){
 | 
			
		||||
            this.status.setStatus(message, persistent, busy);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public DataElementTableModelEditor getEditor() {
 | 
			
		||||
        return this.editor;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
import java.awt.Component;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JTable;
 | 
			
		||||
import javax.swing.table.DefaultTableCellRenderer;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.ConfigModeIntializer;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataNode;
 | 
			
		||||
 | 
			
		||||
public class DataElementTableCellRenderer extends DefaultTableCellRenderer {
 | 
			
		||||
    private static final long serialVersionUID = 8091366819992773074L;
 | 
			
		||||
    private DataElementTableModel tableModel = null;
 | 
			
		||||
 | 
			
		||||
    public DataElementTableCellRenderer(DataElementTableModel tableModel){
 | 
			
		||||
        this.tableModel = tableModel;
 | 
			
		||||
        Logger.getLogger("org.eclipse.cyclonedds.config.swing");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Component getTableCellRendererComponent(JTable table,
 | 
			
		||||
                                                   Object value,
 | 
			
		||||
                                                   boolean isSelected,
 | 
			
		||||
                                                   boolean hasFocus,
 | 
			
		||||
                                                   int row,
 | 
			
		||||
                                                   int column){
 | 
			
		||||
        Component comp = super.getTableCellRendererComponent (table,
 | 
			
		||||
           value, isSelected, hasFocus, row, column);
 | 
			
		||||
        DataNode node = tableModel.getNodeAt(row);
 | 
			
		||||
        node = node.getParent();
 | 
			
		||||
        table.setToolTipText(null);
 | 
			
		||||
        
 | 
			
		||||
        if (ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.COMMERCIAL_MODE) {
 | 
			
		||||
            if (node.getMetadata().getVersion().equals(ConfigModeIntializer.COMMERCIAL)) {
 | 
			
		||||
                if (ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.COMMUNITY_MODE_FILE_OPEN) {
 | 
			
		||||
                    comp.setBackground (Color.LIGHT_GRAY);
 | 
			
		||||
                    comp.setForeground (Color.GRAY);
 | 
			
		||||
                    table.setToolTipText("This element is not part of the community edition");
 | 
			
		||||
                } else {
 | 
			
		||||
                    comp.setBackground (Color.RED);
 | 
			
		||||
                    comp.setForeground (Color.BLACK);
 | 
			
		||||
                    table.setToolTipText("This element is found in the configuration file but not part of the community edition");
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                comp.setBackground (Color.WHITE);
 | 
			
		||||
                comp.setForeground (Color.BLACK);
 | 
			
		||||
                table.setToolTipText(null);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            comp.setBackground (Color.WHITE);
 | 
			
		||||
            comp.setForeground (Color.BLACK);
 | 
			
		||||
            table.setToolTipText(null);
 | 
			
		||||
        }
 | 
			
		||||
        return comp;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,199 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
import javax.swing.SwingUtilities;
 | 
			
		||||
import javax.swing.table.DefaultTableModel;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.ConfigModeIntializer;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataAttribute;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataConfiguration;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataConfigurationListener;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataNode;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataValue;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaAttribute;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaElement;
 | 
			
		||||
 | 
			
		||||
public class DataElementTableModel extends DefaultTableModel implements DataConfigurationListener {
 | 
			
		||||
    private static final long serialVersionUID = -217503219724923467L;
 | 
			
		||||
    private DataElement element;
 | 
			
		||||
    private ArrayList<DataNode> nodes;
 | 
			
		||||
    private DataConfiguration configuration;
 | 
			
		||||
    
 | 
			
		||||
    public DataElementTableModel(){
 | 
			
		||||
        super();
 | 
			
		||||
        this.element = null;
 | 
			
		||||
        this.configuration = null;
 | 
			
		||||
        this.nodes = new ArrayList<DataNode>();
 | 
			
		||||
        this.addColumn("Name");
 | 
			
		||||
        this.addColumn("Value");
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setElement(DataElement element){
 | 
			
		||||
        if(this.element != null){
 | 
			
		||||
            this.clear();
 | 
			
		||||
        }
 | 
			
		||||
        if(element != null){
 | 
			
		||||
            this.element = element;
 | 
			
		||||
            this.initElement();
 | 
			
		||||
            
 | 
			
		||||
            if(!this.element.getOwner().equals(this.configuration)){
 | 
			
		||||
                if(this.configuration != null){
 | 
			
		||||
                    this.configuration.removeDataConfigurationListener(this);
 | 
			
		||||
                }
 | 
			
		||||
                this.configuration = this.element.getOwner();
 | 
			
		||||
                this.configuration.addDataConfigurationListener(this);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public void nodeAdded(DataElement parent, DataNode nodeAdded) {
 | 
			
		||||
        DataNode parentParent;
 | 
			
		||||
        
 | 
			
		||||
        if(parent.equals(this.element)){
 | 
			
		||||
            this.clear();
 | 
			
		||||
            this.initElement();
 | 
			
		||||
        } else {
 | 
			
		||||
            parentParent = parent.getParent();
 | 
			
		||||
            
 | 
			
		||||
            if(this.element.equals(parentParent)){
 | 
			
		||||
                this.clear();
 | 
			
		||||
                this.initElement();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void nodeRemoved(DataElement parent, DataNode nodeRemoved) {
 | 
			
		||||
       if(nodeRemoved.equals(this.element)){
 | 
			
		||||
            this.setElement(null);
 | 
			
		||||
        } else if(this.nodes.contains(nodeRemoved)){
 | 
			
		||||
            this.clear();
 | 
			
		||||
            this.initElement();
 | 
			
		||||
        } else if(this.containsNodeAsParent(nodeRemoved)){
 | 
			
		||||
            this.clear();
 | 
			
		||||
            this.initElement();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private boolean containsNodeAsParent(DataNode node){
 | 
			
		||||
        for(DataNode n: this.nodes){
 | 
			
		||||
            if(n.getParent().equals(node)){
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void valueChanged(DataValue data, Object oldValue, Object newValue) {
 | 
			
		||||
        final int index = this.nodes.indexOf(data); 
 | 
			
		||||
        final Object v = newValue;
 | 
			
		||||
        
 | 
			
		||||
        if(index != -1){
 | 
			
		||||
            /*System.out.println("Value changed: data: " + data + ", oldValue: " + oldValue + " newValue: " + newValue + "(row=" + index +", col=1)");*/
 | 
			
		||||
            
 | 
			
		||||
            SwingUtilities.invokeLater(new Runnable(){
 | 
			
		||||
                @Override
 | 
			
		||||
                public void run() {
 | 
			
		||||
                    setValueAt(v, index, 1);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public DataNode getNodeAt(int index){
 | 
			
		||||
        DataNode result;
 | 
			
		||||
        
 | 
			
		||||
        if(this.nodes.size() >= (index-1)){
 | 
			
		||||
            result = this.nodes.get(index);
 | 
			
		||||
        } else {
 | 
			
		||||
            result = null;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isCellEditable(int row, int column) {
 | 
			
		||||
        boolean result;
 | 
			
		||||
                
 | 
			
		||||
        if(column == 1 && ConfigModeIntializer.CONFIGURATOR_MODE == ConfigModeIntializer.COMMERCIAL_MODE) {
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else if (column == 1 && !element.getMetadata().getVersion().equals(ConfigModeIntializer.COMMERCIAL)) {
 | 
			
		||||
            result = true;
 | 
			
		||||
        } else {
 | 
			
		||||
            result = false;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private void initElement(){
 | 
			
		||||
        String elName;
 | 
			
		||||
        Object[] values = new Object[2];
 | 
			
		||||
        
 | 
			
		||||
        for(DataNode dn: this.element.getChildren()){
 | 
			
		||||
            if(dn instanceof DataAttribute){
 | 
			
		||||
                values[0] = "@" + ((MetaAttribute)dn.getMetadata()).getName();
 | 
			
		||||
                values[1] = ((DataAttribute)dn).getValue();
 | 
			
		||||
                this.nodes.add(((DataAttribute)dn).getDataValue());
 | 
			
		||||
                this.addRow(values);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        for(DataNode dn: this.element.getChildren()){
 | 
			
		||||
            if(dn instanceof DataValue){
 | 
			
		||||
                values[0] = "";
 | 
			
		||||
                values[1] = ((DataValue)dn).getValue();
 | 
			
		||||
                this.nodes.add(dn);
 | 
			
		||||
                this.addRow(values);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        for(DataNode dn: this.element.getChildren()){
 | 
			
		||||
            if(dn instanceof DataElement){
 | 
			
		||||
                if(!((MetaElement)dn.getMetadata()).hasElementChildren() &&
 | 
			
		||||
                   ((MetaElement)dn.getMetadata()).hasValueChildren())
 | 
			
		||||
                {
 | 
			
		||||
                    elName = ((MetaElement)dn.getMetadata()).getName();
 | 
			
		||||
                    
 | 
			
		||||
                    for(DataNode elNode: ((DataElement)dn).getChildren()){
 | 
			
		||||
                        if(elNode instanceof DataValue){
 | 
			
		||||
                            values[0] = elName;
 | 
			
		||||
                            values[1] = ((DataValue)elNode).getValue();
 | 
			
		||||
                            this.nodes.add(elNode);
 | 
			
		||||
                            this.addRow(values);
 | 
			
		||||
                        } else if(elNode instanceof DataAttribute){
 | 
			
		||||
                            values[0] = elName + "[@" + ((MetaAttribute)elNode.getMetadata()).getName() + "]";
 | 
			
		||||
                            values[1] = ((DataAttribute)elNode).getValue();
 | 
			
		||||
                            this.nodes.add(((DataAttribute)elNode).getDataValue());
 | 
			
		||||
                            this.addRow(values);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private void clear(){
 | 
			
		||||
        int rows = super.getRowCount();
 | 
			
		||||
        
 | 
			
		||||
        for(int i=0; i<rows; i++){
 | 
			
		||||
            super.removeRow(0);
 | 
			
		||||
        }
 | 
			
		||||
        this.nodes.clear();
 | 
			
		||||
        
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,224 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
import java.awt.Component;
 | 
			
		||||
import java.awt.event.ActionEvent;
 | 
			
		||||
import java.awt.event.ActionListener;
 | 
			
		||||
import java.awt.event.KeyEvent;
 | 
			
		||||
import java.awt.event.KeyListener;
 | 
			
		||||
 | 
			
		||||
import javax.swing.AbstractCellEditor;
 | 
			
		||||
import javax.swing.JComboBox;
 | 
			
		||||
import javax.swing.JTable;
 | 
			
		||||
import javax.swing.JTextField;
 | 
			
		||||
import javax.swing.table.TableCellEditor;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.controller.AssignmentResult;
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.Config;
 | 
			
		||||
import org.eclipse.cyclonedds.common.view.StatusPanel;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataException;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataValue;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValue;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValueBoolean;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValueEnum;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValueNatural;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValueString;
 | 
			
		||||
 | 
			
		||||
public class DataElementTableModelEditor extends AbstractCellEditor implements TableCellEditor, ActionListener, KeyListener {
 | 
			
		||||
    private static final long serialVersionUID = 805706250918260825L;
 | 
			
		||||
    private Object curValue = null;
 | 
			
		||||
    private StatusPanel status;
 | 
			
		||||
    private final Color editColor = Config.getInputColor();
 | 
			
		||||
    private final Color errorColor = Config.getIncorrectColor();
 | 
			
		||||
    private int editRow, editColumn;
 | 
			
		||||
    private Component curEditor = null;
 | 
			
		||||
    private DataElementTableModel tableModel = null;
 | 
			
		||||
    private DataValue editNode;
 | 
			
		||||
    private MetaValue editType;
 | 
			
		||||
    
 | 
			
		||||
    public DataElementTableModelEditor(DataElementTableModel tableModel){
 | 
			
		||||
        this.tableModel = tableModel;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setStatusListener(StatusPanel  status){
 | 
			
		||||
        this.status = status;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public void cancelCellEditing(){
 | 
			
		||||
        super.cancelCellEditing();
 | 
			
		||||
        curEditor = null;
 | 
			
		||||
        
 | 
			
		||||
        if(status != null){
 | 
			
		||||
            status.setStatus("Editing cancelled", false, false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean stopCellEditing(){
 | 
			
		||||
        boolean result = true;
 | 
			
		||||
        
 | 
			
		||||
        if(curEditor != null){
 | 
			
		||||
            result = this.assign().isValid();
 | 
			
		||||
            
 | 
			
		||||
            if(result){
 | 
			
		||||
                result = super.stopCellEditing();
 | 
			
		||||
                curEditor = null;
 | 
			
		||||
            } else {
 | 
			
		||||
                this.cancelCellEditing();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public Object getCellEditorValue() {
 | 
			
		||||
        return curValue;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public boolean isEditing(){
 | 
			
		||||
        assert (editRow != -1) && (editColumn != -1): "Value of editRow || editColumn == null";
 | 
			
		||||
        return (curEditor != null);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
 | 
			
		||||
        Component result = null;
 | 
			
		||||
        
 | 
			
		||||
        editRow    = row;
 | 
			
		||||
        editColumn = column;
 | 
			
		||||
        curValue   = value;
 | 
			
		||||
        editNode   = (DataValue)tableModel.getNodeAt(editRow);
 | 
			
		||||
        if (editNode != null) {
 | 
			
		||||
            editType   = (MetaValue)editNode.getMetadata();
 | 
			
		||||
        }
 | 
			
		||||
            
 | 
			
		||||
        if(editType instanceof MetaValueBoolean){
 | 
			
		||||
            String[] values = { "true", "false" };
 | 
			
		||||
            JComboBox<String> combo = new JComboBox<String>(values);
 | 
			
		||||
            result = combo;
 | 
			
		||||
            combo.setSelectedItem(curValue);
 | 
			
		||||
            combo.addActionListener(this);
 | 
			
		||||
        } else if(editType instanceof MetaValueEnum){
 | 
			
		||||
            JComboBox<String> combo = new JComboBox<String>();
 | 
			
		||||
            result = combo;
 | 
			
		||||
            
 | 
			
		||||
            for(String posValue: ((MetaValueEnum)editType).getPosValues()){
 | 
			
		||||
                combo.addItem(posValue);
 | 
			
		||||
            }
 | 
			
		||||
            combo.setSelectedItem(curValue);
 | 
			
		||||
            combo.addActionListener(this);
 | 
			
		||||
        } else {
 | 
			
		||||
            result = new JTextField(curValue.toString());
 | 
			
		||||
        }
 | 
			
		||||
        curEditor = result;
 | 
			
		||||
        curEditor.setBackground(editColor);
 | 
			
		||||
        curEditor.addKeyListener(this);
 | 
			
		||||
    
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void actionPerformed(ActionEvent e) {
 | 
			
		||||
        if(e.getSource().equals(curEditor)){
 | 
			
		||||
            this.assign();
 | 
			
		||||
         }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void keyReleased(KeyEvent e) {
 | 
			
		||||
        if(curEditor != null){
 | 
			
		||||
            if(e.getSource() instanceof JTextField){
 | 
			
		||||
                AssignmentResult test = this.testAssignment();
 | 
			
		||||
                
 | 
			
		||||
                if(test.isValid()){
 | 
			
		||||
                    curEditor.setBackground(editColor);
 | 
			
		||||
                    
 | 
			
		||||
                    if(status != null){
 | 
			
		||||
                        status.setStatus("Current input valid.", false, false);
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    curEditor.setBackground(errorColor);
 | 
			
		||||
                    
 | 
			
		||||
                    if(status != null){
 | 
			
		||||
                        status.setStatus("Error: " + test.getErrorMessage(), false, false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } else if(e.getSource() instanceof JComboBox){
 | 
			
		||||
                /*Do nothing.*/
 | 
			
		||||
            }
 | 
			
		||||
        }     
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public void keyTyped(KeyEvent e) {}
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void keyPressed(KeyEvent e) {}
 | 
			
		||||
    
 | 
			
		||||
    public AssignmentResult testAssignment(){
 | 
			
		||||
        AssignmentResult result = new AssignmentResult(true, null);
 | 
			
		||||
        String value;
 | 
			
		||||
        
 | 
			
		||||
        if(curEditor != null){
 | 
			
		||||
            try {
 | 
			
		||||
                if((editType instanceof MetaValueNatural) || (editType instanceof MetaValueString)) {
 | 
			
		||||
                    JTextField source = (JTextField)curEditor;
 | 
			
		||||
                    value = source.getText();
 | 
			
		||||
                    editNode.testSetValue(value);
 | 
			
		||||
                } else {
 | 
			
		||||
                    // No validation required.
 | 
			
		||||
                }
 | 
			
		||||
            } catch(DataException ne){
 | 
			
		||||
                result = new AssignmentResult(false, "Invalid input: " + (ne.getMessage()).toLowerCase());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @SuppressWarnings("rawtypes")
 | 
			
		||||
    private AssignmentResult assign(){
 | 
			
		||||
        Object value = null;
 | 
			
		||||
        AssignmentResult test = this.testAssignment();
 | 
			
		||||
        
 | 
			
		||||
        if(test.isValid()){
 | 
			
		||||
            if(status != null){
 | 
			
		||||
                status.setStatus("Input valid.", false, false);
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            if(curEditor instanceof JTextField){
 | 
			
		||||
                value = ((JTextField)curEditor).getText();
 | 
			
		||||
            } else if(curEditor instanceof JComboBox){
 | 
			
		||||
                value = ((JComboBox) curEditor).getSelectedItem();
 | 
			
		||||
            }
 | 
			
		||||
            try {
 | 
			
		||||
                if(!editNode.getValue().equals(value)){
 | 
			
		||||
                    assert editNode.getOwner() != null: "Owner == null (" + editNode.getMetadata() + ")";
 | 
			
		||||
                    editNode.getOwner().setValue(editNode, value);
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            } catch (DataException e) {
 | 
			
		||||
                assert false: "this.testAssignment does not work properly";
 | 
			
		||||
            }
 | 
			
		||||
            curEditor.removeKeyListener(this);
 | 
			
		||||
            curEditor = null;
 | 
			
		||||
            editNode = null;
 | 
			
		||||
            editType = null;
 | 
			
		||||
            fireEditingStopped();
 | 
			
		||||
        } else if(status != null){
 | 
			
		||||
            status.setStatus("Error: Invalid input " + test.getErrorMessage().toLowerCase(), false, false);
 | 
			
		||||
        }
 | 
			
		||||
        return test;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,223 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.awt.Component;
 | 
			
		||||
import java.awt.Dimension;
 | 
			
		||||
import java.awt.Font;
 | 
			
		||||
import java.awt.font.FontRenderContext;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JLabel;
 | 
			
		||||
import javax.swing.JPopupMenu;
 | 
			
		||||
import javax.swing.JTree;
 | 
			
		||||
import javax.swing.UIManager;
 | 
			
		||||
import javax.swing.tree.DefaultMutableTreeNode;
 | 
			
		||||
import javax.swing.tree.DefaultTreeCellRenderer;
 | 
			
		||||
import javax.swing.tree.DefaultTreeModel;
 | 
			
		||||
import javax.swing.tree.TreeCellRenderer;
 | 
			
		||||
import javax.swing.tree.TreePath;
 | 
			
		||||
import javax.swing.tree.TreeSelectionModel;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.view.StatusPanel;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataConfigurationListener;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataNode;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataValue;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaElement;
 | 
			
		||||
 | 
			
		||||
public class DataElementTree extends JTree 
 | 
			
		||||
    implements DataConfigurationListener, TreeCellRenderer, DataNodePopupSupport 
 | 
			
		||||
{
 | 
			
		||||
    private static final long serialVersionUID = 5103341138480897742L;
 | 
			
		||||
    private final DataElement rootElement;
 | 
			
		||||
    private final DefaultMutableTreeNode rootNode;
 | 
			
		||||
    private final DefaultTreeModel model;
 | 
			
		||||
    private final DefaultTreeCellRenderer initialRenderer;
 | 
			
		||||
    private DataNodePopup popupController;
 | 
			
		||||
    private final StatusPanel status;
 | 
			
		||||
    
 | 
			
		||||
    public DataElementTree(DataElement rootElement, DataNodePopup popup, StatusPanel status){
 | 
			
		||||
        super();
 | 
			
		||||
        this.initialRenderer = new DefaultTreeCellRenderer();
 | 
			
		||||
        this.setCellRenderer(this);
 | 
			
		||||
        this.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
 | 
			
		||||
        this.setEditable(false);
 | 
			
		||||
        this.setRootVisible(true);
 | 
			
		||||
        this.setShowsRootHandles(true);
 | 
			
		||||
        this.rootElement = rootElement;
 | 
			
		||||
        this.status = status;
 | 
			
		||||
        this.rootElement.getOwner().addDataConfigurationListener(this);
 | 
			
		||||
        this.rootNode = new DefaultMutableTreeNode(this.rootElement);
 | 
			
		||||
        this.model = ((DefaultTreeModel)this.treeModel);
 | 
			
		||||
        this.model.setRoot(this.rootNode);
 | 
			
		||||
        this.initElement(this.rootNode, this.rootElement);
 | 
			
		||||
        if(this.rootNode.getChildCount() > 0){
 | 
			
		||||
            this.scrollPathToVisible(
 | 
			
		||||
                    new TreePath(
 | 
			
		||||
                            ((DefaultMutableTreeNode)this.rootNode.getFirstChild()).getPath()));
 | 
			
		||||
        }
 | 
			
		||||
        this.setSelectionPath(new TreePath(this.rootNode.getPath()));
 | 
			
		||||
        
 | 
			
		||||
        if(popup == null){
 | 
			
		||||
            this.popupController = new DataNodePopup();
 | 
			
		||||
        } else {
 | 
			
		||||
            this.popupController = popup;
 | 
			
		||||
        }
 | 
			
		||||
        this.popupController.registerPopupSupport(this);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private void initElement(DefaultMutableTreeNode parent, DataElement element){
 | 
			
		||||
        DefaultMutableTreeNode node;
 | 
			
		||||
        
 | 
			
		||||
        for(DataNode child: element.getChildren()){
 | 
			
		||||
            if(child instanceof DataElement){
 | 
			
		||||
                if(((MetaElement)child.getMetadata()).hasElementChildren()){
 | 
			
		||||
                    node = new DefaultMutableTreeNode(child);
 | 
			
		||||
                    this.model.insertNodeInto(node, parent, parent.getChildCount());
 | 
			
		||||
                    this.initElement(node, (DataElement)child);
 | 
			
		||||
                } else if(!((MetaElement)child.getMetadata()).hasValueChildren()){
 | 
			
		||||
                    node = new DefaultMutableTreeNode(child);
 | 
			
		||||
                    this.model.insertNodeInto(node, parent, parent.getChildCount());
 | 
			
		||||
                    this.initElement(node, (DataElement)child);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void nodeAdded(DataElement parent, DataNode nodeAdded) {
 | 
			
		||||
        DefaultMutableTreeNode parentNode, childNode;
 | 
			
		||||
        
 | 
			
		||||
        if(nodeAdded instanceof DataElement){
 | 
			
		||||
            parentNode = this.lookupNode(this.rootNode, parent);
 | 
			
		||||
            
 | 
			
		||||
            if(parentNode != null){
 | 
			
		||||
                if(((MetaElement)nodeAdded.getMetadata()).hasElementChildren()){
 | 
			
		||||
                    childNode = new DefaultMutableTreeNode(nodeAdded);
 | 
			
		||||
                    this.model.insertNodeInto(childNode, parentNode, parentNode.getChildCount());
 | 
			
		||||
                    this.scrollPathToVisible(new TreePath(childNode.getPath()));
 | 
			
		||||
                    this.initElement(childNode, (DataElement)nodeAdded);
 | 
			
		||||
                } else if(!((MetaElement)nodeAdded.getMetadata()).hasValueChildren()){
 | 
			
		||||
                    childNode = new DefaultMutableTreeNode(nodeAdded);
 | 
			
		||||
                    this.model.insertNodeInto(childNode, parentNode, parentNode.getChildCount());
 | 
			
		||||
                    this.scrollPathToVisible(new TreePath(childNode.getPath()));
 | 
			
		||||
                    this.initElement(childNode, (DataElement)nodeAdded);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this.repaint();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void nodeRemoved(DataElement parent, DataNode nodeRemoved) {
 | 
			
		||||
        DefaultMutableTreeNode node;
 | 
			
		||||
        
 | 
			
		||||
        if(nodeRemoved instanceof DataElement){
 | 
			
		||||
            node = this.lookupNode(this.rootNode, (DataElement)nodeRemoved);
 | 
			
		||||
            
 | 
			
		||||
            if(node != null){
 | 
			
		||||
                if(node.getParent() != null){
 | 
			
		||||
                    this.setSelectionPath(new TreePath(((DefaultMutableTreeNode)node.getParent()).getPath()));
 | 
			
		||||
                }
 | 
			
		||||
                if(node.getParent() != null){
 | 
			
		||||
                    this.model.removeNodeFromParent(node);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this.repaint();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void valueChanged(DataValue data, Object oldValue, Object newValue) {
 | 
			
		||||
        this.repaint();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private DefaultMutableTreeNode lookupNode(DefaultMutableTreeNode node, DataElement element){
 | 
			
		||||
        DefaultMutableTreeNode result = null;
 | 
			
		||||
        
 | 
			
		||||
        if(node.getUserObject().equals(element)){
 | 
			
		||||
            result = node;
 | 
			
		||||
        } else {
 | 
			
		||||
            for(int i=0; (i<node.getChildCount()) && (result == null); i++){
 | 
			
		||||
                result = this.lookupNode((DefaultMutableTreeNode)node.getChildAt(i), element);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
 | 
			
		||||
        Component result = null;
 | 
			
		||||
        JLabel temp;
 | 
			
		||||
        Object nodeValue;
 | 
			
		||||
        
 | 
			
		||||
        if(value instanceof DefaultMutableTreeNode){
 | 
			
		||||
            nodeValue = ((DefaultMutableTreeNode)value).getUserObject();
 | 
			
		||||
            
 | 
			
		||||
            if(nodeValue instanceof DataElement){
 | 
			
		||||
                temp = new JLabel(ConfigUtil.getExtendedDataElementString((DataElement)nodeValue));
 | 
			
		||||
                
 | 
			
		||||
                if(selected){
 | 
			
		||||
                    temp.setForeground(UIManager.getColor("Tree.selectionForeground"));
 | 
			
		||||
                    temp.setBackground(UIManager.getColor("Tree.selectionBackground"));
 | 
			
		||||
                    temp.setOpaque(true);                   
 | 
			
		||||
                } else {
 | 
			
		||||
                    temp.setForeground(UIManager.getColor("Tree.textForeground"));
 | 
			
		||||
                    temp.setBackground(UIManager.getColor("Tree.textBackground"));
 | 
			
		||||
                }
 | 
			
		||||
                temp.setFont(temp.getFont().deriveFont(Font.BOLD));
 | 
			
		||||
                Dimension dim = temp.getPreferredSize();
 | 
			
		||||
                
 | 
			
		||||
                if(dim != null){
 | 
			
		||||
                    FontRenderContext frc = new FontRenderContext(temp.getFont().getTransform(), false, false);
 | 
			
		||||
                    double width = temp.getFont().getStringBounds(temp.getText(), frc).getWidth();
 | 
			
		||||
                    dim.width = (int)width + 3;
 | 
			
		||||
                    temp.setPreferredSize(dim);
 | 
			
		||||
                    temp.setMinimumSize(dim);
 | 
			
		||||
                    
 | 
			
		||||
                }
 | 
			
		||||
                temp.setComponentOrientation(this.getComponentOrientation());
 | 
			
		||||
                
 | 
			
		||||
                result = temp;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        if(result == null){
 | 
			
		||||
            result = initialRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public DataNode getDataNodeAt(int x, int y) {
 | 
			
		||||
        DataNode retVal = null;
 | 
			
		||||
        TreePath path = this.getClosestPathForLocation(x, y);
 | 
			
		||||
 | 
			
		||||
        if (path != null) {
 | 
			
		||||
            this.setSelectionPath(path);
 | 
			
		||||
            retVal = (DataElement)((DefaultMutableTreeNode)path.getLastPathComponent()).getUserObject();
 | 
			
		||||
        }
 | 
			
		||||
        return retVal;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void showPopup(JPopupMenu popup, int x, int y) {
 | 
			
		||||
        popup.show(this, x, y);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setStatus(String message, boolean persistent, boolean busy) {
 | 
			
		||||
        if(this.status != null){
 | 
			
		||||
            this.status.setStatus(message, persistent, busy);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,50 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JMenuItem;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataNode;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaNode;
 | 
			
		||||
 | 
			
		||||
public class DataNodeMenuItem extends JMenuItem {
 | 
			
		||||
    private static final long serialVersionUID = -5909316541978936911L;
 | 
			
		||||
    private DataNode data;
 | 
			
		||||
    private MetaNode childMeta;
 | 
			
		||||
    private DataNodePopupSupport source;
 | 
			
		||||
    
 | 
			
		||||
    public DataNodeMenuItem(String name, DataNode data, MetaNode childMeta){
 | 
			
		||||
        super(name);
 | 
			
		||||
        this.data = data;
 | 
			
		||||
        this.childMeta = childMeta;
 | 
			
		||||
        this.source = null;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public DataNodeMenuItem(String name, DataNode data, MetaNode childMeta, DataNodePopupSupport source){
 | 
			
		||||
        super(name);
 | 
			
		||||
        this.data = data;
 | 
			
		||||
        this.childMeta = childMeta;
 | 
			
		||||
        this.source = source;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public DataNode getData(){
 | 
			
		||||
        return this.data;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public MetaNode getChildMeta(){
 | 
			
		||||
        return this.childMeta;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public DataNodePopupSupport getSource(){
 | 
			
		||||
        return this.source;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,440 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.awt.event.ActionEvent;
 | 
			
		||||
import java.awt.event.ActionListener;
 | 
			
		||||
import java.awt.event.MouseEvent;
 | 
			
		||||
import java.awt.event.MouseListener;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JMenu;
 | 
			
		||||
import javax.swing.JOptionPane;
 | 
			
		||||
import javax.swing.JPopupMenu;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.Report;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataAttribute;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataException;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataNode;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataValue;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaAttribute;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaNode;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaValue;
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.ConfigModeIntializer;
 | 
			
		||||
 | 
			
		||||
public class DataNodePopup implements MouseListener, ActionListener {
 | 
			
		||||
 | 
			
		||||
    private final Set<DataNodePopupSupport> popupSupport;
 | 
			
		||||
 | 
			
		||||
    public DataNodePopup() {
 | 
			
		||||
        this.popupSupport = Collections.synchronizedSet(new HashSet<DataNodePopupSupport>());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void unregisterPopupSupport(DataNodePopupSupport support){
 | 
			
		||||
        synchronized(this.popupSupport){
 | 
			
		||||
            if(this.popupSupport.contains(support)){
 | 
			
		||||
                support.removeMouseListener(this);
 | 
			
		||||
                this.popupSupport.remove(support);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void registerPopupSupport(DataNodePopupSupport support){
 | 
			
		||||
        synchronized(this.popupSupport){
 | 
			
		||||
            if(!this.popupSupport.contains(support)){
 | 
			
		||||
                support.addMouseListener(this);
 | 
			
		||||
                this.popupSupport.add(support);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void notifyStatus(String message, boolean persistent, boolean busy){
 | 
			
		||||
        synchronized(this.popupSupport){
 | 
			
		||||
            for(DataNodePopupSupport dp: this.popupSupport){
 | 
			
		||||
                dp.setStatus(message, persistent, busy);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private int countOccurrences(DataElement parent, MetaNode metaChild){
 | 
			
		||||
        int occurrences = 0;
 | 
			
		||||
 | 
			
		||||
        for(DataNode child: parent.getChildren()){
 | 
			
		||||
            if(metaChild.equals(child.getMetadata())){
 | 
			
		||||
                occurrences++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return occurrences;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private JPopupMenu getPopup(DataNodePopupSupport source, DataNode dn){
 | 
			
		||||
        DataNode parent;
 | 
			
		||||
        DataElement parentParent;
 | 
			
		||||
        DataNodeMenuItem reset, remove, add;
 | 
			
		||||
        MetaNode metaParent, meta;
 | 
			
		||||
        JMenu addMenu;
 | 
			
		||||
        int min, max, current;
 | 
			
		||||
 | 
			
		||||
        JPopupMenu result = new JPopupMenu("Actions");
 | 
			
		||||
 | 
			
		||||
        if (dn != null) {
 | 
			
		||||
            parent     = dn.getParent();
 | 
			
		||||
            meta       = dn.getMetadata();
 | 
			
		||||
        } else {
 | 
			
		||||
            parent = null;
 | 
			
		||||
            meta = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(parent != null){
 | 
			
		||||
            metaParent = parent.getMetadata();
 | 
			
		||||
        } else {
 | 
			
		||||
            metaParent = null;
 | 
			
		||||
        }
 | 
			
		||||
        addMenu    = null;
 | 
			
		||||
        reset      = null;
 | 
			
		||||
        remove     = null;
 | 
			
		||||
 | 
			
		||||
        if(dn instanceof DataValue){
 | 
			
		||||
            assert metaParent!=null: "Parent element == null";
 | 
			
		||||
            reset = new DataNodeMenuItem("Reset to default", dn, null);
 | 
			
		||||
            remove = new DataNodeMenuItem("Remove", parent, null);
 | 
			
		||||
 | 
			
		||||
            if(parent instanceof DataElement){
 | 
			
		||||
                addMenu = new JMenu("Add");
 | 
			
		||||
 | 
			
		||||
                for(MetaNode child: ((MetaElement)metaParent).getChildren()){
 | 
			
		||||
                    if(child instanceof MetaAttribute){
 | 
			
		||||
                        current = this.countOccurrences((DataElement)parent, child);
 | 
			
		||||
                        add = new DataNodeMenuItem(((MetaAttribute)child).getName(), parent, child);
 | 
			
		||||
 | 
			
		||||
                        if(current == 1){
 | 
			
		||||
                            add.setEnabled(false);
 | 
			
		||||
                        } else {
 | 
			
		||||
                            add.setEnabled(true);
 | 
			
		||||
                        }
 | 
			
		||||
                        add.setActionCommand("add");
 | 
			
		||||
                        add.addActionListener(this);
 | 
			
		||||
                        addMenu.add(add);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                parentParent = (DataElement)parent.getParent();
 | 
			
		||||
 | 
			
		||||
                if(parentParent != null){
 | 
			
		||||
                    current = this.countOccurrences((DataElement)parent.getParent(), parent.getMetadata());
 | 
			
		||||
                    min = ((MetaElement)metaParent).getMinOccurrences();
 | 
			
		||||
                    if (ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.COMMERCIAL_MODE && metaParent.getVersion().equals(ConfigModeIntializer.COMMERCIAL)) {
 | 
			
		||||
                        reset.setEnabled(false);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if(min == 0){
 | 
			
		||||
                        remove.setEnabled(true);
 | 
			
		||||
                    } else if(current > min){
 | 
			
		||||
                        remove.setEnabled(true);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        remove.setEnabled(false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } else if(parent instanceof DataAttribute){
 | 
			
		||||
                metaParent = parent.getMetadata();
 | 
			
		||||
                if (ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.COMMERCIAL_MODE && metaParent.getVersion().equals(ConfigModeIntializer.COMMERCIAL)) {
 | 
			
		||||
                    reset.setEnabled(false);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if(((MetaAttribute)metaParent).isRequired()){
 | 
			
		||||
                    remove.setEnabled(false);
 | 
			
		||||
                }
 | 
			
		||||
                result.add(remove);
 | 
			
		||||
            } else {
 | 
			
		||||
                assert false: "Unexpected parent type found: " + (parent==null ? parent: parent.getClass());
 | 
			
		||||
            }
 | 
			
		||||
        } else if(dn instanceof DataElement){
 | 
			
		||||
            addMenu = new JMenu("Add");
 | 
			
		||||
            remove = new DataNodeMenuItem("Remove", dn, null);
 | 
			
		||||
 | 
			
		||||
            min = ((MetaElement)meta).getMinOccurrences();
 | 
			
		||||
            current = this.countOccurrences((DataElement)dn.getParent(), meta);
 | 
			
		||||
 | 
			
		||||
            if(min < current){
 | 
			
		||||
                remove.setEnabled(true);
 | 
			
		||||
            } else {
 | 
			
		||||
                remove.setEnabled(false);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for(MetaNode child: ((MetaElement)meta).getChildren()){
 | 
			
		||||
                current = this.countOccurrences((DataElement)dn, child);
 | 
			
		||||
 | 
			
		||||
                if(child instanceof MetaElement){
 | 
			
		||||
                    add = new DataNodeMenuItem(((MetaElement)child).getName(), dn, child);
 | 
			
		||||
                    max = ((MetaElement)child).getMaxOccurrences();
 | 
			
		||||
 | 
			
		||||
                    if((max == 0) || (current < max)){
 | 
			
		||||
                        add.setEnabled(true);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        add.setEnabled(false);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                } else if(child instanceof MetaAttribute){
 | 
			
		||||
                    add = new DataNodeMenuItem(((MetaAttribute)child).getName(), dn, child);
 | 
			
		||||
 | 
			
		||||
                    if(current == 1){
 | 
			
		||||
                        add.setEnabled(false);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        add.setEnabled(true);
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    add = new DataNodeMenuItem("<NoName>", dn, child);
 | 
			
		||||
 | 
			
		||||
                    if(current == 1){
 | 
			
		||||
                        add.setEnabled(false);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        add.setEnabled(true);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                add.setActionCommand("add");
 | 
			
		||||
                add.addActionListener(this);
 | 
			
		||||
                addMenu.add(add);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        if(addMenu != null){
 | 
			
		||||
        	if (addMenu.getItemCount() == 0){
 | 
			
		||||
        		addMenu.setEnabled(false);
 | 
			
		||||
        	}
 | 
			
		||||
            result.add(addMenu);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        if(remove != null){
 | 
			
		||||
            remove.setActionCommand("remove");
 | 
			
		||||
            remove.addActionListener(this);
 | 
			
		||||
            result.add(remove);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(reset != null){
 | 
			
		||||
            result.addSeparator();
 | 
			
		||||
            reset.setActionCommand("reset");
 | 
			
		||||
            reset.addActionListener(this);
 | 
			
		||||
            result.add(reset);
 | 
			
		||||
        } else {
 | 
			
		||||
            //result.addSeparator();
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    @Override
 | 
			
		||||
    public void actionPerformed(ActionEvent e) {
 | 
			
		||||
        DataNodeMenuItem item;
 | 
			
		||||
        DataNode dataNode;
 | 
			
		||||
        MetaNode metaNode;
 | 
			
		||||
        DataElement dataDomain = null;
 | 
			
		||||
        Object source = e.getSource();
 | 
			
		||||
        String command = e.getActionCommand();
 | 
			
		||||
 | 
			
		||||
        try{
 | 
			
		||||
            if(source instanceof DataNodeMenuItem){
 | 
			
		||||
                item = (DataNodeMenuItem)source;
 | 
			
		||||
                if("remove".equals(command)){
 | 
			
		||||
                    dataNode = item.getData();
 | 
			
		||||
                    boolean remove = false;
 | 
			
		||||
                    if (dataNode.getOwner().isServiceElement(dataNode)) {
 | 
			
		||||
                        int value = JOptionPane.showConfirmDialog(null,
 | 
			
		||||
                                "Are you sure you want to remove this " + ConfigWindow.SERVICE_TEXT + "?", "Remove " + ConfigWindow.SERVICE_TEXT + " confirmation",
 | 
			
		||||
                                JOptionPane.YES_NO_OPTION);
 | 
			
		||||
                        if (value == JOptionPane.NO_OPTION) {
 | 
			
		||||
                            remove = true;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    if (!remove && dataNode.getDependencies() != null) {
 | 
			
		||||
                        for (DataNode dn : dataNode.getDependencies()) {
 | 
			
		||||
                            if(dn instanceof DataElement){
 | 
			
		||||
                                if (dn.getOwner().isServiceElement(dn)) {
 | 
			
		||||
                                    int value = JOptionPane.showConfirmDialog(null,
 | 
			
		||||
                                            "Are you sure you want to remove this " + ConfigWindow.SERVICE_TEXT + "?",
 | 
			
		||||
                                            "Remove " + ConfigWindow.SERVICE_TEXT + " confirmation", JOptionPane.YES_NO_OPTION);
 | 
			
		||||
                                    if (value == JOptionPane.NO_OPTION) {
 | 
			
		||||
                                        remove = true;
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                                if (!remove) {
 | 
			
		||||
                                    dn.getOwner().removeNode(dn);
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    if (!remove) {
 | 
			
		||||
                        dataNode.getOwner().removeNode(dataNode);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if ("removeService".equals(command)) {
 | 
			
		||||
                    boolean remove = false;
 | 
			
		||||
                    int value = JOptionPane.showConfirmDialog(null,
 | 
			
		||||
                            "Are you sure you want to remove this " + ConfigWindow.SERVICE_TEXT + "?",
 | 
			
		||||
                            "Remove " + ConfigWindow.SERVICE_TEXT + " confirmation", JOptionPane.YES_NO_OPTION);
 | 
			
		||||
                    if (value == JOptionPane.NO_OPTION) {
 | 
			
		||||
                        remove = true;
 | 
			
		||||
                    }
 | 
			
		||||
                    if (!remove) {
 | 
			
		||||
                        dataNode = item.getData();
 | 
			
		||||
                        dataDomain = dataNode.getOwner().findServiceDataElement(dataNode.getOwner().getRootElement(),
 | 
			
		||||
                                "Service", (DataElement) dataNode);
 | 
			
		||||
                        if (dataDomain != null) {
 | 
			
		||||
                            dataDomain.getOwner().removeNode(dataDomain);
 | 
			
		||||
                        } else {
 | 
			
		||||
                            this.notifyStatus("Error: failed to remove the " + ConfigWindow.SERVICE_TEXT + " ", false, false);
 | 
			
		||||
                        }
 | 
			
		||||
                        dataNode.getOwner().removeNode(dataNode);
 | 
			
		||||
                    }
 | 
			
		||||
                } else if ("add".equals(command)) {
 | 
			
		||||
                    dataNode = item.getData();
 | 
			
		||||
                    metaNode = item.getChildMeta();
 | 
			
		||||
                    if (dataNode.getOwner().isServiceElement(dataNode)
 | 
			
		||||
                            && ((MetaElement) metaNode).getName().equals("Service")) {
 | 
			
		||||
                        HashMap<String, MetaNode> service = new HashMap<String, MetaNode>();
 | 
			
		||||
                        for (MetaNode mn : ((MetaElement) dataNode.getOwner().getRootElement().getMetadata())
 | 
			
		||||
                                .getChildren()) {
 | 
			
		||||
                            if (!((MetaElement) mn).getName().equals("Domain")) {
 | 
			
		||||
                                service.put(((MetaElement) mn).getName(), mn);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        String[] serviceNames = service.keySet().toArray(new String[service.keySet().size()]);
 | 
			
		||||
                        String name = (String) JOptionPane.showInputDialog(null, "Please select a service to add.",
 | 
			
		||||
                                "Service selection", JOptionPane.QUESTION_MESSAGE, null, serviceNames, serviceNames[0]);
 | 
			
		||||
                        if (name != null) {
 | 
			
		||||
                            addService(dataNode.getOwner().getRootElement(), service.get(name));
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        if (dataNode instanceof DataElement) {
 | 
			
		||||
                            dataNode.getOwner().addNode((DataElement) dataNode, metaNode);
 | 
			
		||||
                        } else {
 | 
			
		||||
                            this.notifyStatus("Error: Unexpected type of parent found: '" + dataNode.getClass() + "'.",
 | 
			
		||||
                                    false, false);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                } else if ("addService".equals(command)) {
 | 
			
		||||
                    addService(item.getData(), item.getChildMeta());
 | 
			
		||||
                } else if("reset".equals(command)){
 | 
			
		||||
                    dataNode = item.getData();
 | 
			
		||||
                    dataNode.getOwner().setValue((DataValue)dataNode, ((MetaValue)dataNode.getMetadata()).getDefaultValue());
 | 
			
		||||
                } else {
 | 
			
		||||
                    this.notifyStatus("Warning: Action for command '" + command + "' not implemented.", false, false);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } catch(DataException de){
 | 
			
		||||
            Report.getInstance().writeErrorLog("DataNodePopup actionPerformed" + de.getMessage());
 | 
			
		||||
            this.notifyStatus("Error: " + de.getMessage(), false, false);
 | 
			
		||||
            StackTraceElement[] elements = de.getStackTrace();
 | 
			
		||||
            String error = "";
 | 
			
		||||
 | 
			
		||||
            for(int i=0; i<elements.length; i++){
 | 
			
		||||
                error += elements[i].getFileName() + ", " +
 | 
			
		||||
 elements[i].getMethodName() + ", "
 | 
			
		||||
                        + elements[i].getLineNumber() + "\n";
 | 
			
		||||
                if(i==0){
 | 
			
		||||
                    error = elements[i].getFileName() + ", " +
 | 
			
		||||
                            elements[i].getMethodName() + ", " + elements[i].getLineNumber();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            Report.getInstance().writeErrorLog("DataNodePopup actionPerformed\n DataException occurred:\n" + error);
 | 
			
		||||
        } catch(Exception ex){
 | 
			
		||||
            StackTraceElement[] elements = ex.getStackTrace();
 | 
			
		||||
            StringBuffer buf = new StringBuffer();
 | 
			
		||||
 | 
			
		||||
            for(int i=0; i<elements.length; i++){
 | 
			
		||||
                buf.append(elements[i].getFileName() + ", " +
 | 
			
		||||
 elements[i].getMethodName() + ", "
 | 
			
		||||
                        + elements[i].getLineNumber() + "\n");
 | 
			
		||||
            }
 | 
			
		||||
            String error = buf.toString();
 | 
			
		||||
            Report.getInstance().writeErrorLog(
 | 
			
		||||
                    "DataNodePopup actionPerformed\n Unhandled exception occurred:\n" + error);
 | 
			
		||||
            this.notifyStatus("Error: " + error, false, false);
 | 
			
		||||
            ex.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void mouseClicked(MouseEvent e) {
 | 
			
		||||
        DataNode dn;
 | 
			
		||||
        DataNodePopupSupport support;
 | 
			
		||||
        Object source = e.getSource();
 | 
			
		||||
 | 
			
		||||
        synchronized(popupSupport){
 | 
			
		||||
            if(popupSupport.contains(source)){
 | 
			
		||||
                if((e.getClickCount() == 1)) {
 | 
			
		||||
                    if(e.getButton() == MouseEvent.BUTTON3) {
 | 
			
		||||
                        support = (DataNodePopupSupport)source;
 | 
			
		||||
                        if (support != null) {
 | 
			
		||||
                            dn = support.getDataNodeAt(e.getX(), e.getY());
 | 
			
		||||
                            support.showPopup(this.getPopup(support, dn), e.getX(), e.getY());
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void addService(DataNode dataNode, MetaNode metaNode) throws DataException {
 | 
			
		||||
        if (dataNode instanceof DataElement) {
 | 
			
		||||
            if (ConfigModeIntializer.CONFIGURATOR_MODE != ConfigModeIntializer.LITE_MODE){
 | 
			
		||||
                String serviceName = null;
 | 
			
		||||
 | 
			
		||||
                String suggestedName = dataNode.getOwner().getMetaAttributeValue((MetaElement) metaNode, "name");
 | 
			
		||||
                /*
 | 
			
		||||
                 * generate a new name if there is already a service with the
 | 
			
		||||
                 * default name
 | 
			
		||||
                 */
 | 
			
		||||
                if (dataNode.getOwner().containsServiceName(suggestedName)) {
 | 
			
		||||
                    String tmp = suggestedName + "_1";
 | 
			
		||||
                    for (int i = 1; dataNode.getOwner().containsServiceName(tmp); i++) {
 | 
			
		||||
                        tmp = suggestedName + "_" + i;
 | 
			
		||||
                    }
 | 
			
		||||
                    suggestedName = tmp;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                serviceName = (String) JOptionPane.showInputDialog(null, "Please enter a service name:",
 | 
			
		||||
                        "Set the service name", JOptionPane.QUESTION_MESSAGE, null, null, suggestedName);
 | 
			
		||||
 | 
			
		||||
                if (serviceName != null) {
 | 
			
		||||
                    if (!dataNode.getOwner().containsServiceName(serviceName)) {
 | 
			
		||||
                        /* get the newly created service element */
 | 
			
		||||
                        dataNode = dataNode.getOwner().addNodeWithDependency((DataElement) dataNode, metaNode);
 | 
			
		||||
                        dataNode.getOwner().createDomainServiceForSerivce(dataNode, metaNode, serviceName);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        this.notifyStatus("Error: Servicename is already in use", false, false);
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    this.notifyStatus("Error: Please fill in a servicename", false, false);
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                /* get the newly created service element */
 | 
			
		||||
                dataNode.getOwner().addNode((DataElement) dataNode, metaNode);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            this.notifyStatus("Error: Unexpected type of parent found: '" + dataNode.getClass() + "'.", false, false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void mouseEntered(MouseEvent e) {}
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void mouseExited(MouseEvent e) {}
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void mousePressed(MouseEvent e) {}
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void mouseReleased(MouseEvent e) {}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,29 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.awt.event.MouseListener;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JPopupMenu;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataNode;
 | 
			
		||||
 | 
			
		||||
public interface DataNodePopupSupport {
 | 
			
		||||
    public DataNode getDataNodeAt(int x, int y);
 | 
			
		||||
    
 | 
			
		||||
    public void showPopup(JPopupMenu popup, int x, int y);
 | 
			
		||||
    
 | 
			
		||||
    public void setStatus(String message, boolean persistent, boolean busy);
 | 
			
		||||
    
 | 
			
		||||
    public void addMouseListener(MouseListener listener);
 | 
			
		||||
    
 | 
			
		||||
    public void removeMouseListener(MouseListener listener);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,163 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.awt.BorderLayout;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JPanel;
 | 
			
		||||
import javax.swing.JFrame;
 | 
			
		||||
import javax.swing.WindowConstants;
 | 
			
		||||
import javax.swing.JSplitPane;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.util.ConfigModeIntializer;
 | 
			
		||||
import org.eclipse.cyclonedds.common.view.StatusPanel;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaConfiguration;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JScrollPane;
 | 
			
		||||
import javax.swing.event.TreeSelectionEvent;
 | 
			
		||||
import javax.swing.event.TreeSelectionListener;
 | 
			
		||||
 | 
			
		||||
public class HelpWindow extends JFrame implements TreeSelectionListener {
 | 
			
		||||
    private static final long serialVersionUID = 11222322324L;
 | 
			
		||||
    private JPanel jContentPane = null;
 | 
			
		||||
    private JSplitPane eastWestSplitPane = null;
 | 
			
		||||
    private StatusPanel statusPanel = null;
 | 
			
		||||
    private MetaConfiguration metaConfiguration = null;
 | 
			
		||||
    private MetaElementTree elementTree = null;
 | 
			
		||||
    private JScrollPane elementTreeScrollPane = null;
 | 
			
		||||
    private JScrollPane docScrollPane = null;
 | 
			
		||||
    private MetaNodeDocPane docPane = null;
 | 
			
		||||
 | 
			
		||||
    public static final String    OSPL_HELP_WINDOW_TITLE      = "Vortex OpenSplice Configurator | Help";
 | 
			
		||||
    public static final String    LITE_HELP_WINDOW_TITLE      = "Vortex DDS Configurator | Help";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This is the default constructor
 | 
			
		||||
     */
 | 
			
		||||
    public HelpWindow(MetaConfiguration metaConfiguration) {
 | 
			
		||||
        super();
 | 
			
		||||
        this.metaConfiguration = metaConfiguration;
 | 
			
		||||
        initialize();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes this
 | 
			
		||||
     * 
 | 
			
		||||
     * @return void
 | 
			
		||||
     */
 | 
			
		||||
    private void initialize() {
 | 
			
		||||
        this.setSize(640, 480);
 | 
			
		||||
        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
 | 
			
		||||
        this.setContentPane(getJContentPane());
 | 
			
		||||
        setWindowTitle(ConfigModeIntializer.CONFIGURATOR_MODE);
 | 
			
		||||
        getElementTree().getSelectionModel().addTreeSelectionListener(this);
 | 
			
		||||
        getDocPane().setNode(getElementTree().getSelectedMetaElement());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setWindowTitle (int configMode) {
 | 
			
		||||
        String windowTitle = "Configurator | Help";
 | 
			
		||||
        if (configMode == ConfigModeIntializer.LITE_MODE) {
 | 
			
		||||
            windowTitle = LITE_HELP_WINDOW_TITLE;
 | 
			
		||||
        } else {
 | 
			
		||||
            windowTitle = OSPL_HELP_WINDOW_TITLE;
 | 
			
		||||
        }
 | 
			
		||||
        this.setTitle(windowTitle);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes jContentPane
 | 
			
		||||
     * 
 | 
			
		||||
     * @return javax.swing.JPanel
 | 
			
		||||
     */
 | 
			
		||||
    private JPanel getJContentPane() {
 | 
			
		||||
        if (jContentPane == null) {
 | 
			
		||||
            jContentPane = new JPanel();
 | 
			
		||||
            jContentPane.setLayout(new BorderLayout());
 | 
			
		||||
            jContentPane.add(getEastWestSplitPane(), BorderLayout.CENTER);
 | 
			
		||||
            jContentPane.add(getStatusPanel(), BorderLayout.SOUTH);
 | 
			
		||||
        }
 | 
			
		||||
        return jContentPane;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes eastWestSplitPane	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JSplitPane	
 | 
			
		||||
     */
 | 
			
		||||
    private JSplitPane getEastWestSplitPane() {
 | 
			
		||||
        if (eastWestSplitPane == null) {
 | 
			
		||||
            eastWestSplitPane = new JSplitPane();
 | 
			
		||||
            eastWestSplitPane.setDividerSize(5);
 | 
			
		||||
            eastWestSplitPane.setDividerLocation(250);
 | 
			
		||||
            eastWestSplitPane.setLeftComponent(getElementTreeScrollPane());
 | 
			
		||||
            eastWestSplitPane.setRightComponent(getDocScrollPane());
 | 
			
		||||
        }
 | 
			
		||||
        return eastWestSplitPane;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private StatusPanel getStatusPanel(){
 | 
			
		||||
        if(this.statusPanel == null){
 | 
			
		||||
            this.statusPanel = new StatusPanel(800, "", false, false);
 | 
			
		||||
        }
 | 
			
		||||
        return this.statusPanel;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private MetaElementTree getElementTree(){
 | 
			
		||||
        if(this.elementTree == null){
 | 
			
		||||
            this.elementTree = new MetaElementTree(metaConfiguration.getRootElement(), getStatusPanel());
 | 
			
		||||
        }
 | 
			
		||||
        return this.elementTree;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes elementTreeScrollPane	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JScrollPane	
 | 
			
		||||
     */
 | 
			
		||||
    private JScrollPane getElementTreeScrollPane() {
 | 
			
		||||
        if (elementTreeScrollPane == null) {
 | 
			
		||||
            elementTreeScrollPane = new JScrollPane();
 | 
			
		||||
            elementTreeScrollPane.setViewportView(getElementTree());
 | 
			
		||||
        }
 | 
			
		||||
        return elementTreeScrollPane;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes docScrollPane	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JScrollPane	
 | 
			
		||||
     */
 | 
			
		||||
    private JScrollPane getDocScrollPane() {
 | 
			
		||||
        if (docScrollPane == null) {
 | 
			
		||||
            docScrollPane = new JScrollPane();
 | 
			
		||||
            docScrollPane.setViewportView(getDocPane());
 | 
			
		||||
        }
 | 
			
		||||
        return docScrollPane;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes codPane	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JEditorPane	
 | 
			
		||||
     */
 | 
			
		||||
    private MetaNodeDocPane getDocPane() {
 | 
			
		||||
        if (docPane == null) {
 | 
			
		||||
            docPane = new MetaNodeDocPane();
 | 
			
		||||
        }
 | 
			
		||||
        return docPane;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void valueChanged(TreeSelectionEvent e) {
 | 
			
		||||
        getDocPane().setNode(getElementTree().getSelectedMetaElement());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,139 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.awt.Component;
 | 
			
		||||
import java.awt.Font;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JLabel;
 | 
			
		||||
import javax.swing.JTree;
 | 
			
		||||
import javax.swing.UIManager;
 | 
			
		||||
import javax.swing.event.TreeSelectionEvent;
 | 
			
		||||
import javax.swing.event.TreeSelectionListener;
 | 
			
		||||
import javax.swing.tree.DefaultMutableTreeNode;
 | 
			
		||||
import javax.swing.tree.DefaultTreeCellRenderer;
 | 
			
		||||
import javax.swing.tree.DefaultTreeModel;
 | 
			
		||||
import javax.swing.tree.TreeCellRenderer;
 | 
			
		||||
import javax.swing.tree.TreePath;
 | 
			
		||||
import javax.swing.tree.TreeSelectionModel;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.view.StatusPanel;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaNode;
 | 
			
		||||
 | 
			
		||||
@SuppressWarnings("serial")
 | 
			
		||||
public class MetaElementTree extends JTree implements TreeCellRenderer, TreeSelectionListener{
 | 
			
		||||
    private final DefaultMutableTreeNode rootNode;
 | 
			
		||||
    private final MetaElement rootElement;
 | 
			
		||||
    private final DefaultTreeModel model;
 | 
			
		||||
    private final DefaultTreeCellRenderer initialRenderer;
 | 
			
		||||
    private final StatusPanel status;
 | 
			
		||||
    
 | 
			
		||||
    public MetaElementTree(MetaElement rootElement, StatusPanel status){
 | 
			
		||||
        super();
 | 
			
		||||
        this.initialRenderer = new DefaultTreeCellRenderer();
 | 
			
		||||
        this.rootElement     = rootElement;
 | 
			
		||||
        this.status          = status;
 | 
			
		||||
        this.rootNode        = new DefaultMutableTreeNode(this.rootElement);
 | 
			
		||||
        this.model           = ((DefaultTreeModel)this.treeModel);
 | 
			
		||||
        this.model.setRoot(this.rootNode);
 | 
			
		||||
        this.setCellRenderer(this);
 | 
			
		||||
        this.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
 | 
			
		||||
        this.setEditable(false);
 | 
			
		||||
        this.setRootVisible(true);
 | 
			
		||||
        this.setShowsRootHandles(true);
 | 
			
		||||
        this.initElement(this.rootNode, this.rootElement);
 | 
			
		||||
        
 | 
			
		||||
        if(this.rootNode.getChildCount() > 0){
 | 
			
		||||
            this.scrollPathToVisible(
 | 
			
		||||
                    new TreePath(
 | 
			
		||||
                            ((DefaultMutableTreeNode)this.rootNode.getFirstChild()).getPath()));
 | 
			
		||||
        }
 | 
			
		||||
        this.getSelectionModel().addTreeSelectionListener(this);
 | 
			
		||||
        this.setSelectionPath(new TreePath(this.rootNode.getPath()));
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private void initElement(DefaultMutableTreeNode parent, MetaElement element){
 | 
			
		||||
        DefaultMutableTreeNode node;
 | 
			
		||||
        
 | 
			
		||||
        for(MetaNode child: element.getChildren()){
 | 
			
		||||
            if(child instanceof MetaElement){
 | 
			
		||||
                node = new DefaultMutableTreeNode(child);
 | 
			
		||||
                this.model.insertNodeInto(node, parent, parent.getChildCount());
 | 
			
		||||
                this.initElement(node, (MetaElement)child);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
 | 
			
		||||
        Component result = null;
 | 
			
		||||
        JLabel temp;
 | 
			
		||||
        Object nodeValue;
 | 
			
		||||
        
 | 
			
		||||
        if(value instanceof DefaultMutableTreeNode){
 | 
			
		||||
            nodeValue = ((DefaultMutableTreeNode)value).getUserObject();
 | 
			
		||||
            
 | 
			
		||||
            if(nodeValue instanceof MetaElement){
 | 
			
		||||
                temp = new JLabel(ConfigUtil.getMetaElementString((MetaElement)nodeValue));
 | 
			
		||||
                
 | 
			
		||||
                if(selected){
 | 
			
		||||
                    temp.setForeground(UIManager.getColor("Tree.selectionForeground"));
 | 
			
		||||
                    temp.setBackground(UIManager.getColor("Tree.selectionBackground"));
 | 
			
		||||
                    temp.setOpaque(true);                   
 | 
			
		||||
                } else {
 | 
			
		||||
                    temp.setForeground(UIManager.getColor("Tree.textForeground"));
 | 
			
		||||
                    temp.setBackground(UIManager.getColor("Tree.textBackground"));
 | 
			
		||||
                }
 | 
			
		||||
                //temp.setFont(temp.getFont().deriveFont(Font.PLAIN));
 | 
			
		||||
                temp.setFont(temp.getFont().deriveFont(Font.BOLD));
 | 
			
		||||
                result = temp;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        if(result == null){
 | 
			
		||||
            result = initialRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public MetaElement getSelectedMetaElement(){
 | 
			
		||||
        MetaElement result = null;
 | 
			
		||||
        TreePath path      = this.getSelectionPath();
 | 
			
		||||
        
 | 
			
		||||
        if(path != null){
 | 
			
		||||
            result = (MetaElement)
 | 
			
		||||
                ((DefaultMutableTreeNode)path.getLastPathComponent()).getUserObject();
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public MetaElement getMetaNodeAt(int x, int y) {
 | 
			
		||||
        MetaElement retVal = null;
 | 
			
		||||
        TreePath path = this.getClosestPathForLocation(x, y);
 | 
			
		||||
        if (path != null) {
 | 
			
		||||
            this.setSelectionPath(path);
 | 
			
		||||
            retVal = (MetaElement)((DefaultMutableTreeNode)path.getLastPathComponent()).getUserObject();
 | 
			
		||||
        }
 | 
			
		||||
        return retVal;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void valueChanged(TreeSelectionEvent e) {
 | 
			
		||||
        MetaElement me = this.getSelectedMetaElement();
 | 
			
		||||
        
 | 
			
		||||
        if((me != null) && (status != null)){
 | 
			
		||||
            status.setStatus("Element '" + me.getName() + "' selected.", true);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,206 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.io.StringWriter;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JEditorPane;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaAttribute;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaNode;
 | 
			
		||||
 | 
			
		||||
@SuppressWarnings("serial")
 | 
			
		||||
public class MetaNodeDocPane extends JEditorPane {
 | 
			
		||||
    private boolean showElementName;
 | 
			
		||||
    private boolean showChildrenAttributes;
 | 
			
		||||
    private static final String fontStyle = "font-family:Sans-serif";
 | 
			
		||||
    
 | 
			
		||||
    public MetaNodeDocPane(){
 | 
			
		||||
        super("text/html", "No selection");
 | 
			
		||||
        this.init(true, true);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public MetaNodeDocPane(boolean showElementName, boolean showChildrenAttributes){
 | 
			
		||||
        super("text/html", "No selection");
 | 
			
		||||
        this.init(showElementName, showChildrenAttributes);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private void init(boolean showElementName, boolean showChildrenAttributes){
 | 
			
		||||
        this.setEditable(false);
 | 
			
		||||
        this.showElementName = showElementName;
 | 
			
		||||
        this.showChildrenAttributes = showChildrenAttributes;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setNode(MetaNode node){
 | 
			
		||||
        String doc;
 | 
			
		||||
        MetaNode[] children;
 | 
			
		||||
        MetaAttribute attribute;
 | 
			
		||||
        
 | 
			
		||||
        int attributeChildrenCount = 0;
 | 
			
		||||
        
 | 
			
		||||
        StringWriter writer = new StringWriter();
 | 
			
		||||
        
 | 
			
		||||
        if(node == null){
 | 
			
		||||
            writer.write("No element selected.");
 | 
			
		||||
        } else {
 | 
			
		||||
            doc = this.layoutDoc(node.getDoc());
 | 
			
		||||
            
 | 
			
		||||
            if(node instanceof MetaElement){
 | 
			
		||||
                if(this.showElementName){
 | 
			
		||||
                    int maxOcc = ((MetaElement)node).getMaxOccurrences();
 | 
			
		||||
                    int minOcc = ((MetaElement)node).getMinOccurrences();
 | 
			
		||||
                    String occ;
 | 
			
		||||
                    
 | 
			
		||||
                    if(maxOcc == Integer.MAX_VALUE){
 | 
			
		||||
                        occ = "occurrences: " + minOcc + " - " + "*";
 | 
			
		||||
                    } else {
 | 
			
		||||
                        occ = "occurrences: " + minOcc + " - " + maxOcc;
 | 
			
		||||
                    }
 | 
			
		||||
                    writer.write("<h1>" + ((MetaElement)node).getName());
 | 
			
		||||
 | 
			
		||||
                    String dimension = node.getDimension();
 | 
			
		||||
 | 
			
		||||
                    if (dimension != null) {
 | 
			
		||||
                        writer.write(" <font size=\"-1\">(" + occ
 | 
			
		||||
                                + " and dimension: " + dimension
 | 
			
		||||
                                + ")</font></h1>");
 | 
			
		||||
                    } else {
 | 
			
		||||
                        writer.write(" <font size=\"-1\">(" + occ
 | 
			
		||||
                                + ")</font></h1>");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                writer.write("<font style=\"" + MetaNodeDocPane.fontStyle + "\">" + doc + "</font>");
 | 
			
		||||
                children = ((MetaElement)node).getChildren();
 | 
			
		||||
                
 | 
			
		||||
                for(MetaNode mn: children){
 | 
			
		||||
                    if(mn instanceof MetaAttribute){
 | 
			
		||||
                        attributeChildrenCount++;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if(this.showChildrenAttributes){
 | 
			
		||||
                    if(attributeChildrenCount > 0){
 | 
			
		||||
                        writer.write("<h2>Attributes</h2>");
 | 
			
		||||
                        
 | 
			
		||||
                        for(MetaNode mn: children){
 | 
			
		||||
                            if(mn instanceof MetaAttribute){
 | 
			
		||||
                                this.writeNode(writer, mn);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        writer.write("<h2>Attributes</h2>Element has no attributes");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } else if(node instanceof MetaAttribute){
 | 
			
		||||
                attribute = (MetaAttribute)node;
 | 
			
		||||
                
 | 
			
		||||
                if(this.showElementName){
 | 
			
		||||
                    writer.write("<h1>" + attribute.getName() + "(");
 | 
			
		||||
                    
 | 
			
		||||
                    if(attribute.isRequired()){
 | 
			
		||||
                        writer.write("required");
 | 
			
		||||
                    } else {
 | 
			
		||||
                        writer.write("optional");
 | 
			
		||||
                    }
 | 
			
		||||
                    String dimension = attribute.getDimension();
 | 
			
		||||
 | 
			
		||||
                    if (dimension != null) {
 | 
			
		||||
                        writer.write(" and dimension: ");
 | 
			
		||||
                        writer.write(dimension);
 | 
			
		||||
                    }
 | 
			
		||||
                    writer.write(")</h1> -");
 | 
			
		||||
                }
 | 
			
		||||
                writer.write("<font style=\"" + MetaNodeDocPane.fontStyle + "\">" + doc + "</font>");
 | 
			
		||||
            } else {
 | 
			
		||||
                writer.write("<font style=\"" + MetaNodeDocPane.fontStyle + "\">" + doc + "</font>");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this.setText(writer.toString());
 | 
			
		||||
        this.setCaretPosition(0);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    private void writeNode(StringWriter writer, MetaNode node){
 | 
			
		||||
        MetaElement element;
 | 
			
		||||
        MetaAttribute attribute;
 | 
			
		||||
        String doc;
 | 
			
		||||
        String dimension = node.getDimension();
 | 
			
		||||
        
 | 
			
		||||
        if(node instanceof MetaElement){
 | 
			
		||||
            element = (MetaElement)node;
 | 
			
		||||
            writer.write("<h3>" + element.getName());
 | 
			
		||||
            writer.write(" (occurrences : " + element.getMinOccurrences()
 | 
			
		||||
                    + " - " + element.getMaxOccurrences());
 | 
			
		||||
 | 
			
		||||
            if (dimension != null) {
 | 
			
		||||
                writer.write(" dimension: " + dimension);
 | 
			
		||||
            }
 | 
			
		||||
            writer.write(")</h3>");
 | 
			
		||||
        } else if(node instanceof MetaAttribute){
 | 
			
		||||
            attribute = (MetaAttribute)node;
 | 
			
		||||
            writer.write("<h3>" + attribute.getName() + " ("); 
 | 
			
		||||
            
 | 
			
		||||
            if(attribute.isRequired()){
 | 
			
		||||
                writer.write("required");
 | 
			
		||||
            } else {
 | 
			
		||||
                writer.write("optional");
 | 
			
		||||
            }
 | 
			
		||||
            if (dimension != null) {
 | 
			
		||||
                writer.write(" and dimension: " + dimension);
 | 
			
		||||
            }
 | 
			
		||||
            writer.write(")</h3>");
 | 
			
		||||
        }
 | 
			
		||||
        doc = this.layoutDoc(node.getDoc());
 | 
			
		||||
        writer.write("<font style=\"" + MetaNodeDocPane.fontStyle + "\">" + doc + "</font>");
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private String layoutDoc(String doc){
 | 
			
		||||
        String temp;
 | 
			
		||||
        char c;
 | 
			
		||||
        StringWriter writer = new StringWriter();
 | 
			
		||||
        
 | 
			
		||||
        if(doc == null){
 | 
			
		||||
            temp = "No description available.";
 | 
			
		||||
        } else {
 | 
			
		||||
            temp = doc;
 | 
			
		||||
        }
 | 
			
		||||
        temp = temp.trim();
 | 
			
		||||
        
 | 
			
		||||
        if(temp.length() == 0){
 | 
			
		||||
            temp = "No description available.";
 | 
			
		||||
        } else {
 | 
			
		||||
            if(temp.startsWith("<p>")){
 | 
			
		||||
                temp = temp.substring(3);
 | 
			
		||||
                temp = temp.replaceFirst("</p>", " ");
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            for(int i=0; i<temp.length(); i++){
 | 
			
		||||
               c = temp.charAt(i);
 | 
			
		||||
               
 | 
			
		||||
               if((c != '\n') && (c != '\t')){
 | 
			
		||||
                   if(c == ' '){
 | 
			
		||||
                       if((i+1)<temp.length()){
 | 
			
		||||
                           if(temp.charAt(i+1) != ' '){
 | 
			
		||||
                               writer.write(c);
 | 
			
		||||
                           }
 | 
			
		||||
                       } else {
 | 
			
		||||
                           writer.write(c);
 | 
			
		||||
                       }
 | 
			
		||||
                   } else {
 | 
			
		||||
                       writer.write(c);
 | 
			
		||||
                   }
 | 
			
		||||
               }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return writer.toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,273 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
package org.eclipse.cyclonedds.config.swing;
 | 
			
		||||
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
import java.awt.Font;
 | 
			
		||||
import java.awt.GridBagConstraints;
 | 
			
		||||
import java.awt.GridBagLayout;
 | 
			
		||||
 | 
			
		||||
import javax.swing.BorderFactory;
 | 
			
		||||
import javax.swing.JComponent;
 | 
			
		||||
import javax.swing.JPanel;
 | 
			
		||||
import javax.swing.JScrollPane;
 | 
			
		||||
import javax.swing.JSplitPane;
 | 
			
		||||
import javax.swing.TransferHandler;
 | 
			
		||||
import javax.swing.border.TitledBorder;
 | 
			
		||||
import javax.swing.event.ListSelectionEvent;
 | 
			
		||||
import javax.swing.event.ListSelectionListener;
 | 
			
		||||
import javax.swing.event.TreeSelectionEvent;
 | 
			
		||||
import javax.swing.event.TreeSelectionListener;
 | 
			
		||||
import javax.swing.tree.DefaultMutableTreeNode;
 | 
			
		||||
import javax.swing.tree.TreePath;
 | 
			
		||||
 | 
			
		||||
import org.eclipse.cyclonedds.common.view.StatusPanel;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataAttribute;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataNode;
 | 
			
		||||
import org.eclipse.cyclonedds.config.data.DataValue;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaAttribute;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaElement;
 | 
			
		||||
import org.eclipse.cyclonedds.config.meta.MetaNode;
 | 
			
		||||
 | 
			
		||||
public class ServicePanel extends JPanel implements TreeSelectionListener, ListSelectionListener {
 | 
			
		||||
 | 
			
		||||
    private static final long serialVersionUID = 1L;
 | 
			
		||||
    private JSplitPane northSouthSplitPane = null;
 | 
			
		||||
    private MetaNodeDocPane docPane = null;
 | 
			
		||||
    private JScrollPane docScrollPane = null;
 | 
			
		||||
    private JSplitPane eastWestSplitPane = null;
 | 
			
		||||
    private JScrollPane elementTreeScrollPane = null;
 | 
			
		||||
    private DataElementTree configurationElementTree = null;
 | 
			
		||||
    private JScrollPane tableScrollPane = null;
 | 
			
		||||
    private DataElementTable configurationTable = null;
 | 
			
		||||
    private DataElement serviceElement = null;
 | 
			
		||||
    private DataNodePopup popupController = null;
 | 
			
		||||
    private StatusPanel status = null;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * This is the default constructor
 | 
			
		||||
     */
 | 
			
		||||
    public ServicePanel(DataElement serviceElement, StatusPanel status) {
 | 
			
		||||
        super();
 | 
			
		||||
        this.serviceElement = serviceElement;
 | 
			
		||||
        this.popupController = new DataNodePopup();
 | 
			
		||||
        this.status = status;
 | 
			
		||||
        initialize();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public DataElement getService(){
 | 
			
		||||
        return this.serviceElement;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public DataElementTable getConfigurationTable() {
 | 
			
		||||
        if (configurationTable == null) {
 | 
			
		||||
            configurationTable = new DataElementTable(this.popupController, serviceElement, this.status);
 | 
			
		||||
            configurationTable.getSelectionModel().addListSelectionListener(this);
 | 
			
		||||
        }
 | 
			
		||||
        return configurationTable;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void valueChanged(TreeSelectionEvent e) {
 | 
			
		||||
        TreePath selectionPath = e.getNewLeadSelectionPath();
 | 
			
		||||
        
 | 
			
		||||
        if(selectionPath != null){
 | 
			
		||||
            this.getConfigurationTable().getSelectionModel().clearSelection();
 | 
			
		||||
            DataElement selection = (DataElement)(
 | 
			
		||||
                                        ((DefaultMutableTreeNode)(
 | 
			
		||||
                                                selectionPath.getLastPathComponent())).getUserObject());
 | 
			
		||||
            this.configurationTable.getEditor().stopCellEditing();
 | 
			
		||||
            ((DataElementTableModel)this.configurationTable.getModel()).setElement(selection);
 | 
			
		||||
            this.updateDocument(selection);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void valueChanged(ListSelectionEvent e) {
 | 
			
		||||
        if(!e.getValueIsAdjusting()){
 | 
			
		||||
            int selectedRow = this.getConfigurationTable().getSelectedRow();
 | 
			
		||||
            
 | 
			
		||||
            if(selectedRow != -1){
 | 
			
		||||
                this.getConfigurationElementTree().getSelectionModel().clearSelection();
 | 
			
		||||
                DataNode selection = this.getConfigurationTable().getDataNodeAt(selectedRow);
 | 
			
		||||
                this.updateDocument(selection);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setTransferHandler(TransferHandler t){
 | 
			
		||||
        super.setTransferHandler(t);
 | 
			
		||||
        int count = this.getComponentCount();
 | 
			
		||||
        
 | 
			
		||||
        for(int i=0; i<count; i++){
 | 
			
		||||
            if(this.getComponent(i) instanceof JComponent){
 | 
			
		||||
                ((JComponent)this.getComponent(i)).setTransferHandler(t);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this.getConfigurationElementTree().setTransferHandler(t);
 | 
			
		||||
        this.getConfigurationTable().setTransferHandler(t);
 | 
			
		||||
        this.getDocPane().setTransferHandler(t);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes this
 | 
			
		||||
     * 
 | 
			
		||||
     * @return void
 | 
			
		||||
     */
 | 
			
		||||
    private void initialize() {
 | 
			
		||||
        GridBagConstraints gridBagConstraints = new GridBagConstraints();
 | 
			
		||||
        gridBagConstraints.fill = GridBagConstraints.BOTH;
 | 
			
		||||
        gridBagConstraints.gridy = 0;
 | 
			
		||||
        gridBagConstraints.weightx = 1.0;
 | 
			
		||||
        gridBagConstraints.weighty = 1.0;
 | 
			
		||||
        gridBagConstraints.gridx = 0;
 | 
			
		||||
        this.setSize(800, 540);
 | 
			
		||||
        this.setLayout(new GridBagLayout());
 | 
			
		||||
        this.add(getNorthSouthSplitPane(), gridBagConstraints);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private JSplitPane getNorthSouthSplitPane() {
 | 
			
		||||
        if (northSouthSplitPane == null) {
 | 
			
		||||
            northSouthSplitPane = new JSplitPane();
 | 
			
		||||
            northSouthSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
 | 
			
		||||
            northSouthSplitPane.setDividerLocation(300);
 | 
			
		||||
            northSouthSplitPane.setBackground(Color.white);
 | 
			
		||||
            northSouthSplitPane.setLeftComponent(getEastWestSplitPane());
 | 
			
		||||
            northSouthSplitPane.setRightComponent(getDocScrollPane());
 | 
			
		||||
            northSouthSplitPane.setDividerSize(5);
 | 
			
		||||
        }
 | 
			
		||||
        return northSouthSplitPane;
 | 
			
		||||
    } 
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes mainSplitPane	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JSplitPane	
 | 
			
		||||
     */
 | 
			
		||||
    private JSplitPane getEastWestSplitPane() {
 | 
			
		||||
        if (eastWestSplitPane == null) {
 | 
			
		||||
            eastWestSplitPane = new JSplitPane();
 | 
			
		||||
            eastWestSplitPane.setDividerLocation(330);
 | 
			
		||||
            eastWestSplitPane.setBackground(Color.white);
 | 
			
		||||
            eastWestSplitPane.setLeftComponent(getElementTreeScrollPane());
 | 
			
		||||
            eastWestSplitPane.setRightComponent(getTableScrollPane());
 | 
			
		||||
            eastWestSplitPane.setDividerSize(5);
 | 
			
		||||
        }
 | 
			
		||||
        return eastWestSplitPane;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes elementTreeScrollPane	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JScrollPane	
 | 
			
		||||
     */
 | 
			
		||||
    private JScrollPane getElementTreeScrollPane() {
 | 
			
		||||
        if (elementTreeScrollPane == null) {
 | 
			
		||||
            elementTreeScrollPane = new JScrollPane();
 | 
			
		||||
            elementTreeScrollPane.setBorder(
 | 
			
		||||
                    BorderFactory.createTitledBorder(null, "Elements", 
 | 
			
		||||
                            TitledBorder.LEFT, TitledBorder.BOTTOM, 
 | 
			
		||||
                            new Font("Dialog", Font.BOLD, 12), 
 | 
			
		||||
                            new Color(51, 51, 51)));
 | 
			
		||||
            elementTreeScrollPane.setViewportView(getConfigurationElementTree());
 | 
			
		||||
            elementTreeScrollPane.setBackground(Color.WHITE);
 | 
			
		||||
        }
 | 
			
		||||
        return elementTreeScrollPane;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes configurationElementTree	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JTree	
 | 
			
		||||
     */
 | 
			
		||||
    private DataElementTree getConfigurationElementTree() {
 | 
			
		||||
        if (configurationElementTree == null) {
 | 
			
		||||
            configurationElementTree = new DataElementTree(serviceElement, null, this.status);
 | 
			
		||||
            configurationElementTree.addTreeSelectionListener(this);
 | 
			
		||||
            this.updateDocument(serviceElement);
 | 
			
		||||
        }
 | 
			
		||||
        return configurationElementTree;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method initializes tableScrollPane	
 | 
			
		||||
     * 	
 | 
			
		||||
     * @return javax.swing.JScrollPane	
 | 
			
		||||
     */
 | 
			
		||||
    private JScrollPane getTableScrollPane() {
 | 
			
		||||
        if (tableScrollPane == null) {
 | 
			
		||||
            tableScrollPane = new JScrollPane();
 | 
			
		||||
            tableScrollPane.setViewportView(getConfigurationTable());
 | 
			
		||||
            tableScrollPane.setBorder(BorderFactory.createTitledBorder(null, "Attributes", TitledBorder.RIGHT, TitledBorder.BOTTOM, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
 | 
			
		||||
            //tableScrollPane.setBackground(Color.WHITE);
 | 
			
		||||
        }
 | 
			
		||||
        return tableScrollPane;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private JScrollPane getDocScrollPane() {
 | 
			
		||||
        if (docScrollPane == null) {
 | 
			
		||||
            docScrollPane = new JScrollPane();
 | 
			
		||||
            docScrollPane.setViewportView(getDocPane());
 | 
			
		||||
            docScrollPane.setBorder(BorderFactory.createTitledBorder(null, "Documentation", TitledBorder.LEFT, TitledBorder.BOTTOM, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
 | 
			
		||||
            docScrollPane.setBackground(Color.WHITE);
 | 
			
		||||
        }
 | 
			
		||||
        return docScrollPane;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private MetaNodeDocPane getDocPane(){
 | 
			
		||||
        if (docPane == null) {
 | 
			
		||||
            docPane = new MetaNodeDocPane(false, false);
 | 
			
		||||
        }
 | 
			
		||||
        return docPane;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private void updateDocument(DataNode node){
 | 
			
		||||
        MetaNode meta = null;
 | 
			
		||||
        DataNode parent;
 | 
			
		||||
        
 | 
			
		||||
        if(node instanceof DataValue){
 | 
			
		||||
            parent = node.getParent();
 | 
			
		||||
            
 | 
			
		||||
            if(parent != null){
 | 
			
		||||
                meta = parent.getMetadata();
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            meta = node.getMetadata();
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
        this.getDocScrollPane().setBorder(BorderFactory.createTitledBorder(null, 
 | 
			
		||||
                "Documentation for '" + this.getXPath(node) + "'", 
 | 
			
		||||
                TitledBorder.LEFT, TitledBorder.BOTTOM, 
 | 
			
		||||
                new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
 | 
			
		||||
        this.getDocPane().setNode(meta);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private String getXPath(DataNode node){
 | 
			
		||||
        String result;
 | 
			
		||||
        DataNode curNode = node;
 | 
			
		||||
        
 | 
			
		||||
        result = "";
 | 
			
		||||
        
 | 
			
		||||
        while(curNode != null){
 | 
			
		||||
            if(curNode instanceof DataElement){
 | 
			
		||||
                result = "/" + ((MetaElement)curNode.getMetadata()).getName() + result;
 | 
			
		||||
            } else if(curNode instanceof DataAttribute){
 | 
			
		||||
                result = "[@" + ((MetaAttribute)curNode.getMetadata()).getName() + "]" + result;
 | 
			
		||||
            }
 | 
			
		||||
            curNode = curNode.getParent();
 | 
			
		||||
        }
 | 
			
		||||
        result = "/" + result;
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								src/tools/config/resources/ptlogoc16.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/tools/config/resources/ptlogoc16.png
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 717 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/tools/config/resources/ptlogoc24.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/tools/config/resources/ptlogoc24.png
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/tools/config/resources/ptlogoc32.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/tools/config/resources/ptlogoc32.png
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 929 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/tools/config/resources/ptlogoc48.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/tools/config/resources/ptlogoc48.png
									
										
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 3.2 KiB  | 
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue