|
|
|
@ -6,14 +6,11 @@ import java.io.FileNotFoundException;
|
|
|
|
|
import java.io.FileOutputStream; |
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.io.InputStream; |
|
|
|
|
import java.util.HashMap; |
|
|
|
|
import java.util.Map; |
|
|
|
|
import java.util.zip.ZipEntry; |
|
|
|
|
import java.util.zip.ZipInputStream; |
|
|
|
|
|
|
|
|
|
import javax.jcr.Node; |
|
|
|
|
import javax.jcr.Session; |
|
|
|
|
|
|
|
|
|
import org.apache.sling.api.resource.Resource; |
|
|
|
|
import org.apache.sling.api.resource.ResourceResolver; |
|
|
|
|
import org.osgi.framework.Constants; |
|
|
|
|
import org.osgi.service.component.annotations.Component; |
|
|
|
|
import org.osgi.service.component.annotations.Reference; |
|
|
|
@ -25,12 +22,9 @@ import com.adobe.granite.workflow.WorkflowSession;
|
|
|
|
|
import com.adobe.granite.workflow.exec.WorkItem; |
|
|
|
|
import com.adobe.granite.workflow.exec.WorkflowProcess; |
|
|
|
|
import com.adobe.granite.workflow.metadata.MetaDataMap; |
|
|
|
|
|
|
|
|
|
import com.day.cq.search.PredicateGroup; |
|
|
|
|
import com.day.cq.search.Query; |
|
|
|
|
import com.day.cq.dam.api.Asset; |
|
|
|
|
import com.day.cq.dam.api.AssetManager; |
|
|
|
|
import com.day.cq.search.QueryBuilder; |
|
|
|
|
import com.day.cq.search.result.Hit; |
|
|
|
|
import com.day.cq.search.result.SearchResult; |
|
|
|
|
|
|
|
|
|
@Component(property = { |
|
|
|
|
Constants.SERVICE_DESCRIPTION + "=Extracts a SCORM content package and puts it somewhere", |
|
|
|
@ -40,51 +34,65 @@ import com.day.cq.search.result.SearchResult;
|
|
|
|
|
public class ScormExtractor implements WorkflowProcess { |
|
|
|
|
private static final Logger log = LoggerFactory.getLogger(ScormExtractor.class); |
|
|
|
|
|
|
|
|
|
ResourceResolver resourceResolver; |
|
|
|
|
|
|
|
|
|
@Reference |
|
|
|
|
QueryBuilder queryBuilder; |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void execute(WorkItem arg0, WorkflowSession arg1, MetaDataMap arg2) throws WorkflowException { |
|
|
|
|
public void execute(WorkItem wi, WorkflowSession ws, MetaDataMap mdm) throws WorkflowException { |
|
|
|
|
|
|
|
|
|
resourceResolver = ws.adaptTo(ResourceResolver.class); |
|
|
|
|
|
|
|
|
|
log.warn("SCORM WORKFLOW: MetaDataMap args: " + arg2.get("PROCESS_ARGS", "string").toString()); |
|
|
|
|
String[] params = arg2.get("PROCESS_ARGS", "string").toString().split(","); |
|
|
|
|
String attachmentsPath = params[0]; |
|
|
|
|
log.warn("SCORM WORKFLOW: MetaDataMap args: " + mdm.get("PROCESS_ARGS", "string").toString()); |
|
|
|
|
String[] params = mdm.get("PROCESS_ARGS", "string").toString().split(","); |
|
|
|
|
//String attachmentsPath = params[0];
|
|
|
|
|
String saveToLocation = params[1]; |
|
|
|
|
log.warn("SCORM WORKFLOW: payload path: " + arg0.getContentPath()); |
|
|
|
|
String payloadPath = arg0.getWorkflowData().getPayload().toString(); |
|
|
|
|
Map<String, String> map = new HashMap<String, String> (); |
|
|
|
|
map.put("path", payloadPath + "/" + attachmentsPath); |
|
|
|
|
unzipFile(saveToLocation, payloadPath); |
|
|
|
|
//File saveLocationFolder = new File(saveToLocation);
|
|
|
|
|
//if (!saveLocationFolder.exists()) {
|
|
|
|
|
// saveLocationFolder.mkdirs();
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
map.put("type", "nt:file"); |
|
|
|
|
//throw new UnsupportedOperationException("Unimplemented method 'execute'");
|
|
|
|
|
log.warn("SCORM WORKFLOW: payload path: " + wi.getContentPath()); |
|
|
|
|
String payloadPath = wi.getWorkflowData().getPayload().toString(); |
|
|
|
|
unzipFile(payloadPath, saveToLocation); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void unzipFile(String filePath, String outputFolder) { |
|
|
|
|
try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream(filePath))) { |
|
|
|
|
log.warn("SCORM WORKFLOW: inside unzipFile: filePath - " + filePath); |
|
|
|
|
log.warn("SCORM WORKFLOW: inside unzipFile: outputFolder - " + outputFolder); |
|
|
|
|
|
|
|
|
|
Resource zipfile = resourceResolver.getResource(filePath); |
|
|
|
|
AssetManager am = resourceResolver.adaptTo(AssetManager.class); |
|
|
|
|
Asset a = zipfile.adaptTo(Asset.class); |
|
|
|
|
log.warn("SCORM WORKFLOW: Asset - " + a); |
|
|
|
|
InputStream is = a.getOriginal().getStream(); |
|
|
|
|
//NOTE: for some reason 'a' is returning NULL
|
|
|
|
|
|
|
|
|
|
try (ZipInputStream zipIn = new ZipInputStream(is)) { |
|
|
|
|
ZipEntry entry = zipIn.getNextEntry(); |
|
|
|
|
while (entry != null) { |
|
|
|
|
String zipFilePath = outputFolder + File.separator + entry.getName(); |
|
|
|
|
log.warn("SCORM WORKFLOW: zipFilePath: " + zipFilePath); |
|
|
|
|
// Extract file
|
|
|
|
|
if (!entry.isDirectory()) { |
|
|
|
|
try (FileOutputStream fos = new FileOutputStream(filePath)) { |
|
|
|
|
File f = new File(entry.getName()); |
|
|
|
|
try (FileOutputStream fos = new FileOutputStream(f)) { |
|
|
|
|
byte[] buffer = new byte[1024]; |
|
|
|
|
int length; |
|
|
|
|
while ((length = zipIn.read(buffer)) >= 0) { |
|
|
|
|
fos.write(buffer, 0, length); |
|
|
|
|
} |
|
|
|
|
InputStream fis = new FileInputStream(f); |
|
|
|
|
am.createAsset(zipFilePath, fis, null, true); |
|
|
|
|
log.warn("SCORM WORKFLOW: file extracted: " + zipFilePath); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
zipIn.closeEntry(); |
|
|
|
|
entry = zipIn.getNextEntry(); |
|
|
|
|
} |
|
|
|
|
} catch (FileNotFoundException e) { |
|
|
|
|
log.error(e.getMessage()); |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
log.error(e.getMessage()); |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|