Loading bundles/ch.elexis.core.jpa.entities/src/ch/elexis/core/jpa/entities/StickerObjectLink.java +11 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,9 @@ public class StickerObjectLink implements EntityWithId { @Column(length = 25, nullable = false) private String etikette; @Column(length = 256, nullable = true) private String data; public String getObj(){ return obj; } Loading @@ -48,6 +51,14 @@ public class StickerObjectLink implements EntityWithId { this.etikette = stickerId; } public String getData(){ return data; } public void setData(String data){ this.data = data; } @Override public int hashCode() { final int prime = 31; Loading bundles/ch.elexis.core.jpa/db/elexisdb_create_optional.xml +14 −0 Original line number Diff line number Diff line Loading @@ -1876,4 +1876,18 @@ DROP TABLE TEMP_ETIKETTEN_OBJCLASS_LINK; <where>param='dbversion'</where> </update> </changeSet> <changeSet author="marco" id="manual_table_ETIKETTEN_OBJECT_LINK_ADD_DATA"> <preConditions onFail="MARK_RAN"> <not> <columnExists tableName="ETIKETTEN_OBJECT_LINK" columnName="DATA" /> </not> </preConditions> <addColumn tableName="ETIKETTEN_OBJECT_LINK"> <column name="DATA" type="VARCHAR(256)" /> </addColumn> </changeSet> </databaseChangeLog> bundles/ch.elexis.core.model/src/ch/elexis/core/model/Sticker.java +29 −0 Original line number Diff line number Diff line package ch.elexis.core.model; import javax.persistence.Transient; import ch.elexis.core.jpa.entities.DbImage; import ch.elexis.core.jpa.model.adapter.AbstractIdDeleteModelAdapter; import ch.elexis.core.jpa.model.adapter.AbstractIdModelAdapter; Loading @@ -8,6 +10,12 @@ import ch.elexis.core.model.util.internal.ModelUtil; public class Sticker extends AbstractIdDeleteModelAdapter<ch.elexis.core.jpa.entities.Sticker> implements IdentifiableWithXid, ISticker { @Transient private Identifiable attachedToIdentifiable; @Transient private String attachedToData; public Sticker(ch.elexis.core.jpa.entities.Sticker entity){ super(entity); } Loading Loading @@ -110,4 +118,25 @@ public class Sticker extends AbstractIdDeleteModelAdapter<ch.elexis.core.jpa.ent public String getLabel(){ return getEntity().getName(); } @Override public Identifiable getAttachedTo(){ return attachedToIdentifiable; } @Override public void setAttachedTo(Identifiable identifiable){ this.attachedToIdentifiable = identifiable; } @Override public String getAttachedToData(){ return this.attachedToData; } @Override public void setAttachedToData(String attachedToData){ this.attachedToData = attachedToData; } } bundles/ch.elexis.core.services/src/ch/elexis/core/services/StickerService.java +48 −22 Original line number Diff line number Diff line package ch.elexis.core.services; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; Loading @@ -18,7 +18,6 @@ import ch.elexis.core.jpa.entities.StickerObjectLink; import ch.elexis.core.jpa.entities.StickerObjectLinkId; import ch.elexis.core.model.ISticker; import ch.elexis.core.model.Identifiable; import ch.elexis.core.services.holder.CoreModelServiceHolder; @Component public class StickerService implements IStickerService { Loading @@ -45,36 +44,56 @@ public class StickerService implements IStickerService { return em.find(StickerObjectLink.class, new StickerObjectLinkId(id, etikette)); } /** * Get all {@link ISticker} linked to the provided object id. The returned list is sorted by * {@link ISticker#getImportance()}. * * @param id * @return */ private List<ISticker> getStickersForId(String id){ List<StickerObjectLink> stickerObjectLinks = getStickerObjectLinksForId(id); List<ISticker> loadedStickers = stickerObjectLinks .stream().map(sol -> CoreModelServiceHolder.get() .load(sol.getEtikette(), ISticker.class).orElse(null)) .filter(Objects::nonNull).collect(Collectors.toList()); loadedStickers.sort(new StickerSorter()); return loadedStickers; } @Override public boolean hasSticker(Identifiable identifiable, ISticker iSticker){ List<StickerObjectLink> entries = findAttachments(identifiable, iSticker); return entries.isEmpty() ? false : true; } private List<StickerObjectLink> findAttachments(Identifiable identifiable, ISticker iSticker){ EntityManager em = (EntityManager) entityManager.getEntityManager(true); TypedQuery<StickerObjectLink> query = em.createNamedQuery("StickerObjectLink.obj.etikette", StickerObjectLink.class); query.setParameter("obj", identifiable.getId()); query.setParameter("etikette", iSticker.getId()); return query.getResultList().isEmpty() ? false : true; return query.getResultList(); } @Override public List<ISticker> getStickers(Identifiable identifiable){ return getStickersForId(identifiable.getId()); List<StickerObjectLink> stickerObjectLinks = getStickerObjectLinksForId(identifiable.getId()); List<ISticker> loadedStickers = new ArrayList<>(); for (StickerObjectLink link : stickerObjectLinks) { ISticker sticker = loadStickerForStickerObjectLink(link, identifiable); if (sticker != null) { loadedStickers.add(sticker); } } loadedStickers.sort(new StickerSorter()); return loadedStickers; } @Override public ISticker getSticker(Identifiable identifiable, ISticker sticker){ List<StickerObjectLink> resultList = findAttachments(identifiable, sticker); if (resultList.isEmpty()) { return null; } StickerObjectLink stickerObjectLink = resultList.get(0); return loadStickerForStickerObjectLink(stickerObjectLink, identifiable); } private ISticker loadStickerForStickerObjectLink(StickerObjectLink stickerObjectLink, Identifiable identifiable){ ISticker sticker = iModelService.load(stickerObjectLink.getEtikette(), ISticker.class).orElse(null); if (sticker != null) { sticker.setAttachedTo(identifiable); sticker.setAttachedToData(stickerObjectLink.getData()); return sticker; } return null; } @Override Loading @@ -87,12 +106,13 @@ public class StickerService implements IStickerService { } @Override public void addSticker(ISticker sticker, Identifiable identifiable){ public void addSticker(ISticker sticker, Identifiable identifiable, String data){ EntityManager em = (EntityManager) entityManager.getEntityManager(false); try { StickerObjectLink link = new StickerObjectLink(); link.setEtikette(sticker.getId()); link.setObj(identifiable.getId()); link.setData(data); em.getTransaction().begin(); em.merge(link); Loading @@ -100,6 +120,12 @@ public class StickerService implements IStickerService { } finally { entityManager.closeEntityManager(em); } } @Override public void addSticker(ISticker sticker, Identifiable identifiable){ addSticker(sticker, identifiable, null); } @Override Loading bundles/ch.elexis.core/model/model.ecore +15 −0 Original line number Diff line number Diff line Loading @@ -289,6 +289,9 @@ <eClassifiers xsi:type="ecore:EClass" name="IDocumentLetter" abstract="true" interface="true" eSuperTypes="#//IDocument"/> <eClassifiers xsi:type="ecore:EClass" name="ISticker" abstract="true" interface="true"> <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> <details key="documentation" value="A sticker is a piece of information that may be attached to an Identifiable. It can either exist for itself, or as an attachedTo (bound to an identifiable) instance."/> </eAnnotations> <eOperations name="getLabel" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> <eStructuralFeatures xsi:type="ecore:EAttribute" name="background" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> <eStructuralFeatures xsi:type="ecore:EAttribute" name="foreground" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> Loading @@ -296,6 +299,18 @@ <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> <eStructuralFeatures xsi:type="ecore:EAttribute" name="importance" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/> <eStructuralFeatures xsi:type="ecore:EReference" name="image" eType="#//IImage"/> <eStructuralFeatures xsi:type="ecore:EReference" name="attachedTo" eType="#//Identifiable" transient="true"> <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> <details key="documentation" value="If not null this is an attached instance of a sticker. "/> </eAnnotations> </eStructuralFeatures> <eStructuralFeatures xsi:type="ecore:EAttribute" name="attachedToData" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" transient="true"> <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> <details key="documentation" value="optionally attached data on an attached sticker instance"/> </eAnnotations> </eStructuralFeatures> <eGenericSuperTypes eClassifier="ecore:EClass types.ecore#//Comparable"> <eTypeArguments eClassifier="#//ISticker"/> </eGenericSuperTypes> Loading Loading
bundles/ch.elexis.core.jpa.entities/src/ch/elexis/core/jpa/entities/StickerObjectLink.java +11 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,9 @@ public class StickerObjectLink implements EntityWithId { @Column(length = 25, nullable = false) private String etikette; @Column(length = 256, nullable = true) private String data; public String getObj(){ return obj; } Loading @@ -48,6 +51,14 @@ public class StickerObjectLink implements EntityWithId { this.etikette = stickerId; } public String getData(){ return data; } public void setData(String data){ this.data = data; } @Override public int hashCode() { final int prime = 31; Loading
bundles/ch.elexis.core.jpa/db/elexisdb_create_optional.xml +14 −0 Original line number Diff line number Diff line Loading @@ -1876,4 +1876,18 @@ DROP TABLE TEMP_ETIKETTEN_OBJCLASS_LINK; <where>param='dbversion'</where> </update> </changeSet> <changeSet author="marco" id="manual_table_ETIKETTEN_OBJECT_LINK_ADD_DATA"> <preConditions onFail="MARK_RAN"> <not> <columnExists tableName="ETIKETTEN_OBJECT_LINK" columnName="DATA" /> </not> </preConditions> <addColumn tableName="ETIKETTEN_OBJECT_LINK"> <column name="DATA" type="VARCHAR(256)" /> </addColumn> </changeSet> </databaseChangeLog>
bundles/ch.elexis.core.model/src/ch/elexis/core/model/Sticker.java +29 −0 Original line number Diff line number Diff line package ch.elexis.core.model; import javax.persistence.Transient; import ch.elexis.core.jpa.entities.DbImage; import ch.elexis.core.jpa.model.adapter.AbstractIdDeleteModelAdapter; import ch.elexis.core.jpa.model.adapter.AbstractIdModelAdapter; Loading @@ -8,6 +10,12 @@ import ch.elexis.core.model.util.internal.ModelUtil; public class Sticker extends AbstractIdDeleteModelAdapter<ch.elexis.core.jpa.entities.Sticker> implements IdentifiableWithXid, ISticker { @Transient private Identifiable attachedToIdentifiable; @Transient private String attachedToData; public Sticker(ch.elexis.core.jpa.entities.Sticker entity){ super(entity); } Loading Loading @@ -110,4 +118,25 @@ public class Sticker extends AbstractIdDeleteModelAdapter<ch.elexis.core.jpa.ent public String getLabel(){ return getEntity().getName(); } @Override public Identifiable getAttachedTo(){ return attachedToIdentifiable; } @Override public void setAttachedTo(Identifiable identifiable){ this.attachedToIdentifiable = identifiable; } @Override public String getAttachedToData(){ return this.attachedToData; } @Override public void setAttachedToData(String attachedToData){ this.attachedToData = attachedToData; } }
bundles/ch.elexis.core.services/src/ch/elexis/core/services/StickerService.java +48 −22 Original line number Diff line number Diff line package ch.elexis.core.services; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; Loading @@ -18,7 +18,6 @@ import ch.elexis.core.jpa.entities.StickerObjectLink; import ch.elexis.core.jpa.entities.StickerObjectLinkId; import ch.elexis.core.model.ISticker; import ch.elexis.core.model.Identifiable; import ch.elexis.core.services.holder.CoreModelServiceHolder; @Component public class StickerService implements IStickerService { Loading @@ -45,36 +44,56 @@ public class StickerService implements IStickerService { return em.find(StickerObjectLink.class, new StickerObjectLinkId(id, etikette)); } /** * Get all {@link ISticker} linked to the provided object id. The returned list is sorted by * {@link ISticker#getImportance()}. * * @param id * @return */ private List<ISticker> getStickersForId(String id){ List<StickerObjectLink> stickerObjectLinks = getStickerObjectLinksForId(id); List<ISticker> loadedStickers = stickerObjectLinks .stream().map(sol -> CoreModelServiceHolder.get() .load(sol.getEtikette(), ISticker.class).orElse(null)) .filter(Objects::nonNull).collect(Collectors.toList()); loadedStickers.sort(new StickerSorter()); return loadedStickers; } @Override public boolean hasSticker(Identifiable identifiable, ISticker iSticker){ List<StickerObjectLink> entries = findAttachments(identifiable, iSticker); return entries.isEmpty() ? false : true; } private List<StickerObjectLink> findAttachments(Identifiable identifiable, ISticker iSticker){ EntityManager em = (EntityManager) entityManager.getEntityManager(true); TypedQuery<StickerObjectLink> query = em.createNamedQuery("StickerObjectLink.obj.etikette", StickerObjectLink.class); query.setParameter("obj", identifiable.getId()); query.setParameter("etikette", iSticker.getId()); return query.getResultList().isEmpty() ? false : true; return query.getResultList(); } @Override public List<ISticker> getStickers(Identifiable identifiable){ return getStickersForId(identifiable.getId()); List<StickerObjectLink> stickerObjectLinks = getStickerObjectLinksForId(identifiable.getId()); List<ISticker> loadedStickers = new ArrayList<>(); for (StickerObjectLink link : stickerObjectLinks) { ISticker sticker = loadStickerForStickerObjectLink(link, identifiable); if (sticker != null) { loadedStickers.add(sticker); } } loadedStickers.sort(new StickerSorter()); return loadedStickers; } @Override public ISticker getSticker(Identifiable identifiable, ISticker sticker){ List<StickerObjectLink> resultList = findAttachments(identifiable, sticker); if (resultList.isEmpty()) { return null; } StickerObjectLink stickerObjectLink = resultList.get(0); return loadStickerForStickerObjectLink(stickerObjectLink, identifiable); } private ISticker loadStickerForStickerObjectLink(StickerObjectLink stickerObjectLink, Identifiable identifiable){ ISticker sticker = iModelService.load(stickerObjectLink.getEtikette(), ISticker.class).orElse(null); if (sticker != null) { sticker.setAttachedTo(identifiable); sticker.setAttachedToData(stickerObjectLink.getData()); return sticker; } return null; } @Override Loading @@ -87,12 +106,13 @@ public class StickerService implements IStickerService { } @Override public void addSticker(ISticker sticker, Identifiable identifiable){ public void addSticker(ISticker sticker, Identifiable identifiable, String data){ EntityManager em = (EntityManager) entityManager.getEntityManager(false); try { StickerObjectLink link = new StickerObjectLink(); link.setEtikette(sticker.getId()); link.setObj(identifiable.getId()); link.setData(data); em.getTransaction().begin(); em.merge(link); Loading @@ -100,6 +120,12 @@ public class StickerService implements IStickerService { } finally { entityManager.closeEntityManager(em); } } @Override public void addSticker(ISticker sticker, Identifiable identifiable){ addSticker(sticker, identifiable, null); } @Override Loading
bundles/ch.elexis.core/model/model.ecore +15 −0 Original line number Diff line number Diff line Loading @@ -289,6 +289,9 @@ <eClassifiers xsi:type="ecore:EClass" name="IDocumentLetter" abstract="true" interface="true" eSuperTypes="#//IDocument"/> <eClassifiers xsi:type="ecore:EClass" name="ISticker" abstract="true" interface="true"> <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> <details key="documentation" value="A sticker is a piece of information that may be attached to an Identifiable. It can either exist for itself, or as an attachedTo (bound to an identifiable) instance."/> </eAnnotations> <eOperations name="getLabel" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> <eStructuralFeatures xsi:type="ecore:EAttribute" name="background" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> <eStructuralFeatures xsi:type="ecore:EAttribute" name="foreground" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> Loading @@ -296,6 +299,18 @@ <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> <eStructuralFeatures xsi:type="ecore:EAttribute" name="importance" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/> <eStructuralFeatures xsi:type="ecore:EReference" name="image" eType="#//IImage"/> <eStructuralFeatures xsi:type="ecore:EReference" name="attachedTo" eType="#//Identifiable" transient="true"> <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> <details key="documentation" value="If not null this is an attached instance of a sticker. "/> </eAnnotations> </eStructuralFeatures> <eStructuralFeatures xsi:type="ecore:EAttribute" name="attachedToData" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" transient="true"> <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> <details key="documentation" value="optionally attached data on an attached sticker instance"/> </eAnnotations> </eStructuralFeatures> <eGenericSuperTypes eClassifier="ecore:EClass types.ecore#//Comparable"> <eTypeArguments eClassifier="#//ISticker"/> </eGenericSuperTypes> Loading