summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsowgro <tpoke.ferrari@gmail.com>2025-11-16 01:56:27 -0500
committersowgro <tpoke.ferrari@gmail.com>2025-11-16 01:56:27 -0500
commitcf59d52cba70742f1d4098c38b4c7a798b3d89fa (patch)
tree3d939229fe72a9298aa5fce98812dfffb6c41fba
parent4ac38e80c2442e085c53986f5717d44f9d2d821a (diff)
downloaddesignproject-design-6-import-export-exp.tar.gz
designproject-design-6-import-export-exp.tar.bz2
designproject-design-6-import-export-exp.zip
IMPORT-EXPORT WORKING!!!!!!!!!!!!!!!!!!!!!!!!!!import-export-exp
Diffstat (limited to '')
-rw-r--r--pom.xml6
-rw-r--r--src/main/java/design/persistence/JSONLeagueDatabase.java45
-rw-r--r--src/main/java/design/persistence/JSONPersonalDatabase.java46
-rw-r--r--src/main/java/design/persistence/LeagueDatabase.java6
-rw-r--r--src/main/java/design/persistence/PersonalDatabase.java6
-rw-r--r--src/main/java/design/persistence/Serializers.java18
-rw-r--r--src/main/java/design/persistence/importexport/DataSource.java10
-rw-r--r--src/main/java/design/persistence/importexport/JSONHandler.java17
-rw-r--r--src/main/java/design/persistence/importexport/XMLHandler.java22
-rw-r--r--test.json10
-rw-r--r--test.xml231
11 files changed, 229 insertions, 188 deletions
diff --git a/pom.xml b/pom.xml
index abcd47f..2333fd8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,7 +45,7 @@
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
- <version>2.16.2</version>
+ <version>2.20.0</version>
</dependency>
</dependencies>
<build>
@@ -72,8 +72,8 @@
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.11</version>
<configuration>
- <destfile>/target/coverage-reports/jacoco-unit.exec</destfile>
- <datafile>/target/coverage-reports/jacoco-unit.exec</datafile>
+ <destFile>/target/coverage-reports/jacoco-unit.exec</destFile>
+ <destFile>/target/coverage-reports/jacoco-unit.exec</destFile>
</configuration>
<executions>
<execution>
diff --git a/src/main/java/design/persistence/JSONLeagueDatabase.java b/src/main/java/design/persistence/JSONLeagueDatabase.java
index 0891551..977e162 100644
--- a/src/main/java/design/persistence/JSONLeagueDatabase.java
+++ b/src/main/java/design/persistence/JSONLeagueDatabase.java
@@ -1,20 +1,15 @@
package design.persistence;
-import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.module.SimpleModule;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
-import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import design.model.Course;
import design.model.Golfer;
import design.model.League;
import java.io.File;
import java.io.IOException;
-import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
public class JSONLeagueDatabase implements LeagueDatabase {
@@ -38,18 +33,8 @@ public class JSONLeagueDatabase implements LeagueDatabase {
this.cache = new HashMap<>();
this.mapper = new ObjectMapper();
- SimpleModule module = new SimpleModule();
- module.addDeserializer(Course.class, new Serializers.CourseIdDeserializer());
- module.addSerializer(Course.class, new Serializers.CourseIdSerializer());
- module.addDeserializer(Golfer.class, new Serializers.GolferUsernameDeserializer());
- module.addSerializer(Golfer.class, new Serializers.GolferUsernameSerializer());
- module.addSerializer(LocalDateTime.class, new Serializers.DateTimeStringSerializer());
- mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
- mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
- mapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));
- mapper.registerModule(new JavaTimeModule());
- mapper.registerModule(module);
- mapper.configOverride(List.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+ Serializers.configureMapper(mapper);
+ mapper.registerModule(this.getJacksonModule());
try {
load();
@@ -101,8 +86,10 @@ public class JSONLeagueDatabase implements LeagueDatabase {
}
@Override
- public void importData(JsonNode tree) throws IOException {
- League[] data = mapper.treeToValue(tree, League[].class);
+ public void importData(Object rawData) throws IOException {
+ if (!(rawData instanceof League[] data)) {
+ throw new ClassCastException();
+ }
cache.clear();
for (League league : data) {
cache.put(league.getId(), league);
@@ -111,8 +98,22 @@ public class JSONLeagueDatabase implements LeagueDatabase {
}
@Override
- public JsonNode exportData() {
- Object[] data = cache.values().toArray();
- return mapper.valueToTree(data);
+ public League[] exportData() {
+ return getLeagues();
+ }
+
+ @Override
+ public SimpleModule getJacksonModule() {
+ SimpleModule module = new SimpleModule();
+ module.addDeserializer(Course.class, new Serializers.CourseIdDeserializer());
+ module.addSerializer(Course.class, new Serializers.CourseIdSerializer());
+ module.addDeserializer(Golfer.class, new Serializers.GolferUsernameDeserializer());
+ module.addSerializer(Golfer.class, new Serializers.GolferUsernameSerializer());
+ return module;
+ }
+
+ @Override
+ public Class<?> getTargetClass() {
+ return League[].class;
}
}
diff --git a/src/main/java/design/persistence/JSONPersonalDatabase.java b/src/main/java/design/persistence/JSONPersonalDatabase.java
index bf0dda9..b92dddf 100644
--- a/src/main/java/design/persistence/JSONPersonalDatabase.java
+++ b/src/main/java/design/persistence/JSONPersonalDatabase.java
@@ -1,19 +1,14 @@
package design.persistence;
-import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.module.SimpleModule;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
-import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import design.model.Course;
import design.model.Golfer;
import design.model.League;
import java.io.File;
import java.io.IOException;
-import java.time.LocalDateTime;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
public class JSONPersonalDatabase implements PersonalDatabase {
@@ -36,19 +31,8 @@ public class JSONPersonalDatabase implements PersonalDatabase {
this.cache = new HashMap<>();
this.mapper = new ObjectMapper();
-
- SimpleModule module = new SimpleModule();
- module.addDeserializer(Course.class, new Serializers.CourseIdDeserializer());
- module.addSerializer(Course.class, new Serializers.CourseIdSerializer());
- module.addSerializer(League.class, new Serializers.LeagueIDSerializer());
- module.addDeserializer(League.class, new Serializers.LeagueIDDeserializer());
- module.addSerializer(LocalDateTime.class, new Serializers.DateTimeStringSerializer());
- mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
- mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
- mapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));
- mapper.registerModule(new JavaTimeModule());
- mapper.registerModule(module);
- mapper.configOverride(List.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+ Serializers.configureMapper(mapper);
+ mapper.registerModule(this.getJacksonModule());
try {
load();
@@ -100,8 +84,10 @@ public class JSONPersonalDatabase implements PersonalDatabase {
}
@Override
- public void importData(JsonNode tree) throws IOException {
- Golfer[] data = mapper.treeToValue(tree, Golfer[].class);
+ public void importData(Object rawData) throws IOException {
+ if (!(rawData instanceof Golfer[] data)) {
+ throw new ClassCastException();
+ }
cache.clear();
for (Golfer golfer : data) {
cache.put(golfer.getUsername(), golfer);
@@ -110,8 +96,22 @@ public class JSONPersonalDatabase implements PersonalDatabase {
}
@Override
- public JsonNode exportData() {
- Object[] data = cache.values().toArray();
- return mapper.valueToTree(data);
+ public Golfer[] exportData() {
+ return getGolfers();
+ }
+
+ @Override
+ public SimpleModule getJacksonModule() {
+ SimpleModule module = new SimpleModule();
+ module.addDeserializer(Course.class, new Serializers.CourseIdDeserializer());
+ module.addSerializer(Course.class, new Serializers.CourseIdSerializer());
+ module.addSerializer(League.class, new Serializers.LeagueIDSerializer());
+ module.addDeserializer(League.class, new Serializers.LeagueIDDeserializer());
+ return module;
+ }
+
+ @Override
+ public Class<?> getTargetClass() {
+ return Golfer[].class;
}
}
diff --git a/src/main/java/design/persistence/LeagueDatabase.java b/src/main/java/design/persistence/LeagueDatabase.java
index 9f835ff..ed6ddae 100644
--- a/src/main/java/design/persistence/LeagueDatabase.java
+++ b/src/main/java/design/persistence/LeagueDatabase.java
@@ -19,4 +19,10 @@ public interface LeagueDatabase extends DataSource {
void removeLeague(League league) throws IOException;
void updateLeague(League league) throws IOException;
+
+ @Override
+ void importData(Object data) throws IOException;
+
+ @Override
+ Object exportData() throws IOException;
}
diff --git a/src/main/java/design/persistence/PersonalDatabase.java b/src/main/java/design/persistence/PersonalDatabase.java
index 77e43cc..70dd37d 100644
--- a/src/main/java/design/persistence/PersonalDatabase.java
+++ b/src/main/java/design/persistence/PersonalDatabase.java
@@ -20,4 +20,10 @@ public interface PersonalDatabase extends DataSource {
void removeGolfer(Golfer golfer) throws IOException;
void updateGolfer(Golfer golfer) throws IOException;
+
+ @Override
+ void importData(Object data) throws IOException;
+
+ @Override
+ Object exportData() throws IOException;
}
diff --git a/src/main/java/design/persistence/Serializers.java b/src/main/java/design/persistence/Serializers.java
index 2f2b208..246dbf1 100644
--- a/src/main/java/design/persistence/Serializers.java
+++ b/src/main/java/design/persistence/Serializers.java
@@ -1,20 +1,20 @@
package design.persistence;
+import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.util.DefaultIndenter;
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
-import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import design.model.Course;
import design.model.Golfer;
import design.model.League;
import java.io.IOException;
import java.time.LocalDateTime;
+import java.util.List;
public class Serializers {
public static class CustomPrettyPrinter extends DefaultPrettyPrinter {
@@ -85,4 +85,12 @@ public class Serializers {
gen.writeString(value.toString());
}
}
+
+ public static void configureMapper(ObjectMapper mapper) {
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
+ mapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));
+ mapper.registerModule(new JavaTimeModule());
+ mapper.configOverride(List.class).setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));
+ }
}
diff --git a/src/main/java/design/persistence/importexport/DataSource.java b/src/main/java/design/persistence/importexport/DataSource.java
index 5290e33..e735c7e 100644
--- a/src/main/java/design/persistence/importexport/DataSource.java
+++ b/src/main/java/design/persistence/importexport/DataSource.java
@@ -1,12 +1,16 @@
package design.persistence.importexport;
-import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.module.SimpleModule;
import java.io.IOException;
public interface DataSource {
- void importData(JsonNode tree) throws IOException;
+ void importData(Object data) throws IOException;
- JsonNode exportData() throws IOException;
+ Object exportData() throws IOException;
+
+ SimpleModule getJacksonModule();
+
+ Class<?> getTargetClass();
} \ No newline at end of file
diff --git a/src/main/java/design/persistence/importexport/JSONHandler.java b/src/main/java/design/persistence/importexport/JSONHandler.java
index 239eb6b..9c04281 100644
--- a/src/main/java/design/persistence/importexport/JSONHandler.java
+++ b/src/main/java/design/persistence/importexport/JSONHandler.java
@@ -1,6 +1,7 @@
package design.persistence.importexport;
-import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;
+import design.persistence.Serializers;
import java.io.File;
import java.io.IOException;
@@ -8,22 +9,26 @@ import java.io.IOException;
public class JSONHandler implements DataHandler {
private final DataSource dataSource;
- private final JsonMapper jsonMapper = new JsonMapper();
+ private final ObjectMapper jsonMapper = new JsonMapper();
public JSONHandler(DataSource dataSource) {
this.dataSource = dataSource;
+
+ Serializers.configureMapper(jsonMapper);
+ jsonMapper.registerModule(dataSource.getJacksonModule());
}
@Override
public void importData(File file) throws IOException {
- JsonNode tree = jsonMapper.readTree(file);
- dataSource.importData(tree);
+ Object data = jsonMapper.readValue(file, dataSource.getTargetClass());
+ dataSource.importData(data);
}
@Override
public void exportData(File file) throws IOException{
- JsonNode tree = dataSource.exportData();
- jsonMapper.writerWithDefaultPrettyPrinter().writeValue(file, tree);
+ Object data = dataSource.exportData();
+ jsonMapper.writer(new Serializers.CustomPrettyPrinter())
+ .writeValue(file, data);
}
}
diff --git a/src/main/java/design/persistence/importexport/XMLHandler.java b/src/main/java/design/persistence/importexport/XMLHandler.java
index 1a16b90..0a07d6e 100644
--- a/src/main/java/design/persistence/importexport/XMLHandler.java
+++ b/src/main/java/design/persistence/importexport/XMLHandler.java
@@ -1,10 +1,11 @@
package design.persistence.importexport;
import java.io.File;
import java.io.IOException;
+import java.time.LocalDateTime;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import design.persistence.Serializers;
public class XMLHandler implements DataHandler {
@@ -13,21 +14,24 @@ public class XMLHandler implements DataHandler {
public XMLHandler(DataSource dataSource) {
this.dataSource = dataSource;
+
+ Serializers.configureMapper(xmlMapper);
+ SimpleModule module = dataSource.getJacksonModule();
+ module.addSerializer(LocalDateTime.class, new Serializers.DateTimeStringSerializer());
+ xmlMapper.registerModule(module);
}
@Override
public void importData(File file) throws IOException {
- JsonNode tree = xmlMapper.readTree(file);
- JsonNode unwrapped = tree.get("items");
- dataSource.importData(unwrapped);
+ Object data = xmlMapper.readValue(file, dataSource.getTargetClass());
+ dataSource.importData(data);
}
@Override
public void exportData(File file) throws IOException {
- JsonNode tree = dataSource.exportData();
- ObjectNode wrapper = xmlMapper.createObjectNode();
- wrapper.set("items", tree);
- xmlMapper.writerWithDefaultPrettyPrinter().withRootName("export").writeValue(file, wrapper);
+ Object data = dataSource.exportData();
+ xmlMapper.writerWithDefaultPrettyPrinter()
+ .writeValue(file, data);
}
}
diff --git a/test.json b/test.json
index b171eba..4e42e0d 100644
--- a/test.json
+++ b/test.json
@@ -20,16 +20,6 @@
"invites": []
},
{
- "clubs": [],
- "nextClubId": 1,
- "username": "GUYHERE2",
- "passwordHash": 3556498,
- "fullName": "GUYHERE2",
- "courses": [],
- "rounds": [],
- "invites" : []
- },
- {
"clubs": [
{
"id": 1,
diff --git a/test.xml b/test.xml
index 0f508ef..4701977 100644
--- a/test.xml
+++ b/test.xml
@@ -1,127 +1,144 @@
-<export>
- <items>
+<Golfers>
+ <item>
+ <clubs/>
<nextClubId>1</nextClubId>
<username>test</username>
<passwordHash>3556498</passwordHash>
<fullName>test</fullName>
- </items>
- <items>
+ <courses/>
+ <rounds/>
+ <invites/>
+ </item>
+ <item>
+ <clubs/>
<nextClubId>1</nextClubId>
<username>GUYHERE</username>
<passwordHash>3556498</passwordHash>
<fullName>GUYHERE</fullName>
- </items>
- <items>
+ <courses/>
+ <rounds/>
+ <invites/>
+ </item>
+ <item>
<clubs>
- <id>1</id>
- <manufacture>Bobby</manufacture>
- <nickname>swen 261</nickname>
- <clubType>DRIVER</clubType>
- </clubs>
- <clubs>
- <id>2</id>
- <manufacture>Bobby</manufacture>
- <nickname>swen 262</nickname>
- <clubType>PUTTER</clubType>
- </clubs>
- <clubs>
- <id>3</id>
- <manufacture>sowclub</manufacture>
- <nickname>man</nickname>
- <clubType>WOOD</clubType>
+ <clubs>
+ <id>1</id>
+ <manufacture>Bobby</manufacture>
+ <nickname>swen 261</nickname>
+ <clubType>DRIVER</clubType>
+ </clubs>
+ <clubs>
+ <id>2</id>
+ <manufacture>Bobby</manufacture>
+ <nickname>swen 262</nickname>
+ <clubType>PUTTER</clubType>
+ </clubs>
+ <clubs>
+ <id>3</id>
+ <manufacture>sowclub</manufacture>
+ <nickname>man</nickname>
+ <clubType>WOOD</clubType>
+ </clubs>
</clubs>
<nextClubId>4</nextClubId>
<username>john_doe</username>
<passwordHash>46792755</passwordHash>
<fullName>John Doe</fullName>
- <courses>2</courses>
- <courses>1</courses>
- <rounds>
- <course>1</course>
- <dateTime>2025</dateTime>
- <dateTime>10</dateTime>
- <dateTime>7</dateTime>
- <dateTime>13</dateTime>
- <dateTime>54</dateTime>
- <dateTime>37</dateTime>
- <dateTime>429963500</dateTime>
- <startingHole>
- <number>1</number>
- <par>5</par>
- </startingHole>
- <plays>
- <holeNumber>1</holeNumber>
- <swings>
- <distance>100</distance>
- <clubUsed>1</clubUsed>
- </swings>
- <swings>
- <distance>5</distance>
- <clubUsed>2</clubUsed>
- </swings>
- <swings>
- <distance>1</distance>
- <clubUsed>2</clubUsed>
- </swings>
- <swingCount>3</swingCount>
- <distance>106</distance>
- </plays>
- <plays>
- <holeNumber>2</holeNumber>
- <swings>
- <distance>1000</distance>
- <clubUsed>1</clubUsed>
- </swings>
- <swings>
- <distance>2</distance>
- <clubUsed>1</clubUsed>
- </swings>
- <swingCount>2</swingCount>
- <distance>1002</distance>
- </plays>
- <currentHoleIndex>2</currentHoleIndex>
- <totalSwings>5</totalSwings>
- <totalDistance>1108.0</totalDistance>
- <currentHole>
- <number>3</number>
- <par>4</par>
- </currentHole>
- </rounds>
+ <courses>
+ <courses>2</courses>
+ <courses>1</courses>
+ </courses>
<rounds>
- <course>1</course>
- <dateTime>2025</dateTime>
- <dateTime>10</dateTime>
- <dateTime>8</dateTime>
- <dateTime>20</dateTime>
- <dateTime>19</dateTime>
- <dateTime>38</dateTime>
- <dateTime>968996400</dateTime>
- <startingHole>
- <number>9</number>
- <par>3</par>
- </startingHole>
- <plays>
- <holeNumber>9</holeNumber>
- <swings>
- <distance>204</distance>
- <clubUsed>1</clubUsed>
- </swings>
- <swingCount>1</swingCount>
- <distance>204</distance>
- </plays>
- <currentHoleIndex>9</currentHoleIndex>
- <totalSwings>1</totalSwings>
- <totalDistance>204.0</totalDistance>
- <currentHole>
- <number>10</number>
- <par>3</par>
- </currentHole>
+ <rounds>
+ <course>1</course>
+ <dateTime>2025-10-07T13:54:37.429963500</dateTime>
+ <startingHole>
+ <number>1</number>
+ <par>5</par>
+ </startingHole>
+ <plays>
+ <plays>
+ <holeNumber>1</holeNumber>
+ <swings>
+ <swings>
+ <distance>100</distance>
+ <clubUsed>1</clubUsed>
+ </swings>
+ <swings>
+ <distance>5</distance>
+ <clubUsed>2</clubUsed>
+ </swings>
+ <swings>
+ <distance>1</distance>
+ <clubUsed>2</clubUsed>
+ </swings>
+ </swings>
+ <swingCount>3</swingCount>
+ <distance>106</distance>
+ </plays>
+ <plays>
+ <holeNumber>2</holeNumber>
+ <swings>
+ <swings>
+ <distance>1000</distance>
+ <clubUsed>1</clubUsed>
+ </swings>
+ <swings>
+ <distance>2</distance>
+ <clubUsed>1</clubUsed>
+ </swings>
+ </swings>
+ <swingCount>2</swingCount>
+ <distance>1002</distance>
+ </plays>
+ </plays>
+ <currentHoleIndex>2</currentHoleIndex>
+ <totalSwings>5</totalSwings>
+ <totalDistance>1108.0</totalDistance>
+ <currentHole>
+ <number>3</number>
+ <par>4</par>
+ </currentHole>
+ </rounds>
+ <rounds>
+ <course>1</course>
+ <dateTime>2025-10-08T20:19:38.968996400</dateTime>
+ <startingHole>
+ <number>9</number>
+ <par>3</par>
+ </startingHole>
+ <plays>
+ <plays>
+ <holeNumber>9</holeNumber>
+ <swings>
+ <swings>
+ <distance>204</distance>
+ <clubUsed>1</clubUsed>
+ </swings>
+ </swings>
+ <swingCount>1</swingCount>
+ <distance>204</distance>
+ </plays>
+ </plays>
+ <currentHoleIndex>9</currentHoleIndex>
+ <totalSwings>1</totalSwings>
+ <totalDistance>204.0</totalDistance>
+ <currentHole>
+ <number>10</number>
+ <par>3</par>
+ </currentHole>
+ </rounds>
</rounds>
- </items>
- <items>
+ <invites/>
+ </item>
+ <item>
+ <clubs/>
<nextClubId>1</nextClubId>
<username>sowgro</username>
<passwordHash>-896456343</passwordHash>
<fullName>sowgro</fullName>
- </items>
-</export>
+ <courses/>
+ <rounds/>
+ <invites/>
+ </item>
+</Golfers>