Add option documentation and add XSD
The ``docs/makernc.pl`` perl script can extract the options from the source code for the configuration processing and turn these into a GitHub MarkDown document and a RELAX NG Compact form (RNC) description of the options. Standard conversion tools can be used to turn the RNC file into an XSD. Although they are generated by a mechanical transformation, it is not (yet) part of the build process, in no small part because there no proper generation and publishing system has yet been set up for the documentation. Now that there is an XSD and a Markdown file for discovering the options, there is no need to retain the configuration editing tool. Any decent editor will do a better job. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
fde05810c6
commit
d429045255
63 changed files with 7969 additions and 11056 deletions
|
@ -11,9 +11,6 @@
|
|||
#
|
||||
set(CMAKE_INSTALL_TOOLSDIR "${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME}/tools")
|
||||
add_subdirectory(pubsub)
|
||||
if(BUILD_CONFTOOL)
|
||||
add_subdirectory(config)
|
||||
endif()
|
||||
add_subdirectory(ddsls)
|
||||
if(BUILD_IDLC)
|
||||
add_subdirectory(ddsperf)
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
#
|
||||
# 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" -Xlint:deprecation)
|
||||
|
||||
file(GLOB_RECURSE JAVA_SOURCES LIST_DIRECTORIES true *.java)
|
||||
|
||||
set(RESOURCES metaconfig.xml metaconfig.xsd )
|
||||
add_jar(${CONFJAR_TARGET} ${JAVA_SOURCES} ${RESOURCES} ENTRY_POINT org.eclipse.cyclonedds.config.CycloneConfig)
|
||||
|
||||
#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)
|
|
@ -1,471 +0,0 @@
|
|||
: # -*- perl -*-
|
||||
eval 'exec perl -w -S $0 "$@"'
|
||||
if 0;
|
||||
|
||||
use strict;
|
||||
|
||||
# NOTES:
|
||||
# - very fragile - and very sensitive to input formatting
|
||||
# - default value may not contain a semicolon
|
||||
#
|
||||
# UGLINESSES:
|
||||
# - knowledge of conversion functions in here
|
||||
# - hard definitions of enums in here
|
||||
# - negated_boolean is A BIT WEIRD and special-cased
|
||||
# - some other hard-coded knowledge of the top level nodes
|
||||
# - some hard-coded overrides for defaults
|
||||
$|=1;
|
||||
|
||||
my %typehint2xmltype = ("____" => "____",
|
||||
"networkAddress" => "String",
|
||||
"partitionAddress" => "String",
|
||||
"networkAddresses" => "String",
|
||||
"ipv4" => "String",
|
||||
"boolean" => "Boolean",
|
||||
"negated_boolean" => "Boolean",
|
||||
"boolean_default" => "Enum",
|
||||
"string" => "String",
|
||||
"tracingOutputFileName" => "String",
|
||||
"verbosity" => "Enum",
|
||||
"tracemask" => "String",
|
||||
"peer" => "String",
|
||||
"float" => "Float",
|
||||
"int" => "Int",
|
||||
"int32" => "Int",
|
||||
"uint" => "Int",
|
||||
"uint32" => "Int",
|
||||
"natint" => "Int",
|
||||
"natint_255" => "Int",
|
||||
"domainId" => "String",
|
||||
"participantIndex" => "String",
|
||||
"port" => "Int",
|
||||
"dyn_port" => "Int",
|
||||
"duration_inf" => "String",
|
||||
"duration_ms_1hr" => "String",
|
||||
"duration_ms_1s" => "String",
|
||||
"duration_100ms_1hr" => "String",
|
||||
"duration_us_1s" => "String",
|
||||
"memsize" => "String",
|
||||
"bandwidth" => "String",
|
||||
"standards_conformance" => "Enum",
|
||||
"locators" => "Enum",
|
||||
"service_name" => "String",
|
||||
"sched_class" => "Enum",
|
||||
"cipher" => "Enum",
|
||||
"besmode" => "Enum",
|
||||
"retransmit_merging" => "Enum",
|
||||
"sched_prio_class" => "Enum",
|
||||
"sched_class" => "Enum",
|
||||
"maybe_int32" => "String",
|
||||
"maybe_memsize" => "String",
|
||||
"maybe_duration_inf" => "String",
|
||||
"allow_multicast" => "String",
|
||||
"transport_selector" => "String",
|
||||
"many_sockets_mode" => "Enum",
|
||||
"xcheck" => "String",
|
||||
"min_tls_version" => "String");
|
||||
|
||||
my %typehint2unit = ("duration_inf" => "duration_inf",
|
||||
"duration_ms_1hr" => "duration",
|
||||
"duration_100ms_1hr" => "duration",
|
||||
"duration_ms_1s" => "duration",
|
||||
"duration_us_1s" => "duration",
|
||||
"bandwidth" => "bandwidth",
|
||||
"memsize" => "memsize",
|
||||
"maybe_memsize" => "memsize",
|
||||
"maybe_duration_inf" => "duration_inf");
|
||||
|
||||
my %enum_values = ("locators" => "local;none",
|
||||
"standards_conformance" => "lax;strict;pedantic",
|
||||
"verbosity" => "finest;finer;fine;config;info;warning;severe;none",
|
||||
"besmode" => "full;writers;minimal",
|
||||
"retransmit_merging" => "never;adaptive;always",
|
||||
"sched_prio_class" => "relative;absolute",
|
||||
"sched_class" => "realtime;timeshare;default",
|
||||
"cipher" => "null;blowfish;aes128;aes192;aes256",
|
||||
"boolean_default" => "false;true;default",
|
||||
"many_sockets_mode" => "false;true;single;none;many");
|
||||
|
||||
my %range = ("port" => "1;65535",
|
||||
"dyn_port" => "-1;65535",
|
||||
"general_cfgelems/startupmodeduration" => "0;60000",
|
||||
"natint_255" => "0;255",
|
||||
"duration_ms_1hr" => "0;1hr",
|
||||
"duration_100ms_1hr" => "100ms;1hr",
|
||||
"duration_ms_1s" => "0;1s",
|
||||
"duration_us_1s" => "0;1s");
|
||||
|
||||
my %unit_blurb = ("bandwidth" => "\n<p>The unit must be specified explicitly. Recognised units: <i>X</i>b/s, <i>X</i>bps for bits/s or <i>X</i>B/s, <i>X</i>Bps for bytes/s; where <i>X</i> is an optional prefix: k for 10<sup>3</sup>, Ki for 2<sup>10</sup>, M for 10<sup>6</sup>, Mi for 2<sup>20</sup>, G for 10<sup>9</sup>, Gi for 2<sup>30</sup>.</p>",
|
||||
"memsize" => "\n<p>The unit must be specified explicitly. Recognised units: B (bytes), kB & KiB (2<sup>10</sup> bytes), MB & MiB (2<sup>20</sup> bytes), GB & GiB (2<sup>30</sup> bytes).</p>",
|
||||
"duration" => "\n<p>The unit must be specified explicitly. Recognised units: ns, us, ms, s, min, hr, day.</p>",
|
||||
"duration_inf" => "\n<p>Valid values are finite durations with an explicit unit or the keyword 'inf' for infinity. Recognised units: ns, us, ms, s, min, hr, day.</p>");
|
||||
|
||||
while (my ($k, $v) = each %typehint2xmltype) {
|
||||
die "script error: values of enum type $k unknown\n" if $v eq "Enum" && $enum_values{$k} eq "";
|
||||
}
|
||||
|
||||
# Configurator can't handle UINT32_MAX ... instead of fixing it, just use a different
|
||||
# default for the rare ones that have a problem (that works as long as there is no
|
||||
# practical difference between the two)
|
||||
my %default_overrides = ("multiple_recv_threads_attrs/maxretries" => 2000000000);
|
||||
|
||||
my ($name, $table, $kind, $subtable, $multiplicity, $defaultvalue, $typehint, $description);
|
||||
|
||||
my %tab2elems;
|
||||
my %elem;
|
||||
my %desc;
|
||||
my %typehint_seen;
|
||||
my $gobbling_description;
|
||||
my $skip_lite;
|
||||
my $in_table;
|
||||
my $rest;
|
||||
my $deprecated;
|
||||
|
||||
############################
|
||||
|
||||
sub clean_description {
|
||||
my ($desc) = @_;
|
||||
$desc =~ s/^\s*BLURB\s*\(\s*//s;
|
||||
$desc =~ s/^\s*"//s;
|
||||
$desc =~ s/\s*"(\s*\))? *(\}\s*,\s*$)?$//s;
|
||||
$desc =~ s/\\"/"/g;
|
||||
$desc =~ s/\\n\s*\\/\n/g;
|
||||
$desc =~ s/\\\\/\\/g;
|
||||
$desc =~ s/\n\n/\n/g;
|
||||
# should fix the source ...
|
||||
$desc =~ s/DDSI2E?/Cyclone DDS/g;
|
||||
return $desc;
|
||||
}
|
||||
|
||||
sub store_entry {
|
||||
$name =~ s/\|.*//; # aliases are not visible in osplconf
|
||||
my $ltable = lc $table;
|
||||
my $lname = lc $name;
|
||||
if (not exists $tab2elems{$ltable}) {
|
||||
$tab2elems{$ltable} = $name;
|
||||
} else {
|
||||
$tab2elems{$ltable} .= ";$name";
|
||||
}
|
||||
$elem{"$ltable/$lname"} = "$kind;$subtable;$multiplicity;$defaultvalue;$typehint";
|
||||
my $ub = exists $typehint2unit{$typehint} && exists $unit_blurb{$typehint2unit{$typehint}} ? $unit_blurb{$typehint2unit{$typehint}} : "";
|
||||
$desc{"$ltable/$lname"} = clean_description($description).$ub;
|
||||
die "error: no mapping defined for type $typehint\n" if $typehint2xmltype{$typehint} eq "";
|
||||
$typehint_seen{$typehint} = 1;
|
||||
#printf "%s - $s\n", "$ltable/$lname", $elem{"$ltable/lname"};
|
||||
#$typehint = "";
|
||||
}
|
||||
|
||||
sub print_description {
|
||||
my ($desc, $indent) = @_;
|
||||
print "$indent <comment><![CDATA[\n";
|
||||
print "$desc\n";
|
||||
print "$indent ]]></comment>\n";
|
||||
}
|
||||
|
||||
sub kind_to_kstr {
|
||||
my ($kind, $typehint, $table, $name, $isroot) = @_;
|
||||
if ($isroot) {
|
||||
die unless $kind eq "GROUP";
|
||||
return "rootElement";
|
||||
} elsif ($kind eq "GROUP" || $kind eq "MGROUP") {
|
||||
return "element";
|
||||
} elsif ($kind eq "ATTR") {
|
||||
return "attribute$typehint2xmltype{$typehint}";
|
||||
} elsif ($kind eq "LEAF") {
|
||||
return "leaf$typehint2xmltype{$typehint}";
|
||||
} else {
|
||||
die "error: $kind unrecognized kind ($table/$name)\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub transform_default {
|
||||
my (@fs) = @_;
|
||||
(my $tmp = $fs[3]) =~ s/^"(.*)"$/$1/;
|
||||
if ($fs[4] ne "negated_boolean") {
|
||||
return $tmp;
|
||||
} else {
|
||||
my %map = ("true" => "false", "false" => "true");
|
||||
return $map{lc $tmp};
|
||||
}
|
||||
}
|
||||
|
||||
sub conv_to_xml {
|
||||
my ($table, $name, $indent, $prefix, $isroot, $force_min_occ_1) = @_;
|
||||
#, fs,vs,vsn,kstr,ts,tsi,tsn,i,min_occ,max_occ,rr,req) { # fs,vs,kstr,... are locals
|
||||
my $lctn = lc "$table/$name";
|
||||
my @fs = split /;/, $elem{$lctn};
|
||||
#print "$table/$name - \n"; for (my $i = 0; $i < @fs; $i++) { print " - $i $fs[$i]\n" }
|
||||
my $kstr = kind_to_kstr($fs[0], $fs[4], $table, $name, $isroot);
|
||||
my ($min_occ, $max_occ);
|
||||
if ($fs[2] =~ /MAX/) {
|
||||
$min_occ = $max_occ = 0;
|
||||
} elsif ($fs[2] == 0 || $fs[2] == 1) {
|
||||
# multiplicity = 0 => special case, treat as-if 1
|
||||
# multiplicity = 1 => required if no default
|
||||
# force_min_occ_1 so we can mark "Domain" as required and have it
|
||||
# show up in the config editor when creating a new file
|
||||
if ($force_min_occ_1) {
|
||||
$min_occ = 1;
|
||||
} elsif ($fs[0] eq "GROUP" || $fs[0] eq "MGROUP") {
|
||||
$min_occ = 0;
|
||||
} elsif ($fs[3] eq "" || $fs[3] eq "NULL") {
|
||||
$min_occ = 1;
|
||||
} else {
|
||||
$min_occ = 0;
|
||||
}
|
||||
$max_occ = 1;
|
||||
} else {
|
||||
$min_occ = 0; $max_occ = $fs[2];
|
||||
}
|
||||
if ($fs[0] eq "ATTR") {
|
||||
my $req = ($min_occ == 0) ? "false" : "true";
|
||||
print "$indent<$kstr name=\"$name\" required=\"$req\">\n";
|
||||
} else {
|
||||
print "$indent<$kstr name=\"$name\" minOccurrences=\"$min_occ\" maxOccurrences=\"$max_occ\">\n";
|
||||
}
|
||||
print_description ("$prefix$desc{$lctn}", $indent);
|
||||
# enum, int ranges
|
||||
if (exists $enum_values{$fs[4]}) {
|
||||
my @vs = split /;/, $enum_values{$fs[4]};
|
||||
print "$indent <value>$_</value>\n" for @vs;
|
||||
}
|
||||
my $rr = exists $range{$lctn} ? $range{$lctn} : "";
|
||||
if ($rr eq "" && exists $range{$fs[4]}) { $rr = $range{$fs[4]}; }
|
||||
if ($rr ne "") {
|
||||
my @vs = split /;/, $rr;
|
||||
print "$indent <minimum>$vs[0]</minimum>\n";
|
||||
print "$indent <maximum>$vs[1]</maximum>\n";
|
||||
}
|
||||
# remarkably, osplconf can't deal with strings for which no maximum
|
||||
# length is specified, even though it accepts unlimited length
|
||||
# strings ...
|
||||
if ($typehint2xmltype{$fs[4]} eq "String") {
|
||||
print "$indent <maxLength>0</maxLength>\n";
|
||||
}
|
||||
# default not applicable to GROUPs
|
||||
if ($fs[0] ne "GROUP" && $fs[0] ne "MGROUP") {
|
||||
my $defover = exists $default_overrides{$lctn} ? $default_overrides{$lctn} : "";
|
||||
if ($defover ne "") {
|
||||
print "$indent <default>$defover</default>\n";
|
||||
} elsif ($fs[3] eq "" || $fs[3] eq "NULL") {
|
||||
print "$indent <default></default>\n";
|
||||
} else {
|
||||
print "$indent <default>".transform_default(@fs)."</default>\n";
|
||||
}
|
||||
}
|
||||
# recurse into subtables if any (except when it is the root: rootElement needs
|
||||
# special treatment
|
||||
if (!$isroot && $fs[1] ne "") {
|
||||
my @ts = sort (split /,/, $fs[1]);
|
||||
conv_table_to_xml($_, "$indent ", $prefix, 0, 0) for @ts;
|
||||
}
|
||||
print "$indent</$kstr>\n";
|
||||
}
|
||||
|
||||
sub conv_table_to_xml {
|
||||
my ($table, $indent, $prefix, $isroot, $force_min_occ_1) = @_;
|
||||
return unless exists $tab2elems{$table};
|
||||
my @ns = sort (split /;/, $tab2elems{$table});
|
||||
conv_to_xml($table, $_, $indent, ($table eq "unsupp_cfgelems") ? "<b>Internal</b>" : $prefix, $isroot, $force_min_occ_1) for @ns;
|
||||
}
|
||||
|
||||
while (<>) {
|
||||
if ($gobbling_description) {
|
||||
$description .= $_;
|
||||
#print " .. $_\n";
|
||||
}
|
||||
|
||||
if ($gobbling_description && /(^|")(\s*\)) *\} *, *$/) {
|
||||
$gobbling_description = 0;
|
||||
store_entry() unless $deprecated;
|
||||
next;
|
||||
}
|
||||
|
||||
if ($gobbling_description) {
|
||||
next;
|
||||
}
|
||||
|
||||
if (/^[ \t]*(#[ \t]*(if|ifdef|ifndef|else|endif).*)?$/) { # skip empty lines, preproc
|
||||
next;
|
||||
}
|
||||
|
||||
if (/^ *END_MARKER *$/) {
|
||||
if (!$in_table) {
|
||||
warn "END_MARKER seen while not in a table";
|
||||
}
|
||||
$in_table = 0;
|
||||
#print "END_MARKER $table\n";
|
||||
next;
|
||||
}
|
||||
|
||||
if (/^static +const +struct +cfgelem +([A-Za-z_0-9]+)\s*\[/) {
|
||||
$in_table = 1;
|
||||
$table = $1;
|
||||
#print "TABLE $table\n";
|
||||
next;
|
||||
}
|
||||
|
||||
if ($in_table && /^ *WILDCARD *, *$|^ *\{ *(MOVED) *\(/) {
|
||||
next;
|
||||
}
|
||||
|
||||
# Recognise all "normal" entries: attributes, groups, leaves and
|
||||
# leaves with attributes. This doesn't recognise the ones used for the
|
||||
# root groups: those are dealt with by the next pattern
|
||||
if ($in_table && /^ *\{ *((?:DEPRECATED_)?(?:ATTR|GROUP|GROUP_W_ATTRS|MGROUP|LEAF|LEAF_W_ATTRS)) *\(/) {
|
||||
$rest = $_;
|
||||
# extract kind
|
||||
$rest =~ s/^ *\{ *((?:DEPRECATED_)?(?:ATTR|GROUP|GROUP_W_ATTRS|MGROUP|LEAF|LEAF_W_ATTRS)) *\( *(.*)/$2/;
|
||||
$kind = $1;
|
||||
$deprecated = ($kind =~ s/^DEPRECATED_//);
|
||||
# extract name + reference to subtable
|
||||
$rest =~ s/\"([A-Za-z_0-9|]+)\" *(.*)/$2/;
|
||||
$name = $1;
|
||||
my ($subelems, $subattrs) = ("", "");
|
||||
if ($kind eq "GROUP" || $kind eq "GROUP_W_ATTRS" || $kind eq "MGROUP") {
|
||||
$rest =~ s/, *([A-Za-z_0-9]+) *(.*)/$2/;
|
||||
$subelems = $1;
|
||||
}
|
||||
if ($kind eq "LEAF_W_ATTRS" || $kind eq "GROUP_W_ATTRS" || $kind eq "MGROUP") {
|
||||
$rest =~ s/, *([A-Za-z_0-9]+) *(.*)/$2/;
|
||||
$subattrs = $1;
|
||||
}
|
||||
$subtable = "";
|
||||
if ($subelems ne "") { $subtable = $subelems; }
|
||||
if ($subattrs ne "") {
|
||||
if ($subtable ne "") { $subtable = "$subtable,$subattrs"; }
|
||||
else { $subtable = $subattrs; }
|
||||
}
|
||||
$rest =~ s/ *\) *, *//;
|
||||
#print " kind $kind name $name subtable $subtable -- $rest\n";
|
||||
|
||||
# don't care about the distinction between GROUP/LEAF and
|
||||
# GROUP/LEAF_W_ATTRS in the remainer of the code: we simply
|
||||
# rely on subtable.
|
||||
$kind =~ s/_W_ATTRS//;
|
||||
}
|
||||
|
||||
# Root groups: use a special trick, which allows them to do groups
|
||||
# with attributes. Which the DDSI2 proper doesn't use, but which the
|
||||
# service configuration stuff does rely on.
|
||||
if ($in_table && /^ *\{ *"([A-Za-z_0-9|]+)" *, */) {
|
||||
$rest = $_;
|
||||
# root elements are all groups, formatted as: <name>, <subelems>,
|
||||
# <attrs>, NODATA, description. They're therefore pretty easy to
|
||||
# parse.
|
||||
$kind = "GROUP";
|
||||
$rest =~ s/^ *\{ *\"([A-Za-z_0-9|]+)\" *, *(.*)/$2/;
|
||||
$name = $1;
|
||||
# then follow the sub-elements and the attributes
|
||||
$rest =~ s/([A-Za-z_0-9]+) *, *(.*)/$2/;
|
||||
my $subelems = $1;
|
||||
$rest =~ s/([A-Za-z_0-9]+) *, *(.*)/$2/;
|
||||
my $subattrs = $1;
|
||||
# then we require NODATA (could do this in the pattern also)
|
||||
die "error: NODATA expected" unless $rest =~ /^NODATA *,/;
|
||||
# multiplicity is hard coded: we want to allow multiple ddsi2 services
|
||||
$multiplicity = 0;
|
||||
$subtable = "";
|
||||
if ($subelems ne "NULL") { $subtable = $subelems; }
|
||||
if ($subattrs ne "NULL") {
|
||||
if ($subtable ne "") { $subtable = "$subtable,$subattrs"; }
|
||||
else { $subtable = $subattrs; }
|
||||
}
|
||||
$rest =~ s/([A-Za-z_0-9]+) *, *(.*)/$2/;
|
||||
}
|
||||
|
||||
# Extract stuff specific to ATTRs, LEAFs and MGROUPs
|
||||
if ($in_table && ($kind eq "ATTR" || $kind eq "LEAF" || $kind eq "MGROUP")) {
|
||||
# extract multiplicity
|
||||
$rest =~ s/([0-9]+|U?INT(?:16|32|64)?_MAX) *, *(.*)/$2/;
|
||||
$multiplicity = $1;
|
||||
# extract default value
|
||||
$rest =~ s/(\"(?:[^\"]*)\"|NULL|0) *, *(.*)/$2/;
|
||||
$defaultvalue = $1;
|
||||
if ($defaultvalue eq "0") { $defaultvalue = "NULL"; }
|
||||
# skip reference to internal name (either ABSOFF(field),
|
||||
# RELOFF(field,field) or <int>,<int> (the latter being used by
|
||||
# "verbosity")
|
||||
$rest =~ s/(ABSOFF *\( *[A-Za-z_0-9.]+ *\)|RELOFF *\( *[A-Za-z_0-9.]+ *, *[A-Za-z_0-9]+ *\)|[0-9]+ *, *[0-9]+) *, *//;
|
||||
# skip init function
|
||||
$rest =~ s/([A-Za-z_0-9]+|0) *, *//;
|
||||
# type hint from conversion function
|
||||
$rest =~ s/(uf_(?:[A-Za-z_0-9]+)|NULL|0) *, *(.*)/$2/;
|
||||
$typehint = $1;
|
||||
$typehint =~ s/^uf_//;
|
||||
# accept typehint = NULL for a LEAF_WITH_ATTRS: there is no defined
|
||||
# "syntax" for groups that have only attributes, pretending it is a
|
||||
# group because that causes us to emit an "element" and not a
|
||||
# "leaf".
|
||||
if ($typehint eq "0" || $typehint eq "NULL") {
|
||||
$kind = "GROUP";
|
||||
$typehint = "____";
|
||||
}
|
||||
# skip free, print functions
|
||||
$rest =~ s/([A-Za-z_0-9]+|0) *, *([A-Za-z_0-9]+|0) *, *//;
|
||||
#print " .. multiplicity $multiplicity default $defaultvalue typehint $typehint\n";
|
||||
}
|
||||
|
||||
# Extract description (or NULL, if not to be included in the configurator XML)
|
||||
if ($in_table) {
|
||||
#print " .. $rest\n";
|
||||
# description or NULL
|
||||
if ($rest =~ /NULL *\} *, *$/) {
|
||||
# no description - discard this one/simply continue with next one
|
||||
} elsif ($rest =~ /(?:BLURB\s*\(\s*)?(".*")(?:\s*\))? *\} *, *$/) {
|
||||
# description ending on same line
|
||||
$description = $1;
|
||||
store_entry() unless $deprecated;
|
||||
} else {
|
||||
# strip the quotes &c. once the full text has been gathered
|
||||
$description = $rest;
|
||||
$gobbling_description = 1;
|
||||
}
|
||||
#print " .. gobbling $gobbling_description";
|
||||
next;
|
||||
}
|
||||
}
|
||||
|
||||
#print "$tab2elems{cyclonedds_root_cfgelems}\n";
|
||||
my @rootnames = split /;/, $tab2elems{cyclonedds_root_cfgelems};
|
||||
die "error: cyclonedds_root_cfgelems has no or multiple entries\n" if @rootnames != 1;
|
||||
die "error: root_cfgelems doesn't exist\n" unless exists $tab2elems{root_cfgelems};
|
||||
|
||||
# Override the type for ControlTopic/Deaf, .../Mute so that an empty
|
||||
# string is allowed by the configuration validation in spliced
|
||||
# (easier than adding a boolean_or_empty to DDSI2 for a quick hack)
|
||||
#if (elem["control_topic_cfgelems/deaf"] == "" || elem["control_topic_cfgelems/mute"] == "") {
|
||||
# print FILENAME": error: control_topic_cfgelems/{deaf,mute} missing" > "/dev/stderr";
|
||||
# exit 1;
|
||||
#}
|
||||
#elem["control_topic_cfgelems/deaf"] = "LEAF;;1;\"false\";string";
|
||||
#elem["control_topic_cfgelems/mute"] = "LEAF;;1;\"false\";string";
|
||||
|
||||
print << 'EOT';
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright(c) 2006 to 2019 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
|
||||
|
||||
===
|
||||
generated from src/core/ddsi/src/q_config.c using excx.pl
|
||||
-->
|
||||
<splice_meta_config version="1.0">
|
||||
<!--xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.splice-dds.org/splice_metaconfig.xsd"-->
|
||||
EOT
|
||||
conv_table_to_xml("cyclonedds_root_cfgelems", " ", "", 1, 0);
|
||||
conv_table_to_xml("root_cfgelems", " ", "", 0, 1);
|
||||
print << 'EOT';
|
||||
</splice_meta_config>
|
||||
EOT
|
||||
|
||||
while (my ($k, $v) = each %typehint_seen) {
|
||||
warn "script warning: type mapping defined for $k but not used" if $v == 0;
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -1,289 +0,0 @@
|
|||
<?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>
|
|
@ -1,51 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,404 +0,0 @@
|
|||
/*
|
||||
* 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 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;
|
||||
}
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
|
@ -1,89 +0,0 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* @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("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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,124 +0,0 @@
|
|||
/*
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,88 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,324 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
|
@ -1,106 +0,0 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
}
|
|
@ -1,149 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
|
@ -1,392 +0,0 @@
|
|||
/*
|
||||
* 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();
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
/*
|
||||
* 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 CycloneConfig extends Initializer {
|
||||
|
||||
/**
|
||||
* Starts configuration. This function is the main class.
|
||||
*
|
||||
* - It passes on the commandline arguments. Arguments that are supported
|
||||
* are:
|
||||
* -# <java_properties_file>
|
||||
*
|
||||
* @param args These are passed on to the initialize function
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
boolean redirect = true;
|
||||
boolean uriSet = false;
|
||||
String[] args2;
|
||||
String uri = null;
|
||||
|
||||
CycloneConfig t = new CycloneConfig();
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
/*
|
||||
* 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
|
@ -1,21 +0,0 @@
|
|||
/*
|
||||
* 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);
|
||||
|
||||
}
|
|
@ -1,197 +0,0 @@
|
|||
/*
|
||||
* 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.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(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 (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
|
||||
((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 {
|
||||
((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;
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
}
|
|
@ -1,73 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,296 +0,0 @@
|
|||
/*
|
||||
* 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.";
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* 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 dimension) {
|
||||
super(doc, 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 += "-Value: " + value.toString();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -1,137 +0,0 @@
|
|||
/*
|
||||
* 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 dimension) {
|
||||
super(doc, 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("-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;
|
||||
}
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
/*
|
||||
* 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
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
/*
|
||||
* 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 dimension;
|
||||
|
||||
public MetaNode(String doc, String dimension) {
|
||||
this.doc = doc;
|
||||
this.dimension = dimension;
|
||||
}
|
||||
|
||||
public String getDoc() {
|
||||
return doc;
|
||||
}
|
||||
|
||||
public void setDoc(String doc) {
|
||||
this.doc = doc;
|
||||
}
|
||||
|
||||
public String getDimension() {
|
||||
return this.dimension;
|
||||
}
|
||||
}
|
|
@ -1,65 +0,0 @@
|
|||
/*
|
||||
* 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 MetaValue extends MetaNode {
|
||||
Object defaultValue;
|
||||
|
||||
public MetaValue(String doc, Object defaultValue, String dimension) {
|
||||
super(doc, 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;
|
||||
}
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,96 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,59 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,83 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,96 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,630 +0,0 @@
|
|||
/*
|
||||
* 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.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 = "Eclipse Cyclone DDS Configurator";
|
||||
|
||||
public static String SERVICE_LABEL = "Component";
|
||||
public static String SERVICE_TEXT = "component";
|
||||
|
||||
/**
|
||||
* 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 () {
|
||||
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);
|
||||
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();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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("control H"));
|
||||
}
|
||||
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("control N"));
|
||||
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("control O"));
|
||||
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("control S"));
|
||||
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("alt F4"));
|
||||
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("control P"));
|
||||
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/LOGO.png");
|
||||
//imgUrls.add(url != null ? url : getClass().getResource("/ptlogoc16.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) {}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,581 +0,0 @@
|
|||
/*
|
||||
* 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.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();
|
||||
|
||||
File f = null;
|
||||
String fileSep = System.getProperty("file.separator");
|
||||
|
||||
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 {
|
||||
config = new DataConfiguration(f, false);
|
||||
} catch (DataException e) {
|
||||
Report.getInstance().writeInfoLog("ConfigWindowController handleOpen\n" + e.getMessage());
|
||||
}
|
||||
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 {
|
||||
config = new DataConfiguration(f, false);
|
||||
} catch (DataException e) {
|
||||
Report.getInstance().writeInfoLog(
|
||||
"ConfigWindowController handleOpen\n"
|
||||
+ e.getMessage());
|
||||
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;
|
||||
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(){
|
||||
ConfigChooseFilter.description = "Eclipse Cyclone DDS 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;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,84 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
/*
|
||||
* 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.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);
|
||||
|
||||
comp.setBackground (Color.WHITE);
|
||||
comp.setForeground (Color.BLACK);
|
||||
table.setToolTipText(null);
|
||||
return comp;
|
||||
}
|
||||
}
|
|
@ -1,196 +0,0 @@
|
|||
/*
|
||||
* 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.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) {
|
||||
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;
|
||||
}
|
||||
}
|
|
@ -1,224 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,223 +0,0 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
|
@ -1,399 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
|
||||
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(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(((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) {
|
||||
/* 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) {}
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
|
@ -1,156 +0,0 @@
|
|||
/*
|
||||
* 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.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 HELP_WINDOW_TITLE = "Eclipse Cyclone 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();
|
||||
getElementTree().getSelectionModel().addTreeSelectionListener(this);
|
||||
getDocPane().setNode(getElementTree().getSelectedMetaElement());
|
||||
}
|
||||
|
||||
public void setWindowTitle () {
|
||||
String windowTitle = 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());
|
||||
}
|
||||
}
|
|
@ -1,139 +0,0 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -1,206 +0,0 @@
|
|||
/*
|
||||
* 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();
|
||||
}
|
||||
}
|
|
@ -1,273 +0,0 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue