Commit df6d2aa0 authored by Marco Descher's avatar Marco Descher
Browse files

[16258] StickerService allow adding detail data to an attached sticker

parent 2bd0f7fb
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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;
	}
@@ -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;
+14 −0
Original line number Diff line number Diff line
@@ -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>
+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;
@@ -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);
	}
@@ -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;
	}
}
+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;

@@ -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 {
@@ -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
@@ -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);
@@ -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
+15 −0
Original line number Diff line number Diff line
@@ -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"/>
@@ -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