You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by dg...@apache.org on 2018/05/23 09:49:45 UTC
incubator-unomi git commit: UNOMI-182 make sure definitions are
redeployed if the bundles that bring them is in SNAPSHOT
Repository: incubator-unomi
Updated Branches:
refs/heads/master f994d99a1 -> 510c524bf
UNOMI-182 make sure definitions are redeployed if the bundles that bring them is in SNAPSHOT
Project: http://git-wip-us.apache.org/repos/asf/incubator-unomi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-unomi/commit/510c524b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-unomi/tree/510c524b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-unomi/diff/510c524b
Branch: refs/heads/master
Commit: 510c524bfe0415a1fae8d643e7cac48b667b88b9
Parents: f994d99
Author: dgaillard <dg...@jahia.com>
Authored: Wed May 23 11:49:34 2018 +0200
Committer: dgaillard <dg...@jahia.com>
Committed: Wed May 23 11:49:34 2018 +0200
----------------------------------------------------------------------
.../unomi/api/services/ProfileService.java | 9 +
.../services/DefinitionsServiceImpl.java | 4 +-
.../services/services/GoalsServiceImpl.java | 4 +-
.../services/services/ProfileServiceImpl.java | 20 +-
.../services/services/RulesServiceImpl.java | 2 +-
.../services/services/SegmentServiceImpl.java | 4 +-
.../unomi/shell/commands/DeployDefinition.java | 183 +++++++++++++++++++
.../resources/OSGI-INF/blueprint/blueprint.xml | 15 +-
8 files changed, 225 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/510c524b/api/src/main/java/org/apache/unomi/api/services/ProfileService.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/unomi/api/services/ProfileService.java b/api/src/main/java/org/apache/unomi/api/services/ProfileService.java
index 028cc89..bc86c70 100644
--- a/api/src/main/java/org/apache/unomi/api/services/ProfileService.java
+++ b/api/src/main/java/org/apache/unomi/api/services/ProfileService.java
@@ -21,6 +21,7 @@ import org.apache.unomi.api.*;
import org.apache.unomi.api.conditions.Condition;
import org.apache.unomi.api.query.Query;
+import java.net.URL;
import java.util.*;
/**
@@ -312,6 +313,14 @@ public interface ProfileService {
boolean setPropertyType(PropertyType property);
/**
+ * This function will try to set the target on the property type if not set already, based on the file URL
+ *
+ * @param predefinedPropertyTypeURL
+ * @param propertyType
+ */
+ void setPropertyTypeTarget(URL predefinedPropertyTypeURL, PropertyType propertyType);
+
+ /**
* Deletes the property type identified by the specified identifier.
*
* TODO: move to a different class
http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/510c524b/services/src/main/java/org/apache/unomi/services/services/DefinitionsServiceImpl.java
----------------------------------------------------------------------
diff --git a/services/src/main/java/org/apache/unomi/services/services/DefinitionsServiceImpl.java b/services/src/main/java/org/apache/unomi/services/services/DefinitionsServiceImpl.java
index b5f8166..3392522 100644
--- a/services/src/main/java/org/apache/unomi/services/services/DefinitionsServiceImpl.java
+++ b/services/src/main/java/org/apache/unomi/services/services/DefinitionsServiceImpl.java
@@ -132,7 +132,7 @@ public class DefinitionsServiceImpl implements DefinitionsService, SynchronousBu
try {
ConditionType conditionType = CustomObjectMapper.getObjectMapper().readValue(predefinedConditionURL, ConditionType.class);
// Register only if condition type does not exist yet
- if (getConditionType(conditionType.getMetadata().getId()) == null) {
+ if (getConditionType(conditionType.getMetadata().getId()) == null || bundleContext.getBundle().getVersion().toString().contains("SNAPSHOT")) {
setConditionType(conditionType);
logger.info("Predefined condition type with id {} registered", conditionType.getMetadata().getId());
} else {
@@ -157,7 +157,7 @@ public class DefinitionsServiceImpl implements DefinitionsService, SynchronousBu
try {
ActionType actionType = CustomObjectMapper.getObjectMapper().readValue(predefinedActionURL, ActionType.class);
// Register only if action type does not exist yet
- if (getActionType(actionType.getMetadata().getId()) == null) {
+ if (getActionType(actionType.getMetadata().getId()) == null || bundleContext.getBundle().getVersion().toString().contains("SNAPSHOT")) {
setActionType(actionType);
logger.info("Predefined action type with id {} registered", actionType.getMetadata().getId());
} else {
http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/510c524b/services/src/main/java/org/apache/unomi/services/services/GoalsServiceImpl.java
----------------------------------------------------------------------
diff --git a/services/src/main/java/org/apache/unomi/services/services/GoalsServiceImpl.java b/services/src/main/java/org/apache/unomi/services/services/GoalsServiceImpl.java
index f9bd9c3..bd7fce5 100644
--- a/services/src/main/java/org/apache/unomi/services/services/GoalsServiceImpl.java
+++ b/services/src/main/java/org/apache/unomi/services/services/GoalsServiceImpl.java
@@ -119,7 +119,7 @@ public class GoalsServiceImpl implements GoalsService, SynchronousBundleListener
goal.getMetadata().setScope("systemscope");
}
// Register only if goal does not exist yet
- if (getGoal(goal.getMetadata().getId()) == null) {
+ if (getGoal(goal.getMetadata().getId()) == null || bundleContext.getBundle().getVersion().toString().contains("SNAPSHOT")) {
setGoal(goal);
logger.info("Predefined goal with id {} registered", goal.getMetadata().getId());
} else {
@@ -264,7 +264,7 @@ public class GoalsServiceImpl implements GoalsService, SynchronousBundleListener
try {
Campaign campaign = CustomObjectMapper.getObjectMapper().readValue(predefinedCampaignURL, Campaign.class);
// Register only if campaign does not exist yet
- if (getCampaign(campaign.getMetadata().getId()) == null) {
+ if (getCampaign(campaign.getMetadata().getId()) == null || bundleContext.getBundle().getVersion().toString().contains("SNAPSHOT")) {
setCampaign(campaign);
logger.info("Predefined campaign with id {} registered", campaign.getMetadata().getId());
} else {
http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/510c524b/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java
----------------------------------------------------------------------
diff --git a/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java b/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java
index a37ed7a..bdce139 100644
--- a/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java
+++ b/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java
@@ -896,6 +896,16 @@ public class ProfileServiceImpl implements ProfileService, SynchronousBundleList
return null;
}
+ public void setPropertyTypeTarget(URL predefinedPropertyTypeURL, PropertyType propertyType) {
+ if (StringUtils.isBlank(propertyType.getTarget())) {
+ String[] splitPath = predefinedPropertyTypeURL.getPath().split("/");
+ String target = splitPath[4];
+ if (StringUtils.isNotBlank(target)) {
+ propertyType.setTarget(target);
+ }
+ }
+ }
+
private void loadPredefinedPersonas(BundleContext bundleContext) {
if (bundleContext == null) {
return;
@@ -914,7 +924,7 @@ public class ProfileServiceImpl implements ProfileService, SynchronousBundleList
String itemId = persona.getPersona().getItemId();
// Register only if persona does not exist yet
- if (persistenceService.load(itemId, Persona.class) == null) {
+ if (persistenceService.load(itemId, Persona.class) == null || bundleContext.getBundle().getVersion().toString().contains("SNAPSHOT")) {
persistenceService.save(persona.getPersona());
List<PersonaSession> sessions = persona.getSessions();
@@ -947,10 +957,9 @@ public class ProfileServiceImpl implements ProfileService, SynchronousBundleList
try {
PropertyType propertyType = CustomObjectMapper.getObjectMapper().readValue(predefinedPropertyTypeURL, PropertyType.class);
// Register only if property type does not exist yet
- if (getPropertyType(propertyType.getMetadata().getId()) == null) {
- String[] splitPath = predefinedPropertyTypeURL.getPath().split("/");
- String target = splitPath[4];
- propertyType.setTarget(target);
+ if (getPropertyType(propertyType.getMetadata().getId()) == null || bundleContext.getBundle().getVersion().toString().contains("SNAPSHOT")) {
+
+ setPropertyTypeTarget(predefinedPropertyTypeURL, propertyType);
persistenceService.save(propertyType);
bundlePropertyTypes.add(propertyType);
@@ -965,7 +974,6 @@ public class ProfileServiceImpl implements ProfileService, SynchronousBundleList
propertyTypes = propertyTypes.with(bundlePropertyTypes);
}
-
public void bundleChanged(BundleEvent event) {
switch (event.getType()) {
case BundleEvent.STARTED:
http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/510c524b/services/src/main/java/org/apache/unomi/services/services/RulesServiceImpl.java
----------------------------------------------------------------------
diff --git a/services/src/main/java/org/apache/unomi/services/services/RulesServiceImpl.java b/services/src/main/java/org/apache/unomi/services/services/RulesServiceImpl.java
index d3758ba..2bcf564 100644
--- a/services/src/main/java/org/apache/unomi/services/services/RulesServiceImpl.java
+++ b/services/src/main/java/org/apache/unomi/services/services/RulesServiceImpl.java
@@ -153,7 +153,7 @@ public class RulesServiceImpl implements RulesService, EventListenerService, Syn
try {
Rule rule = CustomObjectMapper.getObjectMapper().readValue(predefinedSegmentURL, Rule.class);
// Register only if rule does not exist yet
- if (getRule(rule.getMetadata().getId()) == null) {
+ if (getRule(rule.getMetadata().getId()) == null || bundleContext.getBundle().getVersion().toString().contains("SNAPSHOT")) {
setRule(rule);
logger.info("Predefined rule with id {} registered", rule.getMetadata().getId());
} else {
http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/510c524b/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
----------------------------------------------------------------------
diff --git a/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java b/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
index b0d7335..442d14f 100644
--- a/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
+++ b/services/src/main/java/org/apache/unomi/services/services/SegmentServiceImpl.java
@@ -137,7 +137,7 @@ public class SegmentServiceImpl extends AbstractServiceImpl implements SegmentSe
segment.getMetadata().setScope("systemscope");
}
// Register only if segment does not exist yet
- if (getSegmentDefinition(segment.getMetadata().getId()) == null) {
+ if (getSegmentDefinition(segment.getMetadata().getId()) == null || bundleContext.getBundle().getVersion().toString().contains("SNAPSHOT")) {
setSegmentDefinition(segment);
logger.info("Predefined segment with id {} registered", segment.getMetadata().getId());
} else {
@@ -164,7 +164,7 @@ public class SegmentServiceImpl extends AbstractServiceImpl implements SegmentSe
scoring.getMetadata().setScope("systemscope");
}
// Register only if scoring plan does not exist yet
- if (getScoringDefinition(scoring.getMetadata().getId()) == null) {
+ if (getScoringDefinition(scoring.getMetadata().getId()) == null || bundleContext.getBundle().getVersion().toString().contains("SNAPSHOT")) {
setScoringDefinition(scoring);
logger.info("Predefined scoring with id {} registered", scoring.getMetadata().getId());
} else {
http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/510c524b/tools/shell-dev-commands/src/main/java/org/apache/unomi/shell/commands/DeployDefinition.java
----------------------------------------------------------------------
diff --git a/tools/shell-dev-commands/src/main/java/org/apache/unomi/shell/commands/DeployDefinition.java b/tools/shell-dev-commands/src/main/java/org/apache/unomi/shell/commands/DeployDefinition.java
new file mode 100644
index 0000000..abde5ae
--- /dev/null
+++ b/tools/shell-dev-commands/src/main/java/org/apache/unomi/shell/commands/DeployDefinition.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.unomi.shell.commands;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.unomi.api.Persona;
+import org.apache.unomi.api.PersonaWithSessions;
+import org.apache.unomi.api.PropertyType;
+import org.apache.unomi.api.actions.ActionType;
+import org.apache.unomi.api.campaigns.Campaign;
+import org.apache.unomi.api.conditions.ConditionType;
+import org.apache.unomi.api.goals.Goal;
+import org.apache.unomi.api.rules.Rule;
+import org.apache.unomi.api.segments.Scoring;
+import org.apache.unomi.api.segments.Segment;
+import org.apache.unomi.api.services.*;
+import org.apache.unomi.persistence.spi.CustomObjectMapper;
+import org.jline.reader.LineReader;
+import org.osgi.framework.Bundle;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.List;
+
+@Command(scope = "unomi", name = "deploy-definition", description = "This will deploy a specific definition")
+public class DeployDefinition extends OsgiCommandSupport {
+
+ private DefinitionsService definitionsService;
+ private GoalsService goalsService;
+ private ProfileService profileService;
+ private RulesService rulesService;
+ private SegmentService segmentService;
+
+ private List<String> definitionTypes = Arrays.asList("condition", "action", "goal", "campaign", "persona", "persona with sessions", "property", "rule", "segment", "scoring");
+
+ @Argument(index = 0, name = "bundleId", description = "The bundle identifier where to find the definition", required = true, multiValued = false)
+ Long bundleIdentifier;
+
+ @Argument(index = 1, name = "fileName", description = "The name of the file which contains the definition", required = true, multiValued = false)
+ String fileName;
+
+ protected Object doExecute() throws Exception {
+ Bundle bundleToUpdate = bundleContext.getBundle(bundleIdentifier);
+ if (bundleToUpdate == null) {
+ System.out.println("Couldn't find a bundle with id: " + bundleIdentifier);
+ return null;
+ }
+
+ String definitionTypeAnswer = askUserWithAuthorizedAnswer(session,"Which kind of definition do you want to load?" + getDefinitionTypesWithNumber(), Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"));
+ String definitionType = definitionTypes.get(new Integer(definitionTypeAnswer));
+
+ String path = "META-INF/cxs/" + definitionType;
+ Enumeration<URL> definitions = bundleToUpdate.findEntries(path, "*.json", true);
+ if (definitions == null) {
+ System.out.println("Couldn't find definitions in bundle with id: " + bundleIdentifier + " and definition path: " + path);
+ return null;
+ }
+
+ while (definitions.hasMoreElements()) {
+ URL definitionURL = definitions.nextElement();
+ if (definitionURL.toString().contains(fileName)) {
+ System.out.println("Found definition at " + definitionURL + ", loading... ");
+
+ updateDefinition(definitionType, definitionURL);
+ }
+ }
+
+ return null;
+ }
+
+ private String askUserWithAuthorizedAnswer(CommandSession session, String msg, List<String> authorizedAnswer) throws IOException {
+ String answer;
+ do {
+ answer = promptMessageToUser(session,msg);
+ } while (!authorizedAnswer.contains(answer.toLowerCase()));
+ return answer;
+ }
+
+ private String promptMessageToUser(CommandSession session, String msg) throws IOException {
+ LineReader reader = (LineReader) session.get(".jline.reader");
+ return reader.readLine(msg, null);
+ }
+
+ private String getDefinitionTypesWithNumber() {
+ StringBuilder definitionTypesWithNumber = new StringBuilder();
+ for (int i = 0; i < definitionTypes.size(); i++) {
+ definitionTypesWithNumber.append("\n").append(i + 1).append(". ").append(definitionTypes.get(i));
+ }
+ return definitionTypesWithNumber.toString();
+ }
+
+ private void updateDefinition(String definitionType, URL definitionURL) {
+ try {
+ switch (definitionType) {
+ case "condition":
+ ConditionType conditionType = CustomObjectMapper.getObjectMapper().readValue(definitionURL, ConditionType.class);
+ definitionsService.setConditionType(conditionType);
+ break;
+ case "action":
+ ActionType actionType = CustomObjectMapper.getObjectMapper().readValue(definitionURL, ActionType.class);
+ definitionsService.setActionType(actionType);
+ break;
+ case "goal":
+ Goal goal = CustomObjectMapper.getObjectMapper().readValue(definitionURL, Goal.class);
+ goalsService.setGoal(goal);
+ break;
+ case "campaign":
+ Campaign campaign = CustomObjectMapper.getObjectMapper().readValue(definitionURL, Campaign.class);
+ goalsService.setCampaign(campaign);
+ break;
+ case "persona":
+ Persona persona = CustomObjectMapper.getObjectMapper().readValue(definitionURL, Persona.class);
+ profileService.savePersona(persona);
+ break;
+ case "persona with session":
+ PersonaWithSessions personaWithSessions = CustomObjectMapper.getObjectMapper().readValue(definitionURL, PersonaWithSessions.class);
+ profileService.savePersonaWithSessions(personaWithSessions);
+ break;
+ case "property":
+ PropertyType propertyType = CustomObjectMapper.getObjectMapper().readValue(definitionURL, PropertyType.class);
+ profileService.setPropertyTypeTarget(definitionURL, propertyType);
+ profileService.setPropertyType(propertyType);
+ break;
+ case "rule":
+ Rule rule = CustomObjectMapper.getObjectMapper().readValue(definitionURL, Rule.class);
+ rulesService.setRule(rule);
+ break;
+ case "segment":
+ Segment segment = CustomObjectMapper.getObjectMapper().readValue(definitionURL, Segment.class);
+ segmentService.setSegmentDefinition(segment);
+ break;
+ case "scoring":
+ Scoring scoring = CustomObjectMapper.getObjectMapper().readValue(definitionURL, Scoring.class);
+ segmentService.setScoringDefinition(scoring);
+ break;
+ }
+ System.out.println("Predefined definition registered");
+ } catch (IOException e) {
+ System.out.println("Error while saving definition " + definitionURL);
+ System.out.println(e.getMessage());
+ }
+ }
+
+ public void setDefinitionsService(DefinitionsService definitionsService) {
+ this.definitionsService = definitionsService;
+ }
+
+ public void setGoalsService(GoalsService goalsService) {
+ this.goalsService = goalsService;
+ }
+
+ public void setProfileService(ProfileService profileService) {
+ this.profileService = profileService;
+ }
+
+ public void setRulesService(RulesService rulesService) {
+ this.rulesService = rulesService;
+ }
+
+ public void setSegmentService(SegmentService segmentService) {
+ this.segmentService = segmentService;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/510c524b/tools/shell-dev-commands/src/main/resources/OSGI-INF/blueprint/blueprint.xml
----------------------------------------------------------------------
diff --git a/tools/shell-dev-commands/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/tools/shell-dev-commands/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index fb1ea70..c86d45f 100644
--- a/tools/shell-dev-commands/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ b/tools/shell-dev-commands/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -22,9 +22,9 @@
xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:shell="http://karaf.apache.org/xmlns/shell/v1.1.0"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
- http://cxf.apache.org/blueprint/jaxrs http://cxf.apache.org/schemas/blueprint/jaxrs.xsd
- http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd
- http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd">
+ http://cxf.apache.org/blueprint/jaxrs http://cxf.apache.org/schemas/blueprint/jaxrs.xsd
+ http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd
+ http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd">
<reference id="segmentService" interface="org.apache.unomi.api.services.SegmentService"/>
<reference id="userListService" interface="org.apache.unomi.api.services.UserListService"/>
@@ -72,6 +72,15 @@
<shell:property name="segmentService" ref="segmentService" />
</shell:action>
</shell:command>
+ <shell:command>
+ <shell:action class="org.apache.unomi.shell.commands.DeployDefinition">
+ <shell:property name="definitionsService" ref="definitionsService" />
+ <shell:property name="goalsService" ref="goalsService" />
+ <shell:property name="profileService" ref="profileService" />
+ <shell:property name="rulesService" ref="rulesService" />
+ <shell:property name="segmentService" ref="segmentService" />
+ </shell:action>
+ </shell:command>
</shell:command-bundle>
</blueprint>