From 80d3a02996a8467696b535aaa05c07b9328e02a1 Mon Sep 17 00:00:00 2001 From: jensp Date: Sat, 3 Dec 2016 10:49:26 +0000 Subject: [PATCH] CCM NG: Publish for PageModels git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4460 8810af33-2d31-482b-a856-94f89814c4df --- .../libreccm/pagemodel/ComponentModel.java | 14 +- .../pagemodel/ComponentModelRepository.java | 8 +- .../org/libreccm/pagemodel/PageModel.java | 45 +++- .../libreccm/pagemodel/PageModelManager.java | 216 ++++++++++++++++++ .../pagemodel/PageModelRepository.java | 10 +- 5 files changed, 285 insertions(+), 8 deletions(-) diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentModel.java b/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentModel.java index 80c90d642..05b81698a 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentModel.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentModel.java @@ -55,6 +55,10 @@ public class ComponentModel implements Serializable { @NotNull private String uuid; + @Column(name = "MODEL_UUID", length = 255, nullable = false) + @NotNull + private String modelUuid; + @ManyToOne @JoinColumn(name = "PAGE_MODEL_ID") private PageModel pageModel; @@ -83,10 +87,18 @@ public class ComponentModel implements Serializable { return uuid; } - protected void setUUid(final String uuid) { + protected void setUuid(final String uuid) { this.uuid = uuid; } + public String getModelUuid() { + return modelUuid; + } + + protected void setModelUuid(final String modelUuid) { + this.modelUuid = modelUuid; + } + public PageModel getPageModel() { return pageModel; } diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentModelRepository.java b/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentModelRepository.java index 43d711585..5f14b8a73 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentModelRepository.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentModelRepository.java @@ -43,7 +43,13 @@ public class ComponentModelRepository extends AbstractEntityRepository query = entityManager.createNamedQuery( + "PageModel.findDraftVersion", PageModel.class); + query.setParameter("uuid", pageModel.getModelUuid()); + + return query.getSingleResult(); + } + + @Transactional(Transactional.TxType.REQUIRED) + public boolean isLive(final PageModel pageModel) { + final TypedQuery query = entityManager.createNamedQuery( + "PageModel.hasLiveVersion", Boolean.class); + query.setParameter("uuid", pageModel.getModelUuid()); + + return query.getSingleResult(); + } + + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public Optional getLiveVersion( + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) PageModel pageModel) { + + if (isLive(pageModel)) { + final TypedQuery query = entityManager.createNamedQuery( + "PageModel.findLiveVersion", + PageModel.class); + query.setParameter("uuid", pageModel.getModelUuid()); + return Optional.of(query.getSingleResult()); + } else { + return Optional.empty(); + } + } + + public PageModel publish(final PageModel pageModel) { + final PageModel draftModel = getDraftVersion(pageModel); + final PageModel liveModel; + + if (isLive(pageModel)) { + liveModel = getLiveVersion(pageModel).get(); + } else { + liveModel = new PageModel(); + } + + liveModel.setVersion(PageModelVersion.LIVE); + liveModel.setModelUuid(draftModel.getModelUuid()); + + for (Map.Entry entry : draftModel.getTitle().getValues() + .entrySet()) { + liveModel.getTitle().addValue(entry.getKey(), entry.getValue()); + } + + for (Map.Entry entry : liveModel.getDescription() + .getValues().entrySet()) { + liveModel.getDescription().addValue(entry.getKey(), + entry.getValue()); + } + + liveModel.setApplication(draftModel.getApplication()); + liveModel.setType(draftModel.getType()); + + + liveModel.clearComponents(); + for(final ComponentModel draft : draftModel.getComponents()) { + final ComponentModel live = publishComponentModel(draft); + addComponentModel(liveModel, live); + } + + return liveModel; + } + + @SuppressWarnings("unchecked") + private ComponentModel publishComponentModel(final ComponentModel draftModel) { + + final Class clazz = draftModel.getClass(); + + final ComponentModel liveModel; + try { + liveModel = clazz.newInstance(); + } catch (InstantiationException | IllegalAccessException ex) { + throw new UncheckedWrapperException(ex); + } + + liveModel.setModelUuid(draftModel.getModelUuid()); + + final BeanInfo beanInfo; + try { + beanInfo = Introspector.getBeanInfo(clazz); + } catch(IntrospectionException ex) { + throw new UncheckedWrapperException(ex); + } + + for(final PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors()) { + final Class propType = propertyDescriptor.getPropertyType(); + final Method readMethod = propertyDescriptor.getReadMethod(); + final Method writeMethod = propertyDescriptor.getWriteMethod(); + + if (propertyIsExcluded(propertyDescriptor.getName())) { + continue; + } + + if (writeMethod == null) { + continue; + } + + if (propType != null + && propType.isAssignableFrom(List.class)) { + + final List source; + final List target; + try { + source = (List) readMethod.invoke(draftModel); + target = (List) readMethod.invoke(liveModel); + } catch(IllegalAccessException + | IllegalArgumentException + | InvocationTargetException ex) { + throw new UncheckedWrapperException(ex); + } + + target.addAll(source); + } else if(propType != null + && propType.isAssignableFrom(Map.class)) { + + final Map source; + final Map target; + + try { + source = (Map) readMethod.invoke(draftModel); + target = (Map) readMethod.invoke(liveModel); + } catch(IllegalAccessException + | IllegalArgumentException + | InvocationTargetException ex) { + throw new UncheckedWrapperException(ex); + } + + source.forEach((key, value) -> target.put(key, value)); + + } else if(propType != null + && propType.isAssignableFrom(Set.class)) { + + final Set source; + final Set target; + + try { + source = (Set) readMethod.invoke(draftModel); + target = (Set) readMethod.invoke(liveModel); + }catch(IllegalAccessException + | IllegalArgumentException + | InvocationTargetException ex) { + throw new UncheckedWrapperException(ex); + } + + target.addAll(source); + } else { + final Object value; + try { + value = readMethod.invoke(draftModel); + writeMethod.invoke(liveModel, value); + } catch(IllegalAccessException + | IllegalArgumentException + | InvocationTargetException ex) { + throw new UncheckedWrapperException(ex); + } + } + } + + componentModelRepo.save(liveModel); + + return liveModel; + } + + private boolean propertyIsExcluded(final String name) { + final String[] excluded = new String[]{ + "uuid", + "modelUuid" + }; + + boolean result = false; + for(final String current : excluded) { + if (current.equals(name)) { + result = true; + break; + } + } + + return result; + } + public List findAvailableComponents() { final List list = new ArrayList<>(components .values()); diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelRepository.java b/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelRepository.java index 3135ba1c0..76db9182a 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelRepository.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelRepository.java @@ -55,7 +55,13 @@ public class PageModelRepository extends AbstractEntityRepository findByApplication(final CcmApplication application) { @@ -113,7 +119,7 @@ public class PageModelRepository extends AbstractEntityRepository