use of org.alfresco.service.cmr.dictionary.TypeDefinition in project alfresco-remote-api by Alfresco.
the class CustomModelsImpl method getCustomTypes.
@Override
public CollectionWithPagingInfo<CustomType> getCustomTypes(String modelName, Parameters parameters) {
CustomModelDefinition modelDef = getCustomModelImpl(modelName);
Collection<TypeDefinition> typeDefinitions = modelDef.getTypeDefinitions();
// TODO Should we support paging?
Paging paging = Paging.DEFAULT;
List<CustomType> customTypes = convertToCustomTypes(typeDefinitions, false);
return CollectionWithPagingInfo.asPaged(paging, customTypes, false, typeDefinitions.size());
}
use of org.alfresco.service.cmr.dictionary.TypeDefinition in project alfresco-remote-api by Alfresco.
the class BulkMetadataGet method execute.
@Override
public void execute(WebScriptRequest req, WebScriptResponse res) throws IOException {
JSONObject jsonIn;
JSONArray nodeRefsArray;
try {
Content c = req.getContent();
if (c == null) {
throw new WebScriptException(Status.STATUS_BAD_REQUEST, "Missing POST body.");
}
jsonIn = new JSONObject(c.getContent());
nodeRefsArray = jsonIn.getJSONArray("nodeRefs");
if (nodeRefsArray == null || nodeRefsArray.length() == 0) {
throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR, "Must provide node refs");
}
JSONWriter jsonOut = new JSONWriter(res.getWriter());
res.setContentType("application/json");
// TODO: Should be settable on JSONWriter
res.setContentEncoding(Charset.defaultCharset().displayName());
jsonOut.startObject();
{
jsonOut.startValue("nodes");
{
jsonOut.startArray();
{
for (int i = 0; i < nodeRefsArray.length(); i++) {
NodeRef nodeRef = new NodeRef(nodeRefsArray.getString(i));
if (nodeService.exists(nodeRef)) {
NodeRef parentNodeRef = null;
ChildAssociationRef childAssocRef = nodeService.getPrimaryParent(nodeRef);
if (childAssocRef != null) {
parentNodeRef = childAssocRef.getParentRef();
}
QName type = nodeService.getType(nodeRef);
String shortType = type.toPrefixString(services.getNamespaceService());
Map<QName, Serializable> properties = nodeService.getProperties(nodeRef);
jsonOut.startObject();
{
jsonOut.writeValue("nodeRef", nodeRef.toString());
jsonOut.writeValue("parentNodeRef", parentNodeRef.toString());
jsonOut.writeValue("type", type.toString());
jsonOut.writeValue("shortType", shortType);
TypeDefinition typeDef = dictionaryService.getType(type);
jsonOut.writeValue("typeTitle", typeDef.getTitle(dictionaryService));
jsonOut.writeValue("name", (String) properties.get(ContentModel.PROP_NAME));
jsonOut.writeValue("title", (String) properties.get(ContentModel.PROP_TITLE));
jsonOut.writeValue("mimeType", getMimeType((ContentData) properties.get(ContentModel.PROP_CONTENT)));
jsonOut.writeValue("hasWritePermission", permissionService.hasPermission(nodeRef, PermissionService.WRITE) == AccessStatus.ALLOWED);
jsonOut.writeValue("hasDeletePermission", permissionService.hasPermission(nodeRef, PermissionService.DELETE) == AccessStatus.ALLOWED);
}
jsonOut.endObject();
} else {
jsonOut.startObject();
{
jsonOut.writeValue("nodeRef", nodeRef.toString());
jsonOut.writeValue("error", "true");
jsonOut.writeValue("errorCode", "invalidNodeRef");
jsonOut.writeValue("errorText", I18NUtil.getMessage("msg.invalidNodeRef", nodeRef.toString()));
}
jsonOut.endObject();
}
}
}
jsonOut.endArray();
}
jsonOut.endValue();
}
jsonOut.endObject();
} catch (JSONException jErr) {
throw new WebScriptException(Status.STATUS_BAD_REQUEST, "Unable to parse JSON POST body: " + jErr.getMessage());
}
res.getWriter().close();
res.setStatus(Status.STATUS_OK);
}
use of org.alfresco.service.cmr.dictionary.TypeDefinition in project alfresco-remote-api by Alfresco.
the class WorkflowModelBuilder method buildProperties.
private Map<String, Object> buildProperties(WorkflowTask task, Collection<String> propertyFilters) {
Map<QName, Serializable> properties = task.getProperties();
Collection<QName> keys;
if (propertyFilters == null || propertyFilters.size() == 0) {
TypeDefinition taskType = task.getDefinition().getMetadata();
Map<QName, PropertyDefinition> propDefs = taskType.getProperties();
Map<QName, AssociationDefinition> assocDefs = taskType.getAssociations();
Set<QName> propKeys = properties.keySet();
keys = new HashSet<QName>(propDefs.size() + assocDefs.size() + propKeys.size());
keys.addAll(propDefs.keySet());
keys.addAll(assocDefs.keySet());
keys.addAll(propKeys);
keys.add(WorkflowModel.PROP_HIDDEN_TRANSITIONS);
} else {
keys = buildQNameKeys(propertyFilters);
}
Map<String, Object> result = buildQNameProperties(properties, keys, task);
// ALF-18092: Special handling for the "hiddenTransitions" property, as it can be an empty string
if (keys.contains(WorkflowModel.PROP_HIDDEN_TRANSITIONS)) {
List<?> hiddenTransitions = getHiddenTransitions(properties);
if (hiddenTransitions != null) {
result.put(qNameConverter.mapQNameToName(WorkflowModel.PROP_HIDDEN_TRANSITIONS), hiddenTransitions);
}
}
return result;
}
use of org.alfresco.service.cmr.dictionary.TypeDefinition in project alfresco-remote-api by Alfresco.
the class ProcessDefinitionsImpl method getStartFormModel.
@Override
public CollectionWithPagingInfo<FormModelElement> getStartFormModel(String definitionId, Paging paging) {
// first validate if user is allowed to access the process definition if workflows are deployed per tenant
if (tenantService.isEnabled() && deployWorkflowsInTenant) {
ProcessDefinitionQuery query = activitiProcessEngine.getRepositoryService().createProcessDefinitionQuery().processDefinitionId(definitionId);
query.processDefinitionKeyLike("@" + TenantUtil.getCurrentDomain() + "@%");
org.activiti.engine.repository.ProcessDefinition processDefinition = query.singleResult();
if (processDefinition == null) {
throw new EntityNotFoundException(definitionId);
}
}
StartFormData startFormData = activitiProcessEngine.getFormService().getStartFormData(definitionId);
if (startFormData == null) {
throw new EntityNotFoundException(definitionId);
}
if (qNameConverter == null) {
qNameConverter = new WorkflowQNameConverter(namespaceService);
}
if (workflowFactory == null) {
workflowFactory = new WorkflowObjectFactory(qNameConverter, tenantService, messageService, dictionaryService, engineId, defaultStartTaskType);
}
// Lookup type definition for the startTask
TypeDefinition startTaskType = workflowFactory.getTaskFullTypeDefinition(startFormData.getFormKey(), true);
return getFormModelElements(startTaskType, paging);
}
use of org.alfresco.service.cmr.dictionary.TypeDefinition in project alfresco-remote-api by Alfresco.
the class ProcessesImpl method create.
@Override
public ProcessInfo create(ProcessInfo process) {
if (process == null) {
throw new InvalidArgumentException("post body expected when starting a new process instance");
}
boolean definitionExistingChecked = false;
RuntimeService runtimeService = activitiProcessEngine.getRuntimeService();
String processDefinitionId = null;
if (process.getProcessDefinitionId() != null) {
processDefinitionId = process.getProcessDefinitionId();
} else if (process.getProcessDefinitionKey() != null) {
ProcessDefinition definition = activitiProcessEngine.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey(getProcessDefinitionKey(process.getProcessDefinitionKey())).latestVersion().singleResult();
if (definition == null) {
throw new InvalidArgumentException("No workflow definition could be found with key '" + process.getProcessDefinitionKey() + "'.");
}
processDefinitionId = definition.getId();
definitionExistingChecked = true;
} else {
throw new InvalidArgumentException("Either processDefinitionId or processDefinitionKey is required");
}
if (definitionExistingChecked == false) {
// Check if the required definition actually exists
ProcessDefinitionQuery query = activitiProcessEngine.getRepositoryService().createProcessDefinitionQuery().processDefinitionId(processDefinitionId);
if (tenantService.isEnabled() && deployWorkflowsInTenant) {
query.processDefinitionKeyLike("@" + TenantUtil.getCurrentDomain() + "@%");
}
if (query.count() == 0) {
throw new InvalidArgumentException("No workflow definition could be found with id '" + processDefinitionId + "'.");
}
}
Map<QName, Serializable> startParams = new HashMap<QName, Serializable>();
StartFormData startFormData = activitiProcessEngine.getFormService().getStartFormData(processDefinitionId);
if (startFormData != null) {
if (CollectionUtils.isEmpty(process.getVariables()) == false) {
TypeDefinition startTaskType = getWorkflowFactory().getTaskFullTypeDefinition(startFormData.getFormKey(), true);
// Lookup type definition for the startTask
Map<QName, PropertyDefinition> taskProperties = startTaskType.getProperties();
Map<String, QName> propNameMap = new HashMap<String, QName>();
for (QName key : taskProperties.keySet()) {
propNameMap.put(key.getPrefixString().replace(':', '_'), key);
}
Map<QName, AssociationDefinition> taskAssociations = startTaskType.getAssociations();
for (QName key : taskAssociations.keySet()) {
propNameMap.put(key.getPrefixString().replace(':', '_'), key);
}
for (String variableName : process.getVariables().keySet()) {
if (propNameMap.containsKey(variableName)) {
Object variableValue = process.getVariables().get(variableName);
if (taskAssociations.containsKey(propNameMap.get(variableName))) {
AssociationDefinition associationDef = taskAssociations.get(propNameMap.get(variableName));
variableValue = convertAssociationDefinitionValue(associationDef, variableName, variableValue);
} else if (taskProperties.containsKey(propNameMap.get(variableName))) {
PropertyDefinition propDef = taskProperties.get(propNameMap.get(variableName));
DataTypeDefinition propDataType = propDef.getDataType();
if ("java.util.Date".equalsIgnoreCase(propDataType.getJavaClassName())) {
// fix for different ISO 8601 Date format classes in Alfresco (org.alfresco.util and Spring Surf)
variableValue = ISO8601DateFormat.parse((String) variableValue);
}
}
if (variableValue instanceof Serializable) {
startParams.put(propNameMap.get(variableName), (Serializable) variableValue);
}
}
}
}
}
String currentUserName = AuthenticationUtil.getFullyAuthenticatedUser();
Authentication.setAuthenticatedUserId(currentUserName);
NodeRef workflowPackageNodeRef = null;
try {
workflowPackageNodeRef = workflowPackageComponent.createPackage(null);
startParams.put(WorkflowModel.ASSOC_PACKAGE, workflowPackageNodeRef);
} catch (Exception e) {
throw new ApiException("couldn't create workflow package: " + e.getMessage(), e);
}
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(process.getItems())) {
try {
for (String item : process.getItems()) {
NodeRef itemNodeRef = getNodeRef(item);
QName workflowPackageItemId = QName.createQName("wpi", itemNodeRef.toString());
nodeService.addChild(workflowPackageNodeRef, itemNodeRef, WorkflowModel.ASSOC_PACKAGE_CONTAINS, workflowPackageItemId);
}
} catch (Exception e) {
throw new ApiException("Error while adding items to package: " + e.getMessage(), e);
}
}
// Set start task properties. This should be done before instance is started, since it's id will be used
Map<String, Object> variables = getPropertyConverter().getStartVariables(processDefinitionId, startParams);
variables.put(WorkflowConstants.PROP_CANCELLED, Boolean.FALSE);
// Add company home
Object companyHome = getNodeConverter().convertNode(repositoryHelper.getCompanyHome());
variables.put(WorkflowConstants.PROP_COMPANY_HOME, companyHome);
// Add the initiator
NodeRef initiator = getPersonNodeRef(currentUserName);
if (initiator != null) {
variables.put(WorkflowConstants.PROP_INITIATOR, nodeConverter.convertNode(initiator));
// Also add the initiator home reference, if one exists
NodeRef initiatorHome = (NodeRef) nodeService.getProperty(initiator, ContentModel.PROP_HOMEFOLDER);
if (initiatorHome != null) {
variables.put(WorkflowConstants.PROP_INITIATOR_HOME, nodeConverter.convertNode(initiatorHome));
}
}
if (tenantService.isEnabled()) {
// Specify which tenant domain the workflow was started in.
variables.put(ActivitiConstants.VAR_TENANT_DOMAIN, TenantUtil.getCurrentDomain());
}
// Start the process-instance
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, process.getBusinessKey(), variables);
if (processInstance.isEnded() == false) {
runtimeService.setVariable(processInstance.getProcessInstanceId(), ActivitiConstants.PROP_START_TASK_END_DATE, new Date());
}
HistoricProcessInstance historicProcessInstance = activitiProcessEngine.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
return createProcessInfo(historicProcessInstance);
}
Aggregations