cmspublishengine.java
来自「找了很久才找到到源代码」· Java 代码 · 共 773 行 · 第 1/2 页
JAVA
773 行
*
* @throws CmsException if there is some problem during unlocking the resources
* @throws CmsPublishException if the publish job can not be aborted
*/
protected synchronized void abortPublishJob(CmsUUID userId, CmsPublishJobEnqueued publishJob, boolean removeJob)
throws CmsException, CmsPublishException {
// abort event should be raised before the job is removed implicitly
m_listeners.fireAbort(userId, publishJob);
if ((m_currentPublishThread == null) || !publishJob.m_publishJob.equals(m_currentPublishThread.getPublishJob())) {
// engine is currently publishing another job or is not publishing
if (!m_publishQueue.abortPublishJob(publishJob.m_publishJob)) {
// job not found
throw new CmsPublishException(Messages.get().container(
Messages.ERR_PUBLISH_ENGINE_MISSING_PUBLISH_JOB_0));
}
} else {
// engine is currently publishing the job to abort
m_currentPublishThread.abort();
}
// unlock all resources
if (publishJob.getPublishList() != null) {
unlockPublishList(publishJob.m_publishJob);
}
// keep job if requested
if (!removeJob) {
// set finish info
publishJob.m_publishJob.finish();
getPublishHistory().add(publishJob.m_publishJob);
} else {
getPublishQueue().remove(publishJob.m_publishJob);
}
}
/**
* Adds a publish listener to listen on publish events.<p>
*
* @param listener the publish listener to add
*/
protected void addPublishListener(I_CmsPublishEventListener listener) {
m_listeners.add(listener);
}
/**
* Disables the publish engine, i.e. publish jobs are not accepted.<p>
*/
protected void disableEngine() {
m_engineState = CmsPublishEngineState.ENGINE_DISABLED;
}
/**
* Enables the publish engine, i.e. publish jobs are accepted.<p>
*/
protected void enableEngine() {
m_engineState = CmsPublishEngineState.ENGINE_STOPPED;
}
/**
* Returns the current running publish job.<p>
*
* @return the current running publish job
*/
protected CmsPublishThread getCurrentPublishJob() {
return m_currentPublishThread;
}
/**
* Returns the db context factory object.<p>
*
* @return the db context factory object
*/
protected I_CmsDbContextFactory getDbContextFactory() {
return m_dbContextFactory;
}
/**
* Returns the driver manager instance.<p>
*
* @return the driver manager instance
*/
protected synchronized CmsDriverManager getDriverManager() {
return m_driverManager;
}
/**
* Returns the publish history list with already publish job.<p>
*
* @return the publish history list with already publish job
*/
protected CmsPublishHistory getPublishHistory() {
return m_publishHistory;
}
/**
* Returns the queue with still waiting publish job.<p>
*
* @return the queue with still waiting publish job
*/
protected CmsPublishQueue getPublishQueue() {
return m_publishQueue;
}
/**
* Returns the content of the publish report assigned to the given publish job.<p>
*
* @param publishJob the published job
* @return the content of the assigned publish report
*
* @throws CmsException if something goes wrong
*/
protected byte[] getReportContents(CmsPublishJobFinished publishJob) throws CmsException {
CmsDbContext dbc = m_dbContextFactory.getDbContext();
try {
return m_driverManager.readPublishReportContents(dbc, publishJob.getPublishHistoryId());
} finally {
dbc.clear();
}
}
/**
* Returns the user identified by the given id.<p>
*
* @param userId the id of the user to retrieve
*
* @return the user identified by the given id
*/
protected CmsUser getUser(CmsUUID userId) {
CmsDbContext dbc = m_dbContextFactory.getDbContext();
try {
return m_driverManager.readUser(dbc, userId);
} catch (CmsException e) {
LOG.error(e.getLocalizedMessage(), e);
} finally {
dbc.clear();
}
return null;
}
/**
* Initializes the publish engine.<p>
*
* @param adminCms the admin cms
* @param publishQueuePersistance flag if the queue is persisted
* @param publishQueueShutdowntime amount of time to wait for a publish job during shutdown
*
* @throws CmsException if something goes wrong
*/
protected void initialize(CmsObject adminCms, boolean publishQueuePersistance, int publishQueueShutdowntime)
throws CmsException {
// check the driver manager
if (m_driverManager == null || m_dbContextFactory == null) {
throw new CmsPublishException(Messages.get().container(Messages.ERR_PUBLISH_ENGINE_NOT_INITIALIZED_0));
}
m_publishQueueShutdowntime = publishQueueShutdowntime;
// initially the engine is stopped, must be restartet after full system initialization
m_engineState = CmsPublishEngineState.ENGINE_STOPPED;
// read the publish history from the repository
m_publishHistory.initialize();
// read the queue from the repository
m_publishQueue.initialize(adminCms, publishQueuePersistance);
}
/**
* Returns the working state, that is if no publish job
* is waiting to be processed and there is no current running
* publish job.<p>
*
* @return the working state
*/
protected boolean isRunning() {
return ((m_engineState == CmsPublishEngineState.ENGINE_STARTED && !m_publishQueue.isEmpty()) || (m_currentPublishThread != null));
}
/**
* Sets publish locks of resources in a publish list.<p>
*
* @param publishJob the publish job
* @throws CmsException if something goes wrong
*/
protected void lockPublishList(CmsPublishJobInfoBean publishJob) throws CmsException {
CmsPublishList publishList = publishJob.getPublishList();
// lock them
CmsDbContext dbc = getDbContextFactory().getDbContext(publishJob.getCmsObject().getRequestContext());
try {
Iterator itResources = publishList.getAllResources().iterator();
while (itResources.hasNext()) {
CmsResource resource = (CmsResource)itResources.next();
m_driverManager.lockResource(dbc, resource, CmsLockType.PUBLISH);
}
} finally {
dbc.clear();
}
}
/**
* Signalizes that the publish thread finishes.<p>
*
* @param publishJob the finished publish job
*
* @throws CmsException if something goes wrong
*/
protected synchronized void publishJobFinished(CmsPublishJobInfoBean publishJob) throws CmsException {
// in order to avoid not removable publish locks, unlock all assigned resources again
unlockPublishList(publishJob);
if ((m_currentPublishThread != null) && (m_currentPublishThread.isAborted())) {
// try to start a new publish job
new Thread(this).start();
return;
}
// trigger the old event mechanism
CmsDbContext dbc = m_dbContextFactory.getDbContext(publishJob.getCmsObject().getRequestContext());
try {
// fire an event that a project has been published
Map eventData = new HashMap();
eventData.put(I_CmsEventListener.KEY_REPORT, publishJob.getPublishReport());
eventData.put(
I_CmsEventListener.KEY_PUBLISHID,
publishJob.getPublishList().getPublishHistoryId().toString());
eventData.put(I_CmsEventListener.KEY_PROJECTID, dbc.currentProject().getUuid());
eventData.put(I_CmsEventListener.KEY_DBCONTEXT, dbc);
CmsEvent afterPublishEvent = new CmsEvent(I_CmsEventListener.EVENT_PUBLISH_PROJECT, eventData);
OpenCms.fireCmsEvent(afterPublishEvent);
} catch (Throwable t) {
// catch every thing including runtime exceptions
publishJob.getPublishReport().println(t);
} finally {
dbc.clear();
dbc = null;
}
// fire the publish finish event
m_listeners.fireFinish(new CmsPublishJobRunning(publishJob));
// finish the job
publishJob.finish();
// put the publish job into the history list
m_publishHistory.add(publishJob);
// wipe the dead thread
m_currentPublishThread = null;
// try to start a new publish job
new Thread(this).start();
}
/**
* A publish job has been permanently removed from the history.<p>
*
* @param publishJob the removed publish job
*/
protected void publishJobRemoved(CmsPublishJobInfoBean publishJob) {
// a publish job has been removed
m_listeners.fireRemove(new CmsPublishJobFinished(publishJob));
}
/**
* Signalizes that the publish thread starts.<p>
*
* @param publishJob the started publish job
*
* @throws CmsException if something goes wrong
*/
protected void publishJobStarted(CmsPublishJobInfoBean publishJob) throws CmsException {
// update the job
m_publishQueue.update(publishJob);
// fire the publish start event
m_listeners.fireStart(new CmsPublishJobEnqueued(publishJob));
}
/**
* Removes the given publish listener.<p>
*
* @param listener the publish listener to remove
*/
protected void removePublishListener(I_CmsPublishEventListener listener) {
m_listeners.remove(listener);
}
/**
* Sends a message to the given user, if publish notification is enabled or an error is shown in the message.<p>
*
* @param toUserId the id of the user to send the message to
* @param message the message to send
* @param hasErrors flag to determine if the message to send shows an error
*/
protected void sendMessage(CmsUUID toUserId, String message, boolean hasErrors) {
CmsDbContext dbc = m_dbContextFactory.getDbContext();
try {
CmsUser toUser = m_driverManager.readUser(dbc, toUserId);
CmsUserSettings settings = new CmsUserSettings(toUser);
if (settings.getShowPublishNotification() || hasErrors) {
// only show message if publish notification is enabled or the message shows an error
OpenCms.getSessionManager().sendBroadcast(null, message, toUser);
}
} catch (CmsException e) {
LOG.error(e.getLocalizedMessage(), e);
} finally {
dbc.clear();
}
}
/**
* Starts the publish engine, i.e. publish jobs are accepted and processed.<p>
*/
protected synchronized void startEngine() {
if (m_engineState != CmsPublishEngineState.ENGINE_STARTED) {
m_engineState = CmsPublishEngineState.ENGINE_STARTED;
// start publish job if jobs waiting
if (m_currentPublishThread == null && !m_publishQueue.isEmpty()) {
run();
}
}
}
/**
* Stops the publish engine, i.e. publish jobs are still accepted but not published.<p>
*/
protected void stopEngine() {
m_engineState = CmsPublishEngineState.ENGINE_STOPPED;
}
/**
* Removes all publish locks of resources in a publish list of a publish job.<p>
*
* @param publishJob the publish job
* @throws CmsException if something goes wrong
*/
protected void unlockPublishList(CmsPublishJobInfoBean publishJob) throws CmsException {
CmsPublishList publishList = publishJob.getPublishList();
List allResources = publishList.getAllResources();
// unlock them
CmsDbContext dbc = getDbContextFactory().getDbContext(publishJob.getCmsObject().getRequestContext());
try {
Iterator itResources = allResources.iterator();
while (itResources.hasNext()) {
CmsResource resource = (CmsResource)itResources.next();
m_driverManager.unlockResource(dbc, resource, true, true);
}
} finally {
dbc.clear();
}
}
/**
* Returns <code>true</code> if the login manager allows login.<p>
*
* @return if enabled
*/
private boolean isEnabled() {
try {
if (m_engineState == CmsPublishEngineState.ENGINE_STOPPED
|| m_engineState == CmsPublishEngineState.ENGINE_STARTED) {
OpenCms.getLoginManager().checkLoginAllowed();
return true;
} else {
return false;
}
} catch (CmsAuthentificationException e) {
return false;
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?