Bug 565945: load default skills from EMF storage

Change-Id: I38cbcac71550d50aa3bb263c03f648013d281292
diff --git a/plugins/org.eclipse.skills/plugin.xml b/plugins/org.eclipse.skills/plugin.xml
index 105b1fa..8abfc0c 100644
--- a/plugins/org.eclipse.skills/plugin.xml
+++ b/plugins/org.eclipse.skills/plugin.xml
@@ -29,12 +29,6 @@
             class="org.eclipse.skills.startup.SkillsLauncher">

       </startup>

    </extension>

-   <extension

-         point="org.eclipse.skills.quest">

-      <resource

-            URI="resources/default.skills">

-      </resource>

-   </extension>

 

    <extension

          point="org.eclipse.ui.views">

diff --git a/plugins/org.eclipse.skills/resources/default.skills b/plugins/org.eclipse.skills/resources/default.skills
index e0a296f..66df940 100644
--- a/plugins/org.eclipse.skills/resources/default.skills
+++ b/plugins/org.eclipse.skills/resources/default.skills
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <skills:Quest xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:skills="http://eclipse.org/skills/1.0.0" title="Default User Skills">
-  <skills name="Dextery">
+  <skills name="Dextery" baseSkill="true">
     <description text="Your ability to use the application in an efficient way."/>
     <progression xsi:type="skills:FactorProgression"/>
   </skills>
-  <skills name="Strength">
+  <skills name="Strength" baseSkill="true">
     <description text="Your ability to accomplish complex tasks."/>
     <progression xsi:type="skills:FactorProgression"/>
   </skills>
-  <skills name="Wisdom">
+  <skills name="Wisdom" baseSkill="true">
     <description text="Your knowledge about features of the application."/>
     <progression xsi:type="skills:FactorProgression"/>
   </skills>
diff --git a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/UserFactory.java b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/UserFactory.java
index 3280787..1191129 100644
--- a/plugins/org.eclipse.skills/src/org/eclipse/skills/service/UserFactory.java
+++ b/plugins/org.eclipse.skills/src/org/eclipse/skills/service/UserFactory.java
@@ -13,17 +13,44 @@
 
 package org.eclipse.skills.service;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
+import org.eclipse.skills.model.IDescription;
+import org.eclipse.skills.model.IQuest;
 import org.eclipse.skills.model.ISkill;
 import org.eclipse.skills.model.ISkillsFactory;
+import org.eclipse.skills.model.ISkillsPackage;
 import org.eclipse.skills.model.IUser;
 
 public class UserFactory {
 
-	private static ISkill createSkill(String name) {
-		final ISkill experience = ISkillsFactory.eINSTANCE.createSkill();
-		experience.setName(name);
+	private static List<ISkill> getGeneratedDefaultSkills() {
+		final List<ISkill> skills = new ArrayList<>();
+		skills.add(createSkill("Dextery"));
+		skills.add(createSkill("Strength"));
+		skills.add(createSkill("Wisdom"));
 
-		return experience;
+		return skills;
+	}
+
+	private static ISkill createSkill(String name) {
+		final IDescription description = ISkillsFactory.eINSTANCE.createDescription();
+		description.setText("<description missing>");
+
+		final ISkill skill = ISkillsFactory.eINSTANCE.createSkill();
+		skill.setName(name);
+		skill.setDescription(description);
+
+		return skill;
 	}
 
 	private static String capitalizeFirstLetter(String word) {
@@ -39,11 +66,29 @@
 		user.setName(capitalizeFirstLetter(System.getProperty("user.name")));
 
 		user.setExperience(createSkill("Experience"));
+		user.getExperience().getDescription().setText("Your overall progress");
 
-		user.getSkills().add(createSkill("Dextery"));
-		user.getSkills().add(createSkill("Strength"));
-		user.getSkills().add(createSkill("Wisdom"));
+		for (final ISkill skill : getDefaultSkills())
+			user.getSkills().add(EcoreUtil.copy(skill));
 
 		return user;
 	}
+
+	private List<ISkill> getDefaultSkills() {
+		// initialize the model
+		ISkillsPackage.eINSTANCE.eClass();
+
+		final Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
+		final Map<String, Object> extensionsMap = reg.getExtensionToFactoryMap();
+		extensionsMap.put("skills", new XMIResourceFactoryImpl());
+
+		final ResourceSet resourceSet = new ResourceSetImpl();
+		final Resource resource = resourceSet.getResource(URI.createURI("platform:/plugin/org.eclipse.skills/resources/default.skills"), true);
+
+		final EObject root = resource.getContents().get(0);
+		if (root instanceof IQuest)
+			return ((IQuest) root).getSkills();
+
+		return getGeneratedDefaultSkills();
+	}
 }
diff --git a/tests/org.eclipse.skills.test/src/org/eclipse/skills/service/UserFactoryTest.java b/tests/org.eclipse.skills.test/src/org/eclipse/skills/service/UserFactoryTest.java
index 355968d..5fe78c1 100644
--- a/tests/org.eclipse.skills.test/src/org/eclipse/skills/service/UserFactoryTest.java
+++ b/tests/org.eclipse.skills.test/src/org/eclipse/skills/service/UserFactoryTest.java
@@ -19,6 +19,7 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
 
+import org.eclipse.skills.model.ISkill;
 import org.eclipse.skills.model.IUser;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@ -65,4 +66,24 @@
 		assertNotNull(user.getSkill("Dextery"));
 		assertNotNull(user.getSkill("Wisdom"));
 	}
+
+	@Test
+	@DisplayName("default skills have a description")
+	public void defaultSkillsHaveDescription() {
+		final IUser user = new UserFactory().createUser();
+
+		assertFalse(user.getExperience().getDescription().getText().isEmpty());
+
+		for (final ISkill skill : user.getSkills())
+			assertFalse(skill.getDescription().getText().isEmpty());
+	}
+
+	@Test
+	@DisplayName("default skills have 0 XP")
+	public void defaultSkillsHave0XP() {
+		final IUser user = new UserFactory().createUser();
+
+		for (final ISkill skill : user.getSkills())
+			assertEquals(0, skill.getExperience());
+	}
 }