cmsdrivermanager.java
来自「找了很久才找到到源代码」· Java 代码 · 共 1,525 行 · 第 1/5 页
JAVA
1,525 行
* @param source the resource to copy the access control entries from
* @param destination the resource to which the access control entries are copied
* @param updateLastModifiedInfo if true, user and date "last modified" information on the target resource will be updated
*
* @throws CmsException if something goes wrong
*/
public void copyAccessControlEntries(
CmsDbContext dbc,
CmsResource source,
CmsResource destination,
boolean updateLastModifiedInfo) throws CmsException {
// get the entries to copy
ListIterator aceList = m_userDriver.readAccessControlEntries(
dbc,
dbc.currentProject(),
source.getResourceId(),
false).listIterator();
// remove the current entries from the destination
m_userDriver.removeAccessControlEntries(dbc, dbc.currentProject(), destination.getResourceId());
// now write the new entries
while (aceList.hasNext()) {
CmsAccessControlEntry ace = (CmsAccessControlEntry)aceList.next();
m_userDriver.createAccessControlEntry(
dbc,
dbc.currentProject(),
destination.getResourceId(),
ace.getPrincipal(),
ace.getPermissions().getAllowedPermissions(),
ace.getPermissions().getDeniedPermissions(),
ace.getFlags());
}
// update the "last modified" information
if (updateLastModifiedInfo) {
setDateLastModified(dbc, destination, destination.getDateLastModified());
}
// clear the cache
clearAccessControlListCache();
// fire a resource modification event
HashMap data = new HashMap(2);
data.put("resource", destination);
data.put("change", new Integer(CHANGED_ACCESSCONTROL));
OpenCms.fireCmsEvent(new CmsEvent(I_CmsEventListener.EVENT_RESOURCE_MODIFIED, data));
}
/**
* Copies a resource.<p>
*
* You must ensure that the destination path is an absolute, valid and
* existing VFS path. Relative paths from the source are currently not supported.<p>
*
* In case the target resource already exists, it is overwritten with the
* source resource.<p>
*
* The <code>siblingMode</code> parameter controls how to handle siblings
* during the copy operation.
* Possible values for this parameter are:
* <ul>
* <li><code>{@link org.opencms.file.CmsResource#COPY_AS_NEW}</code></li>
* <li><code>{@link org.opencms.file.CmsResource#COPY_AS_SIBLING}</code></li>
* <li><code>{@link org.opencms.file.CmsResource#COPY_PRESERVE_SIBLING}</code></li>
* </ul><p>
*
* @param dbc the current database context
* @param source the resource to copy
* @param destination the name of the copy destination with complete path
* @param siblingMode indicates how to handle siblings during copy
*
* @throws CmsException if something goes wrong
* @throws CmsIllegalArgumentException if the <code>source</code> argument is <code>null</code>
*
* @see CmsObject#copyResource(String, String, CmsResource.CmsResourceCopyMode)
* @see I_CmsResourceType#copyResource(CmsObject, CmsSecurityManager, CmsResource, String, CmsResource.CmsResourceCopyMode)
*/
public void copyResource(
CmsDbContext dbc,
CmsResource source,
String destination,
CmsResource.CmsResourceCopyMode siblingMode) throws CmsException, CmsIllegalArgumentException {
// check the sibling mode to see if this resource has to be copied as a sibling
boolean copyAsSibling = false;
// siblings of folders are not supported
if (!source.isFolder()) {
// if the "copy as sibling" mode is used, set the flag to true
if (siblingMode == CmsResource.COPY_AS_SIBLING) {
copyAsSibling = true;
}
// if the mode is "preserve siblings", we have to check the sibling counter
if (siblingMode == CmsResource.COPY_PRESERVE_SIBLING) {
if (source.getSiblingCount() > 1) {
copyAsSibling = true;
}
}
}
// read the source properties
List properties = readPropertyObjects(dbc, source, false);
if (copyAsSibling) {
// create a sibling of the source file at the destination
createSibling(dbc, source, destination, properties);
// after the sibling is created the copy operation is finished
return;
}
// prepare the content if required
byte[] content = null;
if (source.isFile()) {
if (source instanceof CmsFile) {
// resource already is a file
content = ((CmsFile)source).getContents();
}
if ((content == null) || (content.length < 1)) {
// no known content yet - read from database
content = m_vfsDriver.readContent(dbc, dbc.currentProject().getUuid(), source.getResourceId());
}
}
// determine destination folder
String destinationFoldername = CmsResource.getParentFolder(destination);
// read the destination folder (will also check read permissions)
CmsFolder destinationFolder = m_securityManager.readFolder(
dbc,
destinationFoldername,
CmsResourceFilter.IGNORE_EXPIRATION);
// no further permission check required here, will be done in createResource()
// set user and creation time stamps
long currentTime = System.currentTimeMillis();
long dateLastModified;
CmsUUID userLastModified;
if (source.isFolder()) {
// folders always get a new date and user when they are copied
dateLastModified = currentTime;
userLastModified = dbc.currentUser().getId();
} else {
// files keep the date and user last modified from the source
dateLastModified = source.getDateLastModified();
userLastModified = source.getUserLastModified();
}
// check the resource flags
int flags = source.getFlags();
if (source.isLabeled()) {
// reset "labeled" link flag for new resource
flags &= ~CmsResource.FLAG_LABELED;
}
// create the new resource
CmsResource newResource = new CmsResource(
new CmsUUID(),
new CmsUUID(),
destination,
source.getTypeId(),
source.isFolder(),
flags,
dbc.currentProject().getUuid(),
CmsResource.STATE_NEW,
currentTime,
dbc.currentUser().getId(),
dateLastModified,
userLastModified,
source.getDateReleased(),
source.getDateExpired(),
1,
source.getLength(),
source.getDateContent(),
source.getVersion()); // version number does not matter since it will be computed later
// trigger "is touched" state on resource (will ensure modification date is kept unchanged)
newResource.setDateLastModified(dateLastModified);
// create the resource
newResource = createResource(dbc, destination, newResource, content, properties, false);
// copy the access control entries to the created resource
copyAccessControlEntries(dbc, source, newResource, false);
// clear the cache
clearAccessControlListCache();
List modifiedResources = new ArrayList();
modifiedResources.add(source);
modifiedResources.add(newResource);
modifiedResources.add(destinationFolder);
OpenCms.fireCmsEvent(new CmsEvent(I_CmsEventListener.EVENT_RESOURCE_COPIED, Collections.singletonMap(
"resources",
modifiedResources)));
}
/**
* Copies a resource to the current project of the user.<p>
*
* @param dbc the current database context
* @param resource the resource to apply this operation to
*
* @throws CmsException if something goes wrong
*
* @see CmsObject#copyResourceToProject(String)
* @see I_CmsResourceType#copyResourceToProject(CmsObject, CmsSecurityManager, CmsResource)
*/
public void copyResourceToProject(CmsDbContext dbc, CmsResource resource) throws CmsException {
// copy the resource to the project only if the resource is not already in the project
if (!isInsideCurrentProject(dbc, resource.getRootPath())) {
// check if there are already any subfolders of this resource
if (resource.isFolder()) {
List projectResources = m_projectDriver.readProjectResources(dbc, dbc.currentProject());
for (int i = 0; i < projectResources.size(); i++) {
String resname = (String)projectResources.get(i);
if (resname.startsWith(resource.getRootPath())) {
// delete the existing project resource first
m_projectDriver.deleteProjectResource(dbc, dbc.currentProject().getUuid(), resname);
}
}
}
try {
m_projectDriver.createProjectResource(dbc, dbc.currentProject().getUuid(), resource.getRootPath());
} catch (CmsException exc) {
// if the subfolder exists already - all is ok
} finally {
OpenCms.getMemoryMonitor().flushProjectResources();
OpenCms.fireCmsEvent(new CmsEvent(I_CmsEventListener.EVENT_PROJECT_MODIFIED, Collections.singletonMap(
"project",
dbc.currentProject())));
}
}
}
/**
* Counts the locked resources in this project.<p>
*
* @param project the project to count the locked resources in
*
* @return the amount of locked resources in this project
*/
public int countLockedResources(CmsProject project) {
// count locks
return m_lockManager.countExclusiveLocksInProject(project);
}
/**
* Add a new group to the Cms.<p>
*
* Only the admin can do this.
* Only users, which are in the group "administrators" are granted.<p>
*
* @param dbc the current database context
* @param id the id of the new group
* @param name the name of the new group
* @param description the description for the new group
* @param flags the flags for the new group
* @param parent the name of the parent group (or <code>null</code>)
*
* @return new created group
*
* @throws CmsException if the creation of the group failed
* @throws CmsIllegalArgumentException if the length of the given name was below 1
*/
public CmsGroup createGroup(CmsDbContext dbc, CmsUUID id, String name, String description, int flags, String parent)
throws CmsIllegalArgumentException, CmsException {
// check the group name
OpenCms.getValidationHandler().checkGroupName(CmsOrganizationalUnit.getSimpleName(name));
// trim the name
name = name.trim();
// check the ou
readOrganizationalUnit(dbc, CmsOrganizationalUnit.getParentFqn(name));
// get the id of the parent group if necessary
if (CmsStringUtil.isNotEmpty(parent)) {
CmsGroup parentGroup = readGroup(dbc, parent);
if (!parentGroup.isRole()
&& !CmsOrganizationalUnit.getParentFqn(parent).equals(CmsOrganizationalUnit.getParentFqn(name))) {
throw new CmsDataAccessException(Messages.get().container(
Messages.ERR_PARENT_GROUP_MUST_BE_IN_SAME_OU_3,
CmsOrganizationalUnit.getSimpleName(name),
CmsOrganizationalUnit.getParentFqn(name),
parent));
}
}
// create the group
CmsGroup group = m_userDriver.createGroup(dbc, id, name, description, flags, parent);
// if group is virtualizing a role, initialize it
if (group.isVirtual()) {
// get all users that have the given role
String groupname = CmsRole.valueOf(group).getGroupName();
Iterator it = getUsersOfGroup(dbc, groupname, true, false, true).iterator();
while (it.hasNext()) {
CmsUser user = (CmsUser)it.next();
// put them in the new group
addUserToGroup(dbc, user.getName(), group.getName(), true);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?