cmsvfsdriver.java
来自「找了很久才找到到源代码」· Java 代码 · 共 1,400 行 · 第 1/5 页
JAVA
1,400 行
}
} catch (CmsVfsResourceNotFoundException e) {
// that's what we want in the best case- anything else should be thrown
}
try {
// read the parent id
String parentId = internalReadParentId(dbc, projectId, resourcePath);
// use consistent version numbers if the file is being restored
int lastVersion = m_driverManager.getHistoryDriver().readLastVersion(dbc, newStructureId);
int newStrVersion = 0;
int newResVersion = 0;
if (lastVersion > 0) {
I_CmsHistoryResource histRes = m_driverManager.getHistoryDriver().readResource(
dbc,
newStructureId,
lastVersion);
newStrVersion = histRes.getStructureVersion();
newResVersion = histRes.getResourceVersion();
}
conn = m_sqlManager.getConnection(dbc);
// write the structure
stmt = m_sqlManager.getPreparedStatement(conn, projectId, "C_STRUCTURE_WRITE");
stmt.setString(1, newStructureId.toString());
stmt.setString(2, resource.getResourceId().toString());
stmt.setString(3, resourcePath);
stmt.setInt(4, newState.getState());
stmt.setLong(5, resource.getDateReleased());
stmt.setLong(6, resource.getDateExpired());
stmt.setString(7, parentId);
stmt.setInt(8, newStrVersion); // starting version number
stmt.executeUpdate();
m_sqlManager.closeAll(dbc, null, stmt, null);
if (!validateResourceIdExists(dbc, projectId, resource.getResourceId())) {
try {
// create the resource record
stmt = m_sqlManager.getPreparedStatement(conn, projectId, "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.getState());
stmt.setInt(9, resource.getLength());
stmt.setLong(10, dateContent);
stmt.setString(11, projectId.toString());
stmt.setInt(12, 1); // sibling count
stmt.setInt(13, newResVersion); // version number
stmt.executeUpdate();
} finally {
m_sqlManager.closeAll(dbc, null, stmt, null);
}
if (resource.isFile() && (content != null)) {
// create the file content
createContent(dbc, projectId, resource.getResourceId(), content);
}
} else {
if ((content != null) || !resource.getState().isKeep()) {
CmsUUID projLastMod = projectId;
CmsResourceState state = CmsResource.STATE_CHANGED;
if (projectId.equals(CmsProject.ONLINE_PROJECT_ID)) {
// in case a sibling is being published
projLastMod = resource.getProjectLastModified();
state = CmsResource.STATE_UNCHANGED;
}
// update the resource record only if state has changed or new content is provided
stmt = m_sqlManager.getPreparedStatement(conn, projectId, "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, state.getState());
stmt.setInt(6, resource.getLength());
stmt.setLong(7, resource.getDateContent());
stmt.setString(8, projLastMod.toString());
stmt.setInt(9, countSiblings(dbc, projectId, resource.getResourceId()));
stmt.setString(10, resource.getResourceId().toString());
stmt.executeUpdate();
m_sqlManager.closeAll(dbc, null, stmt, null);
}
if (resource.isFile()) {
if (content != null) {
// update the file content
writeContent(dbc, resource.getResourceId(), content);
} else if (resource.getState().isKeep()) {
// special case sibling creation - update the link Count
stmt = m_sqlManager.getPreparedStatement(conn, projectId, "C_RESOURCES_UPDATE_SIBLING_COUNT");
stmt.setInt(1, countSiblings(dbc, projectId, 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, projectId, "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);
}
repairBrokenRelations(dbc, projectId, resource.getStructureId(), resource.getRootPath());
return readResource(dbc, projectId, newStructureId, false);
}
/**
* @see org.opencms.db.I_CmsVfsDriver#createResource(java.sql.ResultSet, CmsUUID)
*/
public CmsResource createResource(ResultSet res, CmsUUID 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"));
CmsUUID resourceProjectLastModified = new CmsUUID(
res.getString(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 = res.getInt(m_sqlManager.readQuery("C_RESOURCES_SIZE"));
boolean isFolder = CmsFolder.isFolderSize(resourceSize);
if (isFolder) {
// in case of folder type ensure, that the root path has a trailing slash
resourcePath = CmsFileUtil.addTrailingSeparator(resourcePath);
}
long dateContent = isFolder ? -1 : res.getLong(m_sqlManager.readQuery("C_RESOURCES_DATE_CONTENT"));
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 resourceVersion = res.getInt(m_sqlManager.readQuery("C_RESOURCES_VERSION"));
int structureVersion = res.getInt(m_sqlManager.readQuery("C_RESOURCES_STRUCTURE_VERSION"));
int newState = (structureState > resourceState) ? structureState : resourceState;
// if there is a change increase the version number
int newVersion = resourceVersion + structureVersion + (newState > 0 ? 1 : 0);
CmsResource newResource = new CmsResource(
structureId,
resourceId,
resourcePath,
resourceType,
isFolder,
resourceFlags,
resourceProjectLastModified,
CmsResourceState.valueOf(newState),
dateCreated,
userCreated,
dateLastModified,
userLastModified,
dateReleased,
dateExpired,
siblingCount,
resourceSize,
dateContent,
newVersion);
return newResource;
}
/**
* @see org.opencms.db.I_CmsVfsDriver#createSibling(org.opencms.db.CmsDbContext, org.opencms.file.CmsProject, org.opencms.file.CmsResource)
*/
public void createSibling(CmsDbContext dbc, CmsProject project, CmsResource resource) throws CmsDataAccessException {
if (!project.getUuid().equals(CmsProject.ONLINE_PROJECT_ID)) {
// this method is only intended to be used during publishing
return;
}
// check if the resource already exists
CmsResource existingSibling = null;
CmsUUID newStructureId = resource.getStructureId();
Connection conn = null;
PreparedStatement stmt = null;
try {
existingSibling = readResource(dbc, project.getUuid(), resource.getRootPath(), true);
if (existingSibling.getState().isDeleted()) {
// if an existing resource is deleted, it will be finally removed now.
// but we have to reuse its id in order to avoid orphans in the online project.
newStructureId = existingSibling.getStructureId();
// remove the existing file and it's properties
List modifiedResources = readSiblings(dbc, project.getUuid(), existingSibling, false);
int propertyDeleteOption = (existingSibling.getSiblingCount() > 1) ? CmsProperty.DELETE_OPTION_DELETE_STRUCTURE_VALUES
: CmsProperty.DELETE_OPTION_DELETE_STRUCTURE_AND_RESOURCE_VALUES;
deletePropertyObjects(dbc, project.getUuid(), existingSibling, propertyDeleteOption);
removeFile(dbc, project.getUuid(), existingSibling);
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", existingSibling)));
} else {
// we have a collision: there exists already a resource with the same path/name which could not be removed
throw new CmsVfsResourceAlreadyExistsException(Messages.get().container(
Messages.ERR_RESOURCE_WITH_NAME_ALREADY_EXISTS_1,
dbc.removeSiteRoot(resource.getRootPath())));
}
} catch (CmsVfsResourceNotFoundException e) {
// that's what we want in the best case- anything else should be thrown
}
// check if a resource with the specified ID already exists
if (!validateResourceIdExists(dbc, project.getUuid(), resource.getResourceId())) {
throw new CmsVfsResourceNotFoundException(Messages.get().container(
Messages.ERR_CREATE_SIBLING_FILE_NOT_FOUND_1,
dbc.removeSiteRoot(resource.getRootPath())));
}
// write a new structure referring to the resource
try {
// use consistent version numbers if the file is being restored
int lastVersion = m_driverManager.getHistoryDriver().readLastVersion(dbc, newStructureId);
int newStrVersion = 0;
if (lastVersion > 0) {
I_CmsHistoryResource histRes = m_driverManager.getHistoryDriver().readResource(
dbc,
newStructureId,
lastVersion);
newStrVersion = histRes.getStructureVersion();
}
conn = m_sqlManager.getConnection(dbc);
// read the parent id
String parentId = internalReadParentId(dbc, project.getUuid(), resource.getRootPath());
// write the structure
stmt = m_sqlManager.getPreparedStatement(conn, project, "C_STRUCTURE_WRITE");
stmt.setString(1, newStructureId.toString());
stmt.setString(2, resource.getResourceId().toString());
stmt.setString(3, resource.getRootPath());
stmt.setInt(4, CmsResource.STATE_UNCHANGED.getState());
stmt.setLong(5, resource.getDateReleased());
stmt.setLong(6, resource.getDateExpired());
stmt.setString(7, parentId);
stmt.setInt(8, newStrVersion); // initial structure version number
stmt.executeUpdate();
m_sqlManager.closeAll(dbc, null, stmt, null);
// update the link Count
stmt = m_sqlManager.getPreparedStatement(conn, project, "C_RESOURCES_UPDATE_SIBLING_COUNT");
stmt.setInt(1, countSiblings(dbc, project.getUuid(), resource.getResourceId()));
stmt.setString(2, resource.getResourceId().toString());
stmt.executeUpdate();
m_sqlManager.closeAll(dbc, null, stmt, null);
// update the project last modified and flags
stmt = m_sqlManager.getPreparedStatement(conn, project, "C_RESOURCES_UPDATE_RESOURCE_PROJECT");
stmt.setInt(1, resource.getFlags());
stmt.setString(2, resource.getProjectLastModified().toString());
stmt.setString(3, resource.getResourceId().toString());
stmt.executeUpdate();
} catch (SQLException e) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?