cmshistorydriver.java
来自「找了很久才找到到源代码」· Java 代码 · 共 1,535 行 · 第 1/5 页
JAVA
1,535 行
/*
* File : $Source: /usr/local/cvs/opencms/src/org/opencms/db/generic/CmsHistoryDriver.java,v $
* Date : $Date: 2007-08-13 16:30:15 $
* Version: $Revision: 1.4 $
*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) 2002 - 2007 Alkacon Software GmbH (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.db.generic;
import org.opencms.configuration.CmsConfigurationManager;
import org.opencms.db.CmsDbConsistencyException;
import org.opencms.db.CmsDbContext;
import org.opencms.db.CmsDbEntryNotFoundException;
import org.opencms.db.CmsDbSqlException;
import org.opencms.db.CmsDriverManager;
import org.opencms.db.CmsResourceState;
import org.opencms.db.I_CmsDriver;
import org.opencms.db.I_CmsHistoryDriver;
import org.opencms.file.CmsDataAccessException;
import org.opencms.file.CmsFile;
import org.opencms.file.CmsFolder;
import org.opencms.file.CmsProject;
import org.opencms.file.CmsProperty;
import org.opencms.file.CmsPropertyDefinition;
import org.opencms.file.CmsResource;
import org.opencms.file.CmsUser;
import org.opencms.file.CmsVfsResourceNotFoundException;
import org.opencms.file.history.CmsHistoryFile;
import org.opencms.file.history.CmsHistoryFolder;
import org.opencms.file.history.CmsHistoryPrincipal;
import org.opencms.file.history.CmsHistoryProject;
import org.opencms.file.history.I_CmsHistoryResource;
import org.opencms.main.CmsLog;
import org.opencms.security.CmsOrganizationalUnit;
import org.opencms.security.I_CmsPrincipal;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
/**
* Generic (ANSI-SQL) database server implementation of the history driver methods.<p>
*
* @author Thomas Weckert
* @author Michael Emmerich
* @author Carsten Weinholz
* @author Michael Moossen
*
* @version $Revision: 1.4 $
*
* @since 6.9.1
*/
public class CmsHistoryDriver implements I_CmsDriver, I_CmsHistoryDriver {
/** The log object for this class. */
private static final Log LOG = CmsLog.getLog(org.opencms.db.generic.CmsHistoryDriver.class);
/** The driver manager instance. */
protected CmsDriverManager m_driverManager;
/** The SQL manager instance. */
protected org.opencms.db.generic.CmsSqlManager m_sqlManager;
/**
* @see org.opencms.db.I_CmsHistoryDriver#createPropertyDefinition(org.opencms.db.CmsDbContext, java.lang.String, org.opencms.file.CmsPropertyDefinition.CmsPropertyType)
*/
public CmsPropertyDefinition createPropertyDefinition(
CmsDbContext dbc,
String name,
CmsPropertyDefinition.CmsPropertyType type) throws CmsDataAccessException {
Connection conn = null;
PreparedStatement stmt = null;
try {
conn = m_sqlManager.getConnection(dbc);
stmt = m_sqlManager.getPreparedStatement(conn, "C_PROPERTYDEF_CREATE_HISTORY");
stmt.setString(1, new CmsUUID().toString());
stmt.setString(2, name);
stmt.setInt(3, type.getMode());
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);
}
/**
* @see org.opencms.db.I_CmsHistoryDriver#deleteEntries(CmsDbContext, I_CmsHistoryResource, int, long)
*/
public int deleteEntries(CmsDbContext dbc, I_CmsHistoryResource resource, int versionsToKeep, long time)
throws CmsDataAccessException {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet res = null;
try {
conn = m_sqlManager.getConnection(dbc);
int maxVersion = -1;
// get the maximal version number for this resource
stmt = m_sqlManager.getPreparedStatement(conn, "C_STRUCTURE_HISTORY_MAXVER");
stmt.setString(1, resource.getStructureId().toString());
res = stmt.executeQuery();
if (res.next()) {
maxVersion = res.getInt(1);
while (res.next()) {
// do nothing only move through all rows because of mssql odbc driver
}
} else {
// nothing to delete
internalCleanup(dbc, resource);
return 0;
}
m_sqlManager.closeAll(dbc, null, stmt, res);
if (time >= 0) {
int maxVersionByTime = -1;
// get the maximal version to keep for this resource based on the time parameter
stmt = m_sqlManager.getPreparedStatement(conn, "C_STRUCTURE_HISTORY_MAXVER_BYTIME");
stmt.setString(1, resource.getStructureId().toString());
stmt.setLong(2, time);
res = stmt.executeQuery();
if (res.next()) {
maxVersionByTime = res.getInt(1);
while (res.next()) {
// do nothing only move through all rows because of mssql odbc driver
}
}
m_sqlManager.closeAll(dbc, null, stmt, res);
if (maxVersionByTime > 0) {
if (versionsToKeep < 0) {
versionsToKeep = (maxVersion - maxVersionByTime);
} else {
versionsToKeep = Math.min(versionsToKeep, (maxVersion - maxVersionByTime));
}
}
}
if (maxVersion - versionsToKeep <= 0) {
// nothing to delete
internalCleanup(dbc, resource);
return 0;
}
// get the minimal structure publish tag to keep for this sibling
int minStrPublishTagToKeep = -1;
stmt = m_sqlManager.getPreparedStatement(conn, "C_HISTORY_READ_MAXTAG_FOR_VERSION");
stmt.setString(1, resource.getStructureId().toString());
stmt.setInt(2, 1 + maxVersion - versionsToKeep);
res = stmt.executeQuery();
if (res.next()) {
minStrPublishTagToKeep = res.getInt(1);
while (res.next()) {
// do nothing only move through all rows because of mssql odbc driver
}
} else {
// nothing to delete
internalCleanup(dbc, resource);
return 0;
}
m_sqlManager.closeAll(dbc, null, stmt, res);
if (minStrPublishTagToKeep < 1) {
// nothing to delete
internalCleanup(dbc, resource);
return 0;
}
minStrPublishTagToKeep++;
// delete the properties
stmt = m_sqlManager.getPreparedStatement(conn, "C_PROPERTIES_HISTORY_DELETE");
stmt.setString(1, resource.getStructureId().toString());
stmt.setInt(2, minStrPublishTagToKeep);
stmt.executeUpdate();
m_sqlManager.closeAll(dbc, null, stmt, null);
// delete the structure entries
stmt = m_sqlManager.getPreparedStatement(conn, "C_STRUCTURE_HISTORY_DELETE");
stmt.setString(1, resource.getStructureId().toString());
stmt.setInt(2, minStrPublishTagToKeep);
int structureVersions = stmt.executeUpdate();
m_sqlManager.closeAll(dbc, null, stmt, null);
// get the minimal resource publish tag to keep,
// all entries with publish tag less than this will be deleted
int minResPublishTagToKeep = -1;
stmt = m_sqlManager.getPreparedStatement(conn, "C_HISTORY_READ_MIN_USED_TAG");
stmt.setString(1, resource.getResourceId().toString());
res = stmt.executeQuery();
if (res.next()) {
minResPublishTagToKeep = res.getInt(1);
while (res.next()) {
// do nothing only move through all rows because of mssql odbc driver
}
} else {
// nothing to delete
internalCleanup(dbc, resource);
return structureVersions;
}
m_sqlManager.closeAll(dbc, null, stmt, res);
// delete the resource entries
stmt = m_sqlManager.getPreparedStatement(conn, "C_RESOURCES_HISTORY_DELETE");
stmt.setString(1, resource.getResourceId().toString());
stmt.setInt(2, minResPublishTagToKeep);
int resourceVersions = stmt.executeUpdate();
m_sqlManager.closeAll(dbc, null, stmt, null);
// delete the content entries
stmt = m_sqlManager.getPreparedStatement(conn, "C_CONTENT_HISTORY_DELETE");
stmt.setString(1, resource.getResourceId().toString());
stmt.setInt(2, minResPublishTagToKeep);
stmt.executeUpdate();
internalCleanup(dbc, resource);
return Math.max(structureVersions, resourceVersions);
} 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, res);
}
}
/**
* @see org.opencms.db.I_CmsHistoryDriver#deletePropertyDefinition(org.opencms.db.CmsDbContext, org.opencms.file.CmsPropertyDefinition)
*/
public void deletePropertyDefinition(CmsDbContext dbc, CmsPropertyDefinition metadef) throws CmsDataAccessException {
Connection conn = null;
PreparedStatement stmt = null;
try {
if ((internalCountProperties(dbc, metadef, CmsProject.ONLINE_PROJECT_ID) != 0)
|| (internalCountProperties(dbc, metadef, CmsUUID.getOpenCmsUUID()) != 0)) { // HACK: to get an offline project
throw new CmsDbConsistencyException(Messages.get().container(
Messages.ERR_ERROR_DELETING_PROPERTYDEF_1,
metadef.getName()));
}
// delete the historical property definition
conn = m_sqlManager.getConnection(dbc);
stmt = m_sqlManager.getPreparedStatement(conn, "C_PROPERTYDEF_DELETE_HISTORY");
stmt.setString(1, metadef.getId().toString());
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);
}
}
/**
* @see org.opencms.db.I_CmsHistoryDriver#destroy()
*/
public void destroy() throws Throwable {
m_sqlManager = null;
m_driverManager = null;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?