📄 cmsvfsdriver.java
字号:
CmsUUID userCreated = new CmsUUID(res.getString(m_sqlManager.readQuery("C_RESOURCES_USER_CREATED")));
CmsUUID userLastModified = new CmsUUID(res.getString(m_sqlManager.readQuery("C_RESOURCES_USER_LASTMODIFIED")));
int resProjectId = res.getInt("LOCKED_IN_PROJECT");
int siblingCount = res.getInt(m_sqlManager.readQuery("C_RESOURCES_SIBLING_COUNT"));
// in case of folder type ensure, that the root path has a trailing slash
if (CmsFolder.isFolderType(resourceType)) {
resourcePath = addTrailingSeparator(resourcePath);
}
int newState = (structureState > resourceState) ? structureState : resourceState;
return new CmsFolder(
structureId,
resourceId,
resourcePath,
resourceType,
resourceFlags,
resProjectId,
newState,
dateCreated,
userCreated,
dateLastModified,
userLastModified,
siblingCount,
dateReleased,
dateExpired);
}
/**
* @see org.opencms.db.I_CmsVfsDriver#createPropertyDefinition(org.opencms.db.CmsDbContext, int, java.lang.String)
*/
public CmsPropertyDefinition createPropertyDefinition(CmsDbContext dbc, int projectId, String name)
throws CmsDataAccessException {
Connection conn = null;
PreparedStatement stmt = null;
// TODO switch the property def. PK into a CmsUUID PK
try {
conn = m_sqlManager.getConnection(dbc, projectId);
stmt = m_sqlManager.getPreparedStatement(conn, projectId, "C_PROPERTYDEF_CREATE");
stmt.setString(1, new CmsUUID().toString());
stmt.setString(2, name);
stmt.executeUpdate();
} catch (SQLException e) {
throw new CmsDbSqlException(Messages.get().container(
Messages.ERR_GENERIC_SQL_1,
CmsDbSqlException.getErrorQuery(stmt)), e);
} finally {
m_sqlManager.closeAll(dbc, conn, stmt, null);
}
return readPropertyDefinition(dbc, name, projectId);
}
/**
* @see org.opencms.db.I_CmsVfsDriver#createResource(org.opencms.db.CmsDbContext, org.opencms.file.CmsProject, org.opencms.file.CmsResource, byte[])
*/
public CmsResource createResource(CmsDbContext dbc, CmsProject project, CmsResource resource, byte[] content)
throws CmsDataAccessException {
CmsUUID newStructureId = null;
Connection conn = null;
PreparedStatement stmt = null;
// check the resource path
String resourcePath = removeTrailingSeparator(resource.getRootPath());
if (resourcePath.length() > CmsDriverManager.MAX_VFS_RESOURCE_PATH_LENGTH) {
throw new CmsDataAccessException(Messages.get().container(
Messages.ERR_RESOURCENAME_TOO_LONG_2,
resourcePath,
new Integer(CmsDriverManager.MAX_VFS_RESOURCE_PATH_LENGTH)));
}
// check if the parent folder of the resource exists and is not deleted
if (!resource.getRootPath().equals("/")) {
String parentFolderName = CmsResource.getParentFolder(resource.getRootPath());
CmsFolder parentFolder = readFolder(dbc, project.getId(), parentFolderName);
if (parentFolder.getState() == CmsResource.STATE_DELETED) {
throw new CmsDbEntryNotFoundException(Messages.get().container(
Messages.ERR_PARENT_FOLDER_DELETED_1,
resource.getRootPath()));
}
}
// validate the resource length
internalValidateResourceLength(resource);
// set the resource state and modification dates
int newState;
long dateModified;
long dateCreated;
if (project.getId() == CmsProject.ONLINE_PROJECT_ID) {
newState = CmsResource.STATE_UNCHANGED;
dateCreated = resource.getDateCreated();
dateModified = resource.getDateLastModified();
} else {
newState = CmsResource.STATE_NEW;
if (resource.isTouched()) {
dateCreated = resource.getDateCreated();
dateModified = resource.getDateLastModified();
} else {
dateCreated = System.currentTimeMillis();
dateModified = dateCreated;
}
}
// check if the resource already exists
CmsResource existingResource = null;
newStructureId = resource.getStructureId();
try {
existingResource = readResource(dbc, project.getId(), resourcePath, true);
if (existingResource.getState() == CmsResource.STATE_DELETED) {
// if an existing resource is deleted, it will be finally removed now.
// but we have to reuse its id in order to avoid orphanes in the online project
newStructureId = existingResource.getStructureId();
newState = CmsResource.STATE_CHANGED;
// remove the existing file and it's properties
List modifiedResources = readSiblings(dbc, project, existingResource, false);
int propertyDeleteOption = (existingResource.getSiblingCount() > 1) ? CmsProperty.DELETE_OPTION_DELETE_STRUCTURE_VALUES
: CmsProperty.DELETE_OPTION_DELETE_STRUCTURE_AND_RESOURCE_VALUES;
deletePropertyObjects(dbc, project.getId(), existingResource, propertyDeleteOption);
removeFile(dbc, project, existingResource, true);
OpenCms.fireCmsEvent(new CmsEvent(
I_CmsEventListener.EVENT_RESOURCES_MODIFIED,
Collections.singletonMap("resources", modifiedResources)));
OpenCms.fireCmsEvent(new CmsEvent(
I_CmsEventListener.EVENT_RESOURCE_AND_PROPERTIES_MODIFIED,
Collections.singletonMap("resource", existingResource)));
}
} catch (CmsVfsResourceNotFoundException e) {
// that's what we want in the best case- anything else should be thrown
}
if (existingResource != null && existingResource.getState() != CmsResource.STATE_DELETED) {
// we have a collision: there exists already a resource with the same path/name which cannot be removed
throw new CmsVfsResourceAlreadyExistsException(Messages.get().container(
Messages.ERR_RESOURCE_WITH_NAME_ALREADY_EXISTS_1,
dbc.removeSiteRoot(resource.getRootPath())));
}
try {
// read the parent id
String parentId = internalReadParentId(dbc, project.getId(), resourcePath);
conn = m_sqlManager.getConnection(dbc, project.getId());
stmt = m_sqlManager.getPreparedStatement(conn, project, "C_STRUCTURE_WRITE");
stmt.setString(1, newStructureId.toString());
stmt.setString(2, resource.getResourceId().toString());
stmt.setString(3, resourcePath);
stmt.setInt(4, newState);
stmt.setLong(5, resource.getDateReleased());
stmt.setLong(6, resource.getDateExpired());
stmt.setString(7, parentId);
stmt.executeUpdate();
m_sqlManager.closeAll(dbc, null, stmt, null);
if (!validateResourceIdExists(dbc, project.getId(), resource.getResourceId())) {
// create the resource record
stmt = m_sqlManager.getPreparedStatement(conn, project, "C_RESOURCES_WRITE");
stmt.setString(1, resource.getResourceId().toString());
stmt.setInt(2, resource.getTypeId());
stmt.setInt(3, resource.getFlags());
stmt.setLong(4, dateCreated);
stmt.setString(5, resource.getUserCreated().toString());
stmt.setLong(6, dateModified);
stmt.setString(7, resource.getUserLastModified().toString());
stmt.setInt(8, newState);
stmt.setInt(9, resource.getLength());
stmt.setInt(10, project.getId());
stmt.setInt(11, 1);
stmt.executeUpdate();
if (resource.isFile() && content != null) {
// create the file content
createContent(dbc, project, resource.getResourceId(), content, 0);
}
} else {
if ((content != null) || (resource.getState() != CmsResource.STATE_KEEP)) {
// update the resource record only if state has changed or new content is provided
stmt = m_sqlManager.getPreparedStatement(conn, project, "C_RESOURCES_UPDATE_RESOURCES");
stmt.setInt(1, resource.getTypeId());
stmt.setInt(2, resource.getFlags());
stmt.setLong(3, dateModified);
stmt.setString(4, resource.getUserLastModified().toString());
stmt.setInt(5, CmsResource.STATE_CHANGED);
stmt.setInt(6, resource.getLength());
stmt.setInt(7, project.getId());
stmt.setInt(8, internalCountSiblings(dbc, project.getId(), resource.getResourceId()));
stmt.setString(9, resource.getResourceId().toString());
stmt.executeUpdate();
m_sqlManager.closeAll(dbc, null, stmt, null);
}
if (resource.isFile()) {
if (content != null) {
// update the file content
writeContent(dbc, project, resource.getResourceId(), content);
} else if (resource.getState() == CmsResource.STATE_KEEP) {
// special case sibling creation - update the link Count
stmt = m_sqlManager.getPreparedStatement(conn, project, "C_RESOURCES_UPDATE_SIBLING_COUNT");
stmt.setInt(1, this.internalCountSiblings(dbc, project.getId(), resource.getResourceId()));
stmt.setString(2, resource.getResourceId().toString());
stmt.executeUpdate();
m_sqlManager.closeAll(dbc, null, stmt, null);
// update the resource flags
stmt = m_sqlManager.getPreparedStatement(conn, project, "C_RESOURCES_UPDATE_FLAGS");
stmt.setInt(1, resource.getFlags());
stmt.setString(2, resource.getResourceId().toString());
stmt.executeUpdate();
m_sqlManager.closeAll(dbc, null, stmt, null);
}
}
}
} catch (SQLException e) {
throw new CmsDbSqlException(Messages.get().container(
Messages.ERR_GENERIC_SQL_1,
CmsDbSqlException.getErrorQuery(stmt)), e);
} finally {
m_sqlManager.closeAll(dbc, conn, stmt, null);
}
return readResource(dbc, project.getId(), newStructureId, false);
}
/**
* @see org.opencms.db.I_CmsVfsDriver#createResource(java.sql.ResultSet, int)
*/
public CmsResource createResource(ResultSet res, int projectId) throws SQLException {
CmsUUID structureId = new CmsUUID(res.getString(m_sqlManager.readQuery("C_RESOURCES_STRUCTURE_ID")));
CmsUUID resourceId = new CmsUUID(res.getString(m_sqlManager.readQuery("C_RESOURCES_RESOURCE_ID")));
String resourcePath = res.getString(m_sqlManager.readQuery("C_RESOURCES_RESOURCE_PATH"));
int resourceType = res.getInt(m_sqlManager.readQuery("C_RESOURCES_RESOURCE_TYPE"));
int resourceFlags = res.getInt(m_sqlManager.readQuery("C_RESOURCES_RESOURCE_FLAGS"));
int resourceProjectLastModified = res.getInt(m_sqlManager.readQuery("C_RESOURCES_PROJECT_LASTMODIFIED"));
int resourceState = res.getInt(m_sqlManager.readQuery("C_RESOURCES_STATE"));
int structureState = res.getInt(m_sqlManager.readQuery("C_RESOURCES_STRUCTURE_STATE"));
long dateCreated = res.getLong(m_sqlManager.readQuery("C_RESOURCES_DATE_CREATED"));
long dateLastModified = res.getLong(m_sqlManager.readQuery("C_RESOURCES_DATE_LASTMODIFIED"));
long dateReleased = res.getLong(m_sqlManager.readQuery("C_RESOURCES_DATE_RELEASED"));
long dateExpired = res.getLong(m_sqlManager.readQuery("C_RESOURCES_DATE_EXPIRED"));
int resourceSize;
// in case of folder type ensure, that the root path has a trailing slash
boolean isFolder = CmsFolder.isFolderType(resourceType);
if (isFolder) {
resourcePath = addTrailingSeparator(resourcePath);
// folders must have -1 size
resourceSize = -1;
} else {
// not a folder
resourceSize = res.getInt(m_sqlManager.readQuery("C_RESOURCES_SIZE"));
}
CmsUUID userCreated = new CmsUUID(res.getString(m_sqlManager.readQuery("C_RESOURCES_USER_CREATED")));
CmsUUID userLastModified = new CmsUUID(res.getString(m_sqlManager.readQuery("C_RESOURCES_USER_LASTMODIFIED")));
int siblingCount = res.getInt(m_sqlManager.readQuery("C_RESOURCES_SIBLING_COUNT"));
int newState = (structureState > resourceState) ? structureState : resourceState;
CmsResource newResource = new CmsResource(
structureId,
resourceId,
resourcePath,
resourceType,
isFolder,
resourceFlags,
resourceProjectLastModified,
newState,
dateCreated,
userCreated,
dateLastModified,
userLastModified,
dateReleased,
dateExpired,
siblingCount,
resourceSize);
return newResource;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -