diff --git a/source/java/org/alfresco/repo/jscript/ScriptNode.java b/source/java/org/alfresco/repo/jscript/ScriptNode.java index 7d808d30b8..4b23d8c9d9 100644 --- a/source/java/org/alfresco/repo/jscript/ScriptNode.java +++ b/source/java/org/alfresco/repo/jscript/ScriptNode.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2012 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -69,6 +69,7 @@ import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.lock.LockStatus; import org.alfresco.service.cmr.model.FileExistsException; import org.alfresco.service.cmr.model.FileFolderService; @@ -2222,7 +2223,11 @@ public class ScriptNode implements Scopeable, NamespacePrefixResolverProvider } else { - ensureVersioningEnabled(true, true); + // MNT-9369, read props from contentModel.xml, sets to false, false if there is no defaults. + Map versionableProps = services.getDictionaryService().getAspect(ContentModel.ASPECT_VERSIONABLE).getProperties(); + boolean autoVersion = Boolean.parseBoolean(versionableProps.get(ContentModel.PROP_AUTO_VERSION).getDefaultValue()); + boolean autoVersionProps = Boolean.parseBoolean(versionableProps.get(ContentModel.PROP_AUTO_VERSION_PROPS).getDefaultValue()); + ensureVersioningEnabled(autoVersion, autoVersionProps); } } else diff --git a/source/test-java/org/alfresco/repo/jscript/ScriptNodeTest.java b/source/test-java/org/alfresco/repo/jscript/ScriptNodeTest.java index ca69e6459a..b3bafd2ab3 100644 --- a/source/test-java/org/alfresco/repo/jscript/ScriptNodeTest.java +++ b/source/test-java/org/alfresco/repo/jscript/ScriptNodeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -24,29 +24,45 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import java.io.InputStream; +import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.alfresco.model.ContentModel; import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.repo.dictionary.DictionaryDAO; +import org.alfresco.repo.dictionary.DictionaryModelType; +import org.alfresco.repo.dictionary.DictionaryRepositoryBootstrap; +import org.alfresco.repo.dictionary.RepositoryLocation; +import org.alfresco.repo.i18n.MessageService; import org.alfresco.repo.model.Repository; import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.tenant.TenantAdminService; import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.repo.security.permissions.PermissionServiceSPI; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.repo.version.VersionableAspect; import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.site.SiteVisibility; import org.alfresco.service.cmr.version.Version; import org.alfresco.service.cmr.version.VersionHistory; import org.alfresco.service.cmr.version.VersionService; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.GUID; +import org.alfresco.util.PropertyMap; import org.alfresco.util.test.junitrules.AlfrescoPerson; import org.alfresco.util.test.junitrules.ApplicationContextInit; import org.alfresco.util.test.junitrules.RunAsFullyAuthenticatedRule; @@ -54,6 +70,7 @@ import org.alfresco.util.test.junitrules.RunAsFullyAuthenticatedRule.RunAsUser; import org.alfresco.util.test.junitrules.TemporaryNodes; import org.alfresco.util.test.junitrules.TemporarySites; import org.alfresco.util.test.junitrules.TemporarySites.TestSiteAndMemberInfo; +import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.After; @@ -117,39 +134,138 @@ public class ScriptNodeTest private static Search SEARCH_SCRIPT; private static VersionableAspect VERSIONABLE_ASPECT; private static VersionService VERSION_SERVICE; + private static DictionaryService DICTIONARY_SERVICE; + private static NamespaceService NAMESPACE_SERVICE; + private static DictionaryDAO DICTIONARY_DAO; + private static TenantAdminService TENANT_ADMIN_SERVICE; + private static MessageService MESSAGE_SERVICE; + private static TransactionService TRANSACTION_SERVICE; + private static DictionaryModelType DICTIONARY_MODEL_TYPE; private static TestSiteAndMemberInfo USER_ONES_TEST_SITE; private static NodeRef USER_ONES_TEST_FILE; private List excludedOnUpdateProps; private NodeRef testNode; - + + /** The store reference */ + protected StoreRef storeRef; + + /** The root node reference */ + private NodeRef rootNodeRef; + + /** The Dictionary bootstrap for loading new content model */ + DictionaryRepositoryBootstrap bootstrap; + + boolean autoVersion; + boolean autoVersionProps; + + private static final String TEST_CONTENT_MODEL = "alfresco/extension/model/testContentModel.xml"; + @BeforeClass public static void initStaticData() throws Exception { - CONTENT_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("ContentService", ContentService.class); - NODE_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("NodeService", NodeService.class); - SERVICE_REGISTRY = APP_CONTEXT_INIT.getApplicationContext().getBean("ServiceRegistry", ServiceRegistry.class); - TRANSACTION_HELPER = APP_CONTEXT_INIT.getApplicationContext().getBean("retryingTransactionHelper", RetryingTransactionHelper.class); - PERMISSION_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("permissionService", PermissionServiceSPI.class); - SEARCH_SCRIPT = APP_CONTEXT_INIT.getApplicationContext().getBean("searchScript", Search.class); - VERSIONABLE_ASPECT = APP_CONTEXT_INIT.getApplicationContext().getBean("versionableAspect", VersionableAspect.class); - VERSION_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("VersionService", VersionService.class); - + CONTENT_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("ContentService", ContentService.class); + NODE_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("NodeService", NodeService.class); + SERVICE_REGISTRY = APP_CONTEXT_INIT.getApplicationContext().getBean("ServiceRegistry", ServiceRegistry.class); + TRANSACTION_HELPER = APP_CONTEXT_INIT.getApplicationContext().getBean("retryingTransactionHelper", RetryingTransactionHelper.class); + PERMISSION_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("permissionService", PermissionServiceSPI.class); + SEARCH_SCRIPT = APP_CONTEXT_INIT.getApplicationContext().getBean("searchScript", Search.class); + VERSIONABLE_ASPECT = APP_CONTEXT_INIT.getApplicationContext().getBean("versionableAspect", VersionableAspect.class); + VERSION_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("VersionService", VersionService.class); + DICTIONARY_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("DictionaryService", DictionaryService.class); + NAMESPACE_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("namespaceService", NamespaceService.class); + DICTIONARY_DAO = APP_CONTEXT_INIT.getApplicationContext().getBean("dictionaryDAO", DictionaryDAO.class); + TENANT_ADMIN_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("tenantAdminService", TenantAdminService.class); + MESSAGE_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("messageService", MessageService.class); + TRANSACTION_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("transactionComponent", TransactionService.class); + DICTIONARY_MODEL_TYPE = APP_CONTEXT_INIT.getApplicationContext().getBean("dictionaryModelType", DictionaryModelType.class); + USER_ONES_TEST_SITE = STATIC_TEST_SITES.createTestSiteWithUserPerRole(GUID.generate(), "sitePreset", SiteVisibility.PRIVATE, USER_ONE_NAME); - USER_ONES_TEST_FILE = STATIC_TEST_NODES.createQuickFile(MimetypeMap.MIMETYPE_TEXT_PLAIN, USER_ONES_TEST_SITE.doclib, "test.txt", USER_ONE_NAME); + USER_ONES_TEST_FILE = STATIC_TEST_NODES.createQuickFile(MimetypeMap.MIMETYPE_TEXT_PLAIN, USER_ONES_TEST_SITE.doclib, "test.txt", USER_ONE_NAME); } - + @Before public void createTestContent() + { + excludedOnUpdateProps = VERSIONABLE_ASPECT.getExcludedOnUpdateProps(); + + AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getSystemUserName()); + // Create the store and get the root node + storeRef = NODE_SERVICE.createStore(StoreRef.PROTOCOL_WORKSPACE, "Test_" + System.currentTimeMillis()); + rootNodeRef = NODE_SERVICE.getRootNode(storeRef); + } + + /** + * Create test content, can be versionable. + * @param versionable + */ + private void createTestContent(boolean versionable) { Repository repositoryHelper = (Repository) APP_CONTEXT_INIT.getApplicationContext().getBean("repositoryHelper"); NodeRef companyHome = repositoryHelper.getCompanyHome(); - + // Create some test content - testNode = testNodes.createQuickFile(MimetypeMap.MIMETYPE_TEXT_PLAIN, companyHome, "userOnesDoc", TEST_USER1.getUsername(), true); - - excludedOnUpdateProps = VERSIONABLE_ASPECT.getExcludedOnUpdateProps(); + testNode = testNodes.createQuickFile(MimetypeMap.MIMETYPE_TEXT_PLAIN, companyHome, "userOnesDoc", TEST_USER1.getUsername(), versionable); } - + + /** + * Bootstraps the model from custom store + */ + private void setUpBootstrap() + { + bootstrap = new DictionaryRepositoryBootstrap(); + bootstrap.setContentService(CONTENT_SERVICE); + bootstrap.setDictionaryDAO(DICTIONARY_DAO); + bootstrap.setTransactionService(TRANSACTION_SERVICE); + bootstrap.setTenantAdminService(TENANT_ADMIN_SERVICE); + bootstrap.setNodeService(NODE_SERVICE); + bootstrap.setNamespaceService(NAMESPACE_SERVICE); + bootstrap.setMessageService(MESSAGE_SERVICE); + + List storeUrlsToValidate = new ArrayList(1); + storeUrlsToValidate.add(this.storeRef.toString()); + DICTIONARY_MODEL_TYPE.setStoreUrls(storeUrlsToValidate); + + RepositoryLocation location = new RepositoryLocation(); + location.setStoreProtocol(storeRef.getProtocol()); + location.setStoreId(storeRef.getIdentifier()); + location.setQueryLanguage(RepositoryLocation.LANGUAGE_PATH); + // NOTE: we are not setting the path for now .. in doing so we are searching the root node only + + List locations = new ArrayList(); + locations.add(location); + + bootstrap.setRepositoryModelsLocations(locations); + + // register with dictionary service + bootstrap.register(); + } + + /** + * Bootstraps the model from default store + */ + private void revertBootstrap() + { + bootstrap.destroy(); + + List storeUrlsToValidate = new ArrayList(1); + storeUrlsToValidate.add(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE.toString()); + DICTIONARY_MODEL_TYPE.setStoreUrls(storeUrlsToValidate); + + RepositoryLocation location = new RepositoryLocation(); + location.setStoreProtocol(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE.getProtocol()); + location.setStoreId(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE.getIdentifier()); + location.setQueryLanguage(RepositoryLocation.LANGUAGE_PATH); + // NOTE: we are not setting the path for now .. in doing so we are searching the root node only + + List locations = new ArrayList(); + locations.add(location); + + bootstrap.setRepositoryModelsLocations(locations); + + // register with dictionary service + bootstrap.register(); + } + @After public void versionableAspectTearDown() { VERSIONABLE_ASPECT.setExcludedOnUpdateProps(excludedOnUpdateProps); @@ -221,6 +337,7 @@ public class ScriptNodeTest /** See ALF-19783. */ @Test public void versionNumberShouldIncrementOnNodeRevert() { + createTestContent(true); log.debug(testName.getMethodName() + "()"); // We've already got a test node set up. Let's see what its content is so we can ensure that the revert works. @@ -346,4 +463,93 @@ public class ScriptNodeTest } }); } + + /** + * MNT-9369 + *

+ * Initially the ContentModel.PROP_AUTO_VERSION and ContentModel.PROP_AUTO_VERSION_PROPS are true by defaults. + */ + @Test + public void testVersioningPropsDefault() + { + createTestContent(false); + Map versionableProps = DICTIONARY_SERVICE.getAspect(ContentModel.ASPECT_VERSIONABLE).getProperties(); + autoVersion = Boolean.parseBoolean(versionableProps.get(ContentModel.PROP_AUTO_VERSION).getDefaultValue()); + autoVersionProps = Boolean.parseBoolean(versionableProps.get(ContentModel.PROP_AUTO_VERSION_PROPS).getDefaultValue()); + + TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback() + { + public Void execute() throws Throwable + { + log.debug("Adding versionable aspect."); + + ScriptNode sn = new ScriptNode(testNode, SERVICE_REGISTRY); + sn.addAspect("cm:versionable"); + return null; + } + }); + + assertEquals("Incorrect Auto Version property.", autoVersion, NODE_SERVICE.getProperty(testNode, ContentModel.PROP_AUTO_VERSION)); + assertEquals("Incorrect Auto Version Props property.", autoVersionProps, NODE_SERVICE.getProperty(testNode, ContentModel.PROP_AUTO_VERSION_PROPS)); + } + + /** + * MNT-9369 + *

+ * Initially the ContentModel.PROP_AUTO_VERSION and ContentModel.PROP_AUTO_VERSION_PROPS are true by defaults. We'll set them to false. + */ + @Test + public void testVersioningPropsDefaultChanged() + { + setUpBootstrap(); + + TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback() + { + public Void execute() throws Throwable + { + log.debug("Adding new model."); + + // Create a model node + PropertyMap properties = new PropertyMap(1); + properties.put(ContentModel.PROP_MODEL_ACTIVE, true); + + final NodeRef modelNode = NODE_SERVICE.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN, QName.createQName(NamespaceService.ALFRESCO_URI, "dictionaryModels"), + ContentModel.TYPE_DICTIONARY_MODEL, properties).getChildRef(); + assertNotNull(modelNode); + + // Add the model content to the model node + ContentWriter contentWriter = CONTENT_SERVICE.getWriter(modelNode, ContentModel.PROP_CONTENT, true); + contentWriter.setEncoding("UTF-8"); + contentWriter.setMimetype(MimetypeMap.MIMETYPE_XML); + InputStream cmStream = getClass().getClassLoader().getResourceAsStream(TEST_CONTENT_MODEL); + contentWriter.putContent(IOUtils.toString(cmStream)); + cmStream.close(); + return null; + } + }); + + Map versionableProps = DICTIONARY_SERVICE.getAspect(ContentModel.ASPECT_VERSIONABLE).getProperties(); + + autoVersion = Boolean.parseBoolean(versionableProps.get(ContentModel.PROP_AUTO_VERSION).getDefaultValue()); + autoVersionProps = Boolean.parseBoolean(versionableProps.get(ContentModel.PROP_AUTO_VERSION_PROPS).getDefaultValue()); + + createTestContent(false); + + TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback() + { + public Void execute() throws Throwable + { + log.debug("Adding versionable aspect."); + + ScriptNode sn = new ScriptNode(testNode, SERVICE_REGISTRY); + sn.addAspect("cm:versionable"); + return null; + } + }); + + assertEquals("Incorrect Auto Version property.", autoVersion, NODE_SERVICE.getProperty(testNode, ContentModel.PROP_AUTO_VERSION)); + assertEquals("Incorrect Auto Version Props property.", autoVersionProps, NODE_SERVICE.getProperty(testNode, ContentModel.PROP_AUTO_VERSION_PROPS)); + + revertBootstrap(); + } } diff --git a/source/test-resources/alfresco/extension/model/testContentModel.xml b/source/test-resources/alfresco/extension/model/testContentModel.xml new file mode 100644 index 0000000000..146e46252a --- /dev/null +++ b/source/test-resources/alfresco/extension/model/testContentModel.xml @@ -0,0 +1,1585 @@ + + + + + + + + Alfresco Content Domain Model + Alfresco + 2009-06-04 + 1.1 + + + + + + + + + + + + + + + + + \<\?\/\:\|]+.*)|(.*[\.]?.*[\.]+$)|(.*[ ]+$)]]> + false + + + + + defaultStoreSelector + + + + + + + Object + sys:base + + + Name + d:text + true + + true + false + both + + + + + + + + cm:auditable + + + + + Folder + cm:cmobject + true + + + + false + true + + + sys:base + false + true + + false + true + + + + + + Content + cm:cmobject + true + + + d:content + false + + + + + true + false + true + + + + + + + Dictionary Model + cm:content + + + Model name + d:qname + true + + + Description + d:text + true + + + Author + d:text + true + + + Published Date + d:date + true + + + Version + d:text + true + + + Model Active + d:boolean + false + + + + + + Link Object + cm:cmobject + + + Link Destination + d:noderef + true + + + + + + Saved Query + cm:content + + + + System Folder + cm:folder + + + + Alfresco Authority Abstract Type + sys:base + + + + Person + cm:authority + + + + + d:text + true + + + + + + d:noderef + true + + + d:text + true + + + d:text + true + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:content + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:text + + + d:datetime + + + d:text + + + + d:boolean + + + + d:boolean + + + + + + d:long + true + + + + d:long + true + true + + + + d:long + true + + + + + + + + cm:avatarOf + false + false + + + cm:content + cm:hasAvatar + false + false + + + + + + + Alfresco Authority Type + cm:authority + + + + + d:text + + + + + + d:text + + + + + + false + true + + + cm:authority + false + true + + false + + + + + + Alfresco Authentication Zone Type + cm:cmobject + + + + + + false + true + + + cm:authority + false + true + + false + + + + + + + + Category Root + cm:cmobject + + + + false + true + + + cm:category + false + true + + + + + sys:aspect_root + + + + + Category + cm:cmobject + + + + false + true + + + cm:category + false + true + + false + + + + + + + Multilingual Root + sys:container + + + + false + false + + + cm:mlContainer + false + true + + + + + + + Multilingual Container + sys:container + + + + false + false + + + cm:mlDocument + true + true + + + + + cm:versionable + cm:author + sys:localized + + + + + Rating + sys:base + false + + + Rating + d:float + true + + true + true + false + + + + Rating Scheme + d:text + true + + true + true + false + + + + Rated at + d:datetime + true + + true + true + false + + + + + + + + Failed Thumbnail + cm:cmobject + false + false + + + Count of thumbnail failures + d:int + 0 + + + Failed Thumbnail Time + d:datetime + + + + + + + + + + + Thumbnail + cm:content + false + false + + + Thumbnail Name + d:text + false + + + Thumbnailed Content Property Name + d:qname + true + + + + + + + + + + + + + + + Titled + + + Title + d:mltext + + true + false + both + + + + Description + d:mltext + + true + false + both + + + + + + + Auditable + + + Created + d:datetime + true + true + + true + false + both + + + + Creator + d:text + true + true + + + Modified + d:datetime + true + true + + true + false + both + + + + Modifier + d:text + true + true + + + Accessed + d:datetime + true + + true + false + both + + + + + + + Person Disabled + Indicates that a cm:person type has been disabled. + + + + Annullable + Indicates that a node can be deleted if a pending activity is cancelled + + + + Transformable + + + Formats + + cm:formatOf + false + false + + + cm:content + cm:hasFormat + false + true + + + + + + + Templatable + + + Template + d:noderef + false + + + + + + Webscriptable + + + Webscript + d:text + false + + + + + + Project Summary + + + Project Summary Webscript + d:text + false + + + + + + Complianceable + + + Remove After + d:datetime + + true + false + both + + + + + cm:auditable + + + + + Ownable + + + Owner + d:text + + + + + + Author + + + Author + d:text + + + + + + Dublin Core + cm:titled + + + Publisher + d:text + true + + + Contributor + d:text + true + + + Type + d:text + true + + + Identifier + d:text + true + + + Source + d:text + true + + + Coverage + d:text + true + + + Rights + d:text + true + + + Subject + d:text + true + + + + cm:auditable + cm:author + + + + + Basable + + + + cm:basedOn + false + true + + + cm:content + cm:hasBasis + false + true + + + + + + + Partable + + + + cm:partOf + false + true + + + cm:content + cm:hasPart + false + true + + + + + + + Referencing + + + + cm:referencedBy + false + true + + + cm:content + cm:references + false + true + + + + + + + Replacable + + + + cm:replacedBy + false + true + + + cm:content + cm:replaces + false + true + + + + + + + Effectivity + + + Effective From + d:datetime + + true + false + both + + + + Effective To + d:datetime + + true + false + both + + + + + + + Summarizable + + + Summary + d:text + + + + + + Countable + + + d:int + + + d:int + + + + + + Copied From + + + + false + true + + + cm:cmobject + false + false + + + + + + + Working Copy + + false + + + d:text + true + true + + true + false + false + + + + d:text + + + + d:text + true + false + + + + + + Checked Out + + + + true + false + + + cm:workingcopy + true + false + + + + + cm:lockable + + + + + Versionable + + + Version Label + d:text + true + + + Version Type + d:text + true + + + Initial Version + d:boolean + true + + + Auto Version + d:boolean + false + + + Auto Version - on update properties only + d:boolean + false + + + + + + Lockable + + + d:text + true + + + d:text + true + + + d:date + true + false + + + d:boolean + true + + + + + + + + + false + true + + + cm:person + false + true + + + + + + + Classifiable + + + + General Classifiable + cm:classifiable + + + Categories + d:category + false + true + + true + true + false + + + + + + + Taggable + cm:classifiable + + + Tags + d:category + false + true + + true + true + false + + + + + + + Tag Scope + + + Tags + d:content + true + + + Tag Summary + d:text + true + false + true + + + + + + + + Rateable + + + + false + false + + + cm:rating + false + true + + false + + + + + + + Likes rating scheme rollups + + + Likes Rating Scheme ratings count + d:int + + true + true + false + + + + Likes Rating Scheme ratings total + d:float + + true + true + false + + + + + + + Five star rating scheme rollups + + + Five Star Rating Scheme ratings count + d:int + + true + true + false + + + + Five Star Rating Scheme ratings total + d:float + + true + true + false + + + + + + + + Attachable + + + + false + true + + + cm:cmobject + false + true + + + + + + + Emailed + + + Originator + d:text + + + Addressee + d:text + + + Addressees + d:text + true + + + Subject + d:text + + + Sent Date + d:datetime + + true + false + both + + + + + + + + References Node + + + Node Reference + d:noderef + true + + + + + + Multilingual Document + + sys:localized + cm:versionable + + + + + Empty Translation + + cm:mlDocument + + + + + ContentStore Selector + + + Store Name + d:text + true + + + + + + + + + Preferences + + + d:content + + + + + + false + false + + + cm:content + false + false + + + + + + + Content syndication + + + Published + d:datetime + + true + false + both + + + + Updated + d:datetime + + true + false + both + + + + + + + Geographic + + + Latitude + d:double + + + Longitude + d:double + + + + + + + + + + + Rendition + + + + Hidden Rendition + rn:rendition + + + + Visible Rendition + rn:rendition + + + + + Renditioned + + + + + false + true + + + cm:content + false + true + + + + + + + Marker aspect to prevent the creation of renditions for a node. + + + + Failed Thumbnail Source + + + + false + false + + + cm:failedThumbnail + false + true + + + + + + + + + + + EXIF + + + Date and Time + d:datetime + + + Image Width + d:int + + + Image Height + d:int + + + Exposure Time + d:double + + + F Number + d:double + + + Flash Activated + d:boolean + + + Focal Length + d:double + + + ISO Speed + d:text + + + Camera Manufacturer + d:text + + + Camera Model + d:text + + + Camera Software + d:text + + + Orientation + d:int + + + Horizontal Resolution + d:double + + + Vertical Resolution + d:double + + + Resolution Unit + d:text + + + + + + + + + + + Audio + + + Album + d:text + + + Artist + d:text + + + Composer + d:text + + + Engineer + d:text + + + Genre + d:text + + + Track Number + d:int + + + Release Date + d:date + + + + Sample Rate + d:int + + + Sample Type + Audio Sample Type, typically one of 8Int, 16Int, 32Int or 32Float + d:text + + + Channel Type + Audio Channel Type, typically one of Mono, Stereo, 5.1 or 7.1 + d:text + + + Compressor + Audio Compressor Used, such as MP3 or FLAC + d:text + + + + + + + + + + + Index Control + + + Is indexed + d:boolean + true + + + Is content indexed + d:boolean + true + + + + + + + Webdav Object + + + Webdav Dead Properties + d:text + false + true + + + + + + + + + + Localizable + + + Locale + d:category + + + + + + Translatable + cm:localizable + + + Translations + + cm:translationOf + false + false + + + cm:content + cm:hasTranslation + false + true + + + + + + + + Thumbnailed + rn:renditioned + + + Automatic Update + d:boolean + true + true + + + + + + + + + + +