Vielleicht braucht der Eine oder Andere es ja noch, ... hier das gesamte Script:
/*******************
*** Beschreibung ***
*******************/
// Autor: Sebastian Stiemer (adesso AG)
//
// Parameter:
// p_newsletterArchivMediaFolderUid (Pflicht) - in welchem MediaOrdner (Referenzname) sollen die NewsletterPDFs importiert werden? z.B. "newsletter_archiv"
// p_pdf_channel_nr (Pflicht) - Welche Nr hat der PDF Ausgabekanal in dem entsprechenden Projekt? z.B. "1"
//
// Das im zuvor ausgeführten Generierungstask generiert Newsletter-PDFs werden in
// die Medienverwaltung des Projekts importiert
// 1. es werden die Pfade der generierten PDFs in allen Sprachen im Generierungsordner des FiSp-Servers ermittelt
// 2. es wird ein neues sprachabhängiges Medium angelegt, bzw. sollte es das Medium schon geben, wird das bestehende genommen
// 3. Der Inhalt des Mediums wird mit den sprachabhängigen generierten PDF-Dateien befüllt
// 4. der Newsletter-Archiv-Ordner wird rekursiv freigegeben
//
// in mindestens einem Template, welches im Generate Task generiert wird, muss in einen Ausgabekanal folgende Zeile:
// $CMS_SET(void, #global.scheduleContext.setProperty("generationContext", #global.generationContext))$
// um dann hier im Script an den generationContext zu gelangen
//
// es wird eine eigene Verbindung für das Script benötigt
/**************
*** Imports ***
**************/
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import de.espirit.firstspirit.access.AccessUtil;
import de.espirit.firstspirit.access.GenerationContext;
import de.espirit.firstspirit.access.Language;
import de.espirit.firstspirit.access.schedule.GenerateTask;
import de.espirit.firstspirit.access.schedule.ScheduleContext;
import de.espirit.firstspirit.access.schedule.ScheduleTask;
import de.espirit.firstspirit.access.schedule.ScriptTask;
import de.espirit.firstspirit.access.store.ElementDeletedException;
import de.espirit.firstspirit.access.store.IDProvider;
import de.espirit.firstspirit.access.store.LockException;
import de.espirit.firstspirit.access.store.Store;
import de.espirit.firstspirit.access.store.mediastore.Media;
import de.espirit.firstspirit.access.store.mediastore.MediaFolder;
import de.espirit.firstspirit.access.store.mediastore.MediaStoreRoot;
import de.espirit.firstspirit.access.store.sitestore.PageRef;
import de.espirit.firstspirit.access.store.sitestore.SiteStoreFolder;
import de.espirit.firstspirit.agency.StoreAgent;
/**************
*** Methods ***
**************/
// guckt im aktuellen Auftrag ob es genau 1. Teilgenerierungstask gibt und gibt diesen zurück
static GenerateTask getPartialGenerateTask(){
List<ScheduleTask> scheduleTasks = context.getTask().getScheduleEntry().getTasks();
boolean partialGenerateTaskFound = false;
GenerateTask generateTask = null;
for (ScheduleTask scheduleTask : scheduleTasks) {
if(scheduleTask instanceof GenerateTask && (((GenerateTask) scheduleTask).getType() == GenerateTask.Type.Partial)) {
if (!partialGenerateTaskFound) {
generateTask = (GenerateTask) scheduleTask;
partialGenerateTaskFound = true;
} else {
throw new IllegalArgumentException("There is more then one partly-generation-task in this shedule-entry");
}
}
}
return generateTask;
}
// holt einen Scriptparaemter
static String getScriptParameter(String key, Boolean required) {
String paramValue = null;
ScriptTask task = (ScriptTask) context.getTask();
for (Entry param : task.getParameters()) {
if(param.getKey().equals(key)) {
paramValue = (String) param.getValue();
break;
}
}
if(required && paramValue == null){
throw new IllegalArgumentException("Script-Property with key '" + key + "' cant be empty!");
}
return paramValue;
}
/**************
*** Main ***
**************/
// generationContext holen
GenerateTask generateTask = getPartialGenerateTask();
GenerationContext generationContext = (GenerationContext) context.getProperty("generationContext");
// Script-Parameter
String p_newsletterArchivMediaFolderUid = getScriptParameter("p_newsletterArchivMediaFolderUid", true);
String p_pdf_channel_nr = getScriptParameter("p_pdf_channel_nr", true);
if(p_pdf_channel_nr.equals("0")) {
p_pdf_channel_nr = "";
}
else {
p_pdf_channel_nr = "_" + p_pdf_channel_nr;
}
// PageRef des Newsletters
PageRef newsletterPageRef = (PageRef) generateTask.getStartNodes().get(0);
// Alle Projekt-Sprachen
List<Language> projectLanguages = context.getProject().getLanguages();
// Ermitteln aller ParentFolders ausgehend vom Newsletter-PageRef in der Seitenstruktur
SiteStoreFolder parentFolder = newsletterPageRef.getParentFolder();
String parentFolders = "";
while (!"root".equals(parentFolder.getUid())) {
parentFolders = parentFolder.getUid() + "/" + parentFolders;
parentFolder = parentFolder.getParentFolder();
}
// Zusammenbau der Pfade zum Newsletter-PDF für jede Sprache
ArrayList pdfFiles = new ArrayList();
for (Language language : projectLanguages) {
pdfFiles.add(generationContext.getBasePath() + language.getLocale().getLanguage() + p_pdf_channel_nr + "/" + parentFolders + newsletterPageRef.getFilename() + "_" + newsletterPageRef.getContent2Params().getFilterParams().get("newsletterId") + ".pdf");
}
// Speichern der PDF Datei im MediaStore ///////////
File file = new File((String) pdfFiles.get(0));
StoreAgent storeAgent = context.requestSpecialist(StoreAgent.TYPE);
MediaStoreRoot mediaStore = (MediaStoreRoot) storeAgent.getStore(Store.Type.MEDIASTORE);
IDProvider storeElement = null;
IDProvider newsletterArchiv = mediaStore.getStoreElement(p_newsletterArchivMediaFolderUid, IDProvider.UidType.MEDIASTORE_FOLDER);
// wurde die PDF Datei schon einmal angelegt? Wenn ja Update, wenn nein wird ein neues Medium angelegt
storeElement = mediaStore.getStoreElement(file.getName(), IDProvider.UidType.MEDIASTORE_LEAF);
if(storeElement == null) {
try {
storeElement = ((MediaFolder) newsletterArchiv).createMedia(file.getName(), file.getName(), Media.FILE, true);
} catch (Exception e) {
context.logWarning(e.getMessage());
}
}
// der Inhalt des Mediums wird mit den sprachabhängigen PDF-Dateien gefüllt
Media media = (Media) storeElement;
context.logInfo(String.format("uploading '%s' --> '%s'", file.getAbsolutePath(), media.getReferenceName()));
try {
media.setLock(true);
int i = 0;
for ( Language language : projectLanguages) {
file = new File((String) pdfFiles.get(i));
i++;
// Prüfung op die Datei (in der aktuellen Sprache) auch wirklich generiert wurde. falls nicht, dann ab zur nächsten Sprache
if(!file.isFile()) {
continue;
}
FileInputStream fis = new FileInputStream(file);
de.espirit.firstspirit.access.store.mediastore.File fileOfMedia = media.getFile(language);
fileOfMedia.setFile(file.length(), fis, "pdf");
}
media.save();
} catch (IOException e) {
context.logWarning(String.format("Can not read '%s' from disk. \n %s", file.getAbsolutePath(), e));
} catch (LockException e) {
context.logWarning(String.format("Can not lock Storelement '%s'. \n %s", storeElement.getReferenceName(), e));
} catch (ElementDeletedException e) {
context.logWarning(String.format("Can not lock Storelement '%s'. Element is probably deleted. \n %s", storeElement.getReferenceName(), e));
} finally {
try {
media.release();
media.setLock(false);
} catch (LockException e) {
context.logWarning(String.format("Can not unlock Storelement '%s'. \n %s", storeElement.getReferenceName(), e));
} catch (ElementDeletedException e) {
context.logWarning(String.format("Can not unlock Storelement '%s'. Element is probably deleted. \n %s", storeElement.getReferenceName(), e));
}
// newsletterArchiv rekursiv freigeben
try {
newsletterArchiv.setLock(true);
newsletterArchiv.release();
newsletterArchiv.setLock(false);
} catch (LockException e) {
context.logWarning(String.format("Can not unlock Storelement '%s'. \n %s", newsletterArchiv.getReferenceName(), e));
} catch (ElementDeletedException e) {
context.logWarning(String.format("Can not unlock Storelement '%s'. Element is probably deleted. \n %s", newsletterArchiv.getReferenceName(), e));
}
AccessUtil.release(newsletterArchiv, false, true, true, IDProvider.DependentReleaseType.NO_DEPENDENT_RELEASE, "Script: sc_archiveNewsletterPDF > release");
}