Author: taylor
Date: Sat Jul 12 20:51:41 2014
New Revision: 1610047
URL: http://svn.apache.org/r1610047
Log:
JS2-1285: backporting changes from trunk to 2.2.3 maintenance release
Modified:
portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/main/java/org/apache/jetspeed/cluster/NodeManagerImpl.java
Modified:
portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/main/java/org/apache/jetspeed/cluster/NodeManagerImpl.java
URL:
http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/main/java/org/apache/jetspeed/cluster/NodeManagerImpl.java?rev=1610047&r1=1610046&r2=1610047&view=diff
==============================================================================
---
portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/main/java/org/apache/jetspeed/cluster/NodeManagerImpl.java
(original)
+++
portals/jetspeed-2/portal/branches/JETSPEED-BRANCH-2.2.2-POST-RELEASE/components/jetspeed-portal/src/main/java/org/apache/jetspeed/cluster/NodeManagerImpl.java
Sat Jul 12 20:51:41 2014
@@ -5,9 +5,9 @@
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -16,146 +16,205 @@
*/
package org.apache.jetspeed.cluster;
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.BeanFactoryAware;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.BeanFactoryAware;
+import java.util.Map;
/**
- * Node Manager
+ * Node Manager
*
* @author <a href="mailto:[email protected]">Hajo Birthelmer</a>
- * @version
+ * @version $Id$
*/
public class NodeManagerImpl implements NodeManager,BeanFactoryAware
{
- protected final static Logger log =
LoggerFactory.getLogger(NodeManagerImpl.class);
+
+ protected final static Logger log =
LoggerFactory.getLogger(NodeManagerImpl.class);
+
+ private static final String NODES_SERIALIZED_FILE_NAME = "nodeInfo.ser";
/**
* added support for bean factory to create profile rules
*/
private BeanFactory beanFactory;
- private HashMap<String, NodeInformation> nodes = null;
- private File rootIndexDir = null;
-
+ private Map<String, NodeInformation> nodes = new HashMap<String,
NodeInformation>();
+ private File rootIndexDir = null;
+
/** the default criterion bean name */
private String nodeInformationBean = "NodeInformation";
-
- public NodeManagerImpl(String indexRoot, String nodeInformationBean)
- throws Exception
+
+ public NodeManagerImpl(String indexRoot, String nodeInformationBean)
throws Exception
{
-
//assume it's full path for now
rootIndexDir = new File(indexRoot);
this.nodeInformationBean = nodeInformationBean;
- if (!(rootIndexDir.exists()))
- rootIndexDir.mkdirs();
+ if (!rootIndexDir.isDirectory())
+ {
+ rootIndexDir.mkdirs();
+ }
+
load();
}
-
- protected void save()
- {
- try {
- FileOutputStream fout = new
FileOutputStream(rootIndexDir.getAbsolutePath()+ "/nodeInfo.ser");
- ObjectOutputStream oos = new ObjectOutputStream(fout);
- oos.writeObject(nodes);
- oos.close();
- }
- catch (Exception e)
- {
- log.error("Failed to write nodes data file to " +
rootIndexDir.getAbsolutePath()+ "/nodeInfo.ser" + " - error : " +
e.getLocalizedMessage());
- e.printStackTrace();
- }
- }
-
- @SuppressWarnings("unchecked")
+
+ protected void save()
+ {
+ File nodesFile = new File(rootIndexDir, NODES_SERIALIZED_FILE_NAME);
+
+ FileOutputStream fos = null;
+ BufferedOutputStream bos = null;
+ ObjectOutputStream oos = null;
+
+ try
+ {
+ fos = new FileOutputStream(nodesFile);
+ bos = new BufferedOutputStream(fos);
+ oos = new ObjectOutputStream(bos);
+
+ oos.writeObject(nodes);
+ }
+ catch (Exception e)
+ {
+ log.error("Failed to write nodes data to " + nodesFile, e);
+ }
+ finally
+ {
+ IOUtils.closeQuietly(oos);
+ IOUtils.closeQuietly(bos);
+ IOUtils.closeQuietly(fos);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
protected void load()
- {
- File data = new File( rootIndexDir.getAbsolutePath()+
"/nodeInfo.ser");
- if (data.exists())
- {
- try {
- FileInputStream fin = new
FileInputStream(data.getAbsolutePath());
- ObjectInputStream ois = new
ObjectInputStream(fin);
- nodes = (HashMap<String,NodeInformation>)
ois.readObject();
- ois.close();
- }
- catch (Exception e)
- {
- log.error("Failed to read nodes data file
from " + data.getAbsolutePath() + " - error : " + e.getLocalizedMessage());
- nodes = new
HashMap<String,NodeInformation>();
- }
- }
- else
- {
- try
- {
- data.createNewFile();
- }
- catch (Exception e)
- {
- log.error("Failed to create new nodes data file
error : " + e.getLocalizedMessage());
- e.printStackTrace();
- }
- nodes = new HashMap<String,NodeInformation>();
- }
-
-// NodeInformationImpl temp = new NodeInformationImpl();
-// temp.setContextName("tttt");
- }
- public synchronized int checkNode(Long revision, String contextName)
- {
- if ((contextName == null) || (revision == null))
- return NodeManager.INVALID_NODE_REQUEST;
- NodeInformation info = (NodeInformation)nodes.get(contextName);
- if (info == null)
- return NodeManager.NODE_NEW;
- if (info.getRevision().longValue() < revision.longValue())
- return NodeManager.NODE_OUTDATED;
- return NodeManager.NODE_SAVED;
- }
-
- public synchronized void addNode(Long revision, String contextName)
throws Exception
- {
- if ((contextName == null) || (revision == null))
- return;
- NodeInformation info = (NodeInformation)nodes.get(contextName);
- if (info == null)
- {
- info = createNodeInformation();
- info.setContextName(contextName);
- }
- info.setRevision(revision);
- nodes.put(contextName, info);
- save();
- }
-
- public synchronized void removeNode(String contextName) throws Exception
- {
- if (contextName == null)
- return;
- NodeInformation info = (NodeInformation)nodes.get(contextName);
- if (info == null)
- return;
- nodes.remove(contextName);
- save();
- }
-
+ {
+ File nodesFile = new File(rootIndexDir, NODES_SERIALIZED_FILE_NAME);
+
+ FileInputStream fis = null;
+ BufferedInputStream bis = null;
+ ObjectInputStream ois = null;
+
+ if (nodesFile.isFile())
+ {
+ // In order to avoid EOFException, check whether or not the file
is empty before reading.
+ if (nodesFile.length() > 0) {
+ try
+ {
+ fis = new FileInputStream(nodesFile);
+ bis = new BufferedInputStream(fis);
+ ois = new ObjectInputStream(bis);
+
+ nodes = (HashMap<String, NodeInformation>)
ois.readObject();
+ }
+ catch (Exception e)
+ {
+ log.error("Failed to read nodes data from " + nodesFile,
e);
+ nodes = new HashMap<String, NodeInformation>();
+ }
+ finally
+ {
+ IOUtils.closeQuietly(ois);
+ IOUtils.closeQuietly(bis);
+ IOUtils.closeQuietly(fis);
+ }
+ } else {
+ nodes = new HashMap<String, NodeInformation>();
+ }
+ }
+ else
+ {
+ try
+ {
+ nodesFile.createNewFile();
+ }
+ catch (Exception e)
+ {
+ log.error("Failed to create new nodes data file.", e);
+ }
+
+ nodes = new HashMap<String, NodeInformation>();
+ }
+ }
+
+ public synchronized int checkNode(Long revision, String contextName)
+ {
+ if ((contextName == null) || (revision == null))
+ {
+ return NodeManager.INVALID_NODE_REQUEST;
+ }
+
+ NodeInformation info = (NodeInformation) nodes.get(contextName);
+
+ if (info == null)
+ {
+ return NodeManager.NODE_NEW;
+ }
+
+ if (info.getRevision().longValue() < revision.longValue())
+ {
+ return NodeManager.NODE_OUTDATED;
+ }
+
+ return NodeManager.NODE_SAVED;
+ }
+
+ public synchronized void addNode(Long revision, String contextName) throws
Exception
+ {
+ if ((contextName == null) || (revision == null))
+ {
+ return;
+ }
+
+ NodeInformation info = (NodeInformation) nodes.get(contextName);
+
+ if (info == null)
+ {
+ info = createNodeInformation();
+ info.setContextName(contextName);
+ }
+
+ info.setRevision(revision);
+ nodes.put(contextName, info);
+ save();
+ }
+
+ public synchronized void removeNode(String contextName) throws Exception
+ {
+ if (contextName == null)
+ {
+ return;
+ }
+
+ NodeInformation info = (NodeInformation) nodes.get(contextName);
+
+ if (info == null)
+ {
+ return;
+ }
+
+ nodes.remove(contextName);
+ save();
+ }
+
/*
* (non-Javadoc)
- *
+ *
* @see org.apache.jetspeed.profiler.Profiler#createRuleCriterion()
*/
protected NodeInformation createNodeInformation() throws
ClassNotFoundException
@@ -165,7 +224,8 @@ public class NodeManagerImpl implements
NodeInformation nodeInformation = (NodeInformation)
beanFactory.getBean(
this.nodeInformationBean, NodeInformation.class);
return nodeInformation;
- } catch (Exception e)
+ }
+ catch (Exception e)
{
log.error("Failed to create nodeInformation for " +
nodeInformationBean
+ " error : " + e.getLocalizedMessage());
@@ -177,7 +237,7 @@ public class NodeManagerImpl implements
/*
* Method called automatically by Spring container upon initialization
- *
+ *
* @param beanFactory automatically provided by framework @throws
* BeansException
*/
@@ -186,8 +246,8 @@ public class NodeManagerImpl implements
this.beanFactory = beanFactory;
}
- public synchronized int getNumberOfNodes()
- {
- return nodes.size();
- }
+ public synchronized int getNumberOfNodes()
+ {
+ return nodes.size();
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]