Pollen-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
May 2014
- 5 participants
- 203 discussions
r3926 - in trunk/pollen-ui-angular/src/main/webapp/js: . controllers
by garandel@users.chorem.org 09 May '14
by garandel@users.chorem.org 09 May '14
09 May '14
Author: garandel
Date: 2014-05-09 11:13:15 +0200 (Fri, 09 May 2014)
New Revision: 3926
Url: http://forge.chorem.org/projects/pollen/repository/revisions/3926
Log:
fix popup setting
Modified:
trunk/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js
trunk/pollen-ui-angular/src/main/webapp/js/services.js
Modified: trunk/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js
===================================================================
--- trunk/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js 2014-05-09 05:53:25 UTC (rev 3925)
+++ trunk/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js 2014-05-09 09:13:15 UTC (rev 3926)
@@ -159,41 +159,41 @@
}
var PollPopupSettingsCtrl = function ($scope, $filter, $modalInstance, poll) {
- $scope.data.poll = poll;
- $scope.data.toDay = new Date();
+ $scope.poll = poll;
+ $scope.toDay = new Date();
- $scope.$watch('data.poll.beginDate', function() {
- if (data.poll.beginChoiceDate) {
- if (data.poll.beginChoiceDate < data.poll.beginDate) {
- data.poll.beginChoiceDate = data.poll.beginDate;
+ $scope.$watch('poll.beginDate', function() {
+ if (poll.beginChoiceDate) {
+ if (poll.beginChoiceDate < poll.beginDate) {
+ poll.beginChoiceDate = poll.beginDate;
}
}
else {
- data.poll.beginChoiceDate = data.poll.beginDate;
+ poll.beginChoiceDate = poll.beginDate;
}
});
- $scope.$watch('data.poll.endDate', function() {
- if (data.poll.endChoiceDate) {
- if (data.poll.endChoiceDate > data.poll.endDate) {
- data.poll.endChoiceDate = data.poll.endDate;
+ $scope.$watch('poll.endDate', function() {
+ if (poll.endChoiceDate) {
+ if (poll.endChoiceDate > poll.endDate) {
+ poll.endChoiceDate = poll.endDate;
}
}
else {
- data.poll.endChoiceDate = data.poll.endDate;
+ poll.endChoiceDate = poll.endDate;
}
});
if (!angular.isDefined($scope.poll.continuousResults)) {
- $scope.data.poll.continuousResults = false;
+ $scope.poll.continuousResults = false;
}
if (!angular.isDefined($scope.poll.resultVisibility)) {
- $scope.data.poll.resultVisibility = 'EVERYBODY';
+ $scope.poll.resultVisibility = 'EVERYBODY';
}
if (!angular.isDefined($scope.poll.choiceAddAllowed)) {
- $scope.data.poll.choiceAddAllowed = false;
+ $scope.poll.choiceAddAllowed = false;
}
$scope.close = function () {
@@ -268,7 +268,10 @@
$scope.save = function () {
if ($scope.formValid) {
- $scope.data.poll.$update({permission:$scope.data.poll.creator.permission.token}, function () {
+
+ var poll = angular.copy($scope.data.poll);
+ poll.choice = angular.copy($scope.data.choices);
+ Poll.update({permission:$scope.data.poll.creator.permission.token}, poll, function (data) {
$scope.globalVariables.saved = true;
});
}
Modified: trunk/pollen-ui-angular/src/main/webapp/js/services.js
===================================================================
--- trunk/pollen-ui-angular/src/main/webapp/js/services.js 2014-05-09 05:53:25 UTC (rev 3925)
+++ trunk/pollen-ui-angular/src/main/webapp/js/services.js 2014-05-09 09:13:15 UTC (rev 3926)
@@ -42,9 +42,6 @@
transformRequest : function (data, headersGetter) {
return transformParam(data);
}
- },
- 'delete' : {
- method : 'DELETE'
}
});
}])
1
0
r3925 - trunk/pollen-services/src/main/java/org/chorem/pollen/services
by tchemit@users.chorem.org 09 May '14
by tchemit@users.chorem.org 09 May '14
09 May '14
Author: tchemit
Date: 2014-05-09 07:53:25 +0200 (Fri, 09 May 2014)
New Revision: 3925
Url: http://forge.chorem.org/projects/pollen/repository/revisions/3925
Log:
copy deleted state in entity
Modified:
trunk/pollen-services/src/main/java/org/chorem/pollen/services/TopiaEntityCopyVisitor.java
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/TopiaEntityCopyVisitor.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/TopiaEntityCopyVisitor.java 2014-05-09 05:47:25 UTC (rev 3924)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/TopiaEntityCopyVisitor.java 2014-05-09 05:53:25 UTC (rev 3925)
@@ -168,8 +168,12 @@
current.setTopiaId(source.getTopiaId());
current.setTopiaCreateDate(source.getTopiaCreateDate());
current.setTopiaVersion(source.getTopiaVersion());
- //FIXME Deal with technical properties (deleted)
+ if (source.isDeleted()){
+ current.notifyDeleted();
+
+ }
+
} catch (InstantiationException | IllegalAccessException e) {
throw new PollenTechnicalException("could not create a new entity", e);
1
0
r3924 - in trunk: pollen-rest-api/src/main/java/org/chorem/pollen/rest/api pollen-services/src/main/java/org/chorem/pollen/services
by tchemit@users.chorem.org 09 May '14
by tchemit@users.chorem.org 09 May '14
09 May '14
Author: tchemit
Date: 2014-05-09 07:47:25 +0200 (Fri, 09 May 2014)
New Revision: 3924
Url: http://forge.chorem.org/projects/pollen/repository/revisions/3924
Log:
improve copy visitor + remove old code in Render
Modified:
trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRender.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/TopiaEntityCopyVisitor.java
Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRender.java
===================================================================
--- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRender.java 2014-05-08 12:57:53 UTC (rev 3923)
+++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRender.java 2014-05-09 05:47:25 UTC (rev 3924)
@@ -49,19 +49,6 @@
*/
public class PollenRender<T> extends Render {
-// /**
-// * To specify entity collections to include in binded entities.
-// *
-// * @author tchemit <chemit(a)codelutin.com>
-// * @since 2.0
-// */
-// @Retention(RetentionPolicy.RUNTIME)
-// @Target(ElementType.METHOD)
-// public @interface ExposeCollection {
-//
-// public String[] values() default {};
-// }
-
protected T model;
public PollenRender(T model) {
@@ -75,12 +62,6 @@
HttpServletResponse response = context.getResponse();
response.setContentType("application/json");
-// String[] includeCollection = null;
-// ExposeCollection annotation = call.getCurrent().getMethod().getAnnotation(ExposeCollection.class);
-// if (annotation != null) {
-// includeCollection = annotation.values();
-// }
-
Object map;
ObjectMapper mapper;
@@ -125,7 +106,6 @@
}
- // protected <M> Object toMap(M model, String... includeCollection) {
protected <M> Object toMap(M model) {
if (model instanceof InvalidFormException) {
@@ -157,140 +137,6 @@
return model;
-// if (model instanceof Iterable<?>) {
-//
-// // collection of objects
-// Iterable<?> objects = (Iterable<?>) model;
-// List<Object> result = Lists.newArrayList();
-// for (Object object : objects) {
-// Object objectMap = toMap(object, includeCollection);
-// result.add(objectMap);
-// }
-//
-// return result;
-//
-// }
-//
-// // single object
-// // FIXME Do this in service, not here
-//
-// if (model instanceof TopiaEntity) {
-//
-// // entity need to transform it
-//
-// TopiaEntity topiaEntity = (TopiaEntity) model;
-//
-// Class<? extends TopiaEntity> entitytype = PollenEntityEnum.getContractClass(topiaEntity.getClass());
-// PollenEntityBinder<TopiaEntity> binder = BinderFactory.newBinder(entitytype, entitytype, null, PollenEntityBinder.class);
-// Map<String, Object> map = binder.obtainProperties(topiaEntity);
-// Map<String, Object> result = Maps.newTreeMap();
-//
-// for (Map.Entry<String, Object> entry : map.entrySet()) {
-// String propertyName = entry.getKey();
-// Object propertyValue = entry.getValue();
-// if (propertyValue instanceof TopiaEntity) {
-// result.put(propertyName, toMap(propertyValue));
-// continue;
-// }
-//
-// result.put(propertyName, propertyValue);
-//
-// }
-//
-// // treat collections
-//
-// if (includeCollection != null) {
-// for (String propertyName : includeCollection) {
-// Iterable<?> collectionValue = binder.getCollectionValue(topiaEntity, propertyName);
-// result.put(propertyName, toMap(collectionValue));
-//
-// }
-// }
-//
-// return result;
-//
-// }
-
-// return model;
-
}
-// protected static class PollenEntityBinder<E extends TopiaEntity> extends Binder<E, E> {
-//
-// /** Logger. */
-// private static final Log log =
-// LogFactory.getLog(PollenEntityBinder.class);
-//
-// private static final long serialVersionUID = 1L;
-//
-// protected List<String> simpleProperties;
-//
-// public PollenEntityBinder() {
-// }
-//
-// @Override
-// protected void setModel(BinderModel<E, E> model) {
-// super.setModel(model);
-// this.simpleProperties = Lists.newArrayList();
-// for (String property : model.getSourceDescriptors()) {
-// if (model.getCollectionType(property) == null) {
-// simpleProperties.add(property);
-// }
-// }
-// }
-//
-// /**
-// * Obtain from the given object all properties registered in the binder
-// * model.
-// *
-// * @param source the bean to read
-// * @return the map of properties obtained indexed by their property name,
-// * or an empty map is the given {@code from} is {@code null}.
-// * @since 2.3
-// */
-// public Map<String, Object> obtainProperties(E source) {
-// if (source == null) {
-// // special limit case
-// return Collections.emptyMap();
-// }
-//
-// Map<String, Object> result = Maps.newTreeMap();
-// for (String sourceProperty : simpleProperties) {
-//
-//
-// try {
-// Object read;
-// Method readMethod = model.getSourceReadMethod(sourceProperty);
-// read = readMethod.invoke(source);
-// if (log.isDebugEnabled()) {
-// log.debug("property " + sourceProperty + ", type : " +
-// readMethod.getReturnType() + ", value = " + read);
-// }
-// if (readMethod.getReturnType().isPrimitive() &&
-// ObjectUtil.getNullValue(
-// readMethod.getReturnType()).equals(read)) {
-// // for primitive type case, force nullity
-// read = null;
-// }
-//
-// if (read != null) {
-// result.put(sourceProperty, read);
-// }
-// } catch (IllegalAccessException | InvocationTargetException e) {
-// throw new PollenTechnicalException(e);
-// }
-// }
-// return result;
-// }
-//
-// public Iterable<?> getCollectionValue(E source, String sourceProperty) {
-// try {
-// Method readMethod = model.getSourceReadMethod(sourceProperty);
-// Object result = readMethod.invoke(source);
-// return (Iterable<?>) result;
-// } catch (IllegalAccessException | InvocationTargetException e) {
-// throw new PollenTechnicalException(e);
-// }
-// }
-// }
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/TopiaEntityCopyVisitor.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/TopiaEntityCopyVisitor.java 2014-05-08 12:57:53 UTC (rev 3923)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/TopiaEntityCopyVisitor.java 2014-05-09 05:47:25 UTC (rev 3924)
@@ -54,7 +54,7 @@
* <p/>
* When a entity is started, the previous current entity goes at the top of the stack.
* <p/>
- * When a entity is ended, the current entity goes is marked as the last ended,
+ * When a entity is ended, the current entity goes is marked as the last,
* and the last entity of the stack goes back to the current state.
*/
protected Deque<TopiaEntity> stack = new ArrayDeque<>();
@@ -65,9 +65,9 @@
protected TopiaEntity current;
/**
- * The last ended entity (means the last entity entering in the {@link #end(TopiaEntity)} method).
+ * The last entity (means the last entity entering in the {@link #end(TopiaEntity)} method).
*/
- protected TopiaEntity lastEnded;
+ protected TopiaEntity last;
/**
* To get entity concrete class from a entity instance.
@@ -95,7 +95,7 @@
source.accept(visitor);
- E target = (E) visitor.lastEnded;
+ E target = (E) visitor.last;
return target;
@@ -123,7 +123,7 @@
try {
- E target = (E) visitor.lastEnded;
+ E target = visitor.copy(source);
targets.add(target);
@@ -148,7 +148,7 @@
@Override
public void start(TopiaEntity source) {
- boolean accept = acceptEntity(source);
+ boolean accept = source != null && acceptEntity(source);
if (accept) {
@@ -184,15 +184,16 @@
@Override
public void end(TopiaEntity source) {
- boolean accept = acceptEntity(source);
+ boolean accept = source != null && acceptEntity(source);
if (accept) {
- lastEnded = current;
+ last = current;
if (!stack.isEmpty()) {
current = stack.pop();
+
}
}
@@ -201,71 +202,38 @@
@Override
public void visit(TopiaEntity entity, String propertyName, Class<?> type, Object source) {
- if (source != null) {
+ Object target = copy(source);
- Object target = copy(source);
+ setPropertyValue(propertyName, target);
- if (target != null) {
-
- setPropertyValue(propertyName, target);
-
- }
-
- }
}
@Override
- public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, Object source) {
+ public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, Object sources) {
- if (source != null) {
+ if (sources != null) {
- Object target = createCollectionInstance(source);
+ Collection<Object> targets = createCollectionInstance(sources);
- setPropertyValue(propertyName, target);
+ setPropertyValue(propertyName, targets);
- }
+ Collection<?> collectionSource = (Collection<?>) sources;
- }
+ for (Object source : collectionSource) {
- @Override
- public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, int index, Object source) {
+ Object target = copy(source);
- if (source != null) {
+ targets.add(target);
- Object target = copy(source);
-
- // get the collection
-
- Collection<?> collection;
- try {
-
- collection = (Collection<?>) propertyUtilsBean.getSimpleProperty(current, propertyName);
-
- } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
-
- throw new PollenTechnicalException("Could not get property " + propertyName, e);
-
}
- // ensure size is ok
+ }
- while (collection.size() <= index) {
+ }
- collection.add(null);
+ @Override
+ public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, int index, Object source) {
- }
-
- try {
-
- propertyUtilsBean.setIndexedProperty(current, propertyName, index, target);
-
- } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
-
- throw new PollenTechnicalException("Could not set indexed property " + propertyName + " at index " + index, e);
-
- }
-
- }
}
@Override
@@ -273,20 +241,20 @@
stack.clear();
alreadyExplored.clear();
- lastEnded = null;
+ last = null;
current = null;
}
- protected Object copy(Object source) {
+ protected <O> O copy(O source) {
- Object target;
+ O target;
- if (acceptEntity(source)) {
+ if (source != null && acceptEntity(source)) {
((TopiaEntity) source).accept(this);
- target = lastEnded;
+ target = (O) last;
} else {
1
0
Author: tchemit
Date: 2014-05-08 14:57:53 +0200 (Thu, 08 May 2014)
New Revision: 3923
Url: http://forge.chorem.org/projects/pollen/repository/revisions/3923
Log:
- use a visitor to copy services objects (outside the services everything should be transient)
- review validation (to avoir multiple redundant codes)
Added:
trunk/pollen-services/src/main/java/org/chorem/pollen/services/TopiaEntityCopyVisitor.java
Modified:
trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java
trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenPrincipalTopiaDao.java
trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenPrincipals.java
trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/SessionTokenTopiaDao.java
trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/Jsons.java
trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRender.java
trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java
trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityConverter.java
trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/FavoriteListApi.java
trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java
trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollenUserApiTest.java
trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java
trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityConverterTest.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServiceConfig.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServiceConfigOption.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/AuthService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ChoiceService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/CommentService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/FavoriteListService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/InvalidEntityLinkException.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenPrincipalRef.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenUserService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PollenAuthenticationException.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/test/FakePollenApplicationContext.java
trunk/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties
trunk/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties
trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java
Modified: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java
===================================================================
--- trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -1,5 +1,26 @@
package org.chorem.pollen.persistence.entity;
+/*
+ * #%L
+ * Pollen :: Persistence
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
import com.google.common.collect.ImmutableList;
import java.util.List;
Modified: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenPrincipalTopiaDao.java
===================================================================
--- trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenPrincipalTopiaDao.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenPrincipalTopiaDao.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -1,5 +1,26 @@
package org.chorem.pollen.persistence.entity;
+/*
+ * #%L
+ * Pollen :: Persistence
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
public class PollenPrincipalTopiaDao extends AbstractPollenPrincipalTopiaDao<PollenPrincipal> {
public PollenPrincipal findByPermissionToken(String permissionToken) {
Modified: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenPrincipals.java
===================================================================
--- trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenPrincipals.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenPrincipals.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -1,5 +1,26 @@
package org.chorem.pollen.persistence.entity;
+/*
+ * #%L
+ * Pollen :: Persistence
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
import org.nuiton.topia.persistence.TopiaEntity;
/**
Modified: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/SessionTokenTopiaDao.java
===================================================================
--- trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/SessionTokenTopiaDao.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/SessionTokenTopiaDao.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -1,5 +1,26 @@
package org.chorem.pollen.persistence.entity;
+/*
+ * #%L
+ * Pollen :: Persistence
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
public class SessionTokenTopiaDao extends AbstractSessionTokenTopiaDao<SessionToken> {
public SessionToken findUniqueOrNullByToken(String token) {
Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/Jsons.java
===================================================================
--- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/Jsons.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/Jsons.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -1,5 +1,26 @@
package org.chorem.pollen.rest.api;
+/*
+ * #%L
+ * Pollen :: Rest Api
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRender.java
===================================================================
--- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRender.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRender.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -25,37 +25,20 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
-import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.chorem.pollen.persistence.PollenEntityEnum;
-import org.chorem.pollen.services.PollenTechnicalException;
import org.chorem.pollen.services.service.InvalidFormException;
import org.chorem.pollen.services.service.PollenPrincipalRef;
import org.debux.webmotion.server.call.Call;
import org.debux.webmotion.server.call.HttpContext;
import org.debux.webmotion.server.mapping.Mapping;
import org.debux.webmotion.server.render.Render;
-import org.nuiton.topia.persistence.TopiaEntity;
-import org.nuiton.util.ObjectUtil;
-import org.nuiton.util.beans.Binder;
-import org.nuiton.util.beans.BinderFactory;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Collections;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
/**
@@ -66,19 +49,19 @@
*/
public class PollenRender<T> extends Render {
- /**
- * To specify entity collections to include in binded entities.
- *
- * @author tchemit <chemit(a)codelutin.com>
- * @since 2.0
- */
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface ExposeCollection {
+// /**
+// * To specify entity collections to include in binded entities.
+// *
+// * @author tchemit <chemit(a)codelutin.com>
+// * @since 2.0
+// */
+// @Retention(RetentionPolicy.RUNTIME)
+// @Target(ElementType.METHOD)
+// public @interface ExposeCollection {
+//
+// public String[] values() default {};
+// }
- public String[] values() default {};
- }
-
protected T model;
public PollenRender(T model) {
@@ -120,22 +103,6 @@
map = toMap(model);
-// GsonBuilder gsonBuilder = new GsonBuilder().registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
-// @Override
-// public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext c) {
-// JsonElement result;
-//
-// if (src == null) {
-// result = JsonNull.INSTANCE;
-// } else {
-// result = new JsonPrimitive(src.getTime());
-// }
-//
-// return result;
-//
-// }
-// });
-
PollenRestApiApplicationContext applicationContext =
PollenRestApiApplicationContext.getApplicationContext(context.getServletContext());
boolean devMode = applicationContext.getApplicationConfig().isDevMode();
@@ -146,7 +113,6 @@
ObjectWriter objectWriter = mapper.writerWithDefaultPrettyPrinter();
json = objectWriter.writeValueAsString(map);
-// gsonBuilder.setPrettyPrinting();
} else {
@@ -154,15 +120,13 @@
}
-// Gson gson = gsonBuilder.create();
-//
-// String json = gson.toJson(map);
PrintWriter out = context.getOut();
out.print(json);
}
- protected <M> Object toMap(M model, String... includeCollection) {
+ // protected <M> Object toMap(M model, String... includeCollection) {
+ protected <M> Object toMap(M model) {
if (model instanceof InvalidFormException) {
@@ -191,140 +155,142 @@
}
- if (model instanceof Iterable<?>) {
-
- // collection of objects
- Iterable<?> objects = (Iterable<?>) model;
- List<Object> result = Lists.newArrayList();
- for (Object object : objects) {
- Object objectMap = toMap(object, includeCollection);
- result.add(objectMap);
- }
-
- return result;
-
- }
-
- // single object
- // FIXME Do this in service, not here
-
- if (model instanceof TopiaEntity) {
-
- // entity need to transform it
-
- TopiaEntity topiaEntity = (TopiaEntity) model;
-
- Class<? extends TopiaEntity> entitytype = PollenEntityEnum.getContractClass(topiaEntity.getClass());
- PollenEntityBinder<TopiaEntity> binder = BinderFactory.newBinder(entitytype, entitytype, null, PollenEntityBinder.class);
- Map<String, Object> map = binder.obtainProperties(topiaEntity);
- Map<String, Object> result = Maps.newTreeMap();
-
- for (Map.Entry<String, Object> entry : map.entrySet()) {
- String propertyName = entry.getKey();
- Object propertyValue = entry.getValue();
- if (propertyValue instanceof TopiaEntity) {
- result.put(propertyName, toMap(propertyValue));
- continue;
- }
-
- result.put(propertyName, propertyValue);
-
- }
-
- // treat collections
-
- if (includeCollection != null) {
- for (String propertyName : includeCollection) {
- Iterable<?> collectionValue = binder.getCollectionValue(topiaEntity, propertyName);
- result.put(propertyName, toMap(collectionValue));
-
- }
- }
-
- return result;
-
- }
-
return model;
- }
+// if (model instanceof Iterable<?>) {
+//
+// // collection of objects
+// Iterable<?> objects = (Iterable<?>) model;
+// List<Object> result = Lists.newArrayList();
+// for (Object object : objects) {
+// Object objectMap = toMap(object, includeCollection);
+// result.add(objectMap);
+// }
+//
+// return result;
+//
+// }
+//
+// // single object
+// // FIXME Do this in service, not here
+//
+// if (model instanceof TopiaEntity) {
+//
+// // entity need to transform it
+//
+// TopiaEntity topiaEntity = (TopiaEntity) model;
+//
+// Class<? extends TopiaEntity> entitytype = PollenEntityEnum.getContractClass(topiaEntity.getClass());
+// PollenEntityBinder<TopiaEntity> binder = BinderFactory.newBinder(entitytype, entitytype, null, PollenEntityBinder.class);
+// Map<String, Object> map = binder.obtainProperties(topiaEntity);
+// Map<String, Object> result = Maps.newTreeMap();
+//
+// for (Map.Entry<String, Object> entry : map.entrySet()) {
+// String propertyName = entry.getKey();
+// Object propertyValue = entry.getValue();
+// if (propertyValue instanceof TopiaEntity) {
+// result.put(propertyName, toMap(propertyValue));
+// continue;
+// }
+//
+// result.put(propertyName, propertyValue);
+//
+// }
+//
+// // treat collections
+//
+// if (includeCollection != null) {
+// for (String propertyName : includeCollection) {
+// Iterable<?> collectionValue = binder.getCollectionValue(topiaEntity, propertyName);
+// result.put(propertyName, toMap(collectionValue));
+//
+// }
+// }
+//
+// return result;
+//
+// }
- protected static class PollenEntityBinder<E extends TopiaEntity> extends Binder<E, E> {
+// return model;
- /** Logger. */
- private static final Log log =
- LogFactory.getLog(PollenEntityBinder.class);
-
- private static final long serialVersionUID = 1L;
-
- protected List<String> simpleProperties;
-
- public PollenEntityBinder() {
- }
-
- @Override
- protected void setModel(BinderModel<E, E> model) {
- super.setModel(model);
- this.simpleProperties = Lists.newArrayList();
- for (String property : model.getSourceDescriptors()) {
- if (model.getCollectionType(property) == null) {
- simpleProperties.add(property);
- }
- }
- }
-
- /**
- * Obtain from the given object all properties registered in the binder
- * model.
- *
- * @param source the bean to read
- * @return the map of properties obtained indexed by their property name,
- * or an empty map is the given {@code from} is {@code null}.
- * @since 2.3
- */
- public Map<String, Object> obtainProperties(E source) {
- if (source == null) {
- // special limit case
- return Collections.emptyMap();
- }
-
- Map<String, Object> result = Maps.newTreeMap();
- for (String sourceProperty : simpleProperties) {
-
-
- try {
- Object read;
- Method readMethod = model.getSourceReadMethod(sourceProperty);
- read = readMethod.invoke(source);
- if (log.isDebugEnabled()) {
- log.debug("property " + sourceProperty + ", type : " +
- readMethod.getReturnType() + ", value = " + read);
- }
- if (readMethod.getReturnType().isPrimitive() &&
- ObjectUtil.getNullValue(
- readMethod.getReturnType()).equals(read)) {
- // for primitive type case, force nullity
- read = null;
- }
-
- if (read != null) {
- result.put(sourceProperty, read);
- }
- } catch (IllegalAccessException | InvocationTargetException e) {
- throw new PollenTechnicalException(e);
- }
- }
- return result;
- }
-
- public Iterable<?> getCollectionValue(E source, String sourceProperty) {
- try {
- Method readMethod = model.getSourceReadMethod(sourceProperty);
- Object result = readMethod.invoke(source);
- return (Iterable<?>) result;
- } catch (IllegalAccessException | InvocationTargetException e) {
- throw new PollenTechnicalException(e);
- }
- }
}
+
+// protected static class PollenEntityBinder<E extends TopiaEntity> extends Binder<E, E> {
+//
+// /** Logger. */
+// private static final Log log =
+// LogFactory.getLog(PollenEntityBinder.class);
+//
+// private static final long serialVersionUID = 1L;
+//
+// protected List<String> simpleProperties;
+//
+// public PollenEntityBinder() {
+// }
+//
+// @Override
+// protected void setModel(BinderModel<E, E> model) {
+// super.setModel(model);
+// this.simpleProperties = Lists.newArrayList();
+// for (String property : model.getSourceDescriptors()) {
+// if (model.getCollectionType(property) == null) {
+// simpleProperties.add(property);
+// }
+// }
+// }
+//
+// /**
+// * Obtain from the given object all properties registered in the binder
+// * model.
+// *
+// * @param source the bean to read
+// * @return the map of properties obtained indexed by their property name,
+// * or an empty map is the given {@code from} is {@code null}.
+// * @since 2.3
+// */
+// public Map<String, Object> obtainProperties(E source) {
+// if (source == null) {
+// // special limit case
+// return Collections.emptyMap();
+// }
+//
+// Map<String, Object> result = Maps.newTreeMap();
+// for (String sourceProperty : simpleProperties) {
+//
+//
+// try {
+// Object read;
+// Method readMethod = model.getSourceReadMethod(sourceProperty);
+// read = readMethod.invoke(source);
+// if (log.isDebugEnabled()) {
+// log.debug("property " + sourceProperty + ", type : " +
+// readMethod.getReturnType() + ", value = " + read);
+// }
+// if (readMethod.getReturnType().isPrimitive() &&
+// ObjectUtil.getNullValue(
+// readMethod.getReturnType()).equals(read)) {
+// // for primitive type case, force nullity
+// read = null;
+// }
+//
+// if (read != null) {
+// result.put(sourceProperty, read);
+// }
+// } catch (IllegalAccessException | InvocationTargetException e) {
+// throw new PollenTechnicalException(e);
+// }
+// }
+// return result;
+// }
+//
+// public Iterable<?> getCollectionValue(E source, String sourceProperty) {
+// try {
+// Method readMethod = model.getSourceReadMethod(sourceProperty);
+// Object result = readMethod.invoke(source);
+// return (Iterable<?>) result;
+// } catch (IllegalAccessException | InvocationTargetException e) {
+// throw new PollenTechnicalException(e);
+// }
+// }
+// }
}
Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java
===================================================================
--- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -1,5 +1,26 @@
package org.chorem.pollen.rest.api;
+/*
+ * #%L
+ * Pollen :: Rest Api
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.beanutils.converters.AbstractConverter;
import org.chorem.pollen.services.PollenTechnicalException;
Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityConverter.java
===================================================================
--- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityConverter.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityConverter.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -1,5 +1,26 @@
package org.chorem.pollen.rest.api;
+/*
+ * #%L
+ * Pollen :: Rest Api
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.apache.commons.beanutils.converters.AbstractConverter;
Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/FavoriteListApi.java
===================================================================
--- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/FavoriteListApi.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/FavoriteListApi.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -32,8 +32,8 @@
import org.debux.webmotion.server.WebMotionController;
import java.io.File;
-import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Set;
/**
* TODO
@@ -92,9 +92,9 @@
}
- public LinkedHashSet<FavoriteListMember> getMembers(FavoriteListService favoriteListService, String favoriteListId) {
+ public Set<FavoriteListMember> getMembers(FavoriteListService favoriteListService, String favoriteListId) {
- LinkedHashSet<FavoriteListMember> members = favoriteListService.getFavoriteListMembers(favoriteListId);
+ Set<FavoriteListMember> members = favoriteListService.getFavoriteListMembers(favoriteListId);
return members;
}
@@ -123,7 +123,7 @@
public void removeMember(FavoriteListService favoriteListService, String favoriteListId, String memberId) {
- favoriteListService.removeFavoriteListMember(favoriteListId, memberId);
+ favoriteListService.deleteFavoriteListMember(favoriteListId, memberId);
}
}
Modified: trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java
===================================================================
--- trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -49,7 +49,6 @@
* @author Tony Chemit <chemit(a)codelutin.com>
* @since 2.0
*/
-@Ignore
public class PollApiTest extends AbstractPollenRestApiTest {
@Before
@@ -106,12 +105,14 @@
@Test
public void getPoll() throws URISyntaxException, IOException {
+
Poll poll = fixture(PollenFixtures.POLL_NORMAL_ID);
String pollId = poll.getTopiaId();
Request request = createRequest("/v1/polls/" + pollId).Get();
String content = request.execute().returnContent().asString();
showTestResult(content);
assertNotNull(content);
+
}
@Test
Modified: trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollenUserApiTest.java
===================================================================
--- trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollenUserApiTest.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollenUserApiTest.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -24,6 +24,7 @@
*/
import org.apache.http.client.fluent.Request;
+import org.chorem.pollen.persistence.entity.PollenUser;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
@@ -36,7 +37,6 @@
* @author tchemit <chemit(a)codelutin.com>
* @since 2.0
*/
-@Ignore
public class PollenUserApiTest extends AbstractPollenRestApiTest {
@Before
@@ -52,50 +52,65 @@
String content = request.execute().returnContent().asString();
showTestResult(content);
assertTrue(content.contains("email"));
+
}
@Test
public void getUser() throws Exception {
- String userId = "";
+
+ PollenUser pollenUser = fixture("user_jean");
+ String userId = pollenUser.getTopiaId();
Request request = createRequest("/v1/users/" + userId).Get();
String content = request.execute().returnContent().asString();
showTestResult(content);
assertTrue(content.contains("email"));
+ assertTrue(content.contains("jean(a)pollen.fake"));
+
}
@Ignore
@Test
public void postUser() throws Exception {
+
Request request = createRequest("/v1/users").Post();
String content = request.execute().returnContent().asString();
showTestResult(content);
assertTrue(content.contains("email2"));
+
}
@Ignore
@Test
public void putUser() throws Exception {
- String userId = "";
+
+ PollenUser pollenUser = fixture("user_jean");
+ String userId = pollenUser.getTopiaId();
Request request = createRequest("/v1/users/" + userId).Get();
String content = request.execute().returnContent().asString();
showTestResult(content);
assertTrue(content.contains("email3"));
+
}
@Ignore
@Test
public void deleteUser() throws Exception {
- String userId = "";
+
+ PollenUser pollenUser = fixture("user_jean");
+ String userId = pollenUser.getTopiaId();
Request request = createRequest("/v1/users/" + userId).Delete();
String content = request.execute().returnContent().asString();
showTestResult(content);
assertTrue(content.contains("OK!"));
+
}
@Ignore
@Test
public void validateUserEmail() throws Exception {
- String userId = "";
+
+ PollenUser pollenUser = fixture("user_jean");
+ String userId = pollenUser.getTopiaId();
String token = "";
Request request = createRequest("/v1/users/" + userId + "?token=" + token).Put();
String content = request.execute().returnContent().asString();
Modified: trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java
===================================================================
--- trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -1,5 +1,26 @@
package org.chorem.pollen.rest.api;
+/*
+ * #%L
+ * Pollen :: Rest Api
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
import org.chorem.pollen.persistence.entity.Choice;
import org.chorem.pollen.persistence.entity.ChoiceType;
import org.junit.Assert;
Modified: trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityConverterTest.java
===================================================================
--- trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityConverterTest.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityConverterTest.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -1,5 +1,26 @@
package org.chorem.pollen.rest.api;
+/*
+ * #%L
+ * Pollen :: Rest Api
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
import org.chorem.pollen.persistence.entity.CommentVisibility;
import org.chorem.pollen.persistence.entity.Poll;
import org.chorem.pollen.persistence.entity.PollType;
Added: trunk/pollen-services/src/main/java/org/chorem/pollen/services/TopiaEntityCopyVisitor.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/TopiaEntityCopyVisitor.java (rev 0)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/TopiaEntityCopyVisitor.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -0,0 +1,348 @@
+package org.chorem.pollen.services;
+
+/*
+ * #%L
+ * Pollen :: Service
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
+import com.google.common.base.Preconditions;
+import org.apache.commons.beanutils.PropertyUtilsBean;
+import org.nuiton.topia.persistence.TopiaApplicationContext;
+import org.nuiton.topia.persistence.TopiaEntity;
+import org.nuiton.topia.persistence.TopiaEntityVisitor;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Deque;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/**
+ * To copy entities.
+ * FIXME-tchemit-2014-05-08 (Could we move this in ToPIA ?).
+ * <p/>
+ * Created on 5/8/14.
+ *
+ * @author Tony Chemit <chemit(a)codelutin.com>
+ * @since 2.0
+ */
+public class TopiaEntityCopyVisitor<T extends TopiaApplicationContext> implements TopiaEntityVisitor {
+
+ /**
+ * Stack of entities to copy.
+ * <p/>
+ * When a entity is started, the previous current entity goes at the top of the stack.
+ * <p/>
+ * When a entity is ended, the current entity goes is marked as the last ended,
+ * and the last entity of the stack goes back to the current state.
+ */
+ protected Deque<TopiaEntity> stack = new ArrayDeque<>();
+
+ /**
+ * The current entity (means the last entity entering in the {@link #start(TopiaEntity)} method).
+ */
+ protected TopiaEntity current;
+
+ /**
+ * The last ended entity (means the last entity entering in the {@link #end(TopiaEntity)} method).
+ */
+ protected TopiaEntity lastEnded;
+
+ /**
+ * To get entity concrete class from a entity instance.
+ */
+ protected final T topiaApplicationContext;
+
+ /**
+ * To get and set properties.
+ */
+ protected final PropertyUtilsBean propertyUtilsBean;
+
+ /**
+ * Cache of already explored entities.
+ */
+ protected Collection<String> alreadyExplored;
+
+ public static <T extends TopiaApplicationContext, E extends TopiaEntity> E copy(T topiaApplicationContext, E source) {
+
+ Preconditions.checkNotNull(topiaApplicationContext);
+ Preconditions.checkNotNull(source);
+
+ TopiaEntityCopyVisitor<T> visitor = new TopiaEntityCopyVisitor<>(topiaApplicationContext);
+
+ try {
+
+ source.accept(visitor);
+
+ E target = (E) visitor.lastEnded;
+
+ return target;
+
+ } finally {
+
+ visitor.clear();
+
+ }
+
+
+ }
+
+ public static <T extends TopiaApplicationContext, E extends TopiaEntity> Collection<E> copy(T topiaApplicationContext, Collection<E> sources) {
+
+ Preconditions.checkNotNull(topiaApplicationContext);
+ Preconditions.checkNotNull(sources);
+
+ TopiaEntityCopyVisitor<T> visitor = new TopiaEntityCopyVisitor<>(topiaApplicationContext);
+
+ Collection<E> targets = createCollectionInstance(sources);
+
+ for (E source : sources) {
+
+ source.accept(visitor);
+
+ try {
+
+ E target = (E) visitor.lastEnded;
+
+ targets.add(target);
+
+ } finally {
+
+ visitor.clear();
+
+ }
+
+ }
+
+ return targets;
+
+ }
+
+ protected TopiaEntityCopyVisitor(T topiaApplicationContext) {
+ this.topiaApplicationContext = topiaApplicationContext;
+ this.alreadyExplored = new ArrayList<>();
+ this.propertyUtilsBean = new PropertyUtilsBean();
+ }
+
+ @Override
+ public void start(TopiaEntity source) {
+
+ boolean accept = acceptEntity(source);
+
+ if (accept) {
+
+ if (current != null) {
+
+ stack.push(current);
+
+ }
+
+ try {
+
+ Class<? extends TopiaEntity> entityClass = source.getClass();
+
+ Class<?> implementationClass = topiaApplicationContext.getImplementationClass(entityClass);
+
+ current = (TopiaEntity) implementationClass.newInstance();
+ current.setTopiaId(source.getTopiaId());
+ current.setTopiaCreateDate(source.getTopiaCreateDate());
+ current.setTopiaVersion(source.getTopiaVersion());
+ //FIXME Deal with technical properties (deleted)
+
+ } catch (InstantiationException | IllegalAccessException e) {
+
+ throw new PollenTechnicalException("could not create a new entity", e);
+
+ }
+
+ }
+
+
+ }
+
+ @Override
+ public void end(TopiaEntity source) {
+
+ boolean accept = acceptEntity(source);
+
+ if (accept) {
+
+ lastEnded = current;
+
+ if (!stack.isEmpty()) {
+
+ current = stack.pop();
+ }
+
+ }
+ }
+
+ @Override
+ public void visit(TopiaEntity entity, String propertyName, Class<?> type, Object source) {
+
+ if (source != null) {
+
+ Object target = copy(source);
+
+ if (target != null) {
+
+ setPropertyValue(propertyName, target);
+
+ }
+
+ }
+ }
+
+ @Override
+ public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, Object source) {
+
+ if (source != null) {
+
+ Object target = createCollectionInstance(source);
+
+ setPropertyValue(propertyName, target);
+
+ }
+
+ }
+
+ @Override
+ public void visit(TopiaEntity entity, String propertyName, Class<?> collectionType, Class<?> type, int index, Object source) {
+
+ if (source != null) {
+
+ Object target = copy(source);
+
+ // get the collection
+
+ Collection<?> collection;
+ try {
+
+ collection = (Collection<?>) propertyUtilsBean.getSimpleProperty(current, propertyName);
+
+ } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+
+ throw new PollenTechnicalException("Could not get property " + propertyName, e);
+
+ }
+
+ // ensure size is ok
+
+ while (collection.size() <= index) {
+
+ collection.add(null);
+
+ }
+
+ try {
+
+ propertyUtilsBean.setIndexedProperty(current, propertyName, index, target);
+
+ } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+
+ throw new PollenTechnicalException("Could not set indexed property " + propertyName + " at index " + index, e);
+
+ }
+
+ }
+ }
+
+ @Override
+ public void clear() {
+
+ stack.clear();
+ alreadyExplored.clear();
+ lastEnded = null;
+ current = null;
+
+ }
+
+ protected Object copy(Object source) {
+
+ Object target;
+
+ if (acceptEntity(source)) {
+
+ ((TopiaEntity) source).accept(this);
+
+ target = lastEnded;
+
+ } else {
+
+ target = source;
+
+ }
+
+ return target;
+
+ }
+
+ protected void setPropertyValue(String propertyName, Object valueToCopy) {
+
+ try {
+
+ propertyUtilsBean.setSimpleProperty(current, propertyName, valueToCopy);
+
+ } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+
+ throw new PollenTechnicalException("Could not set property " + propertyName, e);
+
+ }
+
+ }
+
+ protected static <E> Collection<E> createCollectionInstance(Object value) {
+
+ Collection<E> valueToCopy;
+
+ if (value instanceof LinkedHashSet) {
+
+ valueToCopy = new LinkedHashSet<>();
+
+ } else if (value instanceof SortedSet) {
+
+ valueToCopy = new TreeSet<>();
+
+ } else if (value instanceof Set) {
+
+ valueToCopy = new HashSet<>();
+
+ } else {
+
+ valueToCopy = new ArrayList<>();
+
+ }
+
+ return valueToCopy;
+
+ }
+
+ protected boolean acceptEntity(Object entity) {
+
+ boolean add = entity instanceof TopiaEntity &&
+ alreadyExplored.add(((TopiaEntity) entity).getTopiaId());
+ return add;
+
+ }
+}
Property changes on: trunk/pollen-services/src/main/java/org/chorem/pollen/services/TopiaEntityCopyVisitor.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:eol-style
+ native
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServiceConfig.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServiceConfig.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServiceConfig.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -29,6 +29,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.shiro.crypto.hash.Sha512Hash;
+import org.chorem.pollen.persistence.entity.ChoiceType;
import org.chorem.pollen.persistence.entity.CommentVisibility;
import org.chorem.pollen.persistence.entity.PollType;
import org.chorem.pollen.persistence.entity.VoteVisibility;
@@ -148,6 +149,13 @@
return result;
}
+ public ChoiceType getDefaultChoiceType() {
+ ChoiceType result = applicationConfig.getOption(
+ ChoiceType.class,
+ PollenServiceConfigOption.DEFAULT_CHOICE_TYPE.key);
+ return result;
+ }
+
/**
* @return Le nom d'hôte du serveur SMTP.
*/
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServiceConfigOption.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServiceConfigOption.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServiceConfigOption.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -23,6 +23,7 @@
* #L%
*/
+import org.chorem.pollen.persistence.entity.ChoiceType;
import org.chorem.pollen.persistence.entity.CommentVisibility;
import org.chorem.pollen.persistence.entity.PollType;
import org.chorem.pollen.persistence.entity.VoteVisibility;
@@ -95,6 +96,17 @@
CommentVisibility.EVERYBODY.name(),
CommentVisibility.class),
+ /**
+ * Default poll choice type to use at a new choice creation.
+ *
+ * @since 2.0
+ */
+ DEFAULT_CHOICE_TYPE(
+ "pollen.default.pollChoiceType",
+ n("pollen.configuration.pollChoiceType"),
+ ChoiceType.TEXT.name(),
+ ChoiceType.class),
+
SMTP_HOST(
"pollen.smtp.host",
"Nom d'hôte du serveur SMTP",
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/AuthService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/AuthService.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/AuthService.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -55,6 +55,7 @@
SessionToken.PROPERTY_POLLEN_TOKEN, pollenToken,
SessionToken.PROPERTY_POLLEN_USER, user);
commit();
+
return sessionToken;
}
@@ -63,8 +64,10 @@
SessionToken sessionToken = getSecurityService().logout();
if (sessionToken != null) {
+
getSessionTokenDao().delete(sessionToken);
commit();
+
}
}
@@ -73,17 +76,14 @@
Preconditions.checkNotNull(login);
- PollenUser user = getUserService().getUserByLogin(login);
+ PollenUser user = getPollenUserDao().forLoginEquals(login).findUnique();
String newPassword = serviceContext.generatePassword();
getSecurityService().setUserPassword(user, newPassword);
commit();
- //TODO Notifiy Password changed to user
- if (log.isDebugEnabled()) {
- log.debug("Notify Password changed");
- }
+ getNotificationService().onUserLostPasswordAsked(user, newPassword);
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ChoiceService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ChoiceService.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ChoiceService.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -23,15 +23,14 @@
* #L%
*/
-import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import org.apache.commons.collections4.CollectionUtils;
import org.chorem.pollen.persistence.entity.Choice;
import org.chorem.pollen.persistence.entity.ChoiceTopiaDao;
import org.chorem.pollen.persistence.entity.Poll;
import org.chorem.pollen.persistence.entity.PollenPrincipal;
+import org.chorem.pollen.persistence.entity.PollenUser;
import org.chorem.pollen.services.service.security.PermissionVerb;
import java.util.List;
@@ -69,6 +68,31 @@
}
+ public Choice getNewChoice() {
+
+ Choice result = getChoiceDao().newInstance();
+
+ // -- default values -- //
+
+ result.setChoiceType(getPollenServiceConfig().getDefaultChoiceType());
+
+ // -- creator -- //
+
+ PollenPrincipal creator = getPollenPrincipalDao().newInstance();
+ result.setCreator(creator);
+
+ PollenUser connectedUser = getConnectedUser();
+
+ if (connectedUser != null) {
+
+ creator.setName(connectedUser.getName());
+ creator.setEmail(connectedUser.getEmail());
+ }
+
+ return result;
+
+ }
+
public Choice addChoice(String pollId, Choice choice) throws InvalidFormException {
checkNotNull(pollId);
@@ -86,11 +110,10 @@
choice.setChoiceOrder(existingChoices.size());
Choice result = saveChoice(poll, choice);
-
- getPollDao().update(poll);
commit();
- //TODO Notify Choice added
+ getNotificationService().onChoiceAdded(poll, result);
+
return result;
}
@@ -108,11 +131,10 @@
errorMap.failIfNotEmpty();
Choice result = saveChoice(poll, choice);
-
- getChoiceDao().update(choice);
commit();
- //TODO Notify Choice edited
+ getNotificationService().onChoiceEdited(poll, result);
+
return result;
}
@@ -128,8 +150,10 @@
getChoiceDao().delete(choice);
commit();
- //TODO Notify Choice deleted
+ getNotificationService().onChoiceDeleted(poll, choice);
+
+
}
protected Choice getChoice(Poll poll, String choiceId) {
@@ -152,17 +176,17 @@
boolean choiceExists = choice.isPersisted();
- Choice choiceToPersist;
+ Choice toSave;
if (choiceExists) {
// get existing choice
- choiceToPersist = getChoice(poll, choice.getTopiaId());
+ toSave = getChoice(poll, choice.getTopiaId());
} else {
// create a new choice
- choiceToPersist = choiceDao.create();
+ toSave = choiceDao.create();
// create a new principal
PollenPrincipal principal = getSecurityService().generatePollenPrincipal();
@@ -173,91 +197,36 @@
principal.setEmail(creator.getEmail());
}
- choiceToPersist.setChoiceType(choice.getChoiceType());
- choiceToPersist.setCreator(principal);
- choiceToPersist.setPoll(poll);
- choiceToPersist.setChoiceOrder(choice.getChoiceOrder());
+ toSave.setChoiceType(choice.getChoiceType());
+ toSave.setCreator(principal);
+ toSave.setPoll(poll);
+ toSave.setChoiceOrder(choice.getChoiceOrder());
}
- switch (choiceToPersist.getChoiceType()) {
+ switch (toSave.getChoiceType()) {
case TEXT:
- choiceToPersist.setName(choice.getName());
- choiceToPersist.setDescription(choice.getDescription());
- choiceToPersist.setCreator(poll.getCreator());
+ toSave.setName(choice.getName());
+ toSave.setDescription(choice.getDescription());
+ toSave.setCreator(poll.getCreator());
+
break;
case DATE:
+
throw new IllegalStateException("Not implemented");
case IMAGE:
+
throw new IllegalStateException("Not implemented");
}
- return choiceToPersist;
+ return toSave;
+
}
-// protected void checkChoiceForm(List<Choice> existingChoices, Choice choice) throws InvalidFormException {
-//
-// //TODO use nuiton validator ?
-// Multimap<String, String> errors = ArrayListMultimap.create();
-//
-// boolean choiceExists = choice.isPersisted();
-//
-// Set<String> choiceNames = Sets.newHashSet();
-//
-// checkNotNull(errors, "choiceType", choice.getChoiceType(), "choiceType can not be null");
-//
-// if (CollectionUtils.isNotEmpty(existingChoices)) {
-//
-// // get all used names
-//
-// for (Choice choice1 : existingChoices) {
-//
-// if (choiceExists &&
-// choice1.getTopiaId().equals(choice.getTopiaId())) {
-// continue;
-// }
-// choiceNames.add(choice1.getName());
-//
-// }
-// }
-//
-// switch (choice.getChoiceType()) {
-//
-// case TEXT:
-//
-// String choiceName = choice.getName();
-// boolean nameNotBlank = checkNotBlank(errors,
-// "name",
-// choiceName,
-// "choice name can not be empty");
-//
-// if (nameNotBlank) {
-// boolean nameAdded = choiceNames.add(choiceName);
-// check(errors, "name", nameAdded, "choice name already used in this list");
-// }
-//
-// break;
-// case DATE:
-//
-// throw new IllegalStateException("Not implemented");
-//
-// case IMAGE:
-//
-// throw new IllegalStateException("Not implemented");
-// }
-//
-// if (!errors.isEmpty()) {
-//
-// throw new InvalidFormException(errors);
-//
-// }
-//
-// }
-
protected ErrorMap checkChoice(List<Choice> existingChoices, Choice choice) {
ErrorMap errors = new ErrorMap();
@@ -276,8 +245,11 @@
if (choiceExists &&
choice1.getTopiaId().equals(choice.getTopiaId())) {
+
continue;
+
}
+
choiceNames.add(choice1.getName());
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/CommentService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/CommentService.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/CommentService.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -23,9 +23,7 @@
* #L%
*/
-import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Multimap;
import org.apache.commons.lang3.StringUtils;
import org.chorem.pollen.persistence.entity.Comment;
import org.chorem.pollen.persistence.entity.Poll;
@@ -72,15 +70,15 @@
checkIsNotPersisted(comment);
checkPermission(PermissionVerb.addComment, pollId);
- Poll poll = getPollService().getPoll(pollId);
+ ErrorMap errorMap = checkComment(comment);
+ errorMap.failIfNotEmpty();
- checkCommentForm(comment);
-
+ Poll poll = getPollService().getPoll(pollId);
Comment result = saveComment(poll, comment);
-
- getPollDao().update(poll);
commit();
+ getNotificationService().onCommentAdded(poll, result);
+
return result;
}
@@ -92,15 +90,15 @@
checkIsPersisted(comment);
checkPermission(PermissionVerb.editComment, comment.getTopiaId());
- Poll poll = getPollService().getPoll(pollId);
+ ErrorMap errorMap = checkComment(comment);
+ errorMap.failIfNotEmpty();
- checkCommentForm(comment);
-
+ Poll poll = getPollService().getPoll(pollId);
Comment result = saveComment(poll, comment);
-
- getCommentDao().update(comment);
commit();
+ getNotificationService().onCommentEdited(poll, result);
+
return result;
}
@@ -118,6 +116,8 @@
getCommentDao().delete(comment);
commit();
+ getNotificationService().onCommentDeleted(poll, comment);
+
}
protected Comment getComment(Poll poll, String commentId) {
@@ -134,10 +134,9 @@
}
- protected void checkCommentForm(Comment comment) throws InvalidFormException {
+ protected ErrorMap checkComment(Comment comment) {
- //TODO use nuiton validator ?
- Multimap<String, String> errors = ArrayListMultimap.create();
+ ErrorMap errors = new ErrorMap();
checkNotBlank(errors, "text", comment.getText(), "textcan not be empty");
boolean authorNotNull = checkNotNull(errors, "author", comment.getAuthor(), "author can not be null");
@@ -147,12 +146,8 @@
}
- if (!errors.isEmpty()) {
+ return errors;
- throw new InvalidFormException(errors);
-
- }
-
}
protected Comment saveComment(Poll poll, Comment comment) {
@@ -167,7 +162,7 @@
} else {
- toSave = getCommentDao().newInstance();
+ toSave = getCommentDao().create();
toSave.setPostDate(serviceContext.getNow());
// -- author -- //
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -1,5 +1,26 @@
package org.chorem.pollen.services.service;
+/*
+ * #%L
+ * Pollen :: Service
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/FavoriteListService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/FavoriteListService.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/FavoriteListService.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -23,13 +23,16 @@
* #L%
*/
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
+import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.chorem.pollen.persistence.entity.FavoriteList;
import org.chorem.pollen.persistence.entity.FavoriteListMember;
+import org.chorem.pollen.persistence.entity.FavoriteListMemberTopiaDao;
+import org.chorem.pollen.persistence.entity.FavoriteListTopiaDao;
import org.chorem.pollen.persistence.entity.PollenUser;
import org.chorem.pollen.services.PollenTechnicalException;
import org.nuiton.util.StringUtil;
@@ -46,7 +49,7 @@
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
-import java.util.LinkedHashSet;
+import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
@@ -68,7 +71,8 @@
PollenUser user = getConnectedUser();
List<FavoriteList> result = user.getFavoriteList();
- return result;
+ return ImmutableList.copyOf(result);
+
}
public FavoriteList getFavoriteList(String favoriteListId) {
@@ -80,6 +84,7 @@
FavoriteList result = getFavoriteList(user, favoriteListId);
return result;
+
}
public FavoriteList createFavoriteList(FavoriteList favoriteList) throws InvalidFormException {
@@ -90,16 +95,17 @@
PollenUser user = getConnectedUser();
- checkFavoriteListForm(user, favoriteList);
+ List<FavoriteList> existingFavoriteLists = new ArrayList<>(user.getFavoriteList());
- FavoriteList toSave = getFavoriteListDao().newInstance();
- copyFavoriteList(favoriteList, toSave);
+ ErrorMap errorMap = checkFavoriteList(existingFavoriteLists, favoriteList);
+ errorMap.failIfNotEmpty();
- user.addFavoriteList(toSave);
- getPollenUserDao().update(user);
+ FavoriteList result = saveFavoriteList(user, favoriteList);
+ commit();
- commit();
- return toSave;
+ getNotificationService().onFavoriteListAdded(user, favoriteList);
+
+ return result;
}
public FavoriteList editFavoriteList(FavoriteList favoriteList) throws InvalidFormException {
@@ -108,20 +114,19 @@
checkNotNull(favoriteList);
checkIsPersisted(favoriteList);
- // get user
PollenUser user = getConnectedUser();
- // get list to save
- FavoriteList toSave = getFavoriteList(user, favoriteList.getTopiaId());
+ List<FavoriteList> existingFavoriteLists = new ArrayList<>(user.getFavoriteList());
- checkFavoriteListForm(user, favoriteList);
+ ErrorMap errorMap = checkFavoriteList(existingFavoriteLists, favoriteList);
+ errorMap.failIfNotEmpty();
+ FavoriteList result = saveFavoriteList(user, favoriteList);
+ commit();
- copyFavoriteList(favoriteList, toSave);
+ getNotificationService().onFavoriteListEdited(user, favoriteList);
- getFavoriteListDao().update(toSave);
- commit();
- return toSave;
+ return result;
}
public void deleteFavoriteList(String favoriteListId) {
@@ -131,15 +136,16 @@
PollenUser user = getConnectedUser();
- FavoriteList persisted = getFavoriteList(user, favoriteListId);
+ FavoriteList favoriteList = getFavoriteList(user, favoriteListId);
- user.removeFavoriteList(persisted);
+ user.removeFavoriteList(favoriteList);
+ commit();
- getPollenUserDao().update(user);
- commit();
+ getNotificationService().onFavoriteListDeleted(user, favoriteList);
+
}
- public LinkedHashSet<FavoriteListMember> getFavoriteListMembers(String favoriteListId) {
+ public Set<FavoriteListMember> getFavoriteListMembers(String favoriteListId) {
checkIsConnected();
checkNotNull(favoriteListId);
@@ -148,7 +154,9 @@
FavoriteList favoriteList = getFavoriteList(user, favoriteListId);
- return favoriteList.getMember();
+ Set<FavoriteListMember> member = favoriteList.getMember();
+ return ImmutableSet.copyOf(member);
+
}
public FavoriteListMember getFavoriteListMember(String favoriteListId, String memberId) {
@@ -163,6 +171,7 @@
FavoriteListMember result = getFavoriteListMember(favoriteList, memberId);
return result;
+
}
public FavoriteListMember addFavoriteListMember(String favoriteListId,
@@ -177,17 +186,16 @@
FavoriteList favoriteList = getFavoriteList(user, favoriteListId);
- checkFavoriteListMemberForm(favoriteList, member);
+ List<FavoriteListMember> existingFavorliteListMembers = new ArrayList<>();
- FavoriteListMember newMember =
- getFavoriteListMemberDao().newInstance();
- copyFavoriteListMember(member, newMember);
- favoriteList.addMember(newMember);
+ ErrorMap errorMap = checkFavoriteListMember(existingFavorliteListMembers, member);
+ errorMap.failIfNotEmpty();
- getFavoriteListDao().update(favoriteList);
+ FavoriteListMember result = saveFavoriteListMember(favoriteList, member);
+ commit();
- commit();
- return newMember;
+ return result;
+
}
public FavoriteListMember editFavoriteListMember(String favoriteListId,
@@ -202,21 +210,19 @@
FavoriteList favoriteList = getFavoriteList(user, favoriteListId);
- String memberId = member.getTopiaId();
+ List<FavoriteListMember> existingFavorliteListMembers = new ArrayList<>();
- FavoriteListMember toSave = getFavoriteListMember(favoriteList, memberId);
+ ErrorMap errorMap = checkFavoriteListMember(existingFavorliteListMembers, member);
+ errorMap.failIfNotEmpty();
- checkFavoriteListMemberForm(favoriteList, member);
+ FavoriteListMember result = saveFavoriteListMember(favoriteList, member);
+ commit();
- copyFavoriteListMember(member, toSave);
+ return result;
- getFavoriteListMemberDao().update(toSave);
-
- commit();
- return toSave;
}
- public void removeFavoriteListMember(String favoriteListId,
+ public void deleteFavoriteListMember(String favoriteListId,
String memberId) {
checkIsConnected();
@@ -233,6 +239,7 @@
getFavoriteListDao().update(favoriteList);
commit();
+
}
public int importFavoriteListMembersFromCsv(String favoriteListId,
@@ -449,104 +456,139 @@
}
- protected void copyFavoriteList(FavoriteList source,
- FavoriteList destination) {
+ protected FavoriteList saveFavoriteList(PollenUser user, FavoriteList favoriteList) {
- destination.setName(source.getName());
+ FavoriteListTopiaDao favoriteListDao = getFavoriteListDao();
+
+ boolean persisted = favoriteList.isPersisted();
+
+ FavoriteList toSave;
+
+ if (persisted) {
+
+ // get existing favorite list
+ toSave = getFavoriteList(user, favoriteList.getTopiaId());
+
+ } else {
+
+ // create a new favorite list
+ toSave = favoriteListDao.create();
+
+ user.addFavoriteList(toSave);
+
+ }
+
+ toSave.setName(favoriteList.getName());
+
+ return toSave;
+
}
- protected void copyFavoriteListMember(FavoriteListMember source,
- FavoriteListMember destination) {
+ protected FavoriteListMember saveFavoriteListMember(FavoriteList favoriteList, FavoriteListMember favoriteListMember) {
- destination.setName(source.getName());
- destination.setEmail(StringUtils.lowerCase(source.getEmail()));
+ FavoriteListMemberTopiaDao favoriteListDao = getFavoriteListMemberDao();
+
+ boolean persisted = favoriteListMember.isPersisted();
+
+ FavoriteListMember toSave;
+
+ if (persisted) {
+
+ // get existing favorite list
+ toSave = getFavoriteListMember(favoriteList, favoriteListMember.getTopiaId());
+
+ } else {
+
+ // create a new favorite list
+ toSave = favoriteListDao.create();
+
+ favoriteList.addMember(toSave);
+
+ }
+
+ toSave.setName(favoriteListMember.getName());
+ toSave.setEmail(StringUtils.lowerCase(favoriteListMember.getEmail()));
+
+ return toSave;
}
- protected void checkFavoriteListForm(PollenUser user, FavoriteList favoriteList) throws InvalidFormException {
+ protected ErrorMap checkFavoriteList(List<FavoriteList> existingFavoriteLists, FavoriteList favoriteList) {
- //TODO use nuiton validator ?
- Multimap<String, String> errors = ArrayListMultimap.create();
+ ErrorMap errors = new ErrorMap();
String favoriteListName = favoriteList.getName();
- // can't accept favorite list without name
checkNotBlank(errors, "name", favoriteListName, "name can not be empty");
+ boolean favoriteListExists = favoriteList.isPersisted();
- // check there is not already a favorite list with same name
- boolean nameFound = false;
- if (!user.isFavoriteListEmpty()) {
- for (FavoriteList list : user.getFavoriteList()) {
- if (favoriteListName.equals(list.getName())) {
- nameFound = true;
- break;
+ Set<String> favoriteListNames = Sets.newHashSet();
+
+ if (CollectionUtils.isNotEmpty(existingFavoriteLists)) {
+
+ // get all used names
+
+ for (FavoriteList favoriteList1 : existingFavoriteLists) {
+
+ if (favoriteListExists &&
+ favoriteList1.getTopiaId().equals(favoriteList.getTopiaId())) {
+
+ continue;
+
}
+
+ favoriteListNames.add(favoriteList1.getName());
+
}
+
}
- check(errors, "name", !nameFound, "name already used by another favorite list");
+ boolean nameAdded = favoriteListNames.add(favoriteListName);
+ check(errors, "name", nameAdded, "name already used by another favorite list");
- if (!favoriteList.isMemberEmpty()) {
+ if (CollectionUtils.isNotEmpty(favoriteList.getMember())) {
int memberIndex = 0;
- Set<String> memberNames = Sets.newHashSet();
- Set<String> memberEmails = Sets.newHashSet();
+ List<FavoriteListMember> existingFavoriteListMembers = new ArrayList<>(favoriteList.getMember());
for (FavoriteListMember member : favoriteList.getMember()) {
- String choiceField = "favoriteListMember[" + (memberIndex++) + "].";
+ ErrorMap favoriteListMemberErrors = checkFavoriteListMember(existingFavoriteListMembers, member);
+ favoriteListMemberErrors.copyTo(errors, "favoriteListMember[" + (memberIndex++) + "].");
- boolean nameNotBlank = checkNotBlank(errors, choiceField + "name", member.getName(), "member name can not be empty");
- if (nameNotBlank) {
- boolean added = memberNames.add(member.getName());
-
- check(errors, choiceField + "name", added, "member name already used");
- }
-
- String memberEmail = getCleanMail(member.getEmail());
-
- boolean emailNotBlank = checkNotBlank(errors, choiceField + "email", memberEmail, "member email can not be empty");
-
- if (emailNotBlank) {
-
- checkValidEmail(errors, choiceField + "email", memberEmail, "member email is not valid");
- boolean emailAdded = memberEmails.add(memberEmail);
- check(errors, choiceField + "email", emailAdded, "member email already used in this list");
- }
}
}
- if (!errors.isEmpty()) {
+ return errors;
- throw new InvalidFormException(errors);
- }
}
+ protected ErrorMap checkFavoriteListMember(List<FavoriteListMember> existingFavoriteListMember, FavoriteListMember favoriteListMember) {
- protected void checkFavoriteListMemberForm(FavoriteList favoriteList, FavoriteListMember favoriteListMember) throws InvalidFormException {
+ ErrorMap errors = new ErrorMap();
- //TODO use nuiton validator ?
- Multimap<String, String> errors = ArrayListMultimap.create();
-
boolean voterListMemberExists = favoriteListMember.isPersisted();
Set<String> memberNames = Sets.newHashSet();
Set<String> memberEmails = Sets.newHashSet();
- if (!favoriteList.isMemberEmpty()) {
+ if (CollectionUtils.isNotEmpty(existingFavoriteListMember)) {
- // get all used names
+ // get all used names / emails
- for (FavoriteListMember member : favoriteList.getMember()) {
+ for (FavoriteListMember favoriteListMember1 : existingFavoriteListMember) {
- if (voterListMemberExists && member.getTopiaId().equals(member.getTopiaId())) {
+ if (voterListMemberExists &&
+ favoriteListMember1.getTopiaId().equals(favoriteListMember1.getTopiaId())) {
continue;
}
- memberNames.add(member.getName());
- memberEmails.add(member.getEmail());
+ memberNames.add(favoriteListMember1.getName());
+ memberEmails.add(favoriteListMember1.getEmail());
+
}
+
}
boolean nameNotBlank = checkNotBlank(errors, "name", favoriteListMember.getName(), "member name can not be empty");
@@ -562,15 +604,17 @@
if (emailNotBlank) {
boolean emailValid = checkValidEmail(errors, "email", memberEmail, "member email is not valid");
+
if (emailValid) {
+
boolean emailAdded = memberEmails.add(memberEmail);
check(errors, "email", emailAdded, "member email already used in this list");
+
}
+
}
- if (!errors.isEmpty()) {
+ return errors;
- throw new InvalidFormException(errors);
- }
}
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/InvalidEntityLinkException.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/InvalidEntityLinkException.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/InvalidEntityLinkException.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -1,5 +1,26 @@
package org.chorem.pollen.services.service;
+/*
+ * #%L
+ * Pollen :: Service
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
import org.chorem.pollen.services.PollenTechnicalException;
import org.nuiton.topia.persistence.TopiaEntity;
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -23,6 +23,7 @@
import org.chorem.pollen.persistence.entity.Choice;
import org.chorem.pollen.persistence.entity.Comment;
+import org.chorem.pollen.persistence.entity.FavoriteList;
import org.chorem.pollen.persistence.entity.Poll;
import org.chorem.pollen.persistence.entity.PollenUser;
import org.chorem.pollen.persistence.entity.Vote;
@@ -35,38 +36,42 @@
*/
public class NotificationService extends PollenServiceSupport {
- public enum NotificationType {
+ public void onUserCreated(PollenUser user, boolean generatePassword) {
+ // TODO
+ }
- // -- poll -- //
- createPoll,
- editPoll,
- deletePoll,
- closePoll,
+ public void onUserEdited(PollenUser user) {
+ // TODO
+ }
- // -- choice -- //
- addChoice,
- editChoice,
- deleteChoice,
+ public void onUserDeleted(PollenUser user) {
+ // TODO
+ }
- // -- comment -- //
- addComment,
- editComment,
- deleteComment,
+ public void onUserPasswordChanged(PollenUser user, String newPassword) {
+ // TODO
+ }
- // -- vote -- //
- addVote,
- editVote,
- deleteVote,
+ public void onUserEmailValidated(PollenUser user) {
+ // TODO
}
- public void onAccountCreated(PollenUser pollenUser) {
+ public void onUserLostPasswordAsked(PollenUser user, String newPassword) {
}
- public void onLostPasswordAsked(PollenUser pollenUser) {
+ public void onFavoriteListAdded(PollenUser user, FavoriteList favoriteList) {
+ // TODO
+ }
+ public void onFavoriteListEdited(PollenUser user, FavoriteList favoriteList) {
+ // TODO
}
+ public void onFavoriteListDeleted(PollenUser user, FavoriteList favoriteList) {
+ // TODO
+ }
+
public void onPollCreated(Poll poll) {
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -53,7 +53,7 @@
// checkIsAdmin();
List<Poll> polls = getPollDao().findAll();
- return ImmutableSet.copyOf(polls);
+ return copyAsSet(polls);
}
@@ -64,7 +64,7 @@
PollenUser connectedUser = getConnectedUser();
Set<Poll> polls = getPollDao().findAllCreated(connectedUser);
- return ImmutableSet.copyOf(polls);
+ return copyAsSet(polls);
}
@@ -75,7 +75,7 @@
PollenUser connectedUser = getConnectedUser();
Set<Poll> polls = getPollDao().findAllInvited(connectedUser);
- return ImmutableSet.copyOf(polls);
+ return copyAsSet(polls);
}
@@ -86,7 +86,7 @@
PollenUser connectedUser = getConnectedUser();
Set<Poll> polls = getPollDao().findAllParticipated(connectedUser);
- return ImmutableSet.copyOf(polls);
+ return copyAsSet(polls);
}
@@ -96,8 +96,15 @@
checkPermission(PermissionVerb.readPoll, pollId);
Poll result = getPollDao().findByTopiaId(pollId);
- return result;
+ if (isNotPermitted(PermissionVerb.editPoll, pollId)) {
+
+ // remove creator informations
+ result.setCreator(null);
+ }
+
+ return copy(result);
+
}
public Poll getNewPoll() {
@@ -123,6 +130,7 @@
creator.setName(connectedUser.getName());
creator.setEmail(connectedUser.getEmail());
+
}
return result;
@@ -136,17 +144,15 @@
ErrorMap errorMap = checkPoll(poll);
checkChoices(errorMap, choices);
- checkvoterLists(errorMap, poll, voterLists);
+ checkVoterLists(errorMap, poll, voterLists);
errorMap.failIfNotEmpty();
Poll savedPoll = savePoll(poll, choices, voterLists);
-
- getPollDao().create(savedPoll);
commit();
getNotificationService().onPollCreated(poll);
- return savedPoll;
+ return copy(savedPoll);
}
@@ -160,13 +166,11 @@
errorMap.failIfNotEmpty();
Poll savedPoll = savePoll(poll, null, null);
-
- getPollDao().update(savedPoll);
commit();
getNotificationService().onPollEdited(poll);
- return savedPoll;
+ return copy(savedPoll);
}
@@ -175,7 +179,7 @@
checkNotNull(pollId);
checkPermission(PermissionVerb.deletePoll, pollId);
- Poll poll = getPoll(pollId);
+ Poll poll = getPollDao().findByTopiaId(pollId);
getPollDao().delete(poll);
commit();
@@ -241,7 +245,7 @@
} else {
- toSave = getPollDao().newInstance();
+ toSave = getPollDao().create();
existingChoices = new ArrayList<>();
PollenPrincipal creatorToPersist =
@@ -305,7 +309,7 @@
}
}
- // -- voting list -- //
+ // -- voter list -- //
if (CollectionUtils.isNotEmpty(voterLists)) {
@@ -322,151 +326,8 @@
}
-// protected void checkPollForm(Poll poll, List<Choice> choices, List<VoterList> voterLists) throws InvalidFormException {
-//
-// //TODO use nuiton validator ?
-// Multimap<String, String> errors = ArrayListMultimap.create();
-//
-// checkNotNull(errors, Poll.PROPERTY_POLL_TYPE, poll.getPollType(), "pollType can not be null");
-// checkNotNull(errors, Poll.PROPERTY_COMMENT_VISIBILITY, poll.getCommentVisibility(), "commentVisibility can not be null");
-// checkNotNull(errors, Poll.PROPERTY_VOTE_VISIBILITY, poll.getVoteVisibility(), "voteVisibility can not be null");
-// checkNotNull(errors, Poll.PROPERTY_VOTE_COUNTING_TYPE, poll.getVoteCountingType(), "voteCountingType can not be null");
-//
-// checkNotBlank(errors, Poll.PROPERTY_TITLE, poll.getTitle(), "title can not be empty");
-//
-// if (!poll.isPersisted()) {
-//
-// // check choices
-// checkNotEmpty(errors, "choice", choices, "need at least one choice");
-//
-// if (CollectionUtils.isNotEmpty(choices)) {
-//
-// // validate choices
-//
-// Set<String> choiceNames = new HashSet<>();
-// int choiceIndex = 0;
-//
-// for (Choice choice : choices) {
-//
-// String choiceField = "choice" + "[" + (choiceIndex++) + "].";
-//
-// checkNotNull(errors,
-// choiceField + Choice.PROPERTY_CHOICE_TYPE,
-// choice.getChoiceType(),
-// "choiceType can not be null");
-// if (choice.getChoiceType() != null) {
-// switch (choice.getChoiceType()) {
-//
-// case TEXT:
-//
-// boolean checkNotBlank = checkNotBlank(errors,
-// choiceField + Choice.PROPERTY_NAME,
-// choice.getName(),
-// "choice name can not be empty");
-//
-// if (checkNotBlank) {
-//
-// // check duplicated name
-//
-// check(errors,
-// choiceField + Choice.PROPERTY_NAME,
-// choiceNames.add(choice.getName()),
-// "Duplicated choice name");
-// }
-// break;
-// case DATE:
-// throw new IllegalStateException("Not implemented");
-//
-// case IMAGE:
-// throw new IllegalStateException("Not implemented");
-// }
-// }
-// }
-// }
-//
-//
-// // check voter lists
-//
-// if (Polls.isPollFree(poll)) {
-// checkEmpty(errors, "voterList", voterLists, "can't have voterList with free poll");
-// } else if (Polls.isPollRestricted(poll)) {
-// check(errors, "voterList", voterLists != null && 1 == voterLists.size(), "must have a unique voterList with a resitricted poll");
-// } else if (Polls.isPollGroup(poll)) {
-// checkNotEmpty(errors, "voterList", voterLists, "must have at least one voterList with a group poll");
-// }
-//
-//
-// if (CollectionUtils.isNotEmpty(voterLists)) {
-//
-// Set<String> voterListNames = Sets.newHashSet();
-//
-// // validate voter lists
-//
-// int voterListIndex = 0;
-//
-// for (VoterList voterList : voterLists) {
-//
-// String voterListField = "voterList" + "[" + (voterListIndex++) + "].";
-//
-// boolean notBlankName = checkNotBlank(errors, voterListField + VoterList.PROPERTY_NAME, voterList.getName(), "voterList name can not be empty");
-//
-// if (notBlankName) {
-// boolean added = voterListNames.add(voterList.getName());
-//
-// check(errors, voterListField + VoterList.PROPERTY_NAME, added, "voterList name already used");
-// }
-// check(errors, voterListField + VoterList.PROPERTY_WEIGHT, voterList.getWeight() > 0, "voterList weight must be greater than 0");
-// boolean withMember = checkNotEmpty(errors, voterListField + VoterList.PROPERTY_MEMBER, voterList.getMember(), "voterList must contains at least one member");
-//
-// if (withMember) {
-// Set<String> voterListMemberNames = Sets.newHashSet();
-// Set<String> voterListMemberEmails = Sets.newHashSet();
-//
-// int voterListMemberIndex = 0;
-//
-// for (VoterListMember voterListMember : voterList.getMember()) {
-//
-// String voterListMemberField = voterListField + VoterList.PROPERTY_MEMBER + "[" + (voterListMemberIndex++) + "].";
-//
-// String voterListMemberName = voterListMember.getName();
-// boolean nameNotNull = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, voterListMemberName, "member name can not be empty");
-//
-// if (nameNotNull) {
-// boolean nameAdded = voterListMemberNames.add(voterListMemberName);
-// check(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, nameAdded, "member name already used in this list");
-// }
-//
-// String voterListMemberEmail = voterListMember.getEmail();
-//
-// boolean emailNotNull = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email can not be empty");
-//
-// if (emailNotNull) {
-//
-// voterListMemberEmail = StringUtils.lowerCase(voterListMemberEmail);
-//
-// checkValidEmail(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email is not valid");
-// boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail);
-// check(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, emailAdded, "member email already used in this list");
-// }
-//
-// check(errors, voterListMemberField + VoterListMember.PROPERTY_WEIGHT, voterListMember.getWeight() > 0, "member weight must be greater than 0");
-// }
-// }
-// }
-// }
-// }
-//
-// if (!errors.isEmpty()) {
-//
-// throw new InvalidFormException(errors);
-//
-// }
-//
-// }
-
protected ErrorMap checkPoll(Poll poll) {
- //TODO use nuiton validator ?
ErrorMap errors = new ErrorMap();
checkNotNull(errors, Poll.PROPERTY_POLL_TYPE, poll.getPollType(), "pollType can not be null");
@@ -480,7 +341,6 @@
}
-
protected void checkChoices(ErrorMap errorMap, List<Choice> choices) {
boolean choicesNotEmpty = CollectionUtils.isNotEmpty(choices);
@@ -505,7 +365,7 @@
}
}
- protected void checkvoterLists(ErrorMap errorMap, Poll poll, List<VoterList> voterLists) {
+ protected void checkVoterLists(ErrorMap errorMap, Poll poll, List<VoterList> voterLists) {
boolean voterListsNotEmpty = CollectionUtils.isNotEmpty(voterLists);
@@ -515,7 +375,7 @@
} else if (Polls.isPollRestricted(poll)) {
- check(errorMap, "voterList", voterListsNotEmpty && 1 == voterLists.size(), "must have a unique voterList with a resitricted poll");
+ check(errorMap, "voterList", voterListsNotEmpty && 1 == voterLists.size(), "must have a unique voterList with a restricted poll");
} else if (Polls.isPollGroup(poll)) {
@@ -533,7 +393,7 @@
ErrorMap voterListErrors = getVoterListService().checkVoterList(existingVoterLists, voterList);
- voterListErrors.copyTo(errorMap, "voterList[" + i + "].");
+ voterListErrors.copyTo(errorMap, "voterList[" + (i++) + "].");
existingVoterLists.add(voterList);
@@ -542,4 +402,5 @@
}
}
+
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenPrincipalRef.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenPrincipalRef.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenPrincipalRef.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -1,5 +1,26 @@
package org.chorem.pollen.services.service;
+/*
+ * #%L
+ * Pollen :: Service
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
import org.chorem.pollen.persistence.entity.PollenPrincipal;
import org.chorem.pollen.persistence.entity.PollenPrincipals;
import org.nuiton.topia.persistence.TopiaEntity;
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -24,6 +24,8 @@
*/
import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
@@ -43,6 +45,7 @@
import org.chorem.pollen.persistence.entity.VoterListTopiaDao;
import org.chorem.pollen.services.PollenService;
import org.chorem.pollen.services.PollenServiceContext;
+import org.chorem.pollen.services.TopiaEntityCopyVisitor;
import org.chorem.pollen.services.config.PollenServiceConfig;
import org.chorem.pollen.services.service.mail.EmailService;
import org.chorem.pollen.services.service.security.PermissionVerb;
@@ -207,112 +210,197 @@
// -- check method -- //
- protected PollenUser getConnectedUser() {
- return serviceContext.getSecurityContext().getPollenUser();
- }
-
public void checkIsConnected() {
-
getSecurityService().checkIsConnected();
-
}
public void checkIsAdmin() {
-
getSecurityService().checkIsAdmin();
-
}
protected void checkPermission(PermissionVerb verb, String id) {
+
String permission = getSecurityService().createPermission(verb, id);
getSecurityService().checkPermission(permission);
+
}
+ protected boolean isPermitted(PermissionVerb verb, String id) {
+
+ String permission = getSecurityService().createPermission(verb, id);
+ boolean permitted = getSecurityService().isPermitted(permission);
+ return permitted;
+
+ }
+
+ protected boolean isNotPermitted(PermissionVerb verb, String id) {
+
+ boolean notPermietted = !isPermitted(verb, id);
+ return notPermietted;
+
+ }
+
protected void checkNotNull(Object object) {
+
Preconditions.checkNotNull(object);
+
}
protected void checkIsPersisted(TopiaEntity entity) {
+
Preconditions.checkState(entity.isPersisted());
+
}
protected void checkIsNotPersisted(TopiaEntity entity) {
+
Preconditions.checkState(!entity.isPersisted());
+
}
protected boolean check(Multimap<String, String> errors, String field, boolean condition, String error) {
+
boolean valid = condition;
if (!valid) {
errors.put(field, error);
}
return valid;
+
}
protected boolean checkNot(Multimap<String, String> errors, String field, boolean condition, String error) {
+
boolean valid = check(errors, field, !condition, error);
return valid;
+
}
protected boolean checkNotNull(Multimap<String, String> errors, String field, Object value, String error) {
+
boolean valid = check(errors, field, value != null, error);
return valid;
+
}
protected boolean checkEmpty(Multimap<String, String> errors, String field, Collection<?> value, String error) {
+
boolean valid = check(errors, field, CollectionUtils.isEmpty(value), error);
return valid;
+
}
protected boolean checkNotEmpty(Multimap<String, String> errors, String field, Collection<?> value, String error) {
+
boolean valid = check(errors, field, CollectionUtils.isNotEmpty(value), error);
return valid;
+
}
protected boolean checkNotBlank(Multimap<String, String> errors, String field, String value, String error) {
+
boolean valid = check(errors, field, StringUtils.isNotBlank(value), error);
return valid;
+
}
protected boolean checkValidEmail(Multimap<String, String> errors, String field, String value, String error) {
+
boolean valid = check(errors, field, StringUtil.isEmail(value), error);
return valid;
+
}
protected boolean checkNot(ErrorMap errors, String field, boolean condition, String error) {
+
boolean valid = check(errors, field, !condition, error);
return valid;
+
}
protected boolean checkNotNull(ErrorMap errors, String field, Object value, String error) {
+
boolean valid = check(errors, field, value != null, error);
return valid;
+
}
protected boolean checkEmpty(ErrorMap errors, String field, Collection<?> value, String error) {
+
boolean valid = check(errors, field, CollectionUtils.isEmpty(value), error);
return valid;
+
}
protected boolean checkNotEmpty(ErrorMap errors, String field, Collection<?> value, String error) {
+
boolean valid = check(errors, field, CollectionUtils.isNotEmpty(value), error);
return valid;
+
}
protected boolean checkNotBlank(ErrorMap errors, String field, String value, String error) {
+
boolean valid = check(errors, field, StringUtils.isNotBlank(value), error);
return valid;
+
}
protected boolean checkValidEmail(ErrorMap errors, String field, String value, String error) {
+
boolean valid = check(errors, field, StringUtil.isEmail(value), error);
return valid;
+
}
protected boolean check(ErrorMap errors, String field, boolean condition, String error) {
+
boolean valid = condition;
if (!valid) {
errors.addError(field, error);
}
return valid;
+
}
+
+ protected PollenUser getConnectedUser() {
+
+ PollenUser pollenUser = serviceContext.getSecurityContext().getPollenUser();
+ return pollenUser;
+
+ }
+
+ protected <T extends TopiaEntity> T copy(T entity) {
+
+ T copy = null;
+
+ if (entity != null) {
+
+ copy = TopiaEntityCopyVisitor.copy(serviceContext.getTopiaApplicationContext(), entity);
+ }
+
+ return copy;
+
+ }
+
+ protected <T extends TopiaEntity> ImmutableList<T> copyAsList(Collection<T> entity) {
+
+ Collection<T> copy = TopiaEntityCopyVisitor.copy(serviceContext.getTopiaApplicationContext(), entity);
+
+ ImmutableList<T> result = ImmutableList.copyOf(copy);
+
+ return result;
+
+ }
+
+ protected <T extends TopiaEntity> ImmutableSet<T> copyAsSet(Collection<T> entity) {
+
+ Collection<T> copy = TopiaEntityCopyVisitor.copy(serviceContext.getTopiaApplicationContext(), entity);
+
+ copy = ImmutableSet.copyOf(copy);
+
+ ImmutableSet<T> result = ImmutableSet.copyOf(copy);
+
+ return result;
+
+ }
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenUserService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenUserService.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenUserService.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -23,8 +23,6 @@
* #L%
*/
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
import org.apache.commons.lang3.ObjectUtils;
import org.chorem.pollen.persistence.entity.PollenToken;
import org.chorem.pollen.persistence.entity.PollenUser;
@@ -50,7 +48,7 @@
// checkIsAdmin();
List<PollenUser> pollenUsers = getPollenUserDao().findAll();
- return pollenUsers;
+ return copyAsList(pollenUsers);
}
@@ -59,60 +57,55 @@
checkNotNull(userId);
PollenUser result = getPollenUserDao().findByTopiaId(userId);
- return result;
+ return copy(result);
}
- public PollenUser getUserByLogin(String login) {
-
- checkNotNull(login);
-
- PollenUser result = getPollenUserDao().forLoginEquals(login).findUnique();
- return result;
-
- }
-
public PollenUser createUser(PollenUser user, boolean generatePassword) throws InvalidFormException {
checkNotNull(user);
checkIsNotPersisted(user);
- checkPollenUserForm(user);
+ ErrorMap errorMap = checkPollenUser(user);
+ errorMap.failIfNotEmpty();
+
PollenUser result = savePollenUser(user, generatePassword);
-
- getPollenUserDao().create(result);
commit();
- //TODO Notify user created
- return result;
+ getNotificationService().onUserCreated(result, generatePassword);
+ return copy(result);
+
}
public PollenUser editUser(PollenUser user) throws InvalidFormException {
checkNotNull(user);
checkIsPersisted(user);
- checkPollenUserForm(user);
+ ErrorMap errorMap = checkPollenUser(user);
+ errorMap.failIfNotEmpty();
+
PollenUser result = savePollenUser(user, false);
-
- getPollenUserDao().update(result);
commit();
- //TODO Notify user edited
- return result;
+ getNotificationService().onUserEdited(user);
+ return copy(result);
+
}
public void deleteUser(String userId) {
checkNotNull(userId);
- PollenUser user = getUser(userId);
+ PollenUser user = getPollenUserDao().findByTopiaId(userId);
getPollenUserDao().delete(user);
commit();
+ getNotificationService().onUserDeleted(user);
+
}
public void changePassword(String userId,
@@ -123,7 +116,7 @@
checkNotNull(oldPassword);
checkNotNull(newPassword);
- PollenUser user = getUser(userId);
+ PollenUser user = getPollenUserDao().findByTopiaId(userId);
// check old password
getSecurityService().checkUserPassword(user, oldPassword);
@@ -131,10 +124,10 @@
// set new password
getSecurityService().setUserPassword(user, newPassword);
- getPollenUserDao().update(user);
commit();
- //TODO Notify PasswordChanged
+ getNotificationService().onUserPasswordChanged(user, newPassword);
+
}
public void validateUserEmail(String userId,
@@ -143,7 +136,7 @@
checkNotNull(userId);
checkNotNull(token);
- PollenUser user = getUser(userId);
+ PollenUser user = getPollenUserDao().findByTopiaId(userId);
getSecurityService().checkUserEmailValidation(user, token);
@@ -152,6 +145,8 @@
commit();
+ getNotificationService().onUserEmailValidated(user);
+
}
public void createDefaultUsers() throws InvalidFormException {
@@ -171,10 +166,9 @@
}
- protected void checkPollenUserForm(PollenUser user) throws InvalidFormException {
+ protected ErrorMap checkPollenUser(PollenUser user) throws InvalidFormException {
- //TODO use nuiton validator ?
- Multimap<String, String> errors = ArrayListMultimap.create();
+ ErrorMap errors = new ErrorMap();
boolean userExists = user.isPersisted();
PollenUser persisted = userExists ? getUser(user.getTopiaId()) : null;
@@ -186,12 +180,15 @@
boolean loginNotBlank = checkNotBlank(errors, "login", userLogin, "login can not be empty");
if (loginNotBlank && !userExists) {
+
check(errors, "login", !dao.loginExists(userLogin), "login already exists");
+
}
boolean emailNotblank = checkNotBlank(errors, "email", userEmail, "email can not be empty");
if (emailNotblank) {
+
checkValidEmail(errors, "email", userEmail, "email is not valid");
@@ -203,31 +200,37 @@
userEmail);
if (emailChanged) {
+
check(errors, "email", !dao.emailExists(userEmail), "email already exists");
+
}
} else {
+
check(errors, "email", !dao.emailExists(userEmail), "email already exists");
+
}
+
}
if (userExists) {
// check current password
+
try {
+
getSecurityService().checkUserPassword(persisted, user.getPassword());
+
} catch (PollenInvalidPasswordException e) {
+
check(errors, "password", false, "invalid password");
+
}
}
- if (!errors.isEmpty()) {
+ return errors;
- throw new InvalidFormException(errors);
-
- }
-
}
protected PollenUser savePollenUser(PollenUser user, boolean generatePassword) {
@@ -240,7 +243,7 @@
if (userExists) {
- toSave = getUser(user.getTopiaId());
+ toSave = getPollenUserDao().findByTopiaId(user.getTopiaId());
boolean emailChanged = !Objects.equals(toSave.getEmail(), cleanMail);
@@ -267,7 +270,7 @@
PollenToken emailActivation = getSecurityService().generateNewToken();
- toSave = getPollenUserDao().newInstance();
+ toSave = getPollenUserDao().create();
toSave.setLogin(user.getLogin());
toSave.setEmailActivationToken(emailActivation);
@@ -283,4 +286,5 @@
return toSave;
}
+
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -23,9 +23,7 @@
* #L%
*/
-import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Multimap;
import org.chorem.pollen.persistence.entity.Poll;
import org.chorem.pollen.persistence.entity.Polls;
import org.chorem.pollen.persistence.entity.Vote;
@@ -74,14 +72,14 @@
Poll poll = getPollService().getPoll(pollId);
- checkVoteForm(poll, vote);
+ ErrorMap errorMap = checkVote(poll, vote);
+ errorMap.failIfNotEmpty();
Vote result = saveVote(poll, vote);
-
- getPollDao().update(poll);
commit();
- //TODO Notify vote added
+ getNotificationService().onVoteAdded(poll, result);
+
return result;
}
@@ -94,14 +92,14 @@
Poll poll = getPollService().getPoll(pollId);
- checkVoteForm(poll, vote);
+ ErrorMap errorMap = checkVote(poll, vote);
+ errorMap.failIfNotEmpty();
Vote result = saveVote(poll, vote);
-
- getVoteDao().update(vote);
commit();
- //TODO Notify vote edited
+ getNotificationService().onVoteEdited(poll, result);
+
return result;
}
@@ -115,17 +113,17 @@
Poll poll = getPollService().getPoll(pollId);
Vote vote = getVote(poll, voteId);
-
+
getVoteDao().delete(vote);
commit();
- //TODO Notify vote deleted
+ getNotificationService().onVoteDeleted(poll, vote);
+
}
- protected void checkVoteForm(Poll poll, Vote vote) throws InvalidFormException {
+ protected ErrorMap checkVote(Poll poll, Vote vote) {
- //TODO use nuiton validator ?
- Multimap<String, String> errors = ArrayListMultimap.create();
+ ErrorMap errors = new ErrorMap();
// poll can't be closed
checkNot(errors, "poll", poll.isClosed(), "poll can not be closed");
@@ -139,12 +137,8 @@
//TODO Finish validation
- if (!errors.isEmpty()) {
+ return errors;
- throw new InvalidFormException(errors);
-
- }
-
}
protected Vote saveVote(Poll poll, Vote vote) {
@@ -157,9 +151,10 @@
if (voteExist) {
toSave = getVote(poll, vote.getTopiaId());
+
} else {
- toSave = getVoteDao().newInstance();
+ toSave = getVoteDao().create();
// toSave.setPostDate(serviceContext.getNow());
// -- author -- //
@@ -195,4 +190,5 @@
return result;
}
+
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -23,9 +23,7 @@
* #L%
*/
-import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import org.apache.commons.collections4.CollectionUtils;
import org.chorem.pollen.persistence.entity.FavoriteList;
@@ -36,6 +34,7 @@
import org.chorem.pollen.persistence.entity.VoterListMemberTopiaDao;
import org.chorem.pollen.persistence.entity.VoterListTopiaDao;
+import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -59,7 +58,7 @@
FavoriteList favoriteList = getFavoriteListService().getFavoriteList(favoriteListId);
VoterListTopiaDao dao = getVoterListDao();
- VoterList result = dao.newInstance();
+ VoterList result = dao.create();
result.setName(favoriteList.getName());
result.setWeight(1d);
@@ -76,7 +75,6 @@
}
result.setPoll(poll);
- getPollDao().update(poll);
commit();
return result;
@@ -113,11 +111,13 @@
Poll poll = getPollService().getPoll(pollId);
- checkVoterListForm(poll, voterList);
+ List<VoterList> existingVoterLists = getVoterListDao().forPollEquals(poll).findAll();
- VoterList result = saveVoterList(poll, voterList);
+ ErrorMap errorMap = checkVoterList(existingVoterLists, voterList);
+ errorMap.failIfNotEmpty();
- getPollDao().update(poll);
+
+ VoterList result = saveVoterList(poll, voterList);
commit();
return result;
@@ -132,11 +132,12 @@
Poll poll = getPollService().getPoll(pollId);
- checkVoterListForm(poll, voterList);
+ List<VoterList> existingVoterLists = getVoterListDao().forPollEquals(poll).findAll();
- VoterList result = saveVoterList(poll, voterList);
+ ErrorMap errorMap = checkVoterList(existingVoterLists, voterList);
+ errorMap.failIfNotEmpty();
- getVoterListDao().update(voterList);
+ VoterList result = saveVoterList(poll, voterList);
commit();
return result;
@@ -151,7 +152,6 @@
Poll poll = getPollService().getPoll(pollId);
VoterList voterList = getVoterList(poll, voterListId);
-
getVoterListDao().delete(voterList);
commit();
@@ -192,11 +192,12 @@
VoterList voterList = getVoterList(pollId, voterListId);
- checkVoterListMemberForm(voterList, member);
+ List<VoterListMember> existingVoterListMembers = new ArrayList<>(voterList.getMember());
- VoterListMember result = saveVoterListMember(voterList, member);
+ ErrorMap errorMap = checkVoterListMember(existingVoterListMembers, member);
+ errorMap.failIfNotEmpty();
- getVoterListDao().update(voterList);
+ VoterListMember result = saveVoterListMember(voterList, member);
commit();
return result;
@@ -213,11 +214,12 @@
VoterList voterList = getVoterList(pollId, voterListId);
- checkVoterListMemberForm(voterList, member);
+ List<VoterListMember> existingVoterListMembers = new ArrayList<>(voterList.getMember());
- VoterListMember result = saveVoterListMember(voterList, member);
+ ErrorMap errorMap = checkVoterListMember(existingVoterListMembers, member);
+ errorMap.failIfNotEmpty();
- getVoterListMemberDao().update(member);
+ VoterListMember result = saveVoterListMember(voterList, member);
commit();
return result;
@@ -234,7 +236,6 @@
VoterListMember member = getVoterListMember(voterList, memberId);
voterList.removeMember(member);
-
commit();
}
@@ -310,8 +311,7 @@
} else {
- toSave = getVoterListMemberDao().newInstance();
-
+ toSave = getVoterListMemberDao().create();
voterList.addMember(toSave);
}
@@ -324,30 +324,22 @@
}
- protected void checkVoterListForm(Poll poll, VoterList voterList) throws InvalidFormException {
+ protected ErrorMap checkVoterList(List<VoterList> existingVoterLists, VoterList voterList) {
- //TODO use nuiton validator ?
- Multimap<String, String> errors = ArrayListMultimap.create();
+ ErrorMap errors = new ErrorMap();
boolean voterListExists = voterList.isPersisted();
Set<String> voterListNames = Sets.newHashSet();
- List<VoterList> existingVoterLists = null;
-
- if (poll.isPersisted()) {
-
- existingVoterLists = getVoterListDao().forPollEquals(poll).findAll();
-
- }
-
if (CollectionUtils.isNotEmpty(existingVoterLists)) {
// get all used names
- for (VoterList lists : existingVoterLists) {
+ for (VoterList voterList1 : existingVoterLists) {
- if (voterListExists && lists.getTopiaId().equals(voterList.getTopiaId())) {
+ if (voterListExists &&
+ voterList1.getTopiaId().equals(voterList.getTopiaId())) {
continue;
}
@@ -357,176 +349,95 @@
}
- checkNotBlank(errors, "name", voterList.getName(), "voterList name can not be empty");
- check(errors, "weight", voterList.getWeight() > 0, "voterList weight must be greater than 0");
- checkNotEmpty(errors, "member", voterList.getMember(), "voterList must contains at least one member");
+ checkNotBlank(errors, VoterList.PROPERTY_NAME, voterList.getName(), "voterList name can not be empty");
+ check(errors, VoterList.PROPERTY_WEIGHT, voterList.getWeight() > 0, "voterList weight must be greater than 0");
+ checkNotEmpty(errors, VoterList.PROPERTY_MEMBER, voterList.getMember(), "voterList must contains at least one member");
boolean added = voterListNames.add(voterList.getName());
- check(errors, "name", added, "voterList name already used");
+ check(errors, VoterList.PROPERTY_NAME, added, "voterList name already used");
- Set<String> voterListMemberNames = Sets.newHashSet();
- Set<String> voterListMemberEmails = Sets.newHashSet();
-
int voterListMemberIndex = 0;
- for (VoterListMember voterListMember : voterList.getMember()) {
+ if (CollectionUtils.isNotEmpty(voterList.getMember())) {
- String voterListMemberField = "member[" + (voterListMemberIndex++) + "].";
+ List<VoterListMember> existingVoterListMembers;
- String voterListMemberName = voterListMember.getName();
- boolean nameNotBlank = checkNotBlank(errors, voterListMemberField + "name", voterListMemberName, "member name can not be empty");
+ if (voterListExists) {
- if (nameNotBlank) {
- boolean nameAdded = voterListMemberNames.add(voterListMemberName);
- check(errors, voterListMemberField + "name", nameAdded, "member name already used in this list");
- }
+ existingVoterListMembers = new ArrayList<>(voterList.getMember());
- String voterListMemberEmail = getCleanMail(voterListMember.getEmail());
+ } else {
- boolean emailNotBlank = checkNotBlank(errors, voterListMemberField + "email", voterListMemberEmail, "member email can not be empty");
+ existingVoterListMembers = new ArrayList<>();
- if (emailNotBlank) {
-
- checkValidEmail(errors, voterListMemberField + "email", voterListMemberEmail, "member email is not valid");
- boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail);
- check(errors, voterListMemberField + "email", emailAdded, "member email already used in this list");
-
}
- }
- if (!errors.isEmpty()) {
+ for (VoterListMember voterListMember : voterList.getMember()) {
- throw new InvalidFormException(errors);
+ ErrorMap voterListMemberErrors = checkVoterListMember(existingVoterListMembers, voterListMember);
+ voterListMemberErrors.copyTo(errors, "member[" + (voterListMemberIndex++) + "].");
+ existingVoterListMembers.add(voterListMember);
+ }
}
+ return errors;
+
}
- protected void checkVoterListMemberForm(VoterList voterList, VoterListMember voterListMember) throws InvalidFormException {
+ protected ErrorMap checkVoterListMember(List<VoterListMember> existingVoterListMembers, VoterListMember voterListMember) {
- //TODO use nuiton validator ?
- Multimap<String, String> errors = ArrayListMultimap.create();
+ ErrorMap errors = new ErrorMap();
boolean voterListMemberExists = voterListMember.isPersisted();
Set<String> voterListMemberNames = Sets.newHashSet();
Set<String> voterListMemberEmails = Sets.newHashSet();
- if (!voterList.isMemberEmpty()) {
+ if (CollectionUtils.isNotEmpty(existingVoterListMembers)) {
- // get all used names
+ // get all used names and email
- for (VoterListMember member : voterList.getMember()) {
+ for (VoterListMember voterListMember1 : existingVoterListMembers) {
if (voterListMemberExists &&
- member.getTopiaId().equals(voterListMember.getTopiaId())) {
+ voterListMember1.getTopiaId().equals(voterListMember.getTopiaId())) {
continue;
}
- voterListMemberNames.add(voterListMember.getName());
- voterListMemberEmails.add(voterListMember.getEmail());
+ voterListMemberNames.add(voterListMember1.getName());
+ voterListMemberEmails.add(voterListMember1.getEmail());
}
}
+
String voterListMemberName = voterListMember.getName();
- boolean nameNotblank = checkNotBlank(errors, "name", voterListMemberName, "member name can not be empty");
+ boolean nameNotblank = checkNotBlank(errors, VoterListMember.PROPERTY_NAME, voterListMemberName, "member name can not be empty");
if (nameNotblank) {
+
boolean nameAdded = voterListMemberNames.add(voterListMemberName);
- check(errors, "name", nameAdded, "member name already used in this list");
+ check(errors, VoterListMember.PROPERTY_NAME, nameAdded, "member name already used in this list");
+
}
String voterListMemberEmail = getCleanMail(voterListMember.getEmail());
- boolean emailNotBlank = checkNotBlank(errors, "email", voterListMemberEmail, "member email can not be empty");
+ boolean emailNotBlank = checkNotBlank(errors, VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email can not be empty");
if (emailNotBlank) {
- checkValidEmail(errors, "email", voterListMemberEmail, "member email is not valid");
+ checkValidEmail(errors, VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email is not valid");
boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail);
- check(errors, "email", emailAdded, "member email already used in this list");
+ check(errors, VoterListMember.PROPERTY_EMAIL, emailAdded, "member email already used in this list");
}
- if (!errors.isEmpty()) {
+ check(errors, VoterListMember.PROPERTY_WEIGHT, voterListMember.getWeight() > 0, "member weight must be greater than 0");
- throw new InvalidFormException(errors);
-
- }
-
- }
-
- protected ErrorMap checkVoterList(List<VoterList> existingVoterLists, VoterList voterList) {
-
- ErrorMap errors = new ErrorMap();
-
- boolean voterListExists = voterList.isPersisted();
-
- Set<String> voterListNames = Sets.newHashSet();
-
- if (CollectionUtils.isNotEmpty(existingVoterLists)) {
-
- // get all used names
-
- for (VoterList lists : existingVoterLists) {
-
- if (voterListExists && lists.getTopiaId().equals(voterList.getTopiaId())) {
- continue;
- }
-
- voterListNames.add(voterList.getName());
-
- }
-
- }
-
- checkNotBlank(errors, VoterList.PROPERTY_NAME, voterList.getName(), "voterList name can not be empty");
- check(errors, VoterList.PROPERTY_WEIGHT, voterList.getWeight() > 0, "voterList weight must be greater than 0");
- checkNotEmpty(errors, VoterList.PROPERTY_MEMBER, voterList.getMember(), "voterList must contains at least one member");
-
- boolean added = voterListNames.add(voterList.getName());
-
- check(errors, VoterList.PROPERTY_NAME, added, "voterList name already used");
-
- Set<String> voterListMemberNames = Sets.newHashSet();
- Set<String> voterListMemberEmails = Sets.newHashSet();
-
- int voterListMemberIndex = 0;
-
- if (voterList.getMember() != null) {
- for (VoterListMember voterListMember : voterList.getMember()) {
-
- String voterListMemberField = "member[" + (voterListMemberIndex++) + "].";
-
- String voterListMemberName = voterListMember.getName();
- boolean nameNotBlank = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, voterListMemberName, "member name can not be empty");
-
- if (nameNotBlank) {
-
- boolean nameAdded = voterListMemberNames.add(voterListMemberName);
- check(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, nameAdded, "member name already used in this list");
-
- }
-
- String voterListMemberEmail = getCleanMail(voterListMember.getEmail());
-
- boolean emailNotBlank = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email can not be empty");
-
- if (emailNotBlank) {
-
- checkValidEmail(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email is not valid");
- boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail);
- check(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, emailAdded, "member email already used in this list");
-
- }
-
- check(errors, voterListMemberField + VoterListMember.PROPERTY_WEIGHT, voterListMember.getWeight() > 0, "member weight must be greater than 0");
-
- }
- }
-
return errors;
}
+
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PollenAuthenticationException.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PollenAuthenticationException.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PollenAuthenticationException.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -1,5 +1,26 @@
package org.chorem.pollen.services.service.security;
+/*
+ * #%L
+ * Pollen :: Service
+ * %%
+ * Copyright (C) 2009 - 2014 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
/**
* Created on 5/4/14.
*
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -75,8 +75,8 @@
throw new PollenAuthenticationException(e);
}
- PollenUser user = getUserService().getUserByLogin(login);
- return user;
+ PollenUser user = getPollenUserDao().forLoginEquals(login).findUnique();
+ return copy(user);
}
@@ -89,7 +89,7 @@
subject.logout();
}
- return sessionToken;
+ return copy(sessionToken);
}
@@ -98,16 +98,13 @@
PollenTokenTopiaDao dao = getPersistenceContext().getPollenTokenDao();
// Create instance
- PollenToken pollenToken = dao.newInstance();
+ PollenToken pollenToken = dao.create();
pollenToken.setCreationDate(serviceContext.getNow());
// Generate token
String token = serviceContext.generateToken();
pollenToken.setToken(token);
- // Persist
- pollenToken = dao.create(pollenToken);
-
return pollenToken;
}
@@ -117,14 +114,12 @@
PollenPrincipalTopiaDao dao = getPersistenceContext().getPollenPrincipalDao();
// Create instance
- PollenPrincipal principal = dao.newInstance();
+ PollenPrincipal principal = dao.create();
// Generate token
PollenToken token = generateNewToken();
principal.setPermission(token);
- // Persist
- dao.create(principal);
return principal;
}
@@ -138,7 +133,7 @@
throw new PollenInvalidSessionTokenException();
}
}
- return sessionToken;
+ return copy(sessionToken);
}
@@ -148,7 +143,7 @@
if (principalId != null) {
principal = getPollenPrincipalDao().findByPermissionToken(principalId);
}
- return principal;
+ return copy(principal);
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/test/FakePollenApplicationContext.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/test/FakePollenApplicationContext.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/test/FakePollenApplicationContext.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -45,6 +45,8 @@
import org.nuiton.util.DateUtil;
import java.io.File;
+import java.io.IOException;
+import java.net.ServerSocket;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
@@ -86,7 +88,11 @@
@Override
protected void starting(Description description) {
- currentPortNumber = portNumberCounter.getAndIncrement();
+ // get an available port
+ currentPortNumber = getAvailablePort();
+ if (log.isDebugEnabled()) {
+ log.debug("Using port: " + currentPortNumber);
+ }
methodName = description.getMethodName();
@@ -233,4 +239,47 @@
}
+ protected int getAvailablePort() {
+
+ int port = portNumberCounter.getAndIncrement();
+
+ boolean portTaken = false;
+ ServerSocket socket = null;
+
+ try {
+
+ socket = new ServerSocket(port);
+
+ } catch (IOException e) {
+
+ portTaken = true;
+
+ } finally {
+
+ if (socket != null)
+
+ try {
+
+ socket.close();
+
+ } catch (IOException e) {
+
+ if (log.isDebugEnabled()) {
+ log.debug("Already used port: " + port);
+ }
+
+ }
+
+ }
+
+ if (portTaken) {
+
+ port = getAvailablePort();
+
+ }
+
+ return port;
+
+ }
+
}
Modified: trunk/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties
===================================================================
--- trunk/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties 2014-05-08 12:57:53 UTC (rev 3923)
@@ -3,6 +3,7 @@
pollen.configuration.defaultPollType=Default Poll type used when creating a new poll
pollen.configuration.defaultPollVoteVisibility=Default Poll vote visibility used when creating a new poll
pollen.configuration.defaultVoteCountingType=Default vote counting type used when creating a new poll
+pollen.configuration.pollChoiceType=
pollen.error.favoriteList.import.csv.already.used.email=
pollen.error.favoriteList.import.csv.already.used.name=
pollen.error.favoriteList.import.csv.invalid.email=
Modified: trunk/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties
===================================================================
--- trunk/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties 2014-05-08 12:57:53 UTC (rev 3923)
@@ -3,6 +3,7 @@
pollen.configuration.defaultPollType=Type de sondage par défaut lors de la création d'un nouveau sondage
pollen.configuration.defaultPollVoteVisibility=Visibilité des votes par défaut lors de la création d'un nouveau sondage
pollen.configuration.defaultVoteCountingType=Type de dépouillement par défaut lors de la création d'un nouveau sondage
+pollen.configuration.pollChoiceType=
pollen.error.favoriteList.import.csv.already.used.email=
pollen.error.favoriteList.import.csv.already.used.name=
pollen.error.favoriteList.import.csv.invalid.email=
Modified: trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java
===================================================================
--- trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java 2014-05-08 07:34:51 UTC (rev 3922)
+++ trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java 2014-05-08 12:57:53 UTC (rev 3923)
@@ -73,6 +73,73 @@
}
@Test
+ public void createSafeFreePoll() throws InvalidFormException {
+
+ Poll poll = service.getNewPoll();
+
+ poll.setPollType(PollType.FREE);
+ poll.setTitle("poll1");
+
+ List<Choice> choices = new ArrayList<>();
+
+ Choice choice1 = getServiceContext().getPersistenceContext().getChoiceDao().newInstance();
+ choices.add(choice1);
+ choice1.setChoiceType(ChoiceType.TEXT);
+ choice1.setName("A");
+ choice1.setDescription("Choice A");
+
+
+ Choice choice2 = getServiceContext().getPersistenceContext().getChoiceDao().newInstance();
+ choice2.setChoiceType(ChoiceType.TEXT);
+ choice2.setName("B");
+ choice2.setDescription("Choice B");
+ choices.add(choice2);
+
+ Poll createdPoll = service.createPoll(poll, choices, null);
+ Assert.assertNotNull(createdPoll);
+ Assert.assertNotNull(createdPoll.getTopiaId());
+
+ Poll reloadedPoll = service.getPoll(createdPoll.getTopiaId());
+ Assert.assertEquals(createdPoll, reloadedPoll);
+
+ Assert.assertEquals(getServiceContext().getNow(), createdPoll.getBeginDate());
+
+ Assert.assertNotNull(createdPoll.getCreator());
+ Assert.assertNotNull(createdPoll.getCreator().getTopiaId());
+ Assert.assertNull(createdPoll.getCreator().getName());
+ Assert.assertNull(createdPoll.getCreator().getEmail());
+
+ List<Choice> createdChoices = choiceService.getChoices(createdPoll.getTopiaId());
+
+ Assert.assertNotNull(createdChoices);
+ Assert.assertEquals(2, createdChoices.size());
+
+
+ Choice createdChoice1 = createdChoices.get(0);
+ Assert.assertNotNull(createdChoice1);
+ Assert.assertNotNull(createdChoice1.getTopiaId());
+
+ Choice reloadedChoice1 = choiceService.getChoice(createdPoll.getTopiaId(), createdChoice1.getTopiaId());
+ Assert.assertEquals(createdChoice1, reloadedChoice1);
+
+ Assert.assertEquals(choice1.getName(), createdChoice1.getName());
+ Assert.assertEquals(choice1.getDescription(), createdChoice1.getDescription());
+ Assert.assertEquals(createdPoll.getCreator(), createdChoice1.getCreator());
+
+ Choice createdChoice2 = createdChoices.get(1);
+ Assert.assertNotNull(createdChoice2);
+ Assert.assertNotNull(createdChoice2.getTopiaId());
+
+ Choice reloadedChoice2 = choiceService.getChoice(createdPoll.getTopiaId(), createdChoice2.getTopiaId());
+ Assert.assertEquals(createdChoice2, reloadedChoice2);
+
+ Assert.assertEquals(choice2.getName(), createdChoice2.getName());
+ Assert.assertEquals(choice2.getDescription(), createdChoice2.getDescription());
+ Assert.assertEquals(createdPoll.getCreator(), createdChoice2.getCreator());
+
+ }
+
+ @Test
public void testCreateFreePoll() throws InvalidFormException {
Poll poll = service.getNewPoll();
@@ -179,7 +246,123 @@
}
+
@Test
+ public void createSafeRestrictedPoll() throws InvalidFormException {
+
+ Poll poll = service.getNewPoll();
+
+ poll.setPollType(PollType.GROUP);
+ poll.setTitle("poll1");
+
+ List<Choice> choices = new ArrayList<>();
+
+ Choice choice1 = getServiceContext().getPersistenceContext().getChoiceDao().newInstance();
+ choices.add(choice1);
+ choice1.setChoiceType(ChoiceType.TEXT);
+ choice1.setName("A");
+ choice1.setDescription("Choice A");
+
+
+ Choice choice2 = getServiceContext().getPersistenceContext().getChoiceDao().newInstance();
+ choice2.setChoiceType(ChoiceType.TEXT);
+ choice2.setName("B");
+ choice2.setDescription("Choice B");
+ choices.add(choice2);
+
+ List<VoterList> voterLists = new ArrayList<>();
+
+ // add voter list
+ VoterList voterList = getServiceContext().getPersistenceContext().getVoterListDao().newInstance();
+
+ voterLists.add(voterList);
+ voterList.setName("voterList1");
+ voterList.setWeight(1);
+
+ VoterListMember voterListMember1 = getServiceContext().getPersistenceContext().getVoterListMemberDao().newInstance();
+ voterList.addMember(voterListMember1);
+
+ voterListMember1.setName("voter1");
+ voterListMember1.setWeight(0.3);
+ voterListMember1.setEmail("voter1(a)pollen.org");
+
+ VoterListMember voterListMember2 = getServiceContext().getPersistenceContext().getVoterListMemberDao().newInstance();
+ voterList.addMember(voterListMember2);
+ voterListMember2.setName("voter2");
+ voterListMember2.setEmail("voter2(a)pollen.org");
+ voterListMember2.setWeight(0.7);
+
+ Poll createdPoll = service.createPoll(poll, choices, voterLists);
+ Assert.assertNotNull(createdPoll);
+ Assert.assertNotNull(createdPoll.getTopiaId());
+
+ try {
+ service.getPoll(createdPoll.getTopiaId());
+ Assert.fail();
+ } catch (PollenInvalidPermissionException e) {
+ Assert.assertTrue(true);
+ }
+
+ FakePollenSecurityContext securityContext = (FakePollenSecurityContext) serviceContext.getSecurityContext();
+ securityContext.setMainPrincipal(createdPoll.getCreator());
+
+ Poll reloadedPoll = service.getPoll(createdPoll.getTopiaId());
+ Assert.assertEquals(createdPoll, reloadedPoll);
+
+ Assert.assertEquals(getServiceContext().getNow(), createdPoll.getBeginDate());
+
+ Assert.assertNotNull(createdPoll.getCreator());
+ Assert.assertNotNull(createdPoll.getCreator().getTopiaId());
+ Assert.assertNull(createdPoll.getCreator().getName());
+ Assert.assertNull(createdPoll.getCreator().getEmail());
+
+ List<Choice> createdChoices = choiceService.getChoices(createdPoll.getTopiaId());
+
+ Assert.assertNotNull(createdChoices);
+ Assert.assertEquals(2, createdChoices.size());
+
+ Choice createdChoice1 = createdChoices.get(0);
+ Assert.assertNotNull(createdChoice1);
+ Assert.assertNotNull(createdChoice1.getTopiaId());
+
+ Choice reloadedChoice1 = choiceService.getChoice(createdPoll.getTopiaId(), createdChoice1.getTopiaId());
+ Assert.assertEquals(createdChoice1, reloadedChoice1);
+
+ Assert.assertEquals(choice1.getName(), createdChoice1.getName());
+ Assert.assertEquals(choice1.getDescription(), createdChoice1.getDescription());
+ Assert.assertEquals(createdPoll.getCreator(), createdChoice1.getCreator());
+
+ Choice createdChoice2 = createdChoices.get(1);
+ Assert.assertNotNull(createdChoice2);
+ Assert.assertNotNull(createdChoice2.getTopiaId());
+
+ Choice reloadedChoice2 = choiceService.getChoice(createdPoll.getTopiaId(), createdChoice2.getTopiaId());
+ Assert.assertEquals(createdChoice2, reloadedChoice2);
+
+ Assert.assertEquals(choice2.getName(), createdChoice2.getName());
+ Assert.assertEquals(choice2.getDescription(), createdChoice2.getDescription());
+ Assert.assertEquals(createdPoll.getCreator(), createdChoice2.getCreator());
+
+ List<VoterList> createdVoterLists = voterListService.getVoterLists(createdPoll.getTopiaId());
+
+ Assert.assertNotNull(createdVoterLists);
+ Assert.assertEquals(1, createdVoterLists.size());
+ VoterList createdVoterList = createdVoterLists.get(0);
+ Assert.assertNotNull(createdVoterList);
+ Assert.assertNotNull(createdVoterList.getTopiaId());
+
+ VoterList reloadedVoterList = voterListService.getVoterList(createdPoll.getTopiaId(), createdVoterList.getTopiaId());
+ Assert.assertEquals(createdVoterList, reloadedVoterList);
+
+ Assert.assertEquals(voterList.getName(), createdVoterList.getName());
+ Assert.assertEquals(voterList.getWeight(), createdVoterList.getWeight(), 0);
+
+ Assert.assertNotNull(createdVoterList.getMember());
+ Assert.assertEquals(2, createdVoterList.sizeMember());
+
+ }
+
+ @Test
public void testCreateRestrictedPoll() throws InvalidFormException {
Poll poll = service.getNewPoll();
1
0
See <http://ci.chorem.org/jenkins/job/pollen-ci/41/changes>
Changes:
[Tony CHEMIT] improve conversions and lots of stuff... to be continued...
------------------------------------------
[...truncated 1022 lines...]
pollen.smtp.host =
pollen.smtp.port = 25
pollen.smtp.from =
pollen.devMode = true
logConfigurationFile = null
05:53:08 INFO (FixturesService.java:77) will restore database with fixture set
05:53:08 DEBUG (FakePollenApplicationContext.java:99) testBasedir: <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-services/target/…>
05:53:08 INFO (PollenServiceConfig.java:88) Pollen configuration:
Filename: pollen-services.properties
pollen.data.directory = <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-services/target/…>
pollen.default.pollType = FREE
pollen.default.voteCountingType = 1
pollen.default.pollVoteVisibility = EVERYBODY
pollen.default.pollCommentVisibility = EVERYBODY
pollen.smtp.host =
pollen.smtp.port = 25
pollen.smtp.from =
pollen.devMode = true
logConfigurationFile = null
05:53:09 INFO (FixturesService.java:77) will restore database with fixture set
05:53:09 DEBUG (FakePollenApplicationContext.java:99) testBasedir: <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-services/target/…>
05:53:09 INFO (PollenServiceConfig.java:88) Pollen configuration:
Filename: pollen-services.properties
pollen.data.directory = <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-services/target/…>
pollen.default.pollType = FREE
pollen.default.voteCountingType = 1
pollen.default.pollVoteVisibility = EVERYBODY
pollen.default.pollCommentVisibility = EVERYBODY
pollen.smtp.host =
pollen.smtp.port = 25
pollen.smtp.from =
pollen.devMode = true
logConfigurationFile = null
05:53:09 INFO (FixturesService.java:77) will restore database with fixture set
05:53:09 DEBUG (FakePollenApplicationContext.java:99) testBasedir: <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-services/target/…>
05:53:09 INFO (PollenServiceConfig.java:88) Pollen configuration:
Filename: pollen-services.properties
pollen.data.directory = <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-services/target/…>
pollen.default.pollType = FREE
pollen.default.voteCountingType = 1
pollen.default.pollVoteVisibility = EVERYBODY
pollen.default.pollCommentVisibility = EVERYBODY
pollen.smtp.host =
pollen.smtp.port = 25
pollen.smtp.from =
pollen.devMode = true
logConfigurationFile = null
05:53:09 INFO (FixturesService.java:77) will restore database with fixture set
05:53:10 DEBUG (FakePollenApplicationContext.java:99) testBasedir: <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-services/target/…>
05:53:10 INFO (PollenServiceConfig.java:88) Pollen configuration:
Filename: pollen-services.properties
pollen.data.directory = <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-services/target/…>
pollen.default.pollType = FREE
pollen.default.voteCountingType = 1
pollen.default.pollVoteVisibility = EVERYBODY
pollen.default.pollCommentVisibility = EVERYBODY
pollen.smtp.host =
pollen.smtp.port = 25
pollen.smtp.from =
pollen.devMode = true
logConfigurationFile = null
05:53:10 INFO (FixturesService.java:77) will restore database with fixture set
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.889 sec - in org.chorem.pollen.service.PollenUserServiceTest
Results :
Tests run: 7, Failures: 0, Errors: 0, Skipped: 0
[JENKINS] Recording test results
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ pollen-services ---
[INFO] Building jar: <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-services/target/…>
[INFO]
[INFO] --- maven-site-plugin:3.3:attach-descriptor (attach-descriptor) @ pollen-services ---
[JENKINS] Archiving disabled
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Pollen :: Rest Api 2.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/repositories/snapshots/org/debux/webm…
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti…
[INFO] Downloaded: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti… (2 KB at 1.0 KB/sec)
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/repositories/snapshots/org/debux/webm…
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti…
[INFO] Downloaded: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti… (7 KB at 9.8 KB/sec)
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/repositories/snapshots/org/debux/webm…
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti…
[INFO] Downloaded: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti… (613 B at 1.4 KB/sec)
[WARNING] The POM for org.antlr:stringtemplate:jar:3.2.1 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/repositories/snapshots/org/debux/webm…
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti…
[INFO] Downloaded: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti… (2 KB at 3.6 KB/sec)
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti…
[INFO] Downloaded: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti… (255 KB at 171.3 KB/sec)
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ pollen-rest-api ---
[INFO] Deleting <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-rest-api/target>
[INFO]
[INFO] --- maven-enforcer-plugin:1.3.1:enforce (check-project-files) @ pollen-rest-api ---
[INFO]
[INFO] >>> i18n-maven-plugin:3.0:bundle (default) @ pollen-rest-api >>>
[INFO]
[INFO] --- i18n-maven-plugin:3.0:collect-i18n-artifacts (collect-i18n-artifacts) @ pollen-rest-api ---
[WARNING] Invalid POM for org.antlr:stringtemplate:jar:3.2.1, transitive dependencies (if any) will not be available, enable debug logging for more details
[INFO] Downloading: https://oss.sonatype.org/content/repositories/snapshots/org/debux/webmotion…
[INFO] Downloaded: https://oss.sonatype.org/content/repositories/snapshots/org/debux/webmotion… (2 KB at 1.3 KB/sec)
[INFO] Downloading: https://oss.sonatype.org/content/repositories/snapshots/org/debux/webmotion…
[INFO] Downloaded: https://oss.sonatype.org/content/repositories/snapshots/org/debux/webmotion… (613 B at 1.6 KB/sec)
[INFO] collected 2 i18n artifacts for locale fr_FR stored in <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-rest-api/target/…>
[INFO] collected 2 i18n artifacts for locale en_GB stored in <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-rest-api/target/…>
[INFO]
[INFO] <<< i18n-maven-plugin:3.0:bundle (default) @ pollen-rest-api <<<
[INFO]
[INFO] --- i18n-maven-plugin:3.0:bundle (default) @ pollen-rest-api ---
[WARNING] bundle fr_FR contains 6/70 empty entries! (use -Di18n.showEmpty to see these entries)
[WARNING] bundle en_GB contains 6/70 empty entries! (use -Di18n.showEmpty to see these entries)
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ pollen-rest-api ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ pollen-rest-api ---
[INFO] Compiling 20 source files to <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-rest-api/target/…>
[WARNING] <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-rest-api/src/mai…>:[304,35] getNullValue(java.lang.Class<?>) in org.nuiton.util.ObjectUtil has been deprecated
[WARNING] <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-rest-api/src/mai…>: Some input files use unchecked or unsafe operations.
[WARNING] <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-rest-api/src/mai…>: Recompile with -Xlint:unchecked for details.
[INFO]
[INFO] --- maven-antrun-plugin:1.7:run (generate-surefire-workdir) @ pollen-rest-api ---
[INFO] Executing tasks
main:
[mkdir] Created dir: <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-rest-api/target/…>
[INFO] Executed tasks
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ pollen-rest-api ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ pollen-rest-api ---
[INFO] Compiling 5 source files to <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-rest-api/target/…>
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-rest-api/src/tes…>:[17,9] cannot find symbol
symbol: class TopiaEntityList
location: class org.chorem.pollen.rest.api.TopiaEntityArrayConverterTest
[ERROR] <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-rest-api/src/tes…>:[17,61] cannot find symbol
symbol: class TopiaEntityList
location: class org.chorem.pollen.rest.api.TopiaEntityArrayConverterTest
[INFO] 2 errors
[INFO] -------------------------------------------------------------
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[JENKINS] Archiving disabled
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Pollen ............................................ SUCCESS [ 1.590 s]
[INFO] Pollen :: VoteCounting (Api) ...................... SUCCESS [ 5.618 s]
[INFO] Pollen :: VoteCounting :: Normal .................. SUCCESS [ 1.385 s]
[INFO] Pollen :: VoteCounting :: Percentage .............. SUCCESS [ 1.250 s]
[INFO] Pollen :: VoteCounting :: Condorcet ............... SUCCESS [ 1.247 s]
[INFO] Pollen :: VoteCounting :: Number .................. SUCCESS [ 1.148 s]
[INFO] Pollen :: VoteCounting :: Borda ................... SUCCESS [ 1.198 s]
[INFO] Pollen :: VoteCounting :: Instant Runoff .......... SUCCESS [ 1.160 s]
[INFO] Pollen :: VoteCounting :: Coombs .................. SUCCESS [ 1.128 s]
[INFO] Pollen :: VoteCounting (Aggregator) ............... SUCCESS [ 0.239 s]
[INFO] Pollen :: Persistence ............................. SUCCESS [ 6.614 s]
[INFO] Pollen :: Service ................................. SUCCESS [ 6.855 s]
[INFO] Pollen :: Rest Api ................................ FAILURE [ 6.801 s]
[INFO] Pollen :: UI (CanJS) .............................. SKIPPED
[INFO] Pollen :: UI (Angular) ............................ SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 38.810 s
[INFO] Finished at: 2014-05-07T17:53:18+01:00
[INFO] Final Memory: 64M/398M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-testCompile) on project pollen-rest-api: Compilation failure: Compilation failure:
[ERROR] <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-rest-api/src/tes…>:[17,9] cannot find symbol
[ERROR] symbol: class TopiaEntityList
[ERROR] location: class org.chorem.pollen.rest.api.TopiaEntityArrayConverterTest
[ERROR] <http://ci.chorem.org/jenkins/job/pollen-ci/ws/trunk/pollen-rest-api/src/tes…>:[17,61] cannot find symbol
[ERROR] symbol: class TopiaEntityList
[ERROR] location: class org.chorem.pollen.rest.api.TopiaEntityArrayConverterTest
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-testCompile) on project pollen-rest-api: Compilation failure
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:108)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:76)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:116)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:361)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
at org.jvnet.hudson.maven3.launcher.Maven31Launcher.main(Maven31Launcher.java:132)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:330)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:238)
at jenkins.maven3.agent.Maven31Main.launch(Maven31Main.java:181)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at hudson.maven.Maven3Builder.call(Maven3Builder.java:134)
at hudson.maven.Maven3Builder.call(Maven3Builder.java:69)
at hudson.remoting.UserRequest.perform(UserRequest.java:118)
at hudson.remoting.UserRequest.perform(UserRequest.java:48)
at hudson.remoting.Request$2.run(Request.java:328)
at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.maven.plugin.compiler.CompilationFailureException: Compilation failure
at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:858)
at org.apache.maven.plugin.compiler.TestCompilerMojo.execute(TestCompilerMojo.java:152)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:133)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
... 30 more
[ERROR]
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <goals> -rf :pollen-rest-api
Sending e-mails to: pollen-commits(a)list.chorem.org chemit+chorem-ci(a)codelutin.com
channel stopped
1
2
Build failed in Jenkins: pollen-ci » Pollen :: Rest Api #41
by admin+ci-chorem.org@codelutin.com 08 May '14
by admin+ci-chorem.org@codelutin.com 08 May '14
08 May '14
See <http://ci.chorem.org/jenkins/job/pollen-ci/org.chorem.pollen$pollen-rest-ap…>
Changes:
[Tony CHEMIT] improve conversions and lots of stuff... to be continued...
------------------------------------------
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Pollen :: Rest Api 2.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/repositories/snapshots/org/debux/webm…
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti…
[INFO] Downloaded: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti… (2 KB at 1.0 KB/sec)
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/repositories/snapshots/org/debux/webm…
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti…
[INFO] Downloaded: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti… (7 KB at 9.8 KB/sec)
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/repositories/snapshots/org/debux/webm…
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti…
[INFO] Downloaded: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti… (613 B at 1.4 KB/sec)
[WARNING] The POM for org.antlr:stringtemplate:jar:3.2.1 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/repositories/snapshots/org/debux/webm…
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti…
[INFO] Downloaded: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti… (2 KB at 3.6 KB/sec)
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti…
[INFO] Downloaded: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti… (255 KB at 171.3 KB/sec)
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ pollen-rest-api ---
[INFO] Deleting <http://ci.chorem.org/jenkins/job/pollen-ci/org.chorem.pollen$pollen-rest-ap…>
[INFO]
[INFO] --- maven-enforcer-plugin:1.3.1:enforce (check-project-files) @ pollen-rest-api ---
[INFO]
[INFO] >>> i18n-maven-plugin:3.0:bundle (default) @ pollen-rest-api >>>
[INFO]
[INFO] --- i18n-maven-plugin:3.0:collect-i18n-artifacts (collect-i18n-artifacts) @ pollen-rest-api ---
[WARNING] Invalid POM for org.antlr:stringtemplate:jar:3.2.1, transitive dependencies (if any) will not be available, enable debug logging for more details
[INFO] Downloading: https://oss.sonatype.org/content/repositories/snapshots/org/debux/webmotion…
[INFO] Downloaded: https://oss.sonatype.org/content/repositories/snapshots/org/debux/webmotion… (2 KB at 1.3 KB/sec)
[INFO] Downloading: https://oss.sonatype.org/content/repositories/snapshots/org/debux/webmotion…
[INFO] Downloaded: https://oss.sonatype.org/content/repositories/snapshots/org/debux/webmotion… (613 B at 1.6 KB/sec)
[INFO] collected 2 i18n artifacts for locale fr_FR stored in <http://ci.chorem.org/jenkins/job/pollen-ci/org.chorem.pollen$pollen-rest-ap…>
[INFO] collected 2 i18n artifacts for locale en_GB stored in <http://ci.chorem.org/jenkins/job/pollen-ci/org.chorem.pollen$pollen-rest-ap…>
[INFO]
[INFO] <<< i18n-maven-plugin:3.0:bundle (default) @ pollen-rest-api <<<
[INFO]
[INFO] --- i18n-maven-plugin:3.0:bundle (default) @ pollen-rest-api ---
[WARNING] bundle fr_FR contains 6/70 empty entries! (use -Di18n.showEmpty to see these entries)
[WARNING] bundle en_GB contains 6/70 empty entries! (use -Di18n.showEmpty to see these entries)
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ pollen-rest-api ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ pollen-rest-api ---
[INFO] Compiling 20 source files to <http://ci.chorem.org/jenkins/job/pollen-ci/org.chorem.pollen$pollen-rest-ap…>
[WARNING] <http://ci.chorem.org/jenkins/job/pollen-ci/org.chorem.pollen$pollen-rest-ap…>:[304,35] getNullValue(java.lang.Class<?>) in org.nuiton.util.ObjectUtil has been deprecated
[WARNING] <http://ci.chorem.org/jenkins/job/pollen-ci/org.chorem.pollen$pollen-rest-ap…>: Some input files use unchecked or unsafe operations.
[WARNING] <http://ci.chorem.org/jenkins/job/pollen-ci/org.chorem.pollen$pollen-rest-ap…>: Recompile with -Xlint:unchecked for details.
[INFO]
[INFO] --- maven-antrun-plugin:1.7:run (generate-surefire-workdir) @ pollen-rest-api ---
[INFO] Executing tasks
main:
[mkdir] Created dir: <http://ci.chorem.org/jenkins/job/pollen-ci/org.chorem.pollen$pollen-rest-ap…>
[INFO] Executed tasks
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ pollen-rest-api ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ pollen-rest-api ---
[INFO] Compiling 5 source files to <http://ci.chorem.org/jenkins/job/pollen-ci/org.chorem.pollen$pollen-rest-ap…>
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] <http://ci.chorem.org/jenkins/job/pollen-ci/org.chorem.pollen$pollen-rest-ap…>:[17,9] cannot find symbol
symbol: class TopiaEntityList
location: class org.chorem.pollen.rest.api.TopiaEntityArrayConverterTest
[ERROR] <http://ci.chorem.org/jenkins/job/pollen-ci/org.chorem.pollen$pollen-rest-ap…>:[17,61] cannot find symbol
symbol: class TopiaEntityList
location: class org.chorem.pollen.rest.api.TopiaEntityArrayConverterTest
[INFO] 2 errors
[INFO] -------------------------------------------------------------
[JENKINS] Archiving disabled
1
2
r3922 - trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api
by tchemit@users.chorem.org 08 May '14
by tchemit@users.chorem.org 08 May '14
08 May '14
Author: tchemit
Date: 2014-05-08 09:34:51 +0200 (Thu, 08 May 2014)
New Revision: 3922
Url: http://forge.chorem.org/projects/pollen/repository/revisions/3922
Log:
fix converter test
Modified:
trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java
Modified: trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java
===================================================================
--- trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java 2014-05-07 16:20:20 UTC (rev 3921)
+++ trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java 2014-05-08 07:34:51 UTC (rev 3922)
@@ -1,6 +1,7 @@
package org.chorem.pollen.rest.api;
import org.chorem.pollen.persistence.entity.Choice;
+import org.chorem.pollen.persistence.entity.ChoiceType;
import org.junit.Assert;
import org.junit.Test;
@@ -9,15 +10,24 @@
@Test
public void convertToType() throws Exception {
- String choicesStr = "[ {name: \"choice1\", choiceType: \"TEXT\"}, " +
- "{name: \"choice2\", choiceType: \"IMAGE\"} ]";
+ String choicesStr = "[ {name: \"choice1\", choiceType: \"TEXT\", choiceOrder: 1}, " +
+ "{name: \"choice2\", choiceType: \"IMAGE\", choiceOrder: 2} ]";
TopiaEntityArrayConverter converter = TopiaEntityArrayConverter.newconverter(Choice.class);
- TopiaEntityList<Choice> choices = converter.convert(TopiaEntityList.class, choicesStr);
+ Choice[] choices = converter.convert(Choice[].class, choicesStr);
Assert.assertNotNull(choices);
- Assert.assertEquals(2, choices.size());
+ Assert.assertEquals(2, choices.length);
+ Assert.assertNotNull(choices[0]);
+ Assert.assertEquals("choice1", choices[0].getName());
+ Assert.assertEquals(ChoiceType.TEXT, choices[0].getChoiceType());
+ Assert.assertEquals(1, choices[0].getChoiceOrder());
+ Assert.assertNotNull(choices[1]);
+ Assert.assertEquals("choice2", choices[1].getName());
+ Assert.assertEquals(ChoiceType.IMAGE, choices[1].getChoiceType());
+ Assert.assertEquals(2, choices[1].getChoiceOrder());
+
}
}
\ No newline at end of file
1
0
Build failed in Jenkins: pollen-nightly » Pollen :: Rest Api #21
by admin+ci-chorem.org@codelutin.com 07 May '14
by admin+ci-chorem.org@codelutin.com 07 May '14
07 May '14
See <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
Changes:
[Tony CHEMIT] improve conversions and lots of stuff... to be continued...
[Tony CHEMIT] fix json serialization
[Tony CHEMIT] - receive object as json
- change from gson to jackson since gson can only deal with field accessors :(
- clean deps
------------------------------------------
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Pollen :: Rest Api 2.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti…
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/repositories/snapshots/org/debux/webm…
[INFO] Downloaded: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti… (2 KB at 1.0 KB/sec)
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti…
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/repositories/snapshots/org/debux/webm…
[INFO] Downloaded: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti… (613 B at 1.2 KB/sec)
[WARNING] The POM for org.antlr:stringtemplate:jar:3.2.1 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/repositories/snapshots/org/debux/webm…
[INFO] Downloading: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti…
[INFO] Downloaded: http://nexus.nuiton.org/nexus/content/groups/pollen-group/org/debux/webmoti… (2 KB at 1.3 KB/sec)
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ pollen-rest-api ---
[INFO] Deleting <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO]
[INFO] --- maven-enforcer-plugin:1.3.1:enforce (ensure-no-container-api) @ pollen-rest-api ---
[INFO]
[INFO] --- maven-enforcer-plugin:1.3.1:enforce (check-project-files) @ pollen-rest-api ---
[INFO]
[INFO] --- helper-maven-plugin:2.1:share-server-secret (get-redmine-login) @ pollen-rest-api ---
[INFO] Exporting server [redmine-forge.chorem.org] privateKey in ${redmine.apiKey}
[INFO]
[INFO] --- license-maven-plugin:1.6:update-project-license (attach-licenses) @ pollen-rest-api ---
[INFO] Will create or update license file [agpl_v3] to <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO]
[INFO] --- license-maven-plugin:1.6:add-third-party (attach-licenses) @ pollen-rest-api ---
[WARNING] Unable to obtain POM for artifact : org.antlr:stringtemplate:jar:3.2.1:compile
org.apache.maven.project.InvalidProjectModelException: 1 problem was encountered while building the effective model
[FATAL] Non-readable POM /var/local/forge/data/chorem.org/maven/repository/org/antlr/stringtemplate/3.2.1/stringtemplate-3.2.1.pom: input contained no data @
for project for project
at org.apache.maven.project.DefaultMavenProjectBuilder.transformError(DefaultMavenProjectBuilder.java:193)
at org.apache.maven.project.DefaultMavenProjectBuilder.buildFromRepository(DefaultMavenProjectBuilder.java:240)
at org.apache.maven.project.DefaultMavenProjectBuilder.buildFromRepository(DefaultMavenProjectBuilder.java:251)
at org.codehaus.mojo.license.api.DefaultDependenciesTool.loadProjectDependencies(DefaultDependenciesTool.java:206)
at org.codehaus.mojo.license.api.DefaultThirdPartyHelper.loadDependencies(DefaultThirdPartyHelper.java:152)
at org.codehaus.mojo.license.AddThirdPartyMojo.loadDependencies(AddThirdPartyMojo.java:288)
at org.codehaus.mojo.license.AbstractAddThirdPartyMojo.init(AbstractAddThirdPartyMojo.java:386)
at org.codehaus.mojo.license.AbstractLicenseMojo.execute(AbstractLicenseMojo.java:174)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:133)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:108)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:76)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:116)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:361)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
at org.jvnet.hudson.maven3.launcher.Maven31Launcher.main(Maven31Launcher.java:132)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:330)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:238)
at jenkins.maven3.agent.Maven31Main.launch(Maven31Main.java:181)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at hudson.maven.Maven3Builder.call(Maven3Builder.java:134)
at hudson.maven.Maven3Builder.call(Maven3Builder.java:69)
at hudson.remoting.UserRequest.perform(UserRequest.java:118)
at hudson.remoting.UserRequest.perform(UserRequest.java:48)
at hudson.remoting.Request$2.run(Request.java:328)
at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
[INFO] Load missing file <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] Missing file <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…> is up-to-date.
[INFO] Writing third-party file to <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] Will attach third party file from <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO]
[INFO] >>> i18n-maven-plugin:3.0:bundle (default) @ pollen-rest-api >>>
[INFO]
[INFO] --- i18n-maven-plugin:3.0:collect-i18n-artifacts (collect-i18n-artifacts) @ pollen-rest-api ---
[WARNING] Invalid POM for org.antlr:stringtemplate:jar:3.2.1, transitive dependencies (if any) will not be available, enable debug logging for more details
[INFO] Downloading: https://oss.sonatype.org/content/repositories/snapshots/org/debux/webmotion…
[INFO] Downloaded: https://oss.sonatype.org/content/repositories/snapshots/org/debux/webmotion… (2 KB at 1.1 KB/sec)
[INFO] Downloading: https://oss.sonatype.org/content/repositories/snapshots/org/debux/webmotion…
[INFO] Downloaded: https://oss.sonatype.org/content/repositories/snapshots/org/debux/webmotion… (613 B at 1.9 KB/sec)
[INFO] collected 2 i18n artifacts for locale fr_FR stored in <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] collected 2 i18n artifacts for locale en_GB stored in <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO]
[INFO] <<< i18n-maven-plugin:3.0:bundle (default) @ pollen-rest-api <<<
[INFO]
[INFO] --- i18n-maven-plugin:3.0:bundle (default) @ pollen-rest-api ---
[WARNING] bundle fr_FR contains 6/70 empty entries! (use -Di18n.showEmpty to see these entries)
[WARNING] bundle en_GB contains 6/70 empty entries! (use -Di18n.showEmpty to see these entries)
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ pollen-rest-api ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] Copying 2 resources
[INFO] Copying 3 resources
[INFO]
[INFO] --- license-maven-plugin:1.6:update-file-header (update-file-header) @ pollen-rest-api ---
[INFO] Will search files to update from root <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] Will search files to update from root <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] - adding license header on file <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] - adding license header on file <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] - adding license header on file <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] - adding license header on file <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] - adding license header on file <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] - adding license header on file <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] - adding license header on file <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] - adding license header on file <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] Scan 34 files header done in 181.982ms.
[INFO]
* uptodate header on 26 files.
* add header on 8 files.
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ pollen-rest-api ---
[INFO] Compiling 20 source files to <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[WARNING] <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>:[304,35] getNullValue(java.lang.Class<?>) in org.nuiton.util.ObjectUtil has been deprecated
[WARNING] <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>: Some input files use unchecked or unsafe operations.
[WARNING] <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>: Recompile with -Xlint:unchecked for details.
[INFO]
[INFO] --- animal-sniffer-maven-plugin:1.10:check (default) @ pollen-rest-api ---
[INFO] Checking unresolved references to org.codehaus.mojo.signature:java17:1.0
[INFO]
[INFO] --- jredmine-maven-plugin:1.8.1:generate-changes (jredmine-generate-changes) @ pollen-rest-api ---
[INFO] Skipping goal (skipGenerateChanges flag is on).
[INFO]
[INFO] --- maven-antrun-plugin:1.7:run (generate-surefire-workdir) @ pollen-rest-api ---
[INFO] Executing tasks
main:
[mkdir] Created dir: <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] Executed tasks
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ pollen-rest-api ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ pollen-rest-api ---
[INFO] Compiling 5 source files to <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>:[38,9] cannot find symbol
symbol: class TopiaEntityList
location: class org.chorem.pollen.rest.api.TopiaEntityArrayConverterTest
[ERROR] <http://ci.chorem.org/jenkins/job/pollen-nightly/org.chorem.pollen$pollen-re…>:[38,61] cannot find symbol
symbol: class TopiaEntityList
location: class org.chorem.pollen.rest.api.TopiaEntityArrayConverterTest
[INFO] 2 errors
[INFO] -------------------------------------------------------------
[JENKINS] Archiving disabled
1
0
r3921 - in trunk/pollen-ui-angular/src/main/webapp: js js/controllers partials
by garandel@users.chorem.org 07 May '14
by garandel@users.chorem.org 07 May '14
07 May '14
Author: garandel
Date: 2014-05-07 18:20:20 +0200 (Wed, 07 May 2014)
New Revision: 3921
Url: http://forge.chorem.org/projects/pollen/repository/revisions/3921
Log:
separate element of model in $scope.data
Modified:
trunk/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js
trunk/pollen-ui-angular/src/main/webapp/js/services.js
trunk/pollen-ui-angular/src/main/webapp/partials/inline-poll.html
trunk/pollen-ui-angular/src/main/webapp/partials/poll-list.html
trunk/pollen-ui-angular/src/main/webapp/partials/poll.html
Modified: trunk/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js
===================================================================
--- trunk/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js 2014-05-07 15:49:33 UTC (rev 3920)
+++ trunk/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js 2014-05-07 16:20:20 UTC (rev 3921)
@@ -31,25 +31,26 @@
}, 5000);
});
- $scope.poll = {};
+ $scope.data = {};
+ $scope.data.poll = {};
$scope.toHTML = function (data) {
return $sce.trustAsHtml(data);
}
$scope.inlineVersion = function () {
- $scope.poll.template = 'inline';
+ $scope.data.poll.template = 'inline';
$scope.templateURL = './partials/inline-poll.html';
}
$scope.bigVersion = function () {
- $scope.poll.template = 'big';
+ $scope.data.poll.template = 'big';
$scope.templateURL = './partials/big-poll.html';
}
var initTemplateURL = function () {
- if (angular.isDefined($scope.poll.template)) {
- if ($scope.poll.template == "big") {
+ if (angular.isDefined($scope.data.poll.template)) {
+ if ($scope.data.poll.template == "big") {
$scope.bigVersion();
}
else {
@@ -78,7 +79,7 @@
$scope.globalVariables.editMode = true;
$scope.globalVariables.create = true;
- $scope.globalVariables.voted = angular.isDefined($scope.poll.votants);
+ $scope.globalVariables.voted = angular.isDefined($scope.data.votants);
$scope.globalVariables.lastType = 'TEXT';
$scope.globalVariables.lastDate = new Date();
@@ -88,8 +89,8 @@
});
$scope.addChoice = function () {
- var index = $scope.poll.choice.push(initChoice());
- var choice = $scope.poll.choice[index-1];
+ var index = $scope.data.choices.push(initChoice());
+ var choice = $scope.data.choices[index-1];
popupChoice(choice, 'Add Choice');
}
@@ -97,10 +98,10 @@
popupChoice(choice, 'Edit Choice');
}
- var deleteChoice = function (ch) {
- var index = $scope.poll.choice.indexOf(ch);
+ var deleteChoice = function (choice) {
+ var index = $scope.data.choices.indexOf(choice);
if (index > -1) {
- $scope.poll.choice.splice(index,1);
+ $scope.data.choices.splice(index,1);
}
}
@@ -110,12 +111,12 @@
controller : PollPopChoiceCtrl,
resolve : {
title : function () { return title;},
- choice : function () { return choice; }
+ choice : function () { return choice;}
}
});
- modalInstance.result.then(function (ch) {
- deleteChoice(ch);
+ modalInstance.result.then(function (choice) {
+ deleteChoice(choice);
}, function () {
$scope.globalVariables.lastType = choice.choiceType;
$scope.globalVariables.lastDate = choice.date;
@@ -128,7 +129,7 @@
controller : PollPopupSettingsCtrl,
size : 'lg',
resolve : { poll: function () {
- return $scope.poll;
+ return $scope.data.poll;
}
}
});
@@ -158,43 +159,41 @@
}
var PollPopupSettingsCtrl = function ($scope, $filter, $modalInstance, poll) {
- $scope.poll = poll;
- $scope.toDay = new Date();
+ $scope.data.poll = poll;
+ $scope.data.toDay = new Date();
- $scope.$watch('poll.beginDate', function() {
- if (poll.beginChoiceDate) {
- if (poll.beginChoiceDate < poll.beginDate) {
- poll.beginChoiceDate = poll.beginDate;
+ $scope.$watch('data.poll.beginDate', function() {
+ if (data.poll.beginChoiceDate) {
+ if (data.poll.beginChoiceDate < data.poll.beginDate) {
+ data.poll.beginChoiceDate = data.poll.beginDate;
}
}
else {
- poll.beginChoiceDate = poll.beginDate;
+ data.poll.beginChoiceDate = data.poll.beginDate;
}
});
- $scope.$watch('poll.endDate', function() {
- if (poll.endChoiceDate) {
- if (poll.endChoiceDate > poll.endDate) {
- poll.endChoiceDate = poll.endDate;
+ $scope.$watch('data.poll.endDate', function() {
+ if (data.poll.endChoiceDate) {
+ if (data.poll.endChoiceDate > data.poll.endDate) {
+ data.poll.endChoiceDate = data.poll.endDate;
}
}
- /*
else {
- poll.endChoiceDate = poll.endDate;
+ data.poll.endChoiceDate = data.poll.endDate;
}
- */
});
if (!angular.isDefined($scope.poll.continuousResults)) {
- $scope.poll.continuousResults = false;
+ $scope.data.poll.continuousResults = false;
}
if (!angular.isDefined($scope.poll.resultVisibility)) {
- $scope.poll.resultVisibility = 'EVERYBODY';
+ $scope.data.poll.resultVisibility = 'EVERYBODY';
}
if (!angular.isDefined($scope.poll.choiceAddAllowed)) {
- $scope.poll.choiceAddAllowed = false;
+ $scope.data.poll.choiceAddAllowed = false;
}
$scope.close = function () {
@@ -213,22 +212,33 @@
}])
-.controller('PollCreateCtrl', ['$scope', '$controller', 'Poll', '$http', function ($scope, $controller, Poll, $http) {
+.controller('PollCreateCtrl', ['$scope', '$controller', '$location', 'Poll', function ($scope, $controller, $location, Poll) {
$controller('PollAdminCtrl', {$scope:$scope});
var initPoll = function () {
- Poll.get({cmd:'new'}).$promise.then(function (poll) {
- $scope.poll = poll;
- $scope.poll.choice = [];
- $scope.vote = {};
- $scope.vote.choice = $scope.poll.choice;
- })
+ Poll.get({cmd:'new'}, function (poll) {
+ $scope.data.poll = poll;
+ $scope.data.choices = [];
+ $scope.data.vote = {};
+ $scope.data.vote.choices = $scope.data.choices;
+ $scope.restRequest = poll;
+ });
}
initPoll();
$scope.save = function () {
if ($scope.formValid) {
- $scope.poll.$add();
+ var poll = angular.copy($scope.data.poll);
+ poll.choice = angular.copy($scope.data.choices);
+ Poll.add(poll, function (data) {
+ $scope.globalVariables.saved = true;
+ $scope.globalVariables.restError = false;
+ $location.path('/poll/edit/'+data.topiaId);
+ }, function (error) {
+ $scope.globalVariables.restError = true;
+ $scope.restError = error;
+ }
+ );
}
else {
$scope.globalVariables.errorForm = true;
@@ -236,7 +246,7 @@
}
$scope.delete = function () {
- $scope.poll = initPoll();
+ $scope.data.poll = initPoll();
}
}])
@@ -246,19 +256,19 @@
var initPoll = function () {
Poll.get({pollId:$routeParams.pollId}).$promise.then(function (poll) {
- $scope.poll = poll;
- PollChoice.query({pollId:$routeParams.pollId}).$promise.then(function (choices) {
- $scope.poll.choice = choices;
- $scope.vote = {};
- $scope.vote.choice = $scope.poll.choice;
- });
+ $scope.data.poll = poll;
});
+ PollChoice.query({pollId:$routeParams.pollId}).$promise.then(function (choices) {
+ $scope.data.choices = choices;
+ $scope.data.vote = {};
+ $scope.data.vote.choices = $scope.data.choices;
+ });
}
initPoll();
$scope.save = function () {
if ($scope.formValid) {
- $scope.poll.$update(function () {
+ $scope.data.poll.$update({permission:$scope.data.poll.creator.permission.token}, function () {
$scope.globalVariables.saved = true;
});
}
@@ -269,53 +279,56 @@
}
$scope.delete = function () {
- $scope.poll.$delete();
- $location.path('/');
+ $scope.data.poll.$delete({permission:$scope.data.poll.creator.permission.token}, function() {
+ $location.path('/');
+ });
}
}])
.controller('PollVoteCtrl', ['$scope', '$filter', '$controller', '$routeParams', 'Poll', 'PollChoice', function ($scope, $filter, $controller, $routeParams, Poll, PollChoice) {
$controller('PollCtrl', {$scope:$scope});
- Poll.get({pollId:$routeParams.pollId}).$promise.then(function (poll) {
- $scope.poll = poll;
- PollChoice.query({pollId:$routeParams.pollId}).$promise.then(function (choices) {
- $scope.poll.choice = choices;
- $scope.vote = {};
- $scope.vote.choice = $scope.poll.choice;
+ var initPoll = function () {
+ Poll.get({pollId:$routeParams.pollId}).$promise.then(function (poll) {
+ $scope.data.poll = poll;
});
- });
+ PollChoice.query({pollId:$routeParams.pollId}, function (choices) {
+ $scope.data.choices = choices;
+ initVote();
+ });
+ }
+ initPoll();
$scope.globalVariables.editMode = false;
- $scope.$watch('vote.name', function (newVal) {
+ $scope.$watch('data.vote.name', function (newVal) {
if (newVal != '') {
$scope.globalVariables.errorForm = false;
}
});
var initVote = function () {
- $scope.vote = {};
- $scope.vote.name = "";
- $scope.vote.choice = [];
- for (var i = 0; i < $scope.poll.choice.length; ++i) {
- if ($scope.poll.choice[i].choiceType == 'TEXT') {
- $scope.vote.choice.push({name:$scope.poll.choice[i].name, value:false});
+ $scope.data.vote = {};
+ $scope.data.vote.name = "";
+ $scope.data.vote.choices = [];
+ for (var i = 0; i < $scope.data.choices.length; ++i) {
+ if ($scope.data.choices[i].choiceType == 'TEXT') {
+ $scope.data.vote.choices.push({name:$scope.data.choices[i].name, value:false});
}
- else if ($scope.poll.choice[i].choiceType == 'DATE') {
- $scope.vote.choice.push({name: $scope.poll.choice[i].date , value:false});
+ else if ($scope.poll.choices[i].choiceType == 'DATE') {
+ $scope.data.choices.push({name: $scope.data.choices[i].date , value:false});
}
}
}
$scope.voter = function () {
- if ($scope.vote.name != '') {
+ if ($scope.data.vote.name != '') {
var data = {};
- data.name = $scope.vote.name;
- data.choice = angular.copy($scope.vote.choice);
- if (!angular.isDefined($scope.poll.votants)) {
- $scope.poll.votants = [];
+ data.name = $scope.data.vote.name;
+ data.choices = angular.copy($scope.data.vote.choices);
+ if (!angular.isDefined($scope.data.votants)) {
+ $scope.data.votants = [];
}
- $scope.poll.votants.push(data);
+ $scope.data.votants.push(data);
// save vote
@@ -332,7 +345,7 @@
.controller('PollListCtrl', ['$scope', '$controller', 'Poll', function ($scope, $controller, Poll) {
$controller('PollCtrl', {$scope:$scope});
- $scope.polls = Poll.query();
+ $scope.data.polls = Poll.query();
}])
Modified: trunk/pollen-ui-angular/src/main/webapp/js/services.js
===================================================================
--- trunk/pollen-ui-angular/src/main/webapp/js/services.js 2014-05-07 15:49:33 UTC (rev 3920)
+++ trunk/pollen-ui-angular/src/main/webapp/js/services.js 2014-05-07 16:20:20 UTC (rev 3921)
@@ -21,6 +21,7 @@
angular.module('pollenServices', ['ngResource'])
.factory('BaseUrl', function() {
+
return 'http://localhost\\:8080/pollen-rest-api/v1';
})
@@ -41,15 +42,35 @@
transformRequest : function (data, headersGetter) {
return transformParam(data);
}
+ },
+ 'delete' : {
+ method : 'DELETE'
}
});
}])
.factory('PollChoice', ['$resource', 'BaseUrl', function ($resource, BaseUrl) {
+
+ var transformParam = function (data) {
+ var obj = angular.copy(data);
+ return 'choices='+JSON.stringify(obj);
+ };
+
return $resource(BaseUrl+'/polls/:pollId/choices/:choiceId', {choiceId : '@topiaId'},
{
- 'add' : { method:'POST'},
- 'update' : {method:'PUT'}
+ 'add' : {
+ method:'POST',
+ transformRequest : function (data, headersGetter) {
+ return transformParam(data);
+ }
+ },
+ 'update' :
+ {
+ method:'PUT',
+ transformRequest : function (data, headersGetter) {
+ return transformParam(data);
+ }
+ }
}
);
}])
\ No newline at end of file
Modified: trunk/pollen-ui-angular/src/main/webapp/partials/inline-poll.html
===================================================================
--- trunk/pollen-ui-angular/src/main/webapp/partials/inline-poll.html 2014-05-07 15:49:33 UTC (rev 3920)
+++ trunk/pollen-ui-angular/src/main/webapp/partials/inline-poll.html 2014-05-07 16:20:20 UTC (rev 3921)
@@ -25,7 +25,7 @@
<!-- begin print choices -->
<tr>
<td><button ng-if="globalVariables.editMode" ng-click="bigVersion()" class="btn btn-default" >Big version</button></td>
- <td ng-repeat="choice in poll.choice" class="pollChoice pollAnim" ng-mouseenter="showEditHover = true" ng-mouseleave="showEditHover = false">
+ <td ng-repeat="choice in data.choices" class="pollChoice pollAnim" ng-mouseenter="showEditHover = true" ng-mouseleave="showEditHover = false">
<div ng-if="choice.choiceType == 'TEXT'" edit-me="showEdit" >
<div ng-hide="showEdit && !globalVariables.voted" class="fixe-input" title="{{choice.description}}">{{choice.name}} <input type="button" class="btn btn-default" ng-if="!globalVariables.voted && globalVariables.editMode" ng-show="showEditHover" ng-click="editChoice(choice)" value="..."/></div>
<div ng-show="showEdit && !globalVariables.voted">
@@ -47,8 +47,8 @@
<!-- begin input vote -->
<tr>
- <td class="pollChoice"> <input type="text" class="form-control" placeholder="votre nom" ng-model="vote.name" /> </td>
- <td ng-repeat="choice in vote.choice" class="pollChoice">
+ <td class="pollChoice"> <input type="text" class="form-control" placeholder="votre nom" ng-model="data.vote.name" /> </td>
+ <td ng-repeat="choice in data.vote.choices" class="pollChoice">
<input type="checkbox" name="$index" ng-model="choice.value"/>
</td>
<td>
@@ -58,9 +58,9 @@
<!-- end input vote -->
<!-- begin print vote -->
- <tr ng-repeat="vote in poll.votants track by $index" class="pollAnim">
+ <tr ng-repeat="vote in data.votants track by $index" class="pollAnim">
<td class="pollChoice"> {{vote.name}}</td>
- <td ng-repeat="choice in vote.choice" class="pollChoice">
+ <td ng-repeat="choice in vote.choices" class="pollChoice">
<input type="checkbox" ng-model="choice.value" disabled/>
</td>
</tr>
Modified: trunk/pollen-ui-angular/src/main/webapp/partials/poll-list.html
===================================================================
--- trunk/pollen-ui-angular/src/main/webapp/partials/poll-list.html 2014-05-07 15:49:33 UTC (rev 3920)
+++ trunk/pollen-ui-angular/src/main/webapp/partials/poll-list.html 2014-05-07 16:20:20 UTC (rev 3921)
@@ -1,5 +1,5 @@
-<div ng-repeat="poll in polls">
+<div ng-repeat="poll in data.polls">
<h2><a href="#/poll/vote/{{poll.topiaId}}">{{poll.title}}</a> <a href="#/poll/edit/{{poll.topiaId}}"><i class="glyphicon glyphicon-pencil"></i></a></h2>
<p ng-bind-html="toHTML(poll.description)"></p>
<hr/>
Modified: trunk/pollen-ui-angular/src/main/webapp/partials/poll.html
===================================================================
--- trunk/pollen-ui-angular/src/main/webapp/partials/poll.html 2014-05-07 15:49:33 UTC (rev 3920)
+++ trunk/pollen-ui-angular/src/main/webapp/partials/poll.html 2014-05-07 16:20:20 UTC (rev 3921)
@@ -22,6 +22,7 @@
<form class="form-inline" name="pollForm" novalidate>
<alert type="danger" ng-if="globalVariables.errorForm"> Champ non remplie </alert>
+ <alert type="danger" ng-if="globalVariables.restError"> {{restError}} </alert>
<alert type="success" ng-if="globalVariables.editMode && globalVariables.saved"> Sondage sauvegardé..</alert>
<alert type="success" ng-if="!globalVariables.editMode && globalVariables.saved"> Vote effectué..</alert>
@@ -29,16 +30,16 @@
<alert type="warning" ng-if="globalVariables.created"> <a href="#/poll/edit/{{pollId}}"> Edition du sondage </a>.. </alert>
<div class="pollTitle" edit-me="showEditTitle">
- <h1 ng-hide="showEditTitle"> {{poll.title || 'Click Me for Editing'}} </h1>
+ <h1 ng-hide="showEditTitle"> {{data.poll.title || 'Click Me for Editing'}} </h1>
- <h1 ng-show="showEditTitle"><input type="text" class="form-control" focus-me="showEditTitle" ng-model="poll.title" ng-exit="showEditTitle = false" required/></h1>
+ <h1 ng-show="showEditTitle"><input type="text" class="form-control" focus-me="showEditTitle" ng-model="data.poll.title" ng-exit="showEditTitle = false" required/></h1>
</div>
<div ng-hide="showEditDesc || !globalVariables.editMode && !poll.description " class="pollDesc" edit-me="showEditDesc">
- <div ng-bind-html="toHTML(poll.description || 'Description (Facultatif). Ce cadre disparait si aucune description n\'est mise')"></div>
+ <div ng-bind-html="toHTML(data.poll.description || 'Description (Facultatif). Ce cadre disparait si aucune description n\'est mise')"></div>
</div>
<div ng-show="showEditDesc" class="pollDesc " ng-exit="showEditDesc = false;">
- <textarea id="descEditor" data-ck-editor ng-model="poll.description"></textarea>
+ <textarea id="descEditor" data-ck-editor ng-model="data.poll.description"></textarea>
<input type="button" value="Return" class="btn btn-primary" ng-click="showEditDesc = false;"/>
</div>
1
0
Author: tchemit
Date: 2014-05-07 17:49:33 +0200 (Wed, 07 May 2014)
New Revision: 3920
Url: http://forge.chorem.org/projects/pollen/repository/revisions/3920
Log:
improve conversions and lots of stuff... to be continued...
Added:
trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java
trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java
trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java
Modified:
trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollTopiaDao.java
trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/Polls.java
trunk/pollen-persistence/src/main/xmi/pollen.zargo
trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/Jsons.java
trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java
trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityConverter.java
trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java
trunk/pollen-rest-api/src/main/resources/mapping
trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java
trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityConverterTest.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ChoiceService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/CommentService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java
trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java
trunk/pollen-services/src/main/resources/fixtures.yaml
trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java
Added: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java
===================================================================
--- trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java (rev 0)
+++ trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -0,0 +1,17 @@
+package org.chorem.pollen.persistence.entity;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+public class ChoiceTopiaDao extends AbstractChoiceTopiaDao<Choice> {
+
+ public List<Choice> findAll(Poll poll) {
+
+ List<Choice> choices = forPollEquals(poll).
+ setOrderByArguments(Choice.PROPERTY_CHOICE_ORDER).
+ findAll();
+ return ImmutableList.copyOf(choices);
+
+ }
+}
Property changes on: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/ChoiceTopiaDao.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:eol-style
+ native
Modified: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollTopiaDao.java
===================================================================
--- trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollTopiaDao.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollTopiaDao.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -26,6 +26,7 @@
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
+import java.util.List;
import java.util.Set;
/**
@@ -51,7 +52,52 @@
public Set<Poll> findAllFreePolls() {
- return ImmutableSet.copyOf(forPollTypeEquals(PollType.FREE).findAll());
+ List<Poll> polls = forPollTypeEquals(PollType.FREE).findAll();
+ return ImmutableSet.copyOf(polls);
}
+
+ @Override
+ public void delete(Poll entity) {
+
+
+ { // --- remove choices --- //
+
+ ChoiceTopiaDao dao = topiaDaoSupplier
+ .getDao(Choice.class, ChoiceTopiaDao.class);
+ List<Choice> list = dao.forPollEquals(entity).findAll();
+ dao.deleteAll(list);
+
+ }
+
+ { // --- remove votes --- //
+
+ VoteTopiaDao dao = topiaDaoSupplier
+ .getDao(Vote.class, VoteTopiaDao.class);
+ List<Vote> list = dao.forPollEquals(entity).findAll();
+ dao.deleteAll(list);
+
+ }
+
+ { // --- remove comments -- //
+
+ CommentTopiaDao dao = topiaDaoSupplier
+ .getDao(Comment.class, CommentTopiaDao.class);
+ List<Comment> list = dao.forPollEquals(entity).findAll();
+ dao.deleteAll(list);
+
+ }
+
+ { // --- remove voterLists --- //
+
+ VoterListTopiaDao dao = topiaDaoSupplier
+ .getDao(VoterList.class, VoterListTopiaDao.class);
+ List<VoterList> list = dao.forPollEquals(entity).findAll();
+ dao.deleteAll(list);
+
+ }
+
+ super.delete(entity);
+
+ }
}
Modified: trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/Polls.java
===================================================================
--- trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/Polls.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/Polls.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -23,11 +23,8 @@
* #L%
*/
-import com.google.common.collect.Sets;
-
import java.util.Date;
import java.util.Objects;
-import java.util.Set;
/**
* TODO
@@ -85,16 +82,16 @@
(endChoiceDate != null && endChoiceDate.before(currentDate));
}
- public static Set<VoterListMember> getAllVoters(Poll poll) {
- Set<VoterListMember> result = Sets.newHashSet();
- if (poll.isVoterListNotEmpty()) {
- for (VoterList list : poll.getVoterList()) {
-
- if (!list.isMemberEmpty()) {
- result.addAll(list.getMember());
- }
- }
- }
- return result;
- }
+// public static Set<VoterListMember> getAllVoters(Poll poll) {
+// Set<VoterListMember> result = Sets.newHashSet();
+// if (poll.isVoterListNotEmpty()) {
+// for (VoterList list : poll.getVoterList()) {
+//
+// if (!list.isMemberEmpty()) {
+// result.addAll(list.getMember());
+// }
+// }
+// }
+// return result;
+// }
}
Modified: trunk/pollen-persistence/src/main/xmi/pollen.zargo
===================================================================
(Binary files differ)
Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/Jsons.java
===================================================================
--- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/Jsons.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/Jsons.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -1,6 +1,7 @@
package org.chorem.pollen.rest.api;
import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
@@ -45,4 +46,10 @@
}
+ public static String entitiesToString(Object o) throws JsonProcessingException {
+
+ return newEntityMapper().writeValueAsString(o);
+
+ }
+
}
Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java
===================================================================
--- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -48,30 +48,14 @@
// --- init converters --- //
-// serverContext.addConverter(new Converter() {
-// @Override
-// public Object convert(Class type, Object value) {
-// Object result = null;
-// if (value != null) {
-// if (value.getClass().isAssignableFrom(Date.class)) {
-// result = value;
-// } else {
-// Object o = ((Object[]) value)[0];
-// String sTime = o.toString();
-// Long time = Long.parseLong(sTime);
-// result = new Date(time);
-// }
-// }
-// return result;
-// }
-//
-// }, Date.class);
-
for (Class<? extends TopiaEntity> entityClass : PollenEntityEnum.getContractClasses()) {
TopiaEntityConverter<? extends TopiaEntity> converter = TopiaEntityConverter.newconverter(entityClass);
serverContext.addConverter(converter, entityClass);
+ TopiaEntityArrayConverter<? extends TopiaEntity> arrayConverter = TopiaEntityArrayConverter.newconverter(entityClass);
+ serverContext.addConverter(arrayConverter, arrayConverter.getDefaultType());
+
}
// --- init injectors --- //
Added: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java
===================================================================
--- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java (rev 0)
+++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -0,0 +1,67 @@
+package org.chorem.pollen.rest.api;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.beanutils.converters.AbstractConverter;
+import org.chorem.pollen.services.PollenTechnicalException;
+import org.nuiton.topia.persistence.TopiaEntity;
+
+import java.io.IOException;
+import java.lang.reflect.Array;
+
+/**
+ * Created on 5/7/14.
+ *
+ * @author Tony Chemit <chemit(a)codelutin.com>
+ * @since 2.0
+ */
+public class TopiaEntityArrayConverter<E extends TopiaEntity> extends AbstractConverter {
+
+ protected final Class<E[]> type;
+
+ protected final ObjectMapper mapper;
+
+
+ public static <E extends TopiaEntity> TopiaEntityArrayConverter<E> newconverter(Class<E> entityType) {
+ return new TopiaEntityArrayConverter<>(entityType);
+ }
+
+ public TopiaEntityArrayConverter(Class<E> entityType) {
+ this.type = getArrayClass(entityType);
+ this.mapper = Jsons.newEntityMapper();
+ }
+
+ <T> Class<T[]> getArrayClass(Class<T> clazz) {
+ return (Class<T[]>) Array.newInstance(clazz, 0).getClass();
+ }
+
+ @Override
+ protected <T> T convertToType(Class<T> type, Object value) throws Throwable {
+
+ String stringValue;
+
+ if (value instanceof String) {
+
+ stringValue = (String) value;
+
+ } else {
+
+ stringValue = ((String[]) value)[0];
+
+ }
+
+ try {
+
+ E[] values = mapper.readValue(stringValue, this.type);
+ return (T) values;
+
+ } catch (IOException e) {
+ throw new PollenTechnicalException("Could not convert " + stringValue + " to " + type.getName(), e);
+ }
+
+ }
+
+ @Override
+ protected Class<?> getDefaultType() {
+ return type;
+ }
+}
Property changes on: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverter.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:eol-style
+ native
Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityConverter.java
===================================================================
--- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityConverter.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/TopiaEntityConverter.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -1,7 +1,5 @@
package org.chorem.pollen.rest.api;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.apache.commons.beanutils.converters.AbstractConverter;
Modified: trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java
===================================================================
--- trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -23,13 +23,17 @@
* #L%
*/
+import com.google.common.collect.Lists;
+import org.chorem.pollen.persistence.entity.Choice;
import org.chorem.pollen.persistence.entity.Poll;
+import org.chorem.pollen.persistence.entity.VoterList;
import org.chorem.pollen.services.service.InvalidFormException;
import org.chorem.pollen.services.service.PollService;
import org.chorem.pollen.services.service.PollenPrincipalRef;
import org.debux.webmotion.server.WebMotionController;
import java.io.File;
+import java.util.List;
import java.util.Set;
/**
@@ -82,9 +86,21 @@
}
- public PollenPrincipalRef<Poll> createPoll(PollService pollService, Poll poll) throws InvalidFormException {
+ public PollenPrincipalRef<Poll> createPoll(PollService pollService, Poll poll, Choice[] choices, VoterList[] voterLists) throws InvalidFormException {
- Poll createdPoll = pollService.createPoll(poll);
+ List<Choice> choiceList = null;
+
+ if (choices != null && choices.length > 0) {
+ choiceList = Lists.newArrayList(choices);
+ }
+
+ List<VoterList> voterListList = null;
+
+ if (voterLists != null && voterLists.length > 0) {
+ voterListList = Lists.newArrayList(voterLists);
+ }
+
+ Poll createdPoll = pollService.createPoll(poll, choiceList, voterListList);
PollenPrincipalRef<Poll> principalRef = PollenPrincipalRef.newRef(createdPoll);
return principalRef;
Modified: trunk/pollen-rest-api/src/main/resources/mapping
===================================================================
--- trunk/pollen-rest-api/src/main/resources/mapping 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-rest-api/src/main/resources/mapping 2014-05-07 15:49:33 UTC (rev 3920)
@@ -71,6 +71,7 @@
GET /v1/polls/participated PollApi.getParticipatedPolls
POST /v1/polls PollApi.createPoll
GET /v1/polls/create PollApi.createPoll
+GET /v1/polls/edit PollApi.editPoll
PUT /v1/polls/{pollId} PollApi.editPoll
GET /v1/polls/{pollId} PollApi.getPoll
DELETE /v1/polls/{pollId} PollApi.deletePoll
Modified: trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java
===================================================================
--- trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -38,6 +38,8 @@
import java.io.IOException;
import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
import static org.junit.Assert.assertNotNull;
@@ -122,21 +124,23 @@
poll.setVoteVisibility(VoteVisibility.EVERYBODY);
poll.setVoteCountingType(1);
poll.setTitle("title");
+
+ List<Choice> choices = new ArrayList<>();
Choice choice1 = new ChoiceImpl();
choice1.setChoiceType(ChoiceType.TEXT);
choice1.setName("choiceA");
- poll.addChoice(choice1);
+ choices.add(choice1);
Choice choice2 = new ChoiceImpl();
choice2.setChoiceType(ChoiceType.TEXT);
choice2.setName("choiceB");
- poll.addChoice(choice2);
+ choices.add(choice2);
- TopiaEntityConverter<Poll> converter = TopiaEntityConverter.newconverter(Poll.class);
+ String choiceStr = Jsons.entitiesToString(choices);
+ String pollStr = Jsons.entitiesToString(poll);
- String strPoll = converter.convertToString(poll);
-
Request request = createRequest("/v1/polls")
- .addParameter("poll", strPoll)
+ .addParameter("poll", pollStr)
+ .addParameter("choices", choiceStr)
.Post();
String content = request.execute().returnContent().asString();
Added: trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java
===================================================================
--- trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java (rev 0)
+++ trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -0,0 +1,23 @@
+package org.chorem.pollen.rest.api;
+
+import org.chorem.pollen.persistence.entity.Choice;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TopiaEntityArrayConverterTest {
+
+ @Test
+ public void convertToType() throws Exception {
+
+ String choicesStr = "[ {name: \"choice1\", choiceType: \"TEXT\"}, " +
+ "{name: \"choice2\", choiceType: \"IMAGE\"} ]";
+
+ TopiaEntityArrayConverter converter = TopiaEntityArrayConverter.newconverter(Choice.class);
+
+ TopiaEntityList<Choice> choices = converter.convert(TopiaEntityList.class, choicesStr);
+ Assert.assertNotNull(choices);
+ Assert.assertEquals(2, choices.size());
+
+
+ }
+}
\ No newline at end of file
Property changes on: trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityArrayConverterTest.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:eol-style
+ native
Modified: trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityConverterTest.java
===================================================================
--- trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityConverterTest.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/TopiaEntityConverterTest.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -1,6 +1,5 @@
package org.chorem.pollen.rest.api;
-import org.chorem.pollen.persistence.entity.ChoiceType;
import org.chorem.pollen.persistence.entity.CommentVisibility;
import org.chorem.pollen.persistence.entity.Poll;
import org.chorem.pollen.persistence.entity.PollType;
@@ -27,11 +26,11 @@
Assert.assertEquals(VoteVisibility.ANONYMOUS, poll.getVoteVisibility());
Assert.assertEquals(CommentVisibility.NOBODY, poll.getCommentVisibility());
Assert.assertEquals(PollType.FREE, poll.getPollType());
- Assert.assertEquals(2, poll.sizeChoice());
- Assert.assertEquals("choice1", poll.getChoice(0).getName());
- Assert.assertEquals(ChoiceType.TEXT, poll.getChoice(0).getChoiceType());
- Assert.assertEquals("choice2", poll.getChoice(1).getName());
- Assert.assertEquals(ChoiceType.IMAGE, poll.getChoice(1).getChoiceType());
+// Assert.assertEquals(2, poll.sizeChoice());
+// Assert.assertEquals("choice1", poll.getChoice(0).getName());
+// Assert.assertEquals(ChoiceType.TEXT, poll.getChoice(0).getChoiceType());
+// Assert.assertEquals("choice2", poll.getChoice(1).getName());
+// Assert.assertEquals(ChoiceType.IMAGE, poll.getChoice(1).getChoiceType());
String convert = converter.convert(String.class, poll);
Assert.assertNotNull(convert);
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ChoiceService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ChoiceService.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ChoiceService.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -24,8 +24,10 @@
*/
import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
+import org.apache.commons.collections4.CollectionUtils;
import org.chorem.pollen.persistence.entity.Choice;
import org.chorem.pollen.persistence.entity.ChoiceTopiaDao;
import org.chorem.pollen.persistence.entity.Poll;
@@ -49,7 +51,8 @@
Poll poll = getPollService().getPoll(pollId);
- return poll.getChoice();
+ List<Choice> choices = getChoiceDao().findAll(poll);
+ return ImmutableList.copyOf(choices);
}
@@ -74,9 +77,14 @@
checkPermission(PermissionVerb.editPoll, pollId);
Poll poll = getPollService().getPoll(pollId);
+ List<Choice> existingChoices = getChoiceDao().findAll(poll);
- checkChoiceForm(poll, choice);
+ ErrorMap errorMap = checkChoice(existingChoices, choice);
+ errorMap.failIfNotEmpty();
+ // set the choice order
+ choice.setChoiceOrder(existingChoices.size());
+
Choice result = saveChoice(poll, choice);
getPollDao().update(poll);
@@ -94,8 +102,10 @@
checkPermission(PermissionVerb.editChoice, choice.getTopiaId());
Poll poll = getPollService().getPoll(pollId);
+ List<Choice> existingChoices = getChoiceDao().findAll(poll);
- checkChoiceForm(poll, choice);
+ ErrorMap errorMap = checkChoice(existingChoices, choice);
+ errorMap.failIfNotEmpty();
Choice result = saveChoice(poll, choice);
@@ -116,9 +126,7 @@
Poll poll = getPollService().getPoll(pollId);
Choice choice = getChoice(poll, choiceId);
- poll.removeChoice(choice);
-
- getPollDao().update(poll);
+ getChoiceDao().delete(choice);
commit();
//TODO Notify Choice deleted
@@ -128,9 +136,9 @@
Choice result = getChoiceDao().findByTopiaId(choiceId);
- if (!poll.containsChoice(result)) {
+ if (!poll.equals(result.getPoll())) {
- throw new InvalidEntityLinkException(Poll.PROPERTY_CHOICE, poll, result);
+ throw new InvalidEntityLinkException(Choice.PROPERTY_POLL, result, poll);
}
@@ -150,10 +158,11 @@
// get existing choice
choiceToPersist = getChoice(poll, choice.getTopiaId());
+
} else {
// create a new choice
- choiceToPersist = choiceDao.newInstance();
+ choiceToPersist = choiceDao.create();
// create a new principal
PollenPrincipal principal = getSecurityService().generatePollenPrincipal();
@@ -166,7 +175,9 @@
choiceToPersist.setChoiceType(choice.getChoiceType());
choiceToPersist.setCreator(principal);
- poll.addChoice(choiceToPersist);
+ choiceToPersist.setPoll(poll);
+ choiceToPersist.setChoiceOrder(choice.getChoiceOrder());
+
}
switch (choiceToPersist.getChoiceType()) {
@@ -188,21 +199,80 @@
}
- protected void checkChoiceForm(Poll poll, Choice choice) throws InvalidFormException {
+// protected void checkChoiceForm(List<Choice> existingChoices, Choice choice) throws InvalidFormException {
+//
+// //TODO use nuiton validator ?
+// Multimap<String, String> errors = ArrayListMultimap.create();
+//
+// boolean choiceExists = choice.isPersisted();
+//
+// Set<String> choiceNames = Sets.newHashSet();
+//
+// checkNotNull(errors, "choiceType", choice.getChoiceType(), "choiceType can not be null");
+//
+// if (CollectionUtils.isNotEmpty(existingChoices)) {
+//
+// // get all used names
+//
+// for (Choice choice1 : existingChoices) {
+//
+// if (choiceExists &&
+// choice1.getTopiaId().equals(choice.getTopiaId())) {
+// continue;
+// }
+// choiceNames.add(choice1.getName());
+//
+// }
+// }
+//
+// switch (choice.getChoiceType()) {
+//
+// case TEXT:
+//
+// String choiceName = choice.getName();
+// boolean nameNotBlank = checkNotBlank(errors,
+// "name",
+// choiceName,
+// "choice name can not be empty");
+//
+// if (nameNotBlank) {
+// boolean nameAdded = choiceNames.add(choiceName);
+// check(errors, "name", nameAdded, "choice name already used in this list");
+// }
+//
+// break;
+// case DATE:
+//
+// throw new IllegalStateException("Not implemented");
+//
+// case IMAGE:
+//
+// throw new IllegalStateException("Not implemented");
+// }
+//
+// if (!errors.isEmpty()) {
+//
+// throw new InvalidFormException(errors);
+//
+// }
+//
+// }
- //TODO use nuiton validator ?
- Multimap<String, String> errors = ArrayListMultimap.create();
+ protected ErrorMap checkChoice(List<Choice> existingChoices, Choice choice) {
+ ErrorMap errors = new ErrorMap();
+
boolean choiceExists = choice.isPersisted();
Set<String> choiceNames = Sets.newHashSet();
- checkNotNull(errors, "choiceType", choice.getChoiceType(), "choiceType can not be null");
- if (!poll.isChoiceEmpty()) {
+ boolean withChoiceType = checkNotNull(errors, "choiceType", choice.getChoiceType(), "choiceType can not be null");
+ if (CollectionUtils.isNotEmpty(existingChoices)) {
+
// get all used names
- for (Choice choice1 : poll.getChoice()) {
+ for (Choice choice1 : existingChoices) {
if (choiceExists &&
choice1.getTopiaId().equals(choice.getTopiaId())) {
@@ -213,36 +283,37 @@
}
}
- switch (choice.getChoiceType()) {
+ if (withChoiceType) {
- case TEXT:
+ switch (choice.getChoiceType()) {
- String choiceName = choice.getName();
- boolean nameNotBlank = checkNotBlank(errors,
- "name",
- choiceName,
- "choice name can not be empty");
+ case TEXT:
- if (nameNotBlank) {
- boolean nameAdded = choiceNames.add(choiceName);
- check(errors, "name", nameAdded, "choice name already used in this list");
- }
+ String choiceName = choice.getName();
+ boolean nameNotBlank = checkNotBlank(errors,
+ "name",
+ choiceName,
+ "choice name can not be empty");
- break;
- case DATE:
+ if (nameNotBlank) {
+ boolean nameAdded = choiceNames.add(choiceName);
+ check(errors, "name", nameAdded, "choice name already used in this list");
+ }
- throw new IllegalStateException("Not implemented");
+ break;
+ case DATE:
- case IMAGE:
+ throw new IllegalStateException("Not implemented");
- throw new IllegalStateException("Not implemented");
- }
+ case IMAGE:
- if (!errors.isEmpty()) {
+ throw new IllegalStateException("Not implemented");
- throw new InvalidFormException(errors);
-
+ }
}
+ return errors;
+
}
+
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/CommentService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/CommentService.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/CommentService.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -24,6 +24,7 @@
*/
import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multimap;
import org.apache.commons.lang3.StringUtils;
import org.chorem.pollen.persistence.entity.Comment;
@@ -46,7 +47,8 @@
checkNotNull(pollId);
Poll poll = getPollService().getPoll(pollId);
- return poll.getComment();
+ List<Comment> comments = getCommentDao().forPollEquals(poll).findAll();
+ return ImmutableList.copyOf(comments);
}
@@ -113,9 +115,7 @@
Comment comment = getComment(poll, commentId);
- poll.removeComment(comment);
-
- getPollDao().update(poll);
+ getCommentDao().delete(comment);
commit();
}
@@ -124,9 +124,9 @@
Comment result = getCommentDao().findByTopiaId(commentId);
- if (!poll.containsComment(result)) {
+ if (!poll.equals(result.getPoll())) {
- throw new InvalidEntityLinkException(Poll.PROPERTY_COMMENT, poll, result);
+ throw new InvalidEntityLinkException(Comment.PROPERTY_POLL, result, poll);
}
@@ -174,9 +174,8 @@
PollenPrincipal author = getSecurityService().generatePollenPrincipal();
toSave.setAuthor(author);
+ toSave.setPoll(poll);
- poll.addComment(toSave);
-
}
toSave.setText(comment.getText());
Added: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java (rev 0)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -0,0 +1,64 @@
+package org.chorem.pollen.services.service;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
+
+import java.util.Collection;
+
+/**
+ * Created on 5/7/14.
+ *
+ * @author Tony Chemit <chemit(a)codelutin.com>
+ * @since 2.0
+ */
+public class ErrorMap {
+
+ protected Multimap<String, String> errors;
+
+ public ErrorMap() {
+
+ errors = ArrayListMultimap.create();
+
+ }
+
+ public void addError(String key, String error) {
+
+ errors.put(key, error);
+
+ }
+
+ public void addErrors(String key, Iterable<String> error) {
+
+ errors.putAll(key, error);
+
+ }
+
+ public void copyTo(ErrorMap errorMap, String prefix) {
+
+ for (String key : errors.keySet()) {
+
+ Collection<String> errors = this.errors.get(key);
+
+ errorMap.addErrors(prefix + key, errors);
+ }
+
+ }
+
+ public boolean isEmpty() {
+
+ return errors.isEmpty();
+
+ }
+
+ public Multimap<String, String> getErrors() {
+ return errors;
+ }
+
+ public void failIfNotEmpty() throws InvalidFormException {
+
+ if (!errors.isEmpty()) {
+
+ throw new InvalidFormException(errors);
+ }
+ }
+}
Property changes on: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/ErrorMap.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision
Added: svn:eol-style
+ native
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -29,6 +29,7 @@
import org.apache.commons.logging.LogFactory;
import org.chorem.pollen.persistence.PollenPersistenceContext;
import org.chorem.pollen.persistence.PollenTopiaApplicationContext;
+import org.chorem.pollen.persistence.entity.Choice;
import org.chorem.pollen.persistence.entity.Poll;
import org.chorem.pollen.persistence.entity.PollenUser;
import org.chorem.pollen.persistence.entity.PollenUserTopiaDao;
@@ -37,6 +38,7 @@
import org.chorem.pollen.services.service.security.SecurityService;
import java.util.Collection;
+import java.util.List;
import java.util.Map;
public class FixturesService extends PollenServiceSupport {
@@ -102,14 +104,15 @@
PollService pollService = newService(PollService.class);
Collection<Poll> polls = fixtures.fixture("polls");
+ List<Choice> choices= fixtures.fixture("choices");
for (Poll poll : polls) {
try {
- Poll createdPoll = pollService.createPoll(poll);
+ Poll createdPoll = pollService.createPoll(poll, choices, null);
poll.setTopiaId(createdPoll.getTopiaId());
poll.setCreator(createdPoll.getCreator());
- poll.setChoice(createdPoll.getChoice());
+// poll.setChoice(createdPoll.getChoice());
} catch (InvalidFormException e) {
throw new PollenTechnicalException(e);
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -23,23 +23,18 @@
* #L%
*/
-import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.collections4.CollectionUtils;
import org.chorem.pollen.persistence.entity.Choice;
import org.chorem.pollen.persistence.entity.Poll;
import org.chorem.pollen.persistence.entity.PollenPrincipal;
import org.chorem.pollen.persistence.entity.PollenUser;
import org.chorem.pollen.persistence.entity.Polls;
import org.chorem.pollen.persistence.entity.VoterList;
-import org.chorem.pollen.persistence.entity.VoterListMember;
import org.chorem.pollen.services.service.security.PermissionVerb;
import java.io.File;
-import java.util.HashSet;
+import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -130,21 +125,22 @@
creator.setEmail(connectedUser.getEmail());
}
- result.setChoice(Lists.<Choice>newArrayList());
- result.setVoterList(Lists.<VoterList>newArrayList());
-
return result;
}
- public Poll createPoll(Poll poll) throws InvalidFormException {
+ public Poll createPoll(Poll poll, List<Choice> choices, List<VoterList> voterLists) throws InvalidFormException {
checkNotNull(poll);
checkIsNotPersisted(poll);
- checkPollForm(poll);
- Poll savedPoll = savePoll(poll);
+ ErrorMap errorMap = checkPoll(poll);
+ checkChoices(errorMap, choices);
+ checkvoterLists(errorMap, poll, voterLists);
+ errorMap.failIfNotEmpty();
+ Poll savedPoll = savePoll(poll, choices, voterLists);
+
getPollDao().create(savedPoll);
commit();
@@ -159,10 +155,12 @@
checkNotNull(poll);
checkIsPersisted(poll);
checkPermission(PermissionVerb.editPoll, poll.getTopiaId());
- checkPollForm(poll);
- Poll savedPoll = savePoll(poll);
+ ErrorMap errorMap = checkPoll(poll);
+ errorMap.failIfNotEmpty();
+ Poll savedPoll = savePoll(poll, null, null);
+
getPollDao().update(savedPoll);
commit();
@@ -228,19 +226,23 @@
}
- protected Poll savePoll(Poll poll) {
+ protected Poll savePoll(Poll poll, List<Choice> choices, List<VoterList> voterLists) {
boolean pollExists = poll.isPersisted();
+ List<Choice> existingChoices;
+
Poll toSave;
if (pollExists) {
toSave = getPoll(poll.getTopiaId());
+ existingChoices = getChoiceDao().findAll(poll);
} else {
toSave = getPollDao().newInstance();
+ existingChoices = new ArrayList<>();
PollenPrincipal creatorToPersist =
getSecurityService().generatePollenPrincipal();
@@ -290,20 +292,29 @@
// -- choice -- //
- for (Choice choice : poll.getChoice()) {
+ if (CollectionUtils.isNotEmpty(choices)) {
- getChoiceService().saveChoice(toSave, choice);
+ ChoiceService choiceService = getChoiceService();
+ for (Choice choice : choices) {
+
+ choice.setChoiceOrder(existingChoices.size());
+ Choice persistedChoice = choiceService.saveChoice(toSave, choice);
+ existingChoices.add(persistedChoice);
+
+ }
}
// -- voting list -- //
- if (!poll.isVoterListEmpty()) {
+ if (CollectionUtils.isNotEmpty(voterLists)) {
- for (VoterList voterList : poll.getVoterList()) {
+ VoterListService voterListService = getVoterListService();
- getVoterListService().saveVoterList(toSave, voterList);
+ for (VoterList voterList : voterLists) {
+ voterListService.saveVoterList(toSave, voterList);
+
}
}
@@ -311,10 +322,152 @@
}
- protected void checkPollForm(Poll poll) throws InvalidFormException {
+// protected void checkPollForm(Poll poll, List<Choice> choices, List<VoterList> voterLists) throws InvalidFormException {
+//
+// //TODO use nuiton validator ?
+// Multimap<String, String> errors = ArrayListMultimap.create();
+//
+// checkNotNull(errors, Poll.PROPERTY_POLL_TYPE, poll.getPollType(), "pollType can not be null");
+// checkNotNull(errors, Poll.PROPERTY_COMMENT_VISIBILITY, poll.getCommentVisibility(), "commentVisibility can not be null");
+// checkNotNull(errors, Poll.PROPERTY_VOTE_VISIBILITY, poll.getVoteVisibility(), "voteVisibility can not be null");
+// checkNotNull(errors, Poll.PROPERTY_VOTE_COUNTING_TYPE, poll.getVoteCountingType(), "voteCountingType can not be null");
+//
+// checkNotBlank(errors, Poll.PROPERTY_TITLE, poll.getTitle(), "title can not be empty");
+//
+// if (!poll.isPersisted()) {
+//
+// // check choices
+// checkNotEmpty(errors, "choice", choices, "need at least one choice");
+//
+// if (CollectionUtils.isNotEmpty(choices)) {
+//
+// // validate choices
+//
+// Set<String> choiceNames = new HashSet<>();
+// int choiceIndex = 0;
+//
+// for (Choice choice : choices) {
+//
+// String choiceField = "choice" + "[" + (choiceIndex++) + "].";
+//
+// checkNotNull(errors,
+// choiceField + Choice.PROPERTY_CHOICE_TYPE,
+// choice.getChoiceType(),
+// "choiceType can not be null");
+// if (choice.getChoiceType() != null) {
+// switch (choice.getChoiceType()) {
+//
+// case TEXT:
+//
+// boolean checkNotBlank = checkNotBlank(errors,
+// choiceField + Choice.PROPERTY_NAME,
+// choice.getName(),
+// "choice name can not be empty");
+//
+// if (checkNotBlank) {
+//
+// // check duplicated name
+//
+// check(errors,
+// choiceField + Choice.PROPERTY_NAME,
+// choiceNames.add(choice.getName()),
+// "Duplicated choice name");
+// }
+// break;
+// case DATE:
+// throw new IllegalStateException("Not implemented");
+//
+// case IMAGE:
+// throw new IllegalStateException("Not implemented");
+// }
+// }
+// }
+// }
+//
+//
+// // check voter lists
+//
+// if (Polls.isPollFree(poll)) {
+// checkEmpty(errors, "voterList", voterLists, "can't have voterList with free poll");
+// } else if (Polls.isPollRestricted(poll)) {
+// check(errors, "voterList", voterLists != null && 1 == voterLists.size(), "must have a unique voterList with a resitricted poll");
+// } else if (Polls.isPollGroup(poll)) {
+// checkNotEmpty(errors, "voterList", voterLists, "must have at least one voterList with a group poll");
+// }
+//
+//
+// if (CollectionUtils.isNotEmpty(voterLists)) {
+//
+// Set<String> voterListNames = Sets.newHashSet();
+//
+// // validate voter lists
+//
+// int voterListIndex = 0;
+//
+// for (VoterList voterList : voterLists) {
+//
+// String voterListField = "voterList" + "[" + (voterListIndex++) + "].";
+//
+// boolean notBlankName = checkNotBlank(errors, voterListField + VoterList.PROPERTY_NAME, voterList.getName(), "voterList name can not be empty");
+//
+// if (notBlankName) {
+// boolean added = voterListNames.add(voterList.getName());
+//
+// check(errors, voterListField + VoterList.PROPERTY_NAME, added, "voterList name already used");
+// }
+// check(errors, voterListField + VoterList.PROPERTY_WEIGHT, voterList.getWeight() > 0, "voterList weight must be greater than 0");
+// boolean withMember = checkNotEmpty(errors, voterListField + VoterList.PROPERTY_MEMBER, voterList.getMember(), "voterList must contains at least one member");
+//
+// if (withMember) {
+// Set<String> voterListMemberNames = Sets.newHashSet();
+// Set<String> voterListMemberEmails = Sets.newHashSet();
+//
+// int voterListMemberIndex = 0;
+//
+// for (VoterListMember voterListMember : voterList.getMember()) {
+//
+// String voterListMemberField = voterListField + VoterList.PROPERTY_MEMBER + "[" + (voterListMemberIndex++) + "].";
+//
+// String voterListMemberName = voterListMember.getName();
+// boolean nameNotNull = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, voterListMemberName, "member name can not be empty");
+//
+// if (nameNotNull) {
+// boolean nameAdded = voterListMemberNames.add(voterListMemberName);
+// check(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, nameAdded, "member name already used in this list");
+// }
+//
+// String voterListMemberEmail = voterListMember.getEmail();
+//
+// boolean emailNotNull = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email can not be empty");
+//
+// if (emailNotNull) {
+//
+// voterListMemberEmail = StringUtils.lowerCase(voterListMemberEmail);
+//
+// checkValidEmail(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email is not valid");
+// boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail);
+// check(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, emailAdded, "member email already used in this list");
+// }
+//
+// check(errors, voterListMemberField + VoterListMember.PROPERTY_WEIGHT, voterListMember.getWeight() > 0, "member weight must be greater than 0");
+// }
+// }
+// }
+// }
+// }
+//
+// if (!errors.isEmpty()) {
+//
+// throw new InvalidFormException(errors);
+//
+// }
+//
+// }
+ protected ErrorMap checkPoll(Poll poll) {
+
//TODO use nuiton validator ?
- Multimap<String, String> errors = ArrayListMultimap.create();
+ ErrorMap errors = new ErrorMap();
checkNotNull(errors, Poll.PROPERTY_POLL_TYPE, poll.getPollType(), "pollType can not be null");
checkNotNull(errors, Poll.PROPERTY_COMMENT_VISIBILITY, poll.getCommentVisibility(), "commentVisibility can not be null");
@@ -322,124 +475,70 @@
checkNotNull(errors, Poll.PROPERTY_VOTE_COUNTING_TYPE, poll.getVoteCountingType(), "voteCountingType can not be null");
checkNotBlank(errors, Poll.PROPERTY_TITLE, poll.getTitle(), "title can not be empty");
- checkNotEmpty(errors, Poll.PROPERTY_CHOICE, poll.getChoice(), "need at least one choice");
- if (Polls.isPollFree(poll)) {
- checkEmpty(errors, Poll.PROPERTY_VOTER_LIST, poll.getVoterList(), "can't have voterList with free poll");
- } else if (Polls.isPollRestricted(poll)) {
- check(errors, Poll.PROPERTY_VOTER_LIST, 1 == poll.sizeVoterList(), "must have a unique voterList with a resitricted poll");
- } else if (Polls.isPollGroup(poll)) {
- checkNotEmpty(errors, Poll.PROPERTY_VOTER_LIST, poll.getVoterList(), "must have at least one voterList with a group poll");
- }
+ return errors;
- if (!poll.isChoiceEmpty()) {
+ }
- // validate choices
- Set<String> choiceNames = new HashSet<>();
- int choiceIndex = 0;
+ protected void checkChoices(ErrorMap errorMap, List<Choice> choices) {
- for (Choice choice : poll.getChoice()) {
+ boolean choicesNotEmpty = CollectionUtils.isNotEmpty(choices);
- String choiceField = Poll.PROPERTY_CHOICE + "[" + (choiceIndex++) + "].";
+ check(errorMap, "choice", choicesNotEmpty, "need at least one choice");
- checkNotNull(errors,
- choiceField + Choice.PROPERTY_CHOICE_TYPE,
- choice.getChoiceType(),
- "choiceType can not be null");
- if (choice.getChoiceType() != null) {
- switch (choice.getChoiceType()) {
+ if (choicesNotEmpty) {
- case TEXT:
+ List<Choice> existingChoices = new ArrayList<>();
- boolean checkNotBlank = checkNotBlank(errors,
- choiceField + Choice.PROPERTY_NAME,
- choice.getName(),
- "choice name can not be empty");
+ for (int i = 0; i < choices.size(); i++) {
- if (checkNotBlank) {
+ Choice choice = choices.get(i);
- // check duplicated name
+ ErrorMap choiceErrors = getChoiceService().checkChoice(existingChoices, choice);
+ choiceErrors.copyTo(errorMap, "choice[" + i + "].");
- check(errors,
- choiceField + Choice.PROPERTY_NAME,
- choiceNames.add(choice.getName()),
- "Duplicated choice name");
- }
- break;
- case DATE:
- throw new IllegalStateException("Not implemented");
+ existingChoices.add(choice);
- case IMAGE:
- throw new IllegalStateException("Not implemented");
- }
- }
}
+
}
+ }
- if (!poll.isVoterListEmpty()) {
+ protected void checkvoterLists(ErrorMap errorMap, Poll poll, List<VoterList> voterLists) {
- Set<String> voterListNames = Sets.newHashSet();
+ boolean voterListsNotEmpty = CollectionUtils.isNotEmpty(voterLists);
- // validate voter lists
+ if (Polls.isPollFree(poll)) {
- int voterListIndex = 0;
+ checkEmpty(errorMap, "voterList", voterLists, "can't have voterList with free poll");
- for (VoterList voterList : poll.getVoterList()) {
+ } else if (Polls.isPollRestricted(poll)) {
- String voterListField = Poll.PROPERTY_VOTER_LIST + "[" + (voterListIndex++) + "].";
+ check(errorMap, "voterList", voterListsNotEmpty && 1 == voterLists.size(), "must have a unique voterList with a resitricted poll");
- boolean notBlankName = checkNotBlank(errors, voterListField + VoterList.PROPERTY_NAME, voterList.getName(), "voterList name can not be empty");
+ } else if (Polls.isPollGroup(poll)) {
- if (notBlankName) {
- boolean added = voterListNames.add(voterList.getName());
+ check(errorMap, "voterList", voterListsNotEmpty, "must have at least one voterList with a group poll");
- check(errors, voterListField + VoterList.PROPERTY_NAME, added, "voterList name already used");
- }
- check(errors, voterListField + VoterList.PROPERTY_WEIGHT, voterList.getWeight() > 0, "voterList weight must be greater than 0");
- boolean withMember = checkNotEmpty(errors, voterListField + VoterList.PROPERTY_MEMBER, voterList.getMember(), "voterList must contains at least one member");
+ }
- if (withMember) {
- Set<String> voterListMemberNames = Sets.newHashSet();
- Set<String> voterListMemberEmails = Sets.newHashSet();
+ if (voterListsNotEmpty) {
- int voterListMemberIndex = 0;
+ List<VoterList> existingVoterLists = new ArrayList<>();
- for (VoterListMember voterListMember : voterList.getMember()) {
+ for (int i = 0; i < voterLists.size(); i++) {
- String voterListMemberField = voterListField + VoterList.PROPERTY_MEMBER + "[" + (voterListMemberIndex++) + "].";
+ VoterList voterList = voterLists.get(i);
- String voterListMemberName = voterListMember.getName();
- boolean nameNotNull = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, voterListMemberName, "member name can not be empty");
+ ErrorMap voterListErrors = getVoterListService().checkVoterList(existingVoterLists, voterList);
- if (nameNotNull) {
- boolean nameAdded = voterListMemberNames.add(voterListMemberName);
- check(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, nameAdded, "member name already used in this list");
- }
+ voterListErrors.copyTo(errorMap, "voterList[" + i + "].");
- String voterListMemberEmail = voterListMember.getEmail();
+ existingVoterLists.add(voterList);
- boolean emailNotNull = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email can not be empty");
-
- if (emailNotNull) {
-
- voterListMemberEmail = StringUtils.lowerCase(voterListMemberEmail);
-
- checkValidEmail(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email is not valid");
- boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail);
- check(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, emailAdded, "member email already used in this list");
- }
-
- check(errors, voterListMemberField + VoterListMember.PROPERTY_WEIGHT, voterListMember.getWeight() > 0, "member weight must be greater than 0");
- }
- }
}
- }
- if (!errors.isEmpty()) {
-
- throw new InvalidFormException(errors);
-
}
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -277,4 +277,42 @@
boolean valid = check(errors, field, StringUtil.isEmail(value), error);
return valid;
}
+
+ protected boolean checkNot(ErrorMap errors, String field, boolean condition, String error) {
+ boolean valid = check(errors, field, !condition, error);
+ return valid;
+ }
+
+ protected boolean checkNotNull(ErrorMap errors, String field, Object value, String error) {
+ boolean valid = check(errors, field, value != null, error);
+ return valid;
+ }
+
+ protected boolean checkEmpty(ErrorMap errors, String field, Collection<?> value, String error) {
+ boolean valid = check(errors, field, CollectionUtils.isEmpty(value), error);
+ return valid;
+ }
+
+ protected boolean checkNotEmpty(ErrorMap errors, String field, Collection<?> value, String error) {
+ boolean valid = check(errors, field, CollectionUtils.isNotEmpty(value), error);
+ return valid;
+ }
+
+ protected boolean checkNotBlank(ErrorMap errors, String field, String value, String error) {
+ boolean valid = check(errors, field, StringUtils.isNotBlank(value), error);
+ return valid;
+ }
+
+ protected boolean checkValidEmail(ErrorMap errors, String field, String value, String error) {
+ boolean valid = check(errors, field, StringUtil.isEmail(value), error);
+ return valid;
+ }
+
+ protected boolean check(ErrorMap errors, String field, boolean condition, String error) {
+ boolean valid = condition;
+ if (!valid) {
+ errors.addError(field, error);
+ }
+ return valid;
+ }
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -24,6 +24,7 @@
*/
import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multimap;
import org.chorem.pollen.persistence.entity.Poll;
import org.chorem.pollen.persistence.entity.Polls;
@@ -46,10 +47,9 @@
checkNotNull(pollId);
Poll poll = getPollService().getPoll(pollId);
+ List<Vote> votes = getVoteDao().forPollEquals(poll).findAll();
+ return ImmutableList.copyOf(votes);
- List<Vote> result = poll.getVote();
- return result;
-
}
public Vote getVote(String pollId, String voteId) {
@@ -115,10 +115,8 @@
Poll poll = getPollService().getPoll(pollId);
Vote vote = getVote(poll, voteId);
-
- poll.removeVote(vote);
-
- getPollDao().update(poll);
+
+ getVoteDao().delete(vote);
commit();
//TODO Notify vote deleted
@@ -144,9 +142,9 @@
if (!errors.isEmpty()) {
throw new InvalidFormException(errors);
-
+
}
-
+
}
protected Vote saveVote(Poll poll, Vote vote) {
@@ -168,8 +166,7 @@
// PollenPrincipal author = getSecurityService().generatePollenPrincipal();
// toSave.setAuthor(author);
-
- poll.addVote(toSave);
+ toSave.setPoll(poll);
}
// toSave.setText(vote.getText());
@@ -182,16 +179,16 @@
// }
return toSave;
-
+
}
protected Vote getVote(Poll poll, String voteId) {
Vote result = getVoteDao().findByTopiaId(voteId);
- if (!poll.containsVote(result)) {
+ if (!poll.equals(result.getPoll())) {
- throw new InvalidEntityLinkException(Poll.PROPERTY_VOTE, poll, result);
+ throw new InvalidEntityLinkException(Vote.PROPERTY_POLL, result, poll);
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -24,9 +24,10 @@
*/
import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Lists;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
+import org.apache.commons.collections4.CollectionUtils;
import org.chorem.pollen.persistence.entity.FavoriteList;
import org.chorem.pollen.persistence.entity.FavoriteListMember;
import org.chorem.pollen.persistence.entity.Poll;
@@ -73,9 +74,8 @@
voterListMember.setEmail(favoriteListMember.getEmail());
result.addMember(voterListMember);
}
+ result.setPoll(poll);
- poll.addVoterList(result);
-
getPollDao().update(poll);
commit();
@@ -88,10 +88,9 @@
checkNotNull(pollId);
Poll poll = getPollService().getPoll(pollId);
+ List<VoterList> voterLists = getVoterListDao().forPollEquals(poll).findAll();
+ return ImmutableList.copyOf(voterLists);
- List<VoterList> result = Lists.newArrayList(poll.getVoterList());
- return result;
-
}
public VoterList getVoterList(String pollId, String voterListId) {
@@ -153,9 +152,7 @@
VoterList voterList = getVoterList(poll, voterListId);
- poll.removeVoterList(voterList);
-
- getPollDao().update(poll);
+ getVoterListDao().delete(voterList);
commit();
}
@@ -246,9 +243,9 @@
VoterList result = getVoterListDao().findByTopiaId(voterListId);
- if (!poll.containsVoterList(result)) {
+ if (!poll.equals(result.getPoll())) {
- throw new InvalidEntityLinkException(Poll.PROPERTY_VOTER_LIST, poll, result);
+ throw new InvalidEntityLinkException(VoterList.PROPERTY_POLL, result, poll);
}
@@ -282,10 +279,9 @@
} else {
- toSave = getVoterListDao().newInstance();
+ toSave = getVoterListDao().create();
+ toSave.setPoll(poll);
- poll.addVoterList(toSave);
-
}
toSave.setName(voterList.getName());
@@ -337,11 +333,19 @@
Set<String> voterListNames = Sets.newHashSet();
- if (!poll.isVoterListEmpty()) {
+ List<VoterList> existingVoterLists = null;
+ if (poll.isPersisted()) {
+
+ existingVoterLists = getVoterListDao().forPollEquals(poll).findAll();
+
+ }
+
+ if (CollectionUtils.isNotEmpty(existingVoterLists)) {
+
// get all used names
- for (VoterList lists : poll.getVoterList()) {
+ for (VoterList lists : existingVoterLists) {
if (voterListExists && lists.getTopiaId().equals(voterList.getTopiaId())) {
continue;
@@ -452,4 +456,77 @@
}
}
+
+ protected ErrorMap checkVoterList(List<VoterList> existingVoterLists, VoterList voterList) {
+
+ ErrorMap errors = new ErrorMap();
+
+ boolean voterListExists = voterList.isPersisted();
+
+ Set<String> voterListNames = Sets.newHashSet();
+
+ if (CollectionUtils.isNotEmpty(existingVoterLists)) {
+
+ // get all used names
+
+ for (VoterList lists : existingVoterLists) {
+
+ if (voterListExists && lists.getTopiaId().equals(voterList.getTopiaId())) {
+ continue;
+ }
+
+ voterListNames.add(voterList.getName());
+
+ }
+
+ }
+
+ checkNotBlank(errors, VoterList.PROPERTY_NAME, voterList.getName(), "voterList name can not be empty");
+ check(errors, VoterList.PROPERTY_WEIGHT, voterList.getWeight() > 0, "voterList weight must be greater than 0");
+ checkNotEmpty(errors, VoterList.PROPERTY_MEMBER, voterList.getMember(), "voterList must contains at least one member");
+
+ boolean added = voterListNames.add(voterList.getName());
+
+ check(errors, VoterList.PROPERTY_NAME, added, "voterList name already used");
+
+ Set<String> voterListMemberNames = Sets.newHashSet();
+ Set<String> voterListMemberEmails = Sets.newHashSet();
+
+ int voterListMemberIndex = 0;
+
+ if (voterList.getMember() != null) {
+ for (VoterListMember voterListMember : voterList.getMember()) {
+
+ String voterListMemberField = "member[" + (voterListMemberIndex++) + "].";
+
+ String voterListMemberName = voterListMember.getName();
+ boolean nameNotBlank = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, voterListMemberName, "member name can not be empty");
+
+ if (nameNotBlank) {
+
+ boolean nameAdded = voterListMemberNames.add(voterListMemberName);
+ check(errors, voterListMemberField + VoterListMember.PROPERTY_NAME, nameAdded, "member name already used in this list");
+
+ }
+
+ String voterListMemberEmail = getCleanMail(voterListMember.getEmail());
+
+ boolean emailNotBlank = checkNotBlank(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email can not be empty");
+
+ if (emailNotBlank) {
+
+ checkValidEmail(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, voterListMemberEmail, "member email is not valid");
+ boolean emailAdded = voterListMemberEmails.add(voterListMemberEmail);
+ check(errors, voterListMemberField + VoterListMember.PROPERTY_EMAIL, emailAdded, "member email already used in this list");
+
+ }
+
+ check(errors, voterListMemberField + VoterListMember.PROPERTY_WEIGHT, voterListMember.getWeight() > 0, "member weight must be greater than 0");
+
+ }
+ }
+
+ return errors;
+
+ }
}
Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java
===================================================================
--- trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -206,7 +206,7 @@
}
- public void checkPermission(String permission) {
+ public boolean isPermitted(String permission) {
Subject subject = getSubject();
@@ -214,8 +214,15 @@
log.info("Check permission: " + permission);
}
- boolean valid = subject.isPermitted(permission);
+ boolean permitted = subject.isPermitted(permission);
+ return permitted;
+ }
+
+ public void checkPermission(String permission) {
+
+ boolean valid = isPermitted(permission);
+
if (!valid) {
throw new PollenInvalidPermissionException(permission);
}
@@ -281,20 +288,29 @@
permissions.add(createSubjectPermission(PermissionVerb.readPoll, poll));
permissions.add(createSubjectPermission(PermissionVerb.readPoll, poll));
- if (poll.isChoiceNotEmpty()) {
- for (Choice choice : poll.getChoice()) {
+ // add choices permissions
+
+ List<Choice> choices = getChoiceDao().forPollEquals(poll).findAll();
+ if (CollectionUtils.isNotEmpty(choices)) {
+ for (Choice choice : choices) {
permissions.add(createSubjectPermission(PermissionVerb.readChoice, choice));
}
}
- if (poll.isCommentNotEmpty()) {
- for (Comment comment : poll.getComment()) {
+ // add comment permissions
+
+ List<Comment> comments = getCommentDao().forPollEquals(poll).findAll();
+ if (CollectionUtils.isNotEmpty(comments)) {
+ for (Comment comment : comments) {
permissions.add(createSubjectPermission(PermissionVerb.readComment, comment));
}
}
- if (poll.isVoteNotEmpty()) {
- for (Vote vote : poll.getVote()) {
+ // add vote permissions
+
+ List<Vote> votes = getVoteDao().forPollEquals(poll).findAll();
+ if (CollectionUtils.isNotEmpty(votes)) {
+ for (Vote vote : votes) {
permissions.add(createSubjectPermission(PermissionVerb.readVote, vote));
}
}
@@ -349,18 +365,29 @@
// creator has all rights on the poll, choices and comments, but can only read votes
permissions.add(createWildcardSubjectPermission(poll));
- if (poll.isChoiceNotEmpty()) {
- for (Choice choice : poll.getChoice()) {
+ // add choices permissions
+
+ List<Choice> choices = getChoiceDao().forPollEquals(poll).findAll();
+ if (CollectionUtils.isNotEmpty(choices)) {
+ for (Choice choice : choices) {
permissions.add(createWildcardSubjectPermission(choice));
}
}
- if (poll.isCommentNotEmpty()) {
- for (Comment comment : poll.getComment()) {
+
+ // add comment permissions
+
+ List<Comment> comments = getCommentDao().forPollEquals(poll).findAll();
+ if (CollectionUtils.isNotEmpty(comments)) {
+ for (Comment comment : comments) {
permissions.add(createWildcardSubjectPermission(comment));
}
}
- if (poll.isVoteNotEmpty()) {
- for (Vote vote : poll.getVote()) {
+
+ // add vote permissions
+
+ List<Vote> votes = getVoteDao().forPollEquals(poll).findAll();
+ if (CollectionUtils.isNotEmpty(votes)) {
+ for (Vote vote : votes) {
permissions.add(createSubjectPermission(PermissionVerb.readVote, vote));
}
}
Modified: trunk/pollen-services/src/main/resources/fixtures.yaml
===================================================================
--- trunk/pollen-services/src/main/resources/fixtures.yaml 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-services/src/main/resources/fixtures.yaml 2014-05-07 15:49:33 UTC (rev 3920)
@@ -41,41 +41,63 @@
creator: !pollen-principal
name: poll creator
email: poll_creator(a)pollen.chorem.org
- choice:
- - &normal_choixA !choice
- name: choixA
- description: choixA description
- choiceType: TEXT
- - &normal_choixB !choice
- name: choixB
- description: choixB description
- choiceType: TEXT
- - &normal_choixC !choice
- name: choixC
- description: choixC description
- choiceType: TEXT
- vote:
- - &normal_vote1 !vote
- weight: 1.0
- anonymous: false
- voteToChoice: !java.util.LinkedList
- - &normal_voteToChoice11 !vote-to-choice
- choice: *normal_choixA
- voteValue: 1
- - &normal_voteToChoice12 !vote-to-choice
- choice: *normal_choixC
- voteValue: 1
- - &normal_vote2 !vote
- weight: 1.0
- anonymous: false
- voteToChoice: !java.util.LinkedList
- - &normal_voteToChoice21 !vote-to-choice
- choice: *normal_choixA
- voteValue: 2
- - &normal_voteToChoice22 !vote-to-choice
- choice: *normal_choixB
- voteValue: 2
+# choice:
+# - &normal_choixA !choice
+# name: choixA
+# description: choixA description
+# choiceType: TEXT
+# - &normal_choixB !choice
+# name: choixB
+# description: choixB description
+# choiceType: TEXT
+# - &normal_choixC !choice
+# name: choixC
+# description: choixC description
+# choiceType: TEXT
+# vote:
+# - &normal_vote1 !vote
+# weight: 1.0
+# anonymous: false
+# voteToChoice: !java.util.LinkedList
+# - &normal_voteToChoice11 !vote-to-choice
+# choice: *normal_choixA
+# voteValue: 1
+# - &normal_voteToChoice12 !vote-to-choice
+# choice: *normal_choixC
+# voteValue: 1
+# - &normal_vote2 !vote
+# weight: 1.0
+# anonymous: false
+# voteToChoice: !java.util.LinkedList
+# - &normal_voteToChoice21 !vote-to-choice
+# choice: *normal_choixA
+# voteValue: 2
+# - &normal_voteToChoice22 !vote-to-choice
+# choice: *normal_choixB
+# voteValue: 2
+choiceA:
+ &normal_choixA !choice
+ poll: *normal
+ name: choixA
+ description: choixA description
+ choiceType: TEXT
+
+choiceB:
+ &normal_choixB !choice
+ poll: *normal
+ name: choixB
+ description: choixB description
+ choiceType: TEXT
+
+choices:
+ - *normal_choixA
+ - *normal_choixB
+
+votes:
+ - normal_vote1
+ - normal_vote2
+
users:
- *tony
- *jean
Modified: trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java
===================================================================
--- trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java 2014-05-07 13:14:48 UTC (rev 3919)
+++ trunk/pollen-services/src/test/java/org/chorem/pollen/service/PollServiceTest.java 2014-05-07 15:49:33 UTC (rev 3920)
@@ -29,8 +29,8 @@
import org.chorem.pollen.persistence.entity.PollType;
import org.chorem.pollen.persistence.entity.VoterList;
import org.chorem.pollen.persistence.entity.VoterListMember;
+import org.chorem.pollen.services.service.ChoiceService;
import org.chorem.pollen.services.service.InvalidFormException;
-import org.chorem.pollen.services.service.ChoiceService;
import org.chorem.pollen.services.service.PollService;
import org.chorem.pollen.services.service.VoterListService;
import org.chorem.pollen.services.service.security.PollenInvalidPermissionException;
@@ -40,7 +40,9 @@
import org.junit.Test;
import java.text.ParseException;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.List;
/**
* TODO
@@ -52,12 +54,18 @@
protected PollService service;
+ protected ChoiceService choiceService;
+
+ protected VoterListService voterListService;
+
@Before
public void setUp() throws ParseException {
loadFixtures("fixtures");
service = newService(PollService.class);
+ choiceService = newService(ChoiceService.class);
+ voterListService = newService(VoterListService.class);
getServiceContext().setDate(new Date(1363948427576l));
@@ -72,7 +80,7 @@
poll.setPollType(PollType.FREE);
try {
- service.createPoll(poll);
+ service.createPoll(poll, null, null);
Assert.fail();
} catch (InvalidFormException e) {
// missing title
@@ -82,11 +90,12 @@
poll.setTitle("poll1");
+ List<Choice> choices = new ArrayList<>();
Choice choice1 = getServiceContext().getPersistenceContext().getChoiceDao().newInstance();
- poll.addChoice(choice1);
+ choices.add(choice1);
try {
- service.createPoll(poll);
+ service.createPoll(poll, choices, null);
Assert.fail();
} catch (InvalidFormException e) {
// missing choice type
@@ -95,7 +104,7 @@
choice1.setChoiceType(ChoiceType.TEXT);
try {
- service.createPoll(poll);
+ service.createPoll(poll, choices, null);
Assert.fail();
} catch (InvalidFormException e) {
// missing choice name
@@ -110,10 +119,10 @@
choice2.setChoiceType(ChoiceType.TEXT);
choice2.setName("A");
choice2.setDescription("Choice B");
- poll.addChoice(choice2);
+ choices.add(choice2);
try {
- service.createPoll(poll);
+ service.createPoll(poll, choices, null);
Assert.fail();
} catch (InvalidFormException e) {
// duplicated choice name
@@ -123,7 +132,7 @@
choice2.setName("B");
- Poll createdPoll = service.createPoll(poll);
+ Poll createdPoll = service.createPoll(poll, choices, null);
Assert.assertNotNull(createdPoll);
Assert.assertNotNull(createdPoll.getTopiaId());
@@ -136,19 +145,20 @@
Assert.assertNotNull(createdPoll.getCreator().getTopiaId());
Assert.assertNull(createdPoll.getCreator().getName());
Assert.assertNull(createdPoll.getCreator().getEmail());
- Assert.assertNull(createdPoll.getComment());
- Assert.assertNull(createdPoll.getVote());
- Assert.assertNull(createdPoll.getVoterList());
+// Assert.assertNull(createdPoll.getComment());
+// Assert.assertNull(createdPoll.getVote());
+// Assert.assertNull(createdPoll.getVoterList());
- Assert.assertNotNull(createdPoll.getChoice());
- Assert.assertEquals(2, createdPoll.sizeChoice());
+ List<Choice> createdChoices = choiceService.getChoices(createdPoll.getTopiaId());
+ Assert.assertNotNull(createdChoices);
+ Assert.assertEquals(2, createdChoices.size());
- Choice createdChoice1 = createdPoll.getChoice(0);
+
+ Choice createdChoice1 = createdChoices.get(0);
Assert.assertNotNull(createdChoice1);
Assert.assertNotNull(createdChoice1.getTopiaId());
- ChoiceService choiceService = newService(ChoiceService.class);
Choice reloadedChoice1 = choiceService.getChoice(createdPoll.getTopiaId(), createdChoice1.getTopiaId());
Assert.assertEquals(createdChoice1, reloadedChoice1);
@@ -156,7 +166,7 @@
Assert.assertEquals(choice1.getDescription(), createdChoice1.getDescription());
Assert.assertEquals(createdPoll.getCreator(), createdChoice1.getCreator());
- Choice createdChoice2 = createdPoll.getChoice(1);
+ Choice createdChoice2 = createdChoices.get(1);
Assert.assertNotNull(createdChoice2);
Assert.assertNotNull(createdChoice2.getTopiaId());
@@ -177,35 +187,39 @@
poll.setTitle("poll1");
+ List<Choice> choices = new ArrayList<>();
+
Choice choice1 = getServiceContext().getPersistenceContext().getChoiceDao().newInstance();
choice1.setChoiceType(ChoiceType.TEXT);
choice1.setName("A");
choice1.setDescription("Choice A");
- poll.addChoice(choice1);
+ choices.add(choice1);
Choice choice2 = getServiceContext().getPersistenceContext().getChoiceDao().newInstance();
choice2.setChoiceType(ChoiceType.TEXT);
choice2.setName("B");
choice2.setDescription("Choice B");
- poll.addChoice(choice2);
+ choices.add(choice2);
try {
- service.createPoll(poll);
+ service.createPoll(poll, choices, null);
Assert.fail();
} catch (InvalidFormException e) {
// missing voterList
assertErrorKeyFound(e, "voterList");
}
+ List<VoterList> voterLists = new ArrayList<>();
+
// add voter list
VoterList voterList = getServiceContext().getPersistenceContext().getVoterListDao().newInstance();
- poll.addVoterList(voterList);
+ voterLists.add(voterList);
try {
- service.createPoll(poll);
+ service.createPoll(poll, choices, voterLists);
Assert.fail();
} catch (InvalidFormException e) {
// missing name
@@ -221,7 +235,7 @@
voterList.addMember(voterListMember1);
try {
- service.createPoll(poll);
+ service.createPoll(poll, choices, voterLists);
Assert.fail();
} catch (InvalidFormException e) {
// missing member name
@@ -234,7 +248,7 @@
voterListMember1.setEmail("voter1_pollen.org");
try {
- service.createPoll(poll);
+ service.createPoll(poll, choices, voterLists);
Assert.fail();
} catch (InvalidFormException e) {
// invalid member email
@@ -250,7 +264,7 @@
voterList.addMember(voterListMember2);
try {
- service.createPoll(poll);
+ service.createPoll(poll, choices, voterLists);
Assert.fail();
} catch (InvalidFormException e) {
// same name
@@ -261,7 +275,7 @@
voterListMember2.setName("voter2");
voterListMember2.setEmail("voter2(a)pollen.org");
- Poll createdPoll = service.createPoll(poll);
+ Poll createdPoll = service.createPoll(poll, choices, voterLists);
Assert.assertNotNull(createdPoll);
Assert.assertNotNull(createdPoll.getTopiaId());
@@ -284,17 +298,18 @@
Assert.assertNotNull(createdPoll.getCreator().getTopiaId());
Assert.assertNull(createdPoll.getCreator().getName());
Assert.assertNull(createdPoll.getCreator().getEmail());
- Assert.assertNull(createdPoll.getComment());
- Assert.assertNull(createdPoll.getVote());
+// Assert.assertNull(createdPoll.getComment());
+// Assert.assertNull(createdPoll.getVote());
- Assert.assertNotNull(createdPoll.getChoice());
- Assert.assertEquals(2, createdPoll.sizeChoice());
+ List<Choice> createdChoices = choiceService.getChoices(createdPoll.getTopiaId());
- Choice createdChoice1 = createdPoll.getChoice(0);
+ Assert.assertNotNull(createdChoices);
+ Assert.assertEquals(2, createdChoices.size());
+
+ Choice createdChoice1 = createdChoices.get(0);
Assert.assertNotNull(createdChoice1);
Assert.assertNotNull(createdChoice1.getTopiaId());
- ChoiceService choiceService = newService(ChoiceService.class);
Choice reloadedChoice1 = choiceService.getChoice(createdPoll.getTopiaId(), createdChoice1.getTopiaId());
Assert.assertEquals(createdChoice1, reloadedChoice1);
@@ -302,7 +317,7 @@
Assert.assertEquals(choice1.getDescription(), createdChoice1.getDescription());
Assert.assertEquals(createdPoll.getCreator(), createdChoice1.getCreator());
- Choice createdChoice2 = createdPoll.getChoice(1);
+ Choice createdChoice2 = createdChoices.get(1);
Assert.assertNotNull(createdChoice2);
Assert.assertNotNull(createdChoice2.getTopiaId());
@@ -313,13 +328,14 @@
Assert.assertEquals(choice2.getDescription(), createdChoice2.getDescription());
Assert.assertEquals(createdPoll.getCreator(), createdChoice2.getCreator());
- Assert.assertNotNull(createdPoll.getVoterList());
- Assert.assertEquals(1, createdPoll.sizeVoterList());
- VoterList createdVoterList = createdPoll.getVoterList(0);
+ List<VoterList> createdVoterLists = voterListService.getVoterLists(createdPoll.getTopiaId());
+
+ Assert.assertNotNull(createdVoterLists);
+ Assert.assertEquals(1, createdVoterLists.size());
+ VoterList createdVoterList = createdVoterLists.get(0);
Assert.assertNotNull(createdVoterList);
Assert.assertNotNull(createdVoterList.getTopiaId());
- VoterListService voterListService = newService(VoterListService.class);
VoterList reloadedVoterList = voterListService.getVoterList(createdPoll.getTopiaId(), createdVoterList.getTopiaId());
Assert.assertEquals(createdVoterList, reloadedVoterList);
1
0