Search in sources :

Example 1 with CustomModelNamedValue

use of org.alfresco.rest.api.model.CustomModelNamedValue in project alfresco-remote-api by Alfresco.

the class CustomModelsImpl method setConstraintOtherData.

private void setConstraintOtherData(CustomModelConstraint constraint, M2Constraint m2Constraint, String propDataType) {
    if (m2Constraint.getType() == null) {
        throw new InvalidArgumentException("cmm.rest_api.constraint_type_null");
    }
    ConstraintValidator constraintValidator = ConstraintValidator.findByType(m2Constraint.getType());
    if (propDataType != null) {
        // Check if the constraint can be used with given data type
        constraintValidator.validateUsage(prefixedStringToQname(propDataType));
    }
    m2Constraint.setTitle(constraint.getTitle());
    m2Constraint.setDescription(constraint.getDescription());
    for (CustomModelNamedValue parameter : constraint.getParameters()) {
        validateName(parameter.getName(), "cmm.rest_api.constraint_parameter_name_null");
        if (parameter.getListValue() != null) {
            if (propDataType != null && "allowedValues".equals(parameter.getName())) {
                validateListConstraint(parameter.getListValue(), propDataType);
            }
            m2Constraint.createParameter(parameter.getName(), parameter.getListValue());
        } else {
            constraintValidator.validate(parameter.getName(), parameter.getSimpleValue());
            m2Constraint.createParameter(parameter.getName(), parameter.getSimpleValue());
        }
    }
}
Also used : CustomModelNamedValue(org.alfresco.rest.api.model.CustomModelNamedValue) InvalidArgumentException(org.alfresco.rest.framework.core.exceptions.InvalidArgumentException)

Example 2 with CustomModelNamedValue

use of org.alfresco.rest.api.model.CustomModelNamedValue in project alfresco-remote-api by Alfresco.

the class TestCustomProperty method testDeleteProperty.

@Test
public void testDeleteProperty() throws Exception {
    setRequestContext(customModelAdmin);
    String modelName = "testModelDeleteProp" + System.currentTimeMillis();
    Pair<String, String> namespacePair = getTestNamespaceUriPrefixPair();
    // Create the model as a Model Administrator
    createCustomModel(modelName, namespacePair, ModelStatus.DRAFT);
    /*
         * Create aspect and update it by adding two properties
         */
    String aspectName = "testAspect1" + System.currentTimeMillis();
    createTypeAspect(CustomAspect.class, modelName, aspectName, null, null, null);
    // Update the Aspect by adding property - property one
    CustomAspect aspectPayload = new CustomAspect();
    aspectPayload.setName(aspectName);
    String aspectPropNameOne = "testAspect1Prop1" + System.currentTimeMillis();
    CustomModelProperty aspectPropOne = new CustomModelProperty();
    aspectPropOne.setName(aspectPropNameOne);
    aspectPropOne.setTitle("aspect property one title");
    aspectPropOne.setMultiValued(true);
    List<CustomModelProperty> props = new ArrayList<>(1);
    props.add(aspectPropOne);
    aspectPayload.setProperties(props);
    // create property one
    put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(aspectPayload), SELECT_PROPS_QS, 200);
    // Update the Aspect by adding another property - property two
    aspectPayload = new CustomAspect();
    aspectPayload.setName(aspectName);
    String aspectPropNameTwo = "testAspect1Prop2" + System.currentTimeMillis();
    CustomModelProperty aspectPropTwo = new CustomModelProperty();
    aspectPropTwo.setName(aspectPropNameTwo);
    aspectPropTwo.setTitle("aspect property two title");
    aspectPropTwo.setMandatory(true);
    aspectPropTwo.setDataType("d:int");
    aspectPropTwo.setDefaultValue("1");
    props = new ArrayList<>(1);
    props.add(aspectPropTwo);
    aspectPayload.setProperties(props);
    // create property two
    put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(aspectPayload), SELECT_PROPS_QS, 200);
    // Retrieve the updated aspect
    HttpResponse response = getSingle("cmm/" + modelName + "/aspects", aspectName, 200);
    CustomAspect returnedAspect = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomAspect.class);
    // Check the aspect's added properties
    assertEquals(2, returnedAspect.getProperties().size());
    /*
         * Create type and update it by adding two properties
         */
    String typeName = "testType1" + System.currentTimeMillis();
    createTypeAspect(CustomType.class, modelName, typeName, "test type1 title", null, "cm:content");
    // Update the Type by adding property - property one
    CustomType typePayload = new CustomType();
    typePayload.setName(typeName);
    String typePropNameOne = "testType1Prop1" + System.currentTimeMillis();
    CustomModelProperty typePropOne = new CustomModelProperty();
    typePropOne.setName(typePropNameOne);
    typePropOne.setTitle("type property one title");
    props = new ArrayList<>(1);
    props.add(typePropOne);
    typePayload.setProperties(props);
    // create property one
    put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(typePayload), SELECT_PROPS_QS, 200);
    // Update the Type by adding another property - property two
    typePayload = new CustomType();
    typePayload.setName(typeName);
    // Create inline MINMAX constraint
    CustomModelConstraint inlineMinMaxConstraint = new CustomModelConstraint();
    inlineMinMaxConstraint.setType("MINMAX");
    inlineMinMaxConstraint.setTitle("test MINMAX title");
    // Create the MinMax constraint's parameters
    List<CustomModelNamedValue> parameters = new ArrayList<>(2);
    parameters.add(buildNamedValue("maxValue", "100.0"));
    parameters.add(buildNamedValue("minValue", "0.0"));
    // Add the parameters into the constraint
    inlineMinMaxConstraint.setParameters(parameters);
    String typePropNameTwo = "testType1Prop2" + System.currentTimeMillis();
    CustomModelProperty typePropTwo = new CustomModelProperty();
    typePropTwo.setName(typePropNameTwo);
    typePropTwo.setTitle("type property two title");
    typePropTwo.setDataType("d:int");
    // add the inline constraint
    typePropTwo.setConstraints(Arrays.asList(inlineMinMaxConstraint));
    props = new ArrayList<>(1);
    props.add(typePropTwo);
    typePayload.setProperties(props);
    // create property one
    put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(typePayload), SELECT_PROPS_QS, 200);
    // Retrieve the updated type
    response = getSingle("cmm/" + modelName + "/types", typeName, 200);
    CustomType returnedType = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomType.class);
    // Check the type's added properties
    assertEquals(2, returnedType.getProperties().size());
    // Delete aspect's property one - model is inactive
    {
        final String deletePropOneAspectQS = getPropDeleteUpdateQS(aspectPropNameOne, true);
        // Try to delete propertyOne from aspect
        // missing payload
        put("cmm/" + modelName + "/aspects", aspectName, null, deletePropOneAspectQS, 400);
        CustomAspect deletePropAspectPayload = new CustomAspect();
        // missing aspect name
        put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(deletePropAspectPayload), deletePropOneAspectQS, 400);
        setRequestContext(nonAdminUserName);
        deletePropAspectPayload.setName(aspectName);
        // unauthorised
        put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(deletePropAspectPayload), deletePropOneAspectQS, 403);
        setRequestContext(customModelAdmin);
        // Delete as a Model Administrator
        put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(deletePropAspectPayload), deletePropOneAspectQS, 200);
        // Check the property has been deleted
        response = getSingle("cmm/" + modelName + "/aspects", aspectName, 200);
        returnedAspect = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomAspect.class);
        assertEquals(1, returnedAspect.getProperties().size());
        assertFalse("Property one should have been deleted.", aspectPropNameOne.equals(returnedAspect.getProperties().get(0).getName()));
        // Not found
        put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(deletePropAspectPayload), deletePropOneAspectQS, 404);
    }
    // Delete type's property two - model is inactive
    {
        final String deletePropTwoTypeQS = getPropDeleteUpdateQS(typePropNameTwo, true);
        // Try to delete propertyOne from type
        // missing payload
        put("cmm/" + modelName + "/types", typeName, null, deletePropTwoTypeQS, 400);
        CustomType deletePropTypePayload = new CustomType();
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(deletePropTypePayload), deletePropTwoTypeQS, // missing type name
        400);
        setRequestContext(nonAdminUserName);
        deletePropTypePayload.setName(typeName);
        // unauthorised
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(deletePropTypePayload), deletePropTwoTypeQS, 403);
        setRequestContext(customModelAdmin);
        // Delete as a Model Administrator
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(deletePropTypePayload), deletePropTwoTypeQS, 200);
        // Check the property has been deleted
        response = getSingle("cmm/" + modelName + "/types", typeName, 200);
        returnedType = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomType.class);
        assertEquals(1, returnedType.getProperties().size());
        assertFalse("Property two should have been deleted.", typePropNameTwo.equals(returnedType.getProperties().get(0).getName()));
        // Not found
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(deletePropTypePayload), deletePropTwoTypeQS, 404);
    }
    /*
         * APPSREPO-59: delete the last property of a Type / Aspect for an active model
         */
    // Activate the model
    CustomModel statusPayload = new CustomModel();
    statusPayload.setStatus(ModelStatus.ACTIVE);
    put("cmm", modelName, RestApiUtil.toJsonAsString(statusPayload), SELECT_STATUS_QS, 200);
    // Delete aspect's property two - model is active
    {
        setRequestContext(customModelAdmin);
        final String deletePropTwoAspectQS = getPropDeleteUpdateQS(aspectPropNameTwo, true);
        CustomAspect deletePropAspectPayload = new CustomAspect();
        deletePropAspectPayload.setName(aspectName);
        // Delete as a Model Administrator
        put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(deletePropAspectPayload), deletePropTwoAspectQS, 200);
        // Check the property has been deleted
        response = getSingle("cmm/" + modelName + "/aspects", aspectName, 200);
        returnedAspect = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomAspect.class);
        assertEquals("Property two should have been deleted.", 0, returnedAspect.getProperties().size());
        // Not found
        put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(deletePropAspectPayload), deletePropTwoAspectQS, 404);
    }
    // Delete type's property one - model is active
    {
        final String deletePropOneTypeQS = getPropDeleteUpdateQS(typePropNameOne, true);
        CustomType deletePropTypePayload = new CustomType();
        deletePropTypePayload.setName(typeName);
        // Delete as a Model Administrator
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(deletePropTypePayload), deletePropOneTypeQS, 200);
        // Check the property has been deleted
        response = getSingle("cmm/" + modelName + "/types", typeName, 200);
        returnedType = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomType.class);
        assertEquals("Property one should have been deleted.", 0, returnedType.getProperties().size());
        // Not found
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(deletePropTypePayload), deletePropOneTypeQS, 404);
    }
}
Also used : CustomType(org.alfresco.rest.api.model.CustomType) CustomAspect(org.alfresco.rest.api.model.CustomAspect) ArrayList(java.util.ArrayList) HttpResponse(org.alfresco.rest.api.tests.client.HttpResponse) CustomModelProperty(org.alfresco.rest.api.model.CustomModelProperty) CustomModel(org.alfresco.rest.api.model.CustomModel) CustomModelNamedValue(org.alfresco.rest.api.model.CustomModelNamedValue) CustomModelConstraint(org.alfresco.rest.api.model.CustomModelConstraint) Test(org.junit.Test)

Example 3 with CustomModelNamedValue

use of org.alfresco.rest.api.model.CustomModelNamedValue in project alfresco-remote-api by Alfresco.

the class TestCustomConstraint method testCreateMinMaxConstraintInvalid.

@Test
public void testCreateMinMaxConstraintInvalid() throws Exception {
    setRequestContext(customModelAdmin);
    String modelName = "testModelMinMaxInvalid" + System.currentTimeMillis();
    final Pair<String, String> namespacePair = getTestNamespaceUriPrefixPair();
    // Create the model as a Model Administrator
    createCustomModel(modelName, namespacePair, ModelStatus.DRAFT);
    // Create aspect
    String aspectName = "testAspect" + System.currentTimeMillis();
    createTypeAspect(CustomAspect.class, modelName, aspectName, "title", "desc", null);
    // Update the Aspect by adding property
    CustomAspect aspectPayload = new CustomAspect();
    aspectPayload.setName(aspectName);
    final String aspectPropName = "testAspect1Prop" + System.currentTimeMillis();
    CustomModelProperty aspectProp = new CustomModelProperty();
    aspectProp.setName(aspectPropName);
    aspectProp.setTitle("property title");
    aspectProp.setDataType("d:text");
    String minMaxConstraintName = "testMinMaxConstraint" + System.currentTimeMillis();
    CustomModelConstraint minMaxConstraint = new CustomModelConstraint();
    minMaxConstraint.setType("MINMAX");
    minMaxConstraint.setName(minMaxConstraintName);
    minMaxConstraint.setTitle("test MinMax title");
    minMaxConstraint.setDescription("test MinMax desc");
    // Create the MinMax constraint's parameters
    List<CustomModelNamedValue> parameters = new ArrayList<>(2);
    parameters.add(buildNamedValue("maxValue", "100.0"));
    parameters.add(buildNamedValue("minValue", "0.0"));
    // Add the parameters into the constraint
    minMaxConstraint.setParameters(parameters);
    // Add inline constraint
    aspectProp.setConstraints(Arrays.asList(minMaxConstraint));
    List<CustomModelProperty> props = new ArrayList<>(1);
    props.add(aspectProp);
    aspectPayload.setProperties(props);
    // Try to create constraint as a Model Administrator
    // MINMAX constraint can only be used with numeric data type.
    put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(aspectPayload), SELECT_PROPS_QS, 400);
    // Change type
    aspectProp.setDataType("d:datetime");
    // MINMAX constraint can only be used with numeric data type.
    put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(aspectPayload), SELECT_PROPS_QS, 400);
    // SHA-1126
    {
        // Change type
        aspectProp.setDataType("d:double");
        parameters = new ArrayList<>(2);
        parameters.add(buildNamedValue("maxValue", "0.0"));
        parameters.add(buildNamedValue("minValue", "-5.0"));
        // Add the parameters into the constraint
        minMaxConstraint.setParameters(parameters);
        // Add inline constraint
        aspectProp.setConstraints(Arrays.asList(minMaxConstraint));
        props = new ArrayList<>(1);
        props.add(aspectProp);
        aspectPayload.setProperties(props);
        // Maximum value of the MINMAX constraint must be a positive nonzero value.
        put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(aspectPayload), SELECT_PROPS_QS, 400);
    }
}
Also used : CustomModelNamedValue(org.alfresco.rest.api.model.CustomModelNamedValue) CustomAspect(org.alfresco.rest.api.model.CustomAspect) ArrayList(java.util.ArrayList) CustomModelConstraint(org.alfresco.rest.api.model.CustomModelConstraint) CustomModelProperty(org.alfresco.rest.api.model.CustomModelProperty) Test(org.junit.Test)

Example 4 with CustomModelNamedValue

use of org.alfresco.rest.api.model.CustomModelNamedValue in project alfresco-remote-api by Alfresco.

the class TestCustomProperty method testUpdateProperty.

@Test
public void testUpdateProperty() throws Exception {
    setRequestContext(customModelAdmin);
    String modelName = "testModelUpdateProp" + System.currentTimeMillis();
    Pair<String, String> namespacePair = getTestNamespaceUriPrefixPair();
    // Create the model as a Model Administrator
    createCustomModel(modelName, namespacePair, ModelStatus.DRAFT);
    /*
         * Create aspect and update it by adding a property
         */
    String aspectName = "testAspect1" + System.currentTimeMillis();
    createTypeAspect(CustomAspect.class, modelName, aspectName, null, null, null);
    // Update the Aspect by adding property
    CustomAspect aspectPayload = new CustomAspect();
    aspectPayload.setName(aspectName);
    String aspectPropName = "testAspect1Prop" + System.currentTimeMillis();
    CustomModelProperty aspectProp = new CustomModelProperty();
    aspectProp.setName(aspectPropName);
    aspectProp.setTitle("aspect property title");
    aspectProp.setMultiValued(true);
    List<CustomModelProperty> props = new ArrayList<>(1);
    props.add(aspectProp);
    aspectPayload.setProperties(props);
    // create property
    put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(aspectPayload), SELECT_PROPS_QS, 200);
    // Retrieve the updated aspect
    HttpResponse response = getSingle("cmm/" + modelName + "/aspects", aspectName, 200);
    CustomAspect returnedAspect = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomAspect.class);
    // Check the aspect's added property
    assertEquals(1, returnedAspect.getProperties().size());
    /*
         * Create type and update it by adding a property
         */
    String typeName = "testType1" + System.currentTimeMillis();
    createTypeAspect(CustomType.class, modelName, typeName, "test type1 title", null, "cm:content");
    // Update the Type by adding property - property one
    CustomType typePayload = new CustomType();
    typePayload.setName(typeName);
    // Create inline MINMAX constraint
    CustomModelConstraint inlineMinMaxConstraint = new CustomModelConstraint();
    inlineMinMaxConstraint.setType("MINMAX");
    inlineMinMaxConstraint.setTitle("test MINMAX title");
    // Create the MinMax constraint's parameters
    List<CustomModelNamedValue> parameters = new ArrayList<>(2);
    parameters.add(buildNamedValue("maxValue", "100.0"));
    parameters.add(buildNamedValue("minValue", "0.0"));
    // Add the parameters into the constraint
    inlineMinMaxConstraint.setParameters(parameters);
    String typePropName = "testType1Prop" + System.currentTimeMillis();
    CustomModelProperty typeProp = new CustomModelProperty();
    typeProp.setName(typePropName);
    typeProp.setDataType("d:int");
    typeProp.setTitle("type property title");
    typeProp.setDefaultValue("0");
    // add the inline constraint
    typeProp.setConstraints(Arrays.asList(inlineMinMaxConstraint));
    props = new ArrayList<>(1);
    props.add(typeProp);
    typePayload.setProperties(props);
    // create property
    put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(typePayload), SELECT_PROPS_QS, 200);
    // Retrieve the updated type
    response = getSingle("cmm/" + modelName + "/types", typeName, 200);
    CustomType returnedType = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomType.class);
    // Check the type's added property
    assertEquals(1, returnedType.getProperties().size());
    // Update aspect's property - model is inactive
    {
        final String updatePropOneAspectQS = getPropDeleteUpdateQS(aspectPropName, false);
        // Try to update property from aspect
        // missing payload
        put("cmm/" + modelName + "/aspects", aspectName, null, updatePropOneAspectQS, 400);
        CustomAspect updatePropAspectPayload = new CustomAspect();
        CustomModelProperty propertyAspect = new CustomModelProperty();
        propertyAspect.setTitle("new Title");
        propertyAspect.setDescription("new Desc");
        // the original value was d:text
        propertyAspect.setDataType("d:int");
        // the original value was true
        propertyAspect.setMultiValued(false);
        // the original value was false
        propertyAspect.setMandatory(true);
        propertyAspect.setDefaultValue("10");
        List<CustomModelProperty> modifiedProp = new ArrayList<>(1);
        modifiedProp.add(propertyAspect);
        updatePropAspectPayload.setProperties(modifiedProp);
        // missing aspect name
        put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(updatePropAspectPayload), updatePropOneAspectQS, 400);
        // set a random name
        updatePropAspectPayload.setName(aspectName + System.currentTimeMillis());
        // Aspect not found
        put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(updatePropAspectPayload), updatePropOneAspectQS, 404);
        // set the correct name
        updatePropAspectPayload.setName(aspectName);
        // the requested property name dose not match the payload
        put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(updatePropAspectPayload), updatePropOneAspectQS, 400);
        // set the property name that matches the requested property
        propertyAspect.setName(aspectPropName);
        setRequestContext(nonAdminUserName);
        // unauthorised
        put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(updatePropAspectPayload), updatePropOneAspectQS, 403);
        setRequestContext(customModelAdmin);
        // Update as a Model Administrator
        put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(updatePropAspectPayload), updatePropOneAspectQS, 200);
        // Check the property has been updated
        response = getSingle("cmm/" + modelName + "/aspects", aspectName, 200);
        returnedAspect = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomAspect.class);
        assertEquals(1, returnedAspect.getProperties().size());
        CustomModelProperty modifiedAspectProperty = returnedAspect.getProperties().get(0);
        compareCustomModelProperties(propertyAspect, modifiedAspectProperty, "prefixedName", "indexTokenisationMode");
    }
    // Activate the model
    CustomModel statusPayload = new CustomModel();
    statusPayload.setStatus(ModelStatus.ACTIVE);
    put("cmm", modelName, RestApiUtil.toJsonAsString(statusPayload), SELECT_STATUS_QS, 200);
    // Update type's property - model is active
    {
        final String updatePropTwoTypeQS = getPropDeleteUpdateQS(typePropName, false);
        CustomType updatePropTypePayload = new CustomType();
        updatePropTypePayload.setName(typeName);
        CustomModelProperty propertyType = new CustomModelProperty();
        propertyType.setName(typePropName);
        propertyType.setTitle("new Title");
        propertyType.setDescription("new Desc");
        // the original value was d:int
        propertyType.setDataType("d:long");
        propertyType.setDefaultValue("5");
        List<CustomModelProperty> modifiedProp = new ArrayList<>(1);
        modifiedProp.add(propertyType);
        updatePropTypePayload.setProperties(modifiedProp);
        setRequestContext(nonAdminUserName);
        // Unauthorised
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(updatePropTypePayload), updatePropTwoTypeQS, 403);
        setRequestContext(customModelAdmin);
        // Try to update an active model as a Model Administrator - Cannot change the data type of the property of an active model
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(updatePropTypePayload), updatePropTwoTypeQS, 409);
        // Set the data type with its original value
        propertyType.setDataType("d:int");
        // the original value was false
        propertyType.setMultiValued(true);
        // Cannot change the multi-valued option of the property of an active model
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(updatePropTypePayload), updatePropTwoTypeQS, 409);
        propertyType.setMultiValued(false);
        // the original value was false
        propertyType.setMandatory(true);
        // Cannot change the mandatory option of the property of an active model
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(updatePropTypePayload), updatePropTwoTypeQS, 409);
        propertyType.setMandatory(false);
        // the original value was false
        propertyType.setMandatoryEnforced(true);
        // Cannot change the mandatory-enforced option of the property of an active model
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(updatePropTypePayload), updatePropTwoTypeQS, 409);
        // Set the mandatory-enforced with its original value
        propertyType.setMandatoryEnforced(false);
        // Update the MinMax constraint's parameters
        parameters = new ArrayList<>(2);
        // the original value was 100.0
        parameters.add(buildNamedValue("maxValue", "120.0"));
        // the original value was 0.0
        parameters.add(buildNamedValue("minValue", "20.0"));
        // Add the parameters into the constraint
        inlineMinMaxConstraint.setParameters(parameters);
        // add the updated inline constraint
        propertyType.setConstraints(Arrays.asList(inlineMinMaxConstraint));
        // Try to Update - constraint violation. The default value is 5 which is not in the MinMax range [20, 120]
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(updatePropTypePayload), updatePropTwoTypeQS, 409);
        // we changed the MinMax constraint to be [20, 120]
        propertyType.setDefaultValue("25");
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(updatePropTypePayload), updatePropTwoTypeQS, 200);
        // Check the property has been updated
        response = getSingle("cmm/" + modelName + "/types", typeName, 200);
        returnedType = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomType.class);
        assertEquals(1, returnedType.getProperties().size());
        CustomModelProperty modifiedTypeProperty = returnedType.getProperties().get(0);
        assertEquals("new Title", modifiedTypeProperty.getTitle());
        assertEquals("new Desc", modifiedTypeProperty.getDescription());
        assertEquals("25", modifiedTypeProperty.getDefaultValue());
        assertEquals("Shouldn't be able to change the data type of the property of an active model.", "d:int", modifiedTypeProperty.getDataType());
        assertFalse(modifiedTypeProperty.isMandatory());
        assertFalse(modifiedTypeProperty.isMultiValued());
        assertFalse(modifiedTypeProperty.isMandatoryEnforced());
        assertEquals(1, modifiedTypeProperty.getConstraints().size());
        CustomModelConstraint modifiedConstraint = modifiedTypeProperty.getConstraints().get(0);
        assertEquals("MINMAX", modifiedConstraint.getType());
        assertEquals("120.0", getParameterSimpleValue(modifiedConstraint.getParameters(), "maxValue"));
        assertEquals("20.0", getParameterSimpleValue(modifiedConstraint.getParameters(), "minValue"));
        // Change the constraint type and parameter
        inlineMinMaxConstraint.setType("LENGTH");
        inlineMinMaxConstraint.setTitle("test LENGTH title");
        parameters = new ArrayList<>(2);
        parameters.add(buildNamedValue("maxLength", "256"));
        parameters.add(buildNamedValue("minLength", "0"));
        // Add the parameters into the constraint
        inlineMinMaxConstraint.setParameters(parameters);
        propertyType.setConstraints(Arrays.asList(inlineMinMaxConstraint));
        // LENGTH can only be used with textual data type
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(updatePropTypePayload), updatePropTwoTypeQS, 400);
        // update the property by removing the constraint
        propertyType.setConstraints(Collections.<CustomModelConstraint>emptyList());
        put("cmm/" + modelName + "/types", typeName, RestApiUtil.toJsonAsString(updatePropTypePayload), updatePropTwoTypeQS, 200);
        response = getSingle("cmm/" + modelName + "/types", typeName, 200);
        returnedType = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomType.class);
        assertEquals(1, returnedType.getProperties().size());
        modifiedTypeProperty = returnedType.getProperties().get(0);
        assertEquals(0, modifiedTypeProperty.getConstraints().size());
    }
}
Also used : CustomType(org.alfresco.rest.api.model.CustomType) CustomAspect(org.alfresco.rest.api.model.CustomAspect) ArrayList(java.util.ArrayList) HttpResponse(org.alfresco.rest.api.tests.client.HttpResponse) CustomModelProperty(org.alfresco.rest.api.model.CustomModelProperty) CustomModel(org.alfresco.rest.api.model.CustomModel) CustomModelNamedValue(org.alfresco.rest.api.model.CustomModelNamedValue) ArrayList(java.util.ArrayList) List(java.util.List) CustomModelConstraint(org.alfresco.rest.api.model.CustomModelConstraint) Test(org.junit.Test)

Example 5 with CustomModelNamedValue

use of org.alfresco.rest.api.model.CustomModelNamedValue in project alfresco-remote-api by Alfresco.

the class TestCustomConstraint method testCreateConstraintAndAddToProperty.

@Test
public void testCreateConstraintAndAddToProperty() throws Exception {
    setRequestContext(customModelAdmin);
    String modelName = "testModelConstraint" + System.currentTimeMillis();
    final Pair<String, String> namespacePair = getTestNamespaceUriPrefixPair();
    // Create the model as a Model Administrator
    createCustomModel(modelName, namespacePair, ModelStatus.DRAFT);
    // Create RegEx constraint
    String regExConstraintName = "testFileNameRegEx" + System.currentTimeMillis();
    CustomModelConstraint regExConstraint = new CustomModelConstraint();
    regExConstraint.setName(regExConstraintName);
    regExConstraint.setType("REGEX");
    regExConstraint.setTitle("test RegEx title");
    regExConstraint.setDescription("test RegEx desc");
    // Create the RegEx constraint's parameters
    List<CustomModelNamedValue> parameters = new ArrayList<>(2);
    parameters.add(buildNamedValue("expression", "(.*[\\\"\\*\\\\\\>\\<\\?\\/\\:\\|]+.*)|(.*[\\.]?.*[\\.]+$)|(.*[ ]+$)"));
    parameters.add(buildNamedValue("requiresMatch", "false"));
    // Add the parameters into the constraint
    regExConstraint.setParameters(parameters);
    // Create constraint as a Model Administrator
    post("cmm/" + modelName + "/constraints", RestApiUtil.toJsonAsString(regExConstraint), 201);
    // Retrieve the created constraint
    HttpResponse response = getSingle("cmm/" + modelName + "/constraints", regExConstraintName, 200);
    CustomModelConstraint returnedConstraint = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomModelConstraint.class);
    // Retrieve all the model's constraints
    Paging paging = getPaging(0, Integer.MAX_VALUE);
    response = getAll("cmm/" + modelName + "/constraints", paging, 200);
    List<CustomModelConstraint> constraints = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), CustomModelConstraint.class);
    assertEquals(1, constraints.size());
    // Create aspect
    String aspectName = "testAspect1" + System.currentTimeMillis();
    createTypeAspect(CustomAspect.class, modelName, aspectName, "title", "desc", null);
    // Update the Aspect by adding property
    CustomAspect payload = new CustomAspect();
    payload.setName(aspectName);
    final String aspectPropName = "testAspect1Prop1" + System.currentTimeMillis();
    CustomModelProperty aspectProp = new CustomModelProperty();
    aspectProp.setName(aspectPropName);
    aspectProp.setTitle("property title");
    aspectProp.setDataType("d:text");
    // Add the constraint ref
    aspectProp.setConstraintRefs(Arrays.asList(returnedConstraint.getPrefixedName()));
    List<CustomModelProperty> props = new ArrayList<>(1);
    props.add(aspectProp);
    payload.setProperties(props);
    // Create the property
    put("cmm/" + modelName + "/aspects", aspectName, RestApiUtil.toJsonAsString(payload), SELECT_PROPS_QS, 200);
    // Activate the model
    CustomModel updatePayload = new CustomModel();
    updatePayload.setStatus(ModelStatus.ACTIVE);
    put("cmm", modelName, RestApiUtil.toJsonAsString(updatePayload), SELECT_STATUS_QS, 200);
    // Retrieve all the model's constraints
    // Test to see if the API took care of duplicate constraints when referencing a constraint within a property.
    response = getAll("cmm/" + modelName + "/constraints", paging, 200);
    constraints = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), CustomModelConstraint.class);
    assertEquals(1, constraints.size());
    // Test RegEx constrain enforcement
    {
        final NodeService nodeService = repoService.getNodeService();
        final QName aspectQName = QName.createQName("{" + namespacePair.getFirst() + "}" + aspectName);
        TestNetwork testNetwork = getTestFixture().getRandomNetwork();
        TestPerson person = testNetwork.createUser();
        final String siteName = "site" + System.currentTimeMillis();
        TenantUtil.runAsUserTenant(new TenantRunAsWork<Void>() {

            @Override
            public Void doWork() throws Exception {
                SiteInformation siteInfo = new SiteInformation(siteName, siteName, siteName, SiteVisibility.PRIVATE);
                TestSite site = repoService.createSite(null, siteInfo);
                NodeRef nodeRef = repoService.createDocument(site.getContainerNodeRef("documentLibrary"), "Test Doc", "Test Content");
                nodeService.addAspect(nodeRef, aspectQName, null);
                assertTrue(nodeService.hasAspect(nodeRef, aspectQName));
                try {
                    QName propQName = QName.createQName("{" + namespacePair.getFirst() + "}" + aspectPropName);
                    nodeService.setProperty(nodeRef, propQName, "Invalid$Char.");
                    fail("Invalid property value. Should have caused integrity violations.");
                } catch (Exception e) {
                // Expected
                }
                // Permanently remove model from repository
                nodeService.addAspect(nodeRef, ContentModel.ASPECT_TEMPORARY, null);
                nodeService.deleteNode(nodeRef);
                return null;
            }
        }, person.getId(), testNetwork.getId());
    }
    setRequestContext(customModelAdmin);
    // Deactivate the model
    updatePayload = new CustomModel();
    updatePayload.setStatus(ModelStatus.DRAFT);
    put("cmm", modelName, RestApiUtil.toJsonAsString(updatePayload), SELECT_STATUS_QS, 200);
    // Test update the namespace prefix (test to see if the API updates the constraints refs with this new prefix)
    CustomModel updateModelPayload = new CustomModel();
    String modifiedPrefix = namespacePair.getSecond() + "Modified";
    updateModelPayload.setNamespacePrefix(modifiedPrefix);
    updateModelPayload.setNamespaceUri(namespacePair.getFirst());
    response = put("cmm", modelName, RestApiUtil.toJsonAsString(updateModelPayload), null, 200);
    CustomModel returnedModel = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomModel.class);
    assertEquals(modifiedPrefix, returnedModel.getNamespacePrefix());
    assertEquals("The namespace URI shouldn't have changed.", namespacePair.getFirst(), returnedModel.getNamespaceUri());
    // Test update the namespace URI
    updateModelPayload = new CustomModel();
    updateModelPayload.setNamespacePrefix(modifiedPrefix);
    String modifiedURI = namespacePair.getFirst() + "Modified";
    updateModelPayload.setNamespaceUri(modifiedURI);
    response = put("cmm", modelName, RestApiUtil.toJsonAsString(updateModelPayload), null, 200);
    returnedModel = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), CustomModel.class);
    assertEquals(modifiedURI, returnedModel.getNamespaceUri());
    assertEquals("The namespace prefix shouldn't have changed.", modifiedPrefix, returnedModel.getNamespacePrefix());
}
Also used : QName(org.alfresco.service.namespace.QName) TestSite(org.alfresco.rest.api.tests.RepoService.TestSite) Paging(org.alfresco.rest.api.tests.client.PublicApiClient.Paging) NodeService(org.alfresco.service.cmr.repository.NodeService) ArrayList(java.util.ArrayList) CustomAspect(org.alfresco.rest.api.model.CustomAspect) HttpResponse(org.alfresco.rest.api.tests.client.HttpResponse) CustomModelProperty(org.alfresco.rest.api.model.CustomModelProperty) CustomModel(org.alfresco.rest.api.model.CustomModel) ConstraintException(org.alfresco.service.cmr.dictionary.ConstraintException) NodeRef(org.alfresco.service.cmr.repository.NodeRef) CustomModelNamedValue(org.alfresco.rest.api.model.CustomModelNamedValue) SiteInformation(org.alfresco.rest.api.tests.RepoService.SiteInformation) TenantRunAsWork(org.alfresco.repo.tenant.TenantUtil.TenantRunAsWork) TestNetwork(org.alfresco.rest.api.tests.RepoService.TestNetwork) TestPerson(org.alfresco.rest.api.tests.RepoService.TestPerson) CustomModelConstraint(org.alfresco.rest.api.model.CustomModelConstraint) Test(org.junit.Test)

Aggregations

CustomModelNamedValue (org.alfresco.rest.api.model.CustomModelNamedValue)7 ArrayList (java.util.ArrayList)5 CustomAspect (org.alfresco.rest.api.model.CustomAspect)5 CustomModelConstraint (org.alfresco.rest.api.model.CustomModelConstraint)5 CustomModelProperty (org.alfresco.rest.api.model.CustomModelProperty)5 Test (org.junit.Test)5 CustomModel (org.alfresco.rest.api.model.CustomModel)3 HttpResponse (org.alfresco.rest.api.tests.client.HttpResponse)3 CustomType (org.alfresco.rest.api.model.CustomType)2 List (java.util.List)1 TenantRunAsWork (org.alfresco.repo.tenant.TenantUtil.TenantRunAsWork)1 SiteInformation (org.alfresco.rest.api.tests.RepoService.SiteInformation)1 TestNetwork (org.alfresco.rest.api.tests.RepoService.TestNetwork)1 TestPerson (org.alfresco.rest.api.tests.RepoService.TestPerson)1 TestSite (org.alfresco.rest.api.tests.RepoService.TestSite)1 Paging (org.alfresco.rest.api.tests.client.PublicApiClient.Paging)1 InvalidArgumentException (org.alfresco.rest.framework.core.exceptions.InvalidArgumentException)1 ConstraintException (org.alfresco.service.cmr.dictionary.ConstraintException)1 NodeRef (org.alfresco.service.cmr.repository.NodeRef)1 NodeService (org.alfresco.service.cmr.repository.NodeService)1