Skip to content

Commit 4287d50

Browse files
authored
New Sample: Edit with branch versioning (#553)
* setup file structure * load feature layer * create and switch versions * ui layout, update and switch * update geometry functionality * refactor methods * tidy up spacing and comments * update readme and add screenshot * update metadata file with script * correction to metadata file * tidy ups from code review * tidy ups * code review changes * refactors from review * tidy ups * small fixes from code review * create error alert method * create method for text validation * updates to readme * add link to docs in readme * tidy ups from code review * amend error messages * validation error messaging
1 parent 4b1298d commit 4287d50

File tree

13 files changed

+985
-0
lines changed

13 files changed

+985
-0
lines changed
289 KB
Loading
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Edit with branch versioning
2+
3+
Create, query and edit a specific server version using service geodatabase.
4+
5+
![Image of edit with branch versioning](EditWithBranchVersioning.png)
6+
7+
## Use case
8+
9+
Workflows often progress in discrete stages, with each stage requiring the allocation of a different set of resources and business rules. Typically, each stage in the overall process represents a single unit of work, such as a work order or job. To manage these, you can create a separate, isolated version and modify it. Once this work is complete, you can integrate the changes into the default version.
10+
11+
## How to use the sample
12+
13+
Upon opening the sample, you will be prompted to enter credentials for the service (un: editor01 / pwd: editor01.password). Once loaded, the map will zoom to the extent of the feature layer. The current version is indicated in the top left corner of the map. You can create a new version by specifying the version information (name, access, and description) in the form in the top right corner, and then clicking "Create version". See the *Additional Information* section for restrictions on the version name.
14+
15+
Select a feature using the primary mouse button to edit an attribute and/or click again with the secondary mouse button to relocate the point.
16+
17+
Click the "Switch version" button in the top left corner to switch back and forth between the version you created and the default version. Edits will automatically be applied to your version when switching to the default version.
18+
19+
## How it works
20+
21+
1. Create and load a `ServiceGeodatabase` with a feature service URL that has enabled [Version Management](https://developers.arcgis.com/java/latest/guide/use-branch-versioning.htm).
22+
2. Get the `ServiceFeatureTable` from the service geodatabase.
23+
3. Create a `FeatureLayer` from the service feature table.
24+
4. Create `ServiceVersionParameters` with a unique name, `VersionAccess`, and description.
25+
* Note - See the additional information section for more restrictions on the version name.
26+
5. Create a new version by calling `ServiceGeodatabase.createVersionAsync()` and passing in the service version parameters.
27+
6. Retrieve the result of the async call, to obtain the `ServiceVersionInfo` of the version created.
28+
7. Switch to the version you have just created using `ServiceGeodatabase.switchVersionAsync()`, passing in the version name obtained from the service version info.
29+
8. Select a `Feature` from the map to edit its "TYPDAMAGE" attribute and location.
30+
9. Apply these edits to your version by calling `ServiceGeodatabase.applyEditsAsync()`.
31+
32+
## Relevant API
33+
34+
* FeatureLayer
35+
* ServiceFeatureTable
36+
* ServiceGeodatabase
37+
* ServiceVersionInfo
38+
* ServiceVersionParameters
39+
* VersionAccess
40+
41+
## About the data
42+
43+
The feature layer used in this sample is [Damage to commercial buildings]("https://sampleserver7.arcgisonline.com/arcgis/rest/services/DamageAssessment/FeatureServer/0") located in Naperville, Illinois.
44+
45+
## Additional information
46+
47+
Credentials:
48+
- Username: editor01
49+
- Password: editor01.password
50+
51+
The name of the version must meet the following criteria:
52+
53+
1. Must not exceed 62 characters
54+
2. Must not include: Period (.), Semicolon (;), Single quotation mark ('), Double quotation mark (")
55+
3. Must not include a space for the first character
56+
57+
- Note: the version name will have the username and a period (.) prepended to it. E.g "editor01.MyNewUniqueVersionName"
58+
59+
Branch versioning access permission:
60+
61+
1. Public - Any portal user can view and edit the version.
62+
2. Protected - Any portal user can view, but only the version owner, feature layer owner, and portal administrator can edit the version.
63+
3. Private - Only the version owner, feature layer owner, and portal administrator can view and edit the version.
64+
65+
## Tags
66+
67+
branch versioning, edit, version control, version management server
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"category": "Editing",
3+
"description": "Create, query and edit a specific server version using service geodatabase.",
4+
"ignore": false,
5+
"images": [
6+
"EditWithBranchVersioning.png"
7+
],
8+
"keywords": [
9+
"branch versioning",
10+
"edit",
11+
"version control",
12+
"version management server",
13+
"FeatureLayer",
14+
"ServiceFeatureTable",
15+
"ServiceGeodatabase",
16+
"ServiceVersionInfo",
17+
"ServiceVersionParameters",
18+
"VersionAccess"
19+
],
20+
"redirect_from": [],
21+
"relevant_apis": [
22+
"FeatureLayer",
23+
"ServiceFeatureTable",
24+
"ServiceGeodatabase",
25+
"ServiceVersionInfo",
26+
"ServiceVersionParameters",
27+
"VersionAccess"
28+
],
29+
"snippets": [
30+
"src/main/java/com/esri/samples/edit_with_branch_versioning/EditWithBranchVersioningController.java",
31+
"src/main/java/com/esri/samples/edit_with_branch_versioning/EditWithBranchVersioningSample.java",
32+
"src/main/resources/edit_with_branch_versioning/main.fxml"
33+
],
34+
"title": "Edit with branch versioning"
35+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
plugins {
2+
id 'application'
3+
id 'org.openjfx.javafxplugin' version '0.0.5'
4+
}
5+
6+
group = 'com.esri.samples'
7+
8+
ext {
9+
arcgisVersion = '100.9.0'
10+
}
11+
12+
javafx {
13+
version = "11.0.2"
14+
modules = [ 'javafx.controls', 'javafx.fxml' ]
15+
}
16+
17+
compileJava.options.encoding = 'UTF-8'
18+
19+
repositories {
20+
jcenter()
21+
maven {
22+
url 'https://esri.bintray.com/arcgis'
23+
}
24+
maven {
25+
url 'http://olympus.esri.com/artifactory/arcgisruntime-repo'
26+
}
27+
}
28+
29+
configurations {
30+
natives
31+
}
32+
33+
dependencies {
34+
compile "com.esri.arcgisruntime:arcgis-java:$arcgisVersion"
35+
natives "com.esri.arcgisruntime:arcgis-java-jnilibs:$arcgisVersion"
36+
natives "com.esri.arcgisruntime:arcgis-java-resources:$arcgisVersion"
37+
}
38+
39+
task copyNatives(type: Copy) {
40+
description = "Copies the arcgis native libraries into the project build directory for development."
41+
group = "build"
42+
configurations.natives.asFileTree.each {
43+
from(zipTree(it))
44+
}
45+
// store native libraries in a common location shared with other samples
46+
into "${System.properties.getProperty("user.home")}/.arcgis/$arcgisVersion"
47+
}
48+
49+
run {
50+
dependsOn copyNatives
51+
mainClassName = 'com.esri.samples.edit_with_branch_versioning.EditWithBranchVersioningLauncher'
52+
}
53+
54+
jar {
55+
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
56+
manifest {
57+
attributes("Main-Class": "$mainClassName")
58+
}
59+
from {
60+
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
61+
}
62+
}
63+
64+
task productionZip(type: Zip) {
65+
group = 'distribution'
66+
from copyNatives
67+
from jar.destinationDir
68+
into (project.name)
69+
baseName = project.name
70+
}
71+
72+
wrapper {
73+
gradleVersion = '6.5.1'
74+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
distributionBase=GRADLE_USER_HOME
2+
distributionPath=wrapper/dists
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip
4+
zipStoreBase=GRADLE_USER_HOME
5+
zipStorePath=wrapper/dists
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
#!/usr/bin/env sh
2+
3+
##############################################################################
4+
##
5+
## Gradle start up script for UN*X
6+
##
7+
##############################################################################
8+
9+
# Attempt to set APP_HOME
10+
# Resolve links: $0 may be a link
11+
PRG="$0"
12+
# Need this for relative symlinks.
13+
while [ -h "$PRG" ] ; do
14+
ls=`ls -ld "$PRG"`
15+
link=`expr "$ls" : '.*-> \(.*\)$'`
16+
if expr "$link" : '/.*' > /dev/null; then
17+
PRG="$link"
18+
else
19+
PRG=`dirname "$PRG"`"/$link"
20+
fi
21+
done
22+
SAVED="`pwd`"
23+
cd "`dirname \"$PRG\"`/" >/dev/null
24+
APP_HOME="`pwd -P`"
25+
cd "$SAVED" >/dev/null
26+
27+
APP_NAME="Gradle"
28+
APP_BASE_NAME=`basename "$0"`
29+
30+
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31+
DEFAULT_JVM_OPTS=""
32+
33+
# Use the maximum available, or set MAX_FD != -1 to use that value.
34+
MAX_FD="maximum"
35+
36+
warn () {
37+
echo "$*"
38+
}
39+
40+
die () {
41+
echo
42+
echo "$*"
43+
echo
44+
exit 1
45+
}
46+
47+
# OS specific support (must be 'true' or 'false').
48+
cygwin=false
49+
msys=false
50+
darwin=false
51+
nonstop=false
52+
case "`uname`" in
53+
CYGWIN* )
54+
cygwin=true
55+
;;
56+
Darwin* )
57+
darwin=true
58+
;;
59+
MINGW* )
60+
msys=true
61+
;;
62+
NONSTOP* )
63+
nonstop=true
64+
;;
65+
esac
66+
67+
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68+
69+
# Determine the Java command to use to start the JVM.
70+
if [ -n "$JAVA_HOME" ] ; then
71+
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72+
# IBM's JDK on AIX uses strange locations for the executables
73+
JAVACMD="$JAVA_HOME/jre/sh/java"
74+
else
75+
JAVACMD="$JAVA_HOME/bin/java"
76+
fi
77+
if [ ! -x "$JAVACMD" ] ; then
78+
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79+
80+
Please set the JAVA_HOME variable in your environment to match the
81+
location of your Java installation."
82+
fi
83+
else
84+
JAVACMD="java"
85+
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86+
87+
Please set the JAVA_HOME variable in your environment to match the
88+
location of your Java installation."
89+
fi
90+
91+
# Increase the maximum file descriptors if we can.
92+
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93+
MAX_FD_LIMIT=`ulimit -H -n`
94+
if [ $? -eq 0 ] ; then
95+
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96+
MAX_FD="$MAX_FD_LIMIT"
97+
fi
98+
ulimit -n $MAX_FD
99+
if [ $? -ne 0 ] ; then
100+
warn "Could not set maximum file descriptor limit: $MAX_FD"
101+
fi
102+
else
103+
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104+
fi
105+
fi
106+
107+
# For Darwin, add options to specify how the application appears in the dock
108+
if $darwin; then
109+
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110+
fi
111+
112+
# For Cygwin, switch paths to Windows format before running java
113+
if $cygwin ; then
114+
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115+
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116+
JAVACMD=`cygpath --unix "$JAVACMD"`
117+
118+
# We build the pattern for arguments to be converted via cygpath
119+
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120+
SEP=""
121+
for dir in $ROOTDIRSRAW ; do
122+
ROOTDIRS="$ROOTDIRS$SEP$dir"
123+
SEP="|"
124+
done
125+
OURCYGPATTERN="(^($ROOTDIRS))"
126+
# Add a user-defined pattern to the cygpath arguments
127+
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128+
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129+
fi
130+
# Now convert the arguments - kludge to limit ourselves to /bin/sh
131+
i=0
132+
for arg in "$@" ; do
133+
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134+
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135+
136+
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137+
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138+
else
139+
eval `echo args$i`="\"$arg\""
140+
fi
141+
i=$((i+1))
142+
done
143+
case $i in
144+
(0) set -- ;;
145+
(1) set -- "$args0" ;;
146+
(2) set -- "$args0" "$args1" ;;
147+
(3) set -- "$args0" "$args1" "$args2" ;;
148+
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149+
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150+
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151+
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152+
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153+
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154+
esac
155+
fi
156+
157+
# Escape application args
158+
save () {
159+
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160+
echo " "
161+
}
162+
APP_ARGS=$(save "$@")
163+
164+
# Collect all arguments for the java command, following the shell quoting and substitution rules
165+
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166+
167+
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168+
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169+
cd "$(dirname "$0")"
170+
fi
171+
172+
exec "$JAVACMD" "$@"

0 commit comments

Comments
 (0)