use of org.olat.portfolio.model.structel.EPStructureToStructureLink in project openolat by klemens.
the class EPStructureManager method syncEPStructureElementRecursively.
/**
* This sync method syncs the structure of the tree, collect restriction, title, description, representation-mode (table/miniview)
*
* @param sourceEl
* @param targetEl
* @param withArtefacts
*/
private void syncEPStructureElementRecursively(EPStructureElement sourceEl, EPStructureElement targetEl, boolean withArtefacts) {
List<EPStructureToStructureLink> sourceRefLinks = new ArrayList<EPStructureToStructureLink>(sourceEl.getInternalChildren());
List<EPStructureToStructureLink> targetRefLinks = new ArrayList<EPStructureToStructureLink>(targetEl.getInternalChildren());
Comparator<EPStructureToStructureLink> COMPARATOR = new KeyStructureToStructureLinkComparator();
// remove deleted elements
for (Iterator<EPStructureToStructureLink> targetIt = targetEl.getInternalChildren().iterator(); targetIt.hasNext(); ) {
EPStructureToStructureLink targetLink = targetIt.next();
int index = indexOf(sourceRefLinks, targetLink, COMPARATOR);
if (index < 0) {
targetIt.remove();
removeStructureRecursively(targetLink.getChild());
}
}
// add new element
for (EPStructureToStructureLink sourceRefLink : sourceRefLinks) {
int index = indexOf(targetRefLinks, sourceRefLink, COMPARATOR);
if (index < 0) {
// create a new structure element, dont clone restriction!
copy(sourceRefLink, targetEl, withArtefacts, false, false);
}
}
// sync attributes, representation and collect restrictions
copyOrUpdateCollectRestriction(sourceEl, targetEl, true);
targetEl.setArtefactRepresentationMode(sourceEl.getArtefactRepresentationMode());
targetEl.setStyle(sourceEl.getStyle());
targetEl.setTitle(sourceEl.getTitle());
targetEl.setDescription(sourceEl.getDescription());
// at this point, we must have the same content in the two list
// but with perhaps other ordering: reorder
List<EPStructureToStructureLink> targetLinks = targetEl.getInternalChildren();
for (int i = 0; i < sourceRefLinks.size(); i++) {
EPStructureToStructureLink sourceRefLink = sourceRefLinks.get(i);
int index = indexOf(targetLinks, sourceRefLink, COMPARATOR);
if (index == i) {
// great, right at its position
} else if (index > i) {
Collections.swap(targetLinks, i, index);
} else {
// not possible
}
// sync recursively
if (index >= 0) {
EPStructureElement subSourceEl = (EPStructureElement) sourceRefLink.getChild();
EPStructureElement subTargetEl = (EPStructureElement) targetLinks.get(i).getChild();
syncEPStructureElementRecursively(subSourceEl, subTargetEl, withArtefacts);
}
}
targetEl = dbInstance.getCurrentEntityManager().merge(targetEl);
}
use of org.olat.portfolio.model.structel.EPStructureToStructureLink in project openolat by klemens.
the class EPStructureManager method copy.
/**
* Copy/Import structure elements recursively
* @param refLink
* @param targetEl
* @param withArtefacts Copy the artefacts
* @param importEl Don't load elements from the DB
* @param cloneRestrictions should the collect-restrictions be applied? you could also do this manually by copyCollectRestriction()
*/
private void copy(EPStructureToStructureLink refLink, EPStructureElement targetEl, boolean withArtefacts, boolean importEl, boolean cloneRestrictions) {
EPStructureElement childSourceEl = (EPStructureElement) refLink.getChild();
EPStructureElement clonedChildEl = instantiateClone(refLink.getChild());
if (clonedChildEl == null) {
log.warn("Attempt to clone an unsupported structure type: " + refLink.getChild(), null);
} else {
OLATResource resource = resourceManager.createOLATResourceInstance(clonedChildEl.getClass());
clonedChildEl.setOlatResource(resource);
// set root
if (targetEl.getRoot() == null) {
// it's the root element
clonedChildEl.setRoot(targetEl);
} else {
clonedChildEl.setRoot(targetEl.getRoot());
}
if (targetEl.getRootMap() == null && targetEl instanceof PortfolioStructureMap) {
clonedChildEl.setRootMap((PortfolioStructureMap) targetEl);
} else {
clonedChildEl.setRootMap(targetEl.getRootMap());
}
if (!importEl)
clonedChildEl.setStructureElSource(childSourceEl.getKey());
if (cloneRestrictions)
copyOrUpdateCollectRestriction(childSourceEl, clonedChildEl, true);
if (importEl) {
importEPStructureElementRecursively(childSourceEl, clonedChildEl);
} else {
copyEPStructureElementRecursively(childSourceEl, clonedChildEl, withArtefacts, cloneRestrictions);
}
EPStructureToStructureLink link = new EPStructureToStructureLink();
link.setParent(targetEl);
link.setChild(clonedChildEl);
targetEl.getInternalChildren().add(link);
}
}
use of org.olat.portfolio.model.structel.EPStructureToStructureLink in project openolat by klemens.
the class EPStructureManager method reOrderStructures.
protected boolean reOrderStructures(PortfolioStructure parent, PortfolioStructure orderSubject, int orderDest) {
EPStructureElement structureEl = (EPStructureElement) dbInstance.loadObject((EPStructureElement) parent);
List<EPStructureToStructureLink> structureLinks = structureEl.getInternalChildren();
int oldPos = indexOf(structureLinks, orderSubject);
if (oldPos != orderDest && oldPos != -1) {
EPStructureToStructureLink link = structureLinks.remove(oldPos);
if (oldPos < orderDest) {
orderDest--;
}
if (orderDest < 0) {
orderDest = 0;
} else if (orderDest > structureLinks.size()) {
// place at end
orderDest = structureLinks.size() - 1;
}
structureLinks.add(orderDest, link);
dbInstance.updateObject(structureEl);
return true;
}
return false;
}
use of org.olat.portfolio.model.structel.EPStructureToStructureLink in project openolat by klemens.
the class EPStructureManager method addStructureToStructure.
/**
* Add a child structure to the parent structure.
* @param parentStructure
* @param childStructure
* @param destinationPos set to -1 to append at the end!
*/
public void addStructureToStructure(PortfolioStructure parentStructure, PortfolioStructure childStructure, int destinationPos) {
if (parentStructure == null || childStructure == null)
throw new NullPointerException();
if (childStructure instanceof EPStructureElement) {
// save eventual changes
dbInstance.updateObject(parentStructure);
// reconnect to the session (why reconnect? you update it already)
// parentStructure = (EPStructureElement)dbInstance.loadObject((EPStructureElement)parentStructure);
EPStructureToStructureLink link = new EPStructureToStructureLink();
link.setParent(parentStructure);
link.setChild(childStructure);
// refresh internal link to its root element
((EPStructureElement) childStructure).setRoot((EPStructureElement) parentStructure);
List<EPStructureToStructureLink> internalChildren = ((EPStructureElement) parentStructure).getInternalChildren();
if (destinationPos == -1) {
internalChildren.add(link);
} else if (destinationPos <= internalChildren.size()) {
internalChildren.add(destinationPos, link);
} else {
internalChildren.add(link);
}
}
}
use of org.olat.portfolio.model.structel.EPStructureToStructureLink in project openolat by klemens.
the class EPStructureManager method importEPStructureElementRecursively.
private void importEPStructureElementRecursively(EPStructureElement sourceEl, EPStructureElement targetEl) {
// clone the links
List<EPStructureToStructureLink> childLinks = sourceEl.getInternalChildren();
for (EPStructureToStructureLink childLink : childLinks) {
EPStructureElement childSourceEl = (EPStructureElement) childLink.getChild();
// remove source-info on imports.
childSourceEl.setStructureElSource(null);
copy(childLink, targetEl, false, true, true);
}
savePortfolioStructure(targetEl);
}
Aggregations