use of org.craftercms.studio.api.v1.to.DmDependencyTO in project studio by craftercms.
the class ClipboardServiceImpl method pasteItems.
/**
* Recursive paste operation on item and it's children
* @param site site ID
* @param destinationPath destination path for itme
* @param clipOps ops to be pasted
* @param pastedItems collection of (new) pasted paths
*/
protected void pasteItems(String site, String destinationPath, Set<ClipboardItem> clipOps, Set<String> pastedItems) throws ServiceLayerException {
for (ClipboardItem op : clipOps) {
try {
String newPath = null;
boolean cut = op.isCut;
if (cut) {
// RDTMP_COPYPASTE
// CopyContent inteface is able to send status and new path yet
workflowService.cleanWorkflow(op.path, site, Collections.<DmDependencyTO>emptySet());
newPath = contentService.moveContent(site, op.path, destinationPath);
} else {
// RDTMP_COPYPASTE
// CopyContent inteface is able to send status and new path yet
newPath = contentService.copyContent(site, op.path, destinationPath);
// recurse on copied children
pasteItems(site, newPath, op.children, pastedItems);
}
pastedItems.add(newPath);
} catch (Exception err) {
logger.error("Paste operation failed for item '{0}' to dest path `{1}', isCut: '{2}'", err);
}
}
// trigger preview deploy
PreviewEventContext context = new PreviewEventContext();
context.setSite(site);
eventService.publish(EVENT_PREVIEW_SYNC, context);
}
use of org.craftercms.studio.api.v1.to.DmDependencyTO in project studio by craftercms.
the class DependencyRules method applyRejectRule.
public Set<DmDependencyTO> applyRejectRule(DmDependencyTO submittedItem) {
Set<DmDependencyTO> dependencies = new HashSet<DmDependencyTO>();
if (submittedItem.isSubmittedForDeletion()) {
return applyDeleteDependencyRule(submittedItem);
}
if (submittedItem.getDocuments() != null) {
for (DmDependencyTO document : submittedItem.getDocuments()) {
dependencies.add(document);
Set<DmDependencyTO> dependencyTOSet = applySubmitRule(document);
dependencies.addAll(dependencyTOSet);
}
}
// get components
if (submittedItem.getComponents() != null) {
for (DmDependencyTO component : submittedItem.getComponents()) {
dependencies.add(component);
Set<DmDependencyTO> dependencyTOSet = applySubmitRule(component);
dependencies.addAll(dependencyTOSet);
}
}
// get components
if (submittedItem.getAssets() != null) {
for (DmDependencyTO asset : submittedItem.getAssets()) {
dependencies.add(asset);
Set<DmDependencyTO> dependencyTOSet = applySubmitRule(asset);
dependencies.addAll(dependencyTOSet);
}
}
// get templates
if (submittedItem.getRenderingTemplates() != null) {
for (DmDependencyTO template : submittedItem.getRenderingTemplates()) {
dependencies.add(template);
Set<DmDependencyTO> dependencyTOSet = applySubmitRule(template);
dependencies.addAll(dependencyTOSet);
}
}
// get level descriptors
if (submittedItem.getLevelDescriptors() != null) {
for (DmDependencyTO ld : submittedItem.getLevelDescriptors()) {
dependencies.add(ld);
Set<DmDependencyTO> dependencyTOSet = applySubmitRule(ld);
dependencies.addAll(dependencyTOSet);
}
}
return dependencies;
}
use of org.craftercms.studio.api.v1.to.DmDependencyTO in project studio by craftercms.
the class WorkflowServiceImpl method submitThisAndReferredComponents.
protected void submitThisAndReferredComponents(DmDependencyTO submittedItem, String site, ZonedDateTime scheduledDate, boolean sendEmail, boolean submitForDeletion, String submittedBy, DependencyRules rule, String submissionComment, String environment) throws ServiceLayerException {
doSubmit(site, submittedItem, scheduledDate, sendEmail, submitForDeletion, submittedBy, true, submissionComment, environment);
Set<DmDependencyTO> stringSet;
if (submitForDeletion) {
stringSet = rule.applyDeleteDependencyRule(submittedItem);
} else {
stringSet = rule.applySubmitRule(submittedItem);
}
for (DmDependencyTO s : stringSet) {
ContentItemTO contentItem = contentService.getContentItem(site, s.getUri());
boolean lsendEmail = true;
boolean lnotifyAdmin = true;
lsendEmail = sendEmail && ((!contentItem.isDocument() && !contentItem.isComponent() && !contentItem.isAsset()));
lnotifyAdmin = (!contentItem.isDocument() && !contentItem.isComponent() && !contentItem.isAsset());
// notify admin will always be true, unless for dependent document/banner/other-files
doSubmit(site, s, scheduledDate, lsendEmail, submitForDeletion, submittedBy, lnotifyAdmin, submissionComment, environment);
}
}
use of org.craftercms.studio.api.v1.to.DmDependencyTO in project studio by craftercms.
the class WorkflowServiceImpl method approveWithoutDependencies.
/**
* approve workflows and schedule them as specified in the request
*
* @param site
* @param request
* @return call result
* @throws ServiceLayerException
*/
@SuppressWarnings("unchecked")
protected ResultTO approveWithoutDependencies(String site, String request, Operation operation) {
String approver = securityService.getCurrentUser();
ResultTO result = new ResultTO();
try {
JSONObject requestObject = JSONObject.fromObject(request);
JSONArray items = requestObject.getJSONArray(JSON_KEY_ITEMS);
String scheduledDate = null;
if (requestObject.containsKey(JSON_KEY_SCHEDULED_DATE)) {
scheduledDate = requestObject.getString(JSON_KEY_SCHEDULED_DATE);
}
boolean isNow = (requestObject.containsKey(JSON_KEY_IS_NOW)) ? requestObject.getBoolean(JSON_KEY_IS_NOW) : false;
String publishChannelGroupName = (requestObject.containsKey(JSON_KEY_PUBLISH_CHANNEL)) ? requestObject.getString(JSON_KEY_PUBLISH_CHANNEL) : null;
JSONObject jsonObjectStatus = requestObject.getJSONObject(JSON_KEY_STATUS_SET);
String statusMessage = (jsonObjectStatus != null && jsonObjectStatus.containsKey(JSON_KEY_STATUS_MESSAGE)) ? jsonObjectStatus.getString(JSON_KEY_STATUS_MESSAGE) : null;
String submissionComment = (requestObject != null && requestObject.containsKey(JSON_KEY_SUBMISSION_COMMENT)) ? requestObject.getString(JSON_KEY_SUBMISSION_COMMENT) : "Test Go Live";
MultiChannelPublishingContext mcpContext = new MultiChannelPublishingContext(publishChannelGroupName, statusMessage, submissionComment);
int length = items.size();
if (length == 0) {
throw new ServiceLayerException("No items provided to go live.");
}
List<String> submittedPaths = new ArrayList<String>();
String responseMessageKey = null;
SimpleDateFormat format = new SimpleDateFormat(StudioConstants.DATE_PATTERN_WORKFLOW_WITH_TZ);
List<DmDependencyTO> submittedItems = new ArrayList<>();
for (int index = 0; index < length; index++) {
String stringItem = items.optString(index);
submittedPaths.add(stringItem);
DmDependencyTO submittedItem = null;
submittedItem = getSubmittedItemApproveWithoutDependencies(site, stringItem, format, scheduledDate);
List<DmDependencyTO> submitForDeleteChildren = removeSubmitToDeleteChildrenForGoLive(submittedItem, operation);
if (submittedItem.isReference()) {
submittedItem.setReference(false);
}
submittedItems.add(submittedItem);
submittedItems.addAll(submitForDeleteChildren);
}
switch(operation) {
case GO_LIVE:
if (scheduledDate != null && isNow == false) {
responseMessageKey = NotificationService.COMPLETE_SCHEDULE_GO_LIVE;
} else {
responseMessageKey = NotificationService.COMPLETE_GO_LIVE;
}
List<DmDependencyTO> submitToDeleteItems = new ArrayList<>();
List<DmDependencyTO> goLiveItems = new ArrayList<>();
List<DmDependencyTO> renameItems = new ArrayList<>();
for (DmDependencyTO item : submittedItems) {
if (item.isSubmittedForDeletion()) {
submitToDeleteItems.add(item);
} else {
if (!isItemRenamed(site, item)) {
goLiveItems.add(item);
} else {
renameItems.add(item);
}
}
}
if (!submitToDeleteItems.isEmpty()) {
doDelete(site, submitToDeleteItems, approver);
}
if (!goLiveItems.isEmpty()) {
List<String> goLivePaths = new ArrayList<>();
Set<String> processedPaths = new HashSet<String>();
for (DmDependencyTO goLiveItem : goLiveItems) {
resolveSubmittedPaths(site, goLiveItem, goLivePaths, processedPaths);
}
goLive(site, goLiveItems, approver, mcpContext);
}
if (!renameItems.isEmpty()) {
List<String> renamePaths = new ArrayList<>();
List<DmDependencyTO> renamedChildren = new ArrayList<>();
for (DmDependencyTO renameItem : renameItems) {
renamedChildren.addAll(getChildrenForRenamedItem(site, renameItem));
renamePaths.add(renameItem.getUri());
objectStateService.setSystemProcessing(site, renameItem.getUri(), true);
}
for (DmDependencyTO renamedChild : renamedChildren) {
renamePaths.add(renamedChild.getUri());
objectStateService.setSystemProcessing(site, renamedChild.getUri(), true);
}
renameItems.addAll(renamedChildren);
// Set proper information of all renameItems before send them to GoLive
for (int i = 0; i < renameItems.size(); i++) {
DmDependencyTO renamedItem = renameItems.get(i);
if (renamedItem.getScheduledDate() != null && renamedItem.getScheduledDate().isAfter(ZonedDateTime.now(ZoneOffset.UTC))) {
renamedItem.setNow(false);
} else {
renamedItem.setNow(true);
}
renameItems.set(i, renamedItem);
}
goLive(site, renameItems, approver, mcpContext);
}
break;
case DELETE:
responseMessageKey = NotificationService.COMPLETE_DELETE;
List<String> deletePaths = new ArrayList<>();
List<String> nodeRefs = new ArrayList<String>();
for (DmDependencyTO deletedItem : submittedItems) {
deletePaths.add(deletedItem.getUri());
ContentItemTO contentItem = contentService.getContentItem(site, deletedItem.getUri());
if (contentItem != null) {
// nodeRefs.add(nodeRef.getId());
}
}
doDelete(site, submittedItems, approver);
}
result.setSuccess(true);
result.setStatus(200);
result.setMessage(notificationService.getNotificationMessage(site, NotificationMessageType.CompleteMessages, responseMessageKey, Locale.ENGLISH));
} catch (JSONException e) {
logger.error("error performing operation " + operation + " " + e);
result.setSuccess(false);
result.setMessage(e.getMessage());
} catch (ServiceLayerException e) {
logger.error("error performing operation " + operation + " " + e);
result.setSuccess(false);
result.setMessage(e.getMessage());
}
return result;
}
use of org.craftercms.studio.api.v1.to.DmDependencyTO in project studio by craftercms.
the class WorkflowServiceImpl method submitForApproval.
@SuppressWarnings("unchecked")
protected ResultTO submitForApproval(final String site, String submittedBy, final String request, final boolean delete) throws ServiceLayerException {
RequestContext requestContext = RequestContextBuilder.buildSubmitContext(site, submittedBy);
ResultTO result = new ResultTO();
try {
SimpleDateFormat format = new SimpleDateFormat(StudioConstants.DATE_PATTERN_WORKFLOW_WITH_TZ);
JSONObject requestObject = JSONObject.fromObject(request);
JSONArray items = requestObject.getJSONArray(JSON_KEY_ITEMS);
int length = items.size();
if (length > 0) {
for (int index = 0; index < length; index++) {
objectStateService.setSystemProcessing(site, items.optString(index), true);
}
}
boolean isNow = (requestObject.containsKey(JSON_KEY_SCHEDULE)) ? StringUtils.equalsIgnoreCase(requestObject.getString(JSON_KEY_SCHEDULE), JSON_KEY_IS_NOW) : false;
ZonedDateTime scheduledDate = null;
if (!isNow) {
scheduledDate = (requestObject.containsKey(JSON_KEY_SCHEDULED_DATE)) ? getScheduledDate(site, format, requestObject.getString(JSON_KEY_SCHEDULED_DATE)) : null;
}
boolean sendEmail = (requestObject.containsKey(JSON_KEY_SEND_EMAIL)) ? requestObject.getBoolean(JSON_KEY_SEND_EMAIL) : false;
String environment = (requestObject != null && requestObject.containsKey(JSON_KEY_ENVIRONMENT)) ? requestObject.getString(JSON_KEY_ENVIRONMENT) : null;
String submissionComment = (requestObject != null && requestObject.containsKey(JSON_KEY_SUBMISSION_COMMENT)) ? requestObject.getString(JSON_KEY_SUBMISSION_COMMENT) : null;
// TODO: check scheduled date to make sure it is not null when isNow
// = true and also it is not past
String schDate = null;
if (requestObject.containsKey(JSON_KEY_SCHEDULED_DATE)) {
schDate = requestObject.getString(JSON_KEY_SCHEDULED_DATE);
}
if (length > 0) {
List<DmDependencyTO> submittedItems = new ArrayList<DmDependencyTO>();
for (int index = 0; index < length; index++) {
String stringItem = items.optString(index);
DmDependencyTO submittedItem = getSubmittedItem(site, stringItem, format, schDate, null);
String user = submittedBy;
submittedItems.add(submittedItem);
if (delete) {
submittedItem.setSubmittedForDeletion(true);
}
}
submittedItems.addAll(addDependenciesForSubmitForApproval(site, submittedItems, format, schDate));
List<String> submittedPaths = new ArrayList<String>();
for (DmDependencyTO goLiveItem : submittedItems) {
submittedPaths.add(goLiveItem.getUri());
objectStateService.setSystemProcessing(site, goLiveItem.getUri(), true);
DependencyRules rule = new DependencyRules(site);
rule.setObjectStateService(objectStateService);
rule.setContentService(contentService);
Set<DmDependencyTO> depSet = rule.applySubmitRule(goLiveItem);
for (DmDependencyTO dep : depSet) {
submittedPaths.add(dep.getUri());
objectStateService.setSystemProcessing(site, dep.getUri(), true);
}
}
List<DmError> errors = submitToGoLive(submittedItems, scheduledDate, sendEmail, delete, requestContext, submissionComment, environment);
SiteFeed siteFeed = siteService.getSite(site);
AuditLog auditLog = auditServiceInternal.createAuditLogEntry();
auditLog.setOperation(OPERATION_REQUEST_PUBLISH);
auditLog.setActorId(submittedBy);
auditLog.setSiteId(siteFeed.getId());
auditLog.setPrimaryTargetId(site);
auditLog.setPrimaryTargetType(TARGET_TYPE_CONTENT_ITEM);
auditLog.setPrimaryTargetValue(site);
auditServiceInternal.insertAuditLog(auditLog);
result.setSuccess(true);
result.setStatus(200);
result.setMessage(notificationService.getNotificationMessage(site, NotificationMessageType.CompleteMessages, COMPLETE_SUBMIT_TO_GO_LIVE_MSG, Locale.ENGLISH));
for (String relativePath : submittedPaths) {
objectStateService.setSystemProcessing(site, relativePath, false);
}
}
} catch (Exception e) {
result.setSuccess(false);
result.setMessage(e.getMessage());
logger.error("Error while submitting content for approval.", e);
}
return result;
}
Aggregations