summaryrefslogtreecommitdiffstats
path: root/src/com.gluster.storage.management.core
diff options
context:
space:
mode:
authorShireesh Anjal <anjalshireesh@gmail.com>2011-03-28 06:58:51 -0700
committerShireesh Anjal <anjalshireesh@gmail.com>2011-03-28 06:58:51 -0700
commitbf531d097bc99db08bda4d1a1dec541c57c7933c (patch)
tree253a3fc82d5bac3755fc7e32f8456879b69b9979 /src/com.gluster.storage.management.core
parentb27c5d68d3ffa47c92e0fcd7d0873ac2d6b8fca8 (diff)
Preparing src for migration to github
Diffstat (limited to 'src/com.gluster.storage.management.core')
-rw-r--r--src/com.gluster.storage.management.core/.classpath9
-rw-r--r--src/com.gluster.storage.management.core/.project28
-rw-r--r--src/com.gluster.storage.management.core/.settings/org.eclipse.jdt.core.prefs8
-rw-r--r--src/com.gluster.storage.management.core/META-INF/MANIFEST.MF12
-rw-r--r--src/com.gluster.storage.management.core/build.properties4
-rw-r--r--src/com.gluster.storage.management.core/junit/com/gluster/storage/management/core/utils/TestFileUtil.java84
-rw-r--r--src/com.gluster.storage.management.core/junit/core.junit.launch15
-rw-r--r--src/com.gluster.storage.management.core/junit/test/test.txt1
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/CoreConstants.java29
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java37
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/exceptions/GlusterRuntimeException.java31
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractResponse.java32
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java100
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java43
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ConnectionDetails.java44
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java80
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java107
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java83
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/EntityGroup.java46
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java53
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Filterable.java37
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GenericResponse.java56
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDataModel.java42
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java283
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java106
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerListResponse.java71
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerResponse.java32
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/LogMessage.java75
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java73
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Response.java37
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTask.java75
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTaskListResponse.java43
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTaskStatus.java41
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java174
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerListResponse.java65
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java77
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/StringListResponse.java45
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/User.java40
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java252
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeOptionInfo.java66
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/DateUtil.java35
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/FileUtil.java45
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java218
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/MD5.java504
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/MD5Crypt.java339
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/NumberUtil.java30
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/ProcessResult.java63
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/ProcessUtil.java97
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/StringUtil.java28
49 files changed, 3895 insertions, 0 deletions
diff --git a/src/com.gluster.storage.management.core/.classpath b/src/com.gluster.storage.management.core/.classpath
new file mode 100644
index 00000000..b41cbcdb
--- /dev/null
+++ b/src/com.gluster.storage.management.core/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="junit"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/src/com.gluster.storage.management.core/.project b/src/com.gluster.storage.management.core/.project
new file mode 100644
index 00000000..6c8fbb5c
--- /dev/null
+++ b/src/com.gluster.storage.management.core/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>com.gluster.storage.management.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/src/com.gluster.storage.management.core/.settings/org.eclipse.jdt.core.prefs b/src/com.gluster.storage.management.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000..f22cedf1
--- /dev/null
+++ b/src/com.gluster.storage.management.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#Wed Dec 22 11:18:01 IST 2010
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/src/com.gluster.storage.management.core/META-INF/MANIFEST.MF b/src/com.gluster.storage.management.core/META-INF/MANIFEST.MF
new file mode 100644
index 00000000..b5a2a830
--- /dev/null
+++ b/src/com.gluster.storage.management.core/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Gluster Storage Platform Core
+Bundle-SymbolicName: com.gluster.storage.management.core
+Bundle-Version: 1.0.0
+Bundle-Vendor: GLUSTER
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: com.gluster.storage.management.core.constants,
+ com.gluster.storage.management.core.exceptions,
+ com.gluster.storage.management.core.model,
+ com.gluster.storage.management.core.utils
+Require-Bundle: org.eclipse.core.runtime;bundle-version="3.6.0"
diff --git a/src/com.gluster.storage.management.core/build.properties b/src/com.gluster.storage.management.core/build.properties
new file mode 100644
index 00000000..34d2e4d2
--- /dev/null
+++ b/src/com.gluster.storage.management.core/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/src/com.gluster.storage.management.core/junit/com/gluster/storage/management/core/utils/TestFileUtil.java b/src/com.gluster.storage.management.core/junit/com/gluster/storage/management/core/utils/TestFileUtil.java
new file mode 100644
index 00000000..8902ae8f
--- /dev/null
+++ b/src/com.gluster.storage.management.core/junit/com/gluster/storage/management/core/utils/TestFileUtil.java
@@ -0,0 +1,84 @@
+/**
+ * TestFileUtil.java
+ *
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+package com.gluster.storage.management.core.utils;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestFileUtil {
+ private String testFileName;
+ private String fileContent;
+ private FileUtil fileUtil;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ testFileName = "testFileUtil.txt";
+ fileContent = "Testing FileUtil class.";
+ fileUtil = new FileUtil();
+
+ BufferedOutputStream outStream = new BufferedOutputStream(new FileOutputStream(testFileName));
+ OutputStreamWriter writer = new OutputStreamWriter(outStream);
+ writer.write(fileContent);
+ writer.close();
+ outStream.close();
+ }
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @After
+ public void tearDown() throws Exception {
+ File testFile = new File(testFileName);
+ testFile.delete();
+ }
+
+ /**
+ * Test method for {@link com.gluster.storage.management.core.utils.FileUtil#readFileAsString(java.io.File)}.
+ */
+ @Test
+ public final void testReadFileAsString() {
+ String readContent = fileUtil.readFileAsString(new File(testFileName));
+ assertTrue("File contents expected [" + fileContent + "], actual [" + readContent + "]",
+ readContent.equals(fileContent));
+ }
+
+ /**
+ * Test method for {@link com.gluster.storage.management.core.utils.FileUtil#loadResource(java.lang.String)}.
+ */
+ @Test
+ public final void testLoadResource() {
+ InputStream inputStream = fileUtil.loadResource("test/test.txt");
+ Assert.assertNotNull(inputStream);
+ }
+}
diff --git a/src/com.gluster.storage.management.core/junit/core.junit.launch b/src/com.gluster.storage.management.core/junit/core.junit.launch
new file mode 100644
index 00000000..0bf6dc30
--- /dev/null
+++ b/src/com.gluster.storage.management.core/junit/core.junit.launch
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/com.gluster.storage.management.core"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=com.gluster.storage.management.core"/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.gluster.storage.management.core"/>
+</launchConfiguration>
diff --git a/src/com.gluster.storage.management.core/junit/test/test.txt b/src/com.gluster.storage.management.core/junit/test/test.txt
new file mode 100644
index 00000000..267ce144
--- /dev/null
+++ b/src/com.gluster.storage.management.core/junit/test/test.txt
@@ -0,0 +1 @@
+Test Resource \ No newline at end of file
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/CoreConstants.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/CoreConstants.java
new file mode 100644
index 00000000..177334bd
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/CoreConstants.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.constants;
+
+
+/**
+ *
+ */
+public class CoreConstants {
+ public static final String NEWLINE = System.getProperty("line.separator");
+ public static final String FILE_SEPARATOR = System.getProperty("file.separator");
+ public static final String ENCODING_UTF8 = "UTF-8";
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java
new file mode 100644
index 00000000..fb40be8a
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java
@@ -0,0 +1,37 @@
+/**
+ * RESTConstants.java
+ *
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+package com.gluster.storage.management.core.constants;
+
+/**
+ * All constants related to the Gluster REST server and client
+ */
+public class RESTConstants {
+ // Volumes Resource
+ public static final String RESOURCE_PATH_VOLUMES = "/cluster/volumes";
+ public static final String FORM_PARAM_OPERATION = "operation";
+ public static final String FORM_PARAM_VALUE_START = "start";
+ public static final String FORM_PARAM_VALUE_STOP = "stop";
+ public static final String PATH_PARAM_VOLUME_NAME = "volumeName";
+ public static final String SUBRESOURCE_DEFAULT_OPTIONS = "defaultoptions";
+
+ // Running tasks resource
+ public static final String RESOURCE_PATH_RUNNING_TASKS = "/cluster/runningtasks";
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/exceptions/GlusterRuntimeException.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/exceptions/GlusterRuntimeException.java
new file mode 100644
index 00000000..e7e604fc
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/exceptions/GlusterRuntimeException.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.exceptions;
+
+public class GlusterRuntimeException extends RuntimeException {
+ private static final long serialVersionUID = 1L;
+
+ public GlusterRuntimeException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public GlusterRuntimeException(String message) {
+ super(message);
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractResponse.java
new file mode 100644
index 00000000..be552bdc
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractResponse.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+public abstract class AbstractResponse implements Response {
+ private Status status;
+
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ public void setStatus(Status status) {
+ this.status = status;
+ }
+} \ No newline at end of file
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java
new file mode 100644
index 00000000..65d5ebea
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="cluster")
+public class Cluster extends Entity {
+ List<GlusterServer> servers = new ArrayList<GlusterServer>();
+ List<Server> discoveredServers = new ArrayList<Server>();
+ List<Volume> volumes = new ArrayList<Volume>();
+ List<RunningTask> runningTasks = new ArrayList<RunningTask>();
+
+ public Cluster() {
+ }
+
+ public List<GlusterServer> getServers() {
+ return servers;
+ }
+
+ public void addServer(GlusterServer server) {
+ servers.add(server);
+ }
+
+ public void removeServer(GlusterServer server) {
+ servers.remove(server);
+ }
+
+ public void addDiscoveredServer(Server server) {
+ discoveredServers.add(server);
+ }
+
+ public void removeDiscoveredServer(Server server) {
+ discoveredServers.remove(server);
+ }
+
+ public void setServers(List<GlusterServer> servers) {
+ this.servers = servers;
+ children.add(new EntityGroup<GlusterServer>("Servers", GlusterServer.class, this, servers));
+ }
+
+ public List<Server> getAutoDiscoveredServers() {
+ return discoveredServers;
+ }
+
+ public void setAutoDiscoveredServers(List<Server> autoDiscoveredServers) {
+ this.discoveredServers = autoDiscoveredServers;
+ children.add(new EntityGroup<Server>("Discovered Servers", Server.class, this, autoDiscoveredServers));
+ }
+
+ public List<Volume> getVolumes() {
+ return volumes;
+ }
+
+ public void setVolumes(List<Volume> volumes) {
+ this.volumes = volumes;
+ children.add(new EntityGroup<Volume>("Volumes", Volume.class, this, volumes));
+ }
+
+ public void addVolume(Volume volume) {
+ this.volumes.add(volume);
+ }
+
+ public Cluster(String name, Entity parent) {
+ super(name, parent);
+ }
+
+ public Cluster(String name, Entity parent, List<GlusterServer> servers, List<Volume> volumes) {
+ super(name, parent);
+ setServers(servers);
+ setVolumes(volumes);
+ }
+
+ public List<RunningTask> getRunningTasks() {
+ return runningTasks;
+ }
+
+ public void setRunningTasks(List<RunningTask> runningTasks) {
+ this.runningTasks = runningTasks;
+ }
+} \ No newline at end of file
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java
new file mode 100644
index 00000000..ce2752a4
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+/**
+ * Interface for a cluster listener. Every registered listener will be notified
+ * on various events happening on the cluster.
+ */
+public interface ClusterListener {
+ public void discoveredServerAdded(Server server);
+
+ public void discoveredServerRemoved(Server server);
+
+ public void serverAdded(GlusterServer server);
+
+ public void serverRemoved(GlusterServer server);
+
+ public void serverChanged(GlusterServer server, Event event);
+
+ public void volumeAdded(Volume volume);
+
+ public void volumeRemoved(Volume volume);
+
+ public void volumeChanged(Volume volume, Event event);
+
+ public void volumeCreated(Volume volume);
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ConnectionDetails.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ConnectionDetails.java
new file mode 100644
index 00000000..ccf8fecf
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ConnectionDetails.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+public class ConnectionDetails {
+ private String userId, password;
+
+ public ConnectionDetails() {
+
+ }
+
+ public ConnectionDetails(String userId, String password) {
+ this.userId = userId;
+ this.password = password;
+ }
+
+ public String getUserId() {
+ return userId;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java
new file mode 100644
index 00000000..1a39a014
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+/**
+ * Default listener - doesn't do anything. Sub-class and override the method for
+ * the event you want to handle.
+ */
+public class DefaultClusterListener implements ClusterListener {
+
+ @Override
+ public void serverAdded(GlusterServer server) {
+ clusterChanged();
+ }
+
+ @Override
+ public void serverRemoved(GlusterServer server) {
+ clusterChanged();
+ }
+
+ @Override
+ public void serverChanged(GlusterServer server, Event event) {
+ clusterChanged();
+ }
+
+ @Override
+ public void volumeAdded(Volume volume) {
+ clusterChanged();
+ }
+
+ @Override
+ public void volumeRemoved(Volume volume) {
+ clusterChanged();
+ }
+
+ @Override
+ public void volumeChanged(Volume volume, Event event) {
+ clusterChanged();
+ }
+
+ @Override
+ public void discoveredServerAdded(Server server) {
+ clusterChanged();
+ }
+
+ @Override
+ public void discoveredServerRemoved(Server server) {
+ clusterChanged();
+ }
+
+ @Override
+ public void volumeCreated(Volume volume) {
+ clusterChanged();
+ }
+
+ /**
+ * This method is called by every other event method. Thus, if a view/listener is interested in performing the same
+ * task on any change happening in the cluster data model, it can simply override this method and implement the
+ * logic. e.g. A view may simply refresh its tree/table viewer whenever the cluster data model changes.
+ */
+ public void clusterChanged() {
+
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java
new file mode 100644
index 00000000..9924d596
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import com.gluster.storage.management.core.utils.StringUtil;
+
+@XmlRootElement(name="Disk")
+public class Disk extends Entity {
+ public enum DISK_STATUS {
+ READY, UNINITIALIZED, INITIALIZING, OFFLINE
+ };
+
+ private String[] DISK_STATUS_STR = { "Ready", "Uninitialized", "Initializing", "Offline" };
+
+ private String serverName;
+ private Double space;
+ private Double spaceInUse;
+ private DISK_STATUS status;
+
+ public Disk() {
+
+ }
+
+ public Double getSpace() {
+ return space;
+ }
+
+ public void setSpace(Double space) {
+ this.space = space;
+ }
+
+ public boolean isUninitialized() {
+ return getStatus() == DISK_STATUS.UNINITIALIZED;
+ }
+
+ public boolean isOffline() {
+ return getStatus() == DISK_STATUS.OFFLINE;
+ }
+
+ public boolean isReady() {
+ return getStatus() == DISK_STATUS.READY;
+ }
+
+ public DISK_STATUS getStatus() {
+ return status;
+ }
+
+ public String getStatusStr() {
+ return DISK_STATUS_STR[getStatus().ordinal()];
+ }
+
+ public void setStatus(DISK_STATUS status) {
+ this.status = status;
+ }
+
+ public Double getSpaceInUse() {
+ return spaceInUse;
+ }
+
+ public void setSpaceInUse(Double spaceInUse) {
+ this.spaceInUse = spaceInUse;
+ }
+
+ public String getServerName() {
+ return serverName;
+ }
+
+ public void setServerName(String serverName) {
+ this.serverName = serverName;
+ }
+
+ public Disk(Server server, String name, Double space, Double spaceInUse, DISK_STATUS status) {
+ super(name, server);
+ setServerName(server != null ? server.getName() : "");
+ setSpace(space);
+ setSpaceInUse(spaceInUse);
+ setStatus(status);
+ }
+
+ @Override
+ public boolean filter(String filterString, boolean caseSensitive) {
+ return StringUtil.filterString(getServerName() + getName() + getStatusStr(), filterString, caseSensitive);
+ }
+
+ public String getQualifiedName() {
+ return getServerName() + ":" + getName();
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java
new file mode 100644
index 00000000..e721d052
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.eclipse.core.runtime.PlatformObject;
+
+import com.gluster.storage.management.core.utils.StringUtil;
+
+@XmlRootElement
+public class Entity extends PlatformObject implements Filterable {
+ private static final long serialVersionUID = 1L;
+
+ protected String name;
+ protected List<Entity> children = new ArrayList<Entity>();
+ private Entity parent;
+
+ public Entity() {
+
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @XmlTransient
+ public Entity getParent() {
+ return parent;
+ }
+
+ public void setParent(Entity parent) {
+ this.parent = parent;
+ }
+
+ public List<? extends Entity> getChildren() {
+ return children;
+ }
+
+ public void setChildren(List<Entity> children) {
+ this.children = children;
+ }
+
+ public Entity(String name, Entity parent) {
+ this.name = name;
+ this.parent = parent;
+ }
+
+ public Entity(String name, Entity parent, List<Entity> children) {
+ this.name = name;
+ this.parent = parent;
+ this.children = children;
+ }
+
+ @Override
+ public boolean filter(String filterString, boolean caseSensitive) {
+ return StringUtil.filterString(getName(), filterString, caseSensitive);
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/EntityGroup.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/EntityGroup.java
new file mode 100644
index 00000000..0fc0f507
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/EntityGroup.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import java.util.List;
+
+public class EntityGroup<T> extends Entity {
+ private Class<? extends Entity> type;
+
+ public EntityGroup(String name, Class<? extends Entity> type, Cluster cluster) {
+ this(name, type, cluster, null);
+ }
+
+ public EntityGroup(String name, Class<? extends Entity> type, Cluster cluster, List<T> entities) {
+ super(name, cluster, (List<Entity>)entities);
+ this.type = type;
+ }
+
+ public List<? extends Entity> getEntities() {
+ return children;
+ }
+
+ public void setEntities(List<T> entities) {
+ children = (List<Entity>)entities;
+ }
+
+ public Class<? extends Entity> getEntityType() {
+ return type;
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java
new file mode 100644
index 00000000..65501a2b
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+public class Event {
+ public enum EVENT_TYPE {
+ DISK_ADDED,
+ DISK_REMOVED,
+ NETWORK_INTERFACE_ADDED,
+ NETWORK_INTERFACE_REMOVED,
+ VOLUME_STATUS_CHANGED
+ }
+
+ private EVENT_TYPE eventType;
+ private Object eventData;
+
+ public Event(EVENT_TYPE eventType, Object eventData) {
+ this.eventType = eventType;
+ this.eventData = eventData;
+ }
+
+ public EVENT_TYPE getEventType() {
+ return eventType;
+ }
+
+ public void setEventType(EVENT_TYPE eventType) {
+ this.eventType = eventType;
+ }
+
+ public Object getEventData() {
+ return eventData;
+ }
+
+ public void setEventData(Object eventData) {
+ this.eventData = eventData;
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Filterable.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Filterable.java
new file mode 100644
index 00000000..9a2ed405
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Filterable.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+/**
+ * By default, the {@link EntityViewerFilter} filters the objects by parsing the
+ * output of {@link Object#toString()} with the filter string. Classes that need
+ * specific filtering logic can implement this interface. The default logic will
+ * then be overridden by the method {@link Filterable#filter(String)}.
+ */
+public interface Filterable {
+ /**
+ * @param filterString
+ * String to be used for filtering
+ * @param caseSensitive
+ * Flag indicating whether the filtering should be case sensitive
+ * @return true if the object can be selected using the filter string, else
+ * false
+ */
+ public boolean filter(String filterString, boolean caseSensitive);
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GenericResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GenericResponse.java
new file mode 100644
index 00000000..efeed34b
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GenericResponse.java
@@ -0,0 +1,56 @@
+/**
+ * GenericServerResponse.java
+ *
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+package com.gluster.storage.management.core.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "response")
+public class GenericResponse<T> extends AbstractResponse {
+ private T data;
+ private Status status;
+
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ public void setStatus(Status status) {
+ this.status = status;
+ }
+
+ public GenericResponse(Status status, T data) {
+ setStatus(status);
+ this.data = data;
+ }
+
+ public GenericResponse() {
+ }
+
+ @Override
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDataModel.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDataModel.java
new file mode 100644
index 00000000..612cae31
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDataModel.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class GlusterDataModel extends Entity {
+ public GlusterDataModel(String name, List<Cluster> clusters) {
+ super(name, null);
+ children.addAll(clusters);
+ }
+
+ public GlusterDataModel(String name) {
+ this(name, new ArrayList<Cluster>());
+ }
+
+ public void setClusters(List<Cluster> clusters) {
+ children.clear();
+ children.addAll(clusters);
+ }
+
+ public void addCluster(Cluster cluster) {
+ children.add(cluster);
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java
new file mode 100644
index 00000000..11d31553
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java
@@ -0,0 +1,283 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import com.gluster.storage.management.core.model.Disk.DISK_STATUS;
+import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS;
+import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE;
+import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS;
+import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE;
+
+public class GlusterDummyModel {
+ // private Server discoveredServer1, discoveredServer2, discoveredServer3, discoveredServer4, discoveredServer5;
+ private GlusterServer server1, server2, server3, server4, server5;
+ private Volume volume1, volume2, volume3, volume4, volume5;
+ private Disk s1da, s1db, s2da, s2db, s2dc, s2dd, s3da, s4da, s5da, s5db;
+ private static List<LogMessage> logMessages = new ArrayList<LogMessage>();
+ private static GlusterDummyModel instance = new GlusterDummyModel();
+ private GlusterDataModel model;
+
+ private GlusterDummyModel() {
+ model = initializeModel();
+ }
+
+ public GlusterDataModel getModel() {
+ return model;
+ }
+
+ public static GlusterDummyModel getInstance() {
+ return instance;
+ }
+
+ // Renamed preferredInterfaceName to interfaceName
+ private GlusterServer addGlusterServer(List<GlusterServer> servers, Entity parent, String name,
+ SERVER_STATUS status, String interfaceName, int numOfCPUs, double cpuUsage, double totalMemory,
+ double memoryInUse) {
+ GlusterServer glusterServer = new GlusterServer(name, parent, status, numOfCPUs, cpuUsage, totalMemory,
+ memoryInUse);
+ NetworkInterface networkInterface = addNetworkInterface(glusterServer, interfaceName); // Renamed preferredInterfaceName to interfaceName
+ // glusterServer.setPreferredNetworkInterface(networkInterface);
+
+ servers.add(glusterServer);
+ return glusterServer;
+ }
+
+ private NetworkInterface addNetworkInterface(Server server, String interfaceName) {
+ NetworkInterface networkInterface = new NetworkInterface(interfaceName, server, "192.168.1."
+ + Math.round(Math.random() * 255), "255.255.255.0", "192.168.1.1");
+ server.setNetworkInterfaces(Arrays.asList(new NetworkInterface[] { networkInterface }));
+ return networkInterface;
+ }
+
+ private void addDiscoveredServer(List<Server> servers, Entity parent, String name, int numOfCPUs, double cpuUsage,
+ double totalMemory, double memoryInUse, double totalDiskSpace, double diskSpaceInUse) {
+ Server server = new Server(name, parent, numOfCPUs, cpuUsage, totalMemory, memoryInUse);
+ server.addDisk(new Disk(server, "sda", totalDiskSpace, diskSpaceInUse, DISK_STATUS.READY));
+ addNetworkInterface(server, "eth0");
+
+ servers.add(server);
+ }
+
+ private GlusterDataModel initializeModel() {
+ // Create the dummy data model for demo
+ GlusterDataModel model = new GlusterDataModel("Clusters");
+ Cluster cluster = new Cluster("Home", model);
+
+ initializeGlusterServers(cluster);
+ initializeVolumes(cluster);
+ initializeAutoDiscoveredServers(cluster);
+ initializeDisks();
+ addDisksToServers();
+ addDisksToVolumes();
+ addVolumeOptions();
+
+ createDummyLogMessages();
+
+ model.addCluster(cluster);
+ return model;
+ }
+
+ private void addVolumeOptions() {
+ for (Volume vol : new Volume[] { volume1, volume2, volume3, volume4, volume5 }) {
+ for (int i = 1; i <= 5; i++) {
+ String key = vol.getName() + "key" + i;
+ String value = vol.getName() + "value" + i;
+ vol.setOption(key, value);
+ }
+ }
+ }
+
+ private Volume addVolume(List<Volume> volumes, String name, Cluster cluster, VOLUME_TYPE volumeType,
+ TRANSPORT_TYPE transportType, VOLUME_STATUS status) {
+ Volume volume = new Volume(name, cluster, volumeType, transportType, status);
+ volumes.add(volume);
+
+ return volume;
+ }
+
+ private void initializeVolumes(Cluster cluster) {
+ List<Volume> volumes = new ArrayList<Volume>();
+
+ volume1 = addVolume(volumes, "Volume1", cluster, VOLUME_TYPE.PLAIN_DISTRIBUTE, TRANSPORT_TYPE.ETHERNET,
+ VOLUME_STATUS.ONLINE);
+
+ volume2 = addVolume(volumes, "Volume2", cluster, VOLUME_TYPE.PLAIN_DISTRIBUTE, TRANSPORT_TYPE.ETHERNET,
+ VOLUME_STATUS.ONLINE);
+
+ volume3 = addVolume(volumes, "Volume3", cluster, VOLUME_TYPE.DISTRIBUTED_MIRROR, TRANSPORT_TYPE.ETHERNET,
+ VOLUME_STATUS.OFFLINE);
+ volume3.setReplicaCount(2);
+
+ volume4 = addVolume(volumes, "Volume4", cluster, VOLUME_TYPE.PLAIN_DISTRIBUTE, TRANSPORT_TYPE.ETHERNET,
+ VOLUME_STATUS.ONLINE);
+
+ volume5 = addVolume(volumes, "Volume5", cluster, VOLUME_TYPE.DISTRIBUTED_STRIPE, TRANSPORT_TYPE.INFINIBAND,
+ VOLUME_STATUS.OFFLINE);
+ volume5.setStripeCount(3);
+
+ cluster.setVolumes(volumes);
+ }
+
+ private void initializeDisks() {
+ s1da = new Disk(server1, "sda", 100d, 80d, DISK_STATUS.READY);
+ s1db = new Disk(server1, "sdb", 100d, 67.83, DISK_STATUS.READY);
+
+ s2da = new Disk(server2, "sda", 200d, 157.12, DISK_STATUS.READY);
+ s2db = new Disk(server2, "sdb", 200d, 182.27, DISK_STATUS.READY);
+ s2dc = new Disk(server2, "sdc", 200d, -1d, DISK_STATUS.UNINITIALIZED);
+ s2dd = new Disk(server2, "sdd", 200d, 124.89, DISK_STATUS.READY);
+
+ s3da = new Disk(server3, "NA", -1d, -1d, DISK_STATUS.OFFLINE); // disk name unavailable since server is offline
+
+ s4da = new Disk(server4, "sda", 100d, 85.39, DISK_STATUS.READY);
+
+ s5da = new Disk(server5, "sda", 100d, 92.83, DISK_STATUS.READY);
+ s5db = new Disk(server5, "sdb", 200d, 185.69, DISK_STATUS.READY);
+ }
+
+ private void addDisksToServers() {
+ server1.addDisk(s1da);
+ server1.addDisk(s1db);
+
+ server2.addDisk(s2da);
+ server2.addDisk(s2db);
+ server2.addDisk(s2dc);
+ server2.addDisk(s2dd);
+
+ // server3.addDisk(s3da);
+
+ server4.addDisk(s4da);
+
+ server5.addDisk(s5da);
+ server5.addDisk(s5db);
+ }
+
+ private void addDisksToVolumes() {
+ volume1.addDisk(s1da);
+
+ volume2.addDisk(s2da);
+ volume2.addDisk(s1db);
+ volume2.addDisk(s3da);
+ volume2.addDisk(s4da);
+
+ volume3.addDisk(s2db);
+ volume3.addDisk(s4da);
+ volume3.addDisk(s5da);
+
+ volume4.addDisk(s1da);
+ volume4.addDisk(s3da);
+ volume4.addDisk(s4da);
+ volume4.addDisk(s5db);
+
+ volume5.addDisk(s2da);
+ volume5.addDisk(s5db);
+ }
+
+ private void initializeGlusterServers(Cluster cluster) {
+ List<GlusterServer> servers = new ArrayList<GlusterServer>();
+ server1 = addGlusterServer(servers, cluster, "Server1", SERVER_STATUS.ONLINE, "eth0", 4, 56.3, 16, 8.4);
+ server2 = addGlusterServer(servers, cluster, "Server2", SERVER_STATUS.ONLINE, "eth1", 8, 41.92, 32, 18.76);
+ server3 = addGlusterServer(servers, cluster, "Server3", SERVER_STATUS.OFFLINE, "eth0", -1, -1, -1, -1);
+ server4 = addGlusterServer(servers, cluster, "Server4", SERVER_STATUS.ONLINE, "eth0", 1, 92.83, 4, 3.18);
+ server5 = addGlusterServer(servers, cluster, "Server5", SERVER_STATUS.ONLINE, "inf0", 2, 87.24, 8, 7.23);
+
+ cluster.setServers(servers);
+ }
+
+ private void initializeAutoDiscoveredServers(Cluster cluster) {
+ List<Server> servers = new ArrayList<Server>();
+ addDiscoveredServer(servers, cluster, "ADServer1", 4, 56.3, 16, 8.4, 200, 147.83);
+ addDiscoveredServer(servers, cluster, "ADServer2", 8, 41.92, 32, 18.76, 800, 464.28);
+ addDiscoveredServer(servers, cluster, "ADServer3", 2, 84.28, 2, 1.41, 120, 69.93);
+ addDiscoveredServer(servers, cluster, "ADServer4", 1, 92.83, 4, 3.18, 100, 85.39);
+ addDiscoveredServer(servers, cluster, "ADServer5", 2, 87.24, 8, 7.23, 250, 238.52);
+ cluster.setAutoDiscoveredServers(servers);
+ }
+
+ private void addMessages(List<LogMessage> messages, Disk disk, String severity, int count) {
+ for (int i = 1; i <= count; i++) {
+ String message = severity + "message" + i;
+ messages.add(new LogMessage(new Date(), disk, severity, message));
+ }
+ }
+
+ private void addMessagesForDisk(List<LogMessage> logMessages, Disk disk) {
+ addMessages(logMessages, disk, "SEVERE", 5);
+ addMessages(logMessages, disk, "WARNING", 5);
+ addMessages(logMessages, disk, "DEBUG", 5);
+ addMessages(logMessages, disk, "INFO", 5);
+ }
+
+ public List<LogMessage> createDummyLogMessages() {
+ addMessagesForDisk(logMessages, s1da);
+ addMessagesForDisk(logMessages, s1db);
+ addMessagesForDisk(logMessages, s2da);
+ addMessagesForDisk(logMessages, s2db);
+ addMessagesForDisk(logMessages, s2dc);
+ addMessagesForDisk(logMessages, s2dd);
+ addMessagesForDisk(logMessages, s4da);
+ addMessagesForDisk(logMessages, s5da);
+ addMessagesForDisk(logMessages, s5db);
+ return logMessages;
+ }
+
+ public static List<LogMessage> getDummyLogMessages() {
+ return logMessages;
+ }
+
+ public List<Disk> getReadyDisksOfVolume(Volume volume) {
+ List<Disk> disks = new ArrayList<Disk>();
+ for (Disk disk : volume.getDisks()) {
+ if (disk.isReady()) {
+ disks.add(disk);
+ }
+ }
+ return disks;
+ }
+
+ public List<Disk> getReadyDisksOfAllVolumes() {
+ List<Disk> disks = new ArrayList<Disk>();
+ for (Volume volume : ((Cluster) model.getChildren().get(0)).getVolumes()) {
+ disks.addAll(getReadyDisksOfVolume(volume));
+ }
+ return disks;
+ }
+
+ public List<Disk> getReadyDisksOfAllServers() {
+ return getReadyDisksOfAllServersExcluding(new ArrayList<Disk>());
+ }
+
+ public List<Disk> getReadyDisksOfAllServersExcluding(List<Disk> excludeDisks) {
+ List<Disk> disks = new ArrayList<Disk>();
+
+ for (Server server : ((Cluster) model.getChildren().get(0)).getServers()) {
+ for (Disk disk : server.getDisks()) {
+ if (disk.isReady() && !excludeDisks.contains(disk)) {
+ disks.add(disk);
+ }
+ }
+ }
+ return disks;
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java
new file mode 100644
index 00000000..fd4e58c9
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import com.gluster.storage.management.core.utils.StringUtil;
+
+@XmlRootElement(name = "glusterServer")
+public class GlusterServer extends Server {
+ public enum SERVER_STATUS {
+ ONLINE, OFFLINE
+ };
+
+ private static final String[] STATUS_STR = new String[] { "Online", "Offline" };
+
+ private String uuid;
+ private SERVER_STATUS status;
+ // private NetworkInterface preferredNetworkInterface;
+ private Cluster cluster;
+
+ public GlusterServer() {
+ }
+
+ public GlusterServer(String name) {
+ super(name);
+ }
+
+ public GlusterServer(String name, Entity parent, SERVER_STATUS status, int numOfCPUs, double cpuUsage,
+ double totalMemory, double memoryInUse) {
+ super(name, parent, numOfCPUs, cpuUsage, totalMemory, memoryInUse);
+ setStatus(status);
+ }
+
+ public GlusterServer(String name, Entity parent, SERVER_STATUS status, int numOfCPUs, double cpuUsage,
+ double totalMemory, double memoryInUse, Cluster cluster) {
+ this(name, parent, status, numOfCPUs, cpuUsage, totalMemory, memoryInUse);
+ setCluster(cluster);
+ }
+
+ public String getStatusStr() {
+ return STATUS_STR[getStatus().ordinal()];
+ }
+
+ public SERVER_STATUS getStatus() {
+ return status;
+ }
+
+ public void setStatus(SERVER_STATUS status) {
+ this.status = status;
+ }
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+
+
+// public NetworkInterface getPreferredNetworkInterface() {
+// return preferredNetworkInterface;
+// }
+//
+// public void setPreferredNetworkInterface(NetworkInterface preferredNetworkInterface) {
+// this.preferredNetworkInterface = preferredNetworkInterface;
+// preferredNetworkInterface.setPreferred(true);
+// }
+
+
+ @XmlTransient
+ public Cluster getCluster() {
+ return cluster;
+ }
+
+ public void setCluster(Cluster cluster) {
+ this.cluster = cluster;
+ }
+
+ /**
+ * Filter matches if any of the properties name, status and primary/secondary/third
+ * DNS contains the filter string
+ */
+ @Override
+ public boolean filter(String filterString, boolean caseSensitive) {
+ return StringUtil.filterString(getName() + getStatusStr(), filterString, caseSensitive);
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerListResponse.java
new file mode 100644
index 00000000..479dcc09
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerListResponse.java
@@ -0,0 +1,71 @@
+/**
+ * GlusterServerListResponse.java
+ *
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+package com.gluster.storage.management.core.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+/**
+ *
+ */
+@XmlRootElement(name = "response")
+public class GlusterServerListResponse extends AbstractResponse {
+ private List<GlusterServer> servers = new ArrayList<GlusterServer>();
+
+ public GlusterServerListResponse() {
+ }
+
+ public GlusterServerListResponse(Status status, List<GlusterServer> servers) {
+ setStatus(status);
+ setServers(servers);
+ }
+
+ @XmlElementWrapper(name = "servers")
+ @XmlElement(name = "server", type=GlusterServer.class)
+ public List<GlusterServer> getServers() {
+ return servers;
+ }
+
+ /**
+ * @param servers
+ * the servers to set
+ */
+ public void setServers(List<GlusterServer> servers) {
+ this.servers = servers;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.gluster.storage.management.core.model.Response#getData()
+ */
+ @Override
+ @XmlTransient
+ public List<GlusterServer> getData() {
+ return getServers();
+ }
+}
+
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerResponse.java
new file mode 100644
index 00000000..e00b8288
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerResponse.java
@@ -0,0 +1,32 @@
+package com.gluster.storage.management.core.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+@XmlRootElement(name = "response")
+public class GlusterServerResponse extends AbstractResponse {
+ private GlusterServer glusterServer;
+
+ public GlusterServerResponse() {
+ }
+
+ public GlusterServerResponse(Status status, GlusterServer server) {
+ setStatus(status);
+ setGlusterServer(server);
+ }
+
+ public GlusterServer getGlusterServer() {
+ return glusterServer;
+ }
+
+ public void setGlusterServer(GlusterServer glusterServer) {
+ this.glusterServer = glusterServer;
+ }
+
+ @XmlTransient
+ @Override
+ public GlusterServer getData() {
+ return getGlusterServer();
+ }
+
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/LogMessage.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/LogMessage.java
new file mode 100644
index 00000000..cc3aa043
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/LogMessage.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import java.util.Date;
+
+import com.gluster.storage.management.core.utils.StringUtil;
+
+public class LogMessage implements Filterable {
+ private Date timestamp;
+ private Disk disk;
+ private String severity;
+ private String message;
+
+ public Date getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(Date timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public Disk getDisk() {
+ return disk;
+ }
+
+ public void setDisk(Disk disk) {
+ this.disk = disk;
+ }
+
+ public String getSeverity() {
+ return severity;
+ }
+
+ public void setSeverity(String severity) {
+ this.severity = severity;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public LogMessage(Date timestamp, Disk disk, String severity, String message) {
+ setTimestamp(timestamp);
+ setDisk(disk);
+ setSeverity(severity);
+ setMessage(message);
+ }
+
+ @Override
+ public boolean filter(String filterString, boolean caseSensitive) {
+ return StringUtil.filterString(getSeverity() + getTimestamp() + getDisk().getServerName()
+ + getDisk().getQualifiedName() + getMessage(), filterString, caseSensitive);
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java
new file mode 100644
index 00000000..882dfe09
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="networkInterface")
+public class NetworkInterface extends Entity {
+ private String ipAddress;
+ private String netMask;
+ private String defaultGateway;
+// private boolean isPreferred;
+
+ public NetworkInterface() {
+
+ }
+
+// public boolean isPreferred() {
+// return isPreferred;
+// }
+//
+// public void setPreferred(boolean isPreferred) {
+// this.isPreferred = isPreferred;
+// }
+
+ public String getIpAddress() {
+ return ipAddress;
+ }
+
+ public void setIpAddress(String ipAddress) {
+ this.ipAddress = ipAddress;
+ }
+
+ public String getNetMask() {
+ return netMask;
+ }
+
+ public void setNetMask(String netMask) {
+ this.netMask = netMask;
+ }
+
+ public String getDefaultGateway() {
+ return defaultGateway;
+ }
+
+ public void setDefaultGateway(String defaultGateway) {
+ this.defaultGateway = defaultGateway;
+ }
+
+ public NetworkInterface(String name, Entity parent, String ipAddress, String netMask, String defaultGateway) {
+ super(name, parent);
+ setIpAddress(ipAddress);
+ setNetMask(netMask);
+ setDefaultGateway(defaultGateway);
+ }
+
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Response.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Response.java
new file mode 100644
index 00000000..96ea8497
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Response.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+/**
+ * Interface for server response. Any request handled by the Gluster Management
+ * Server will result in a response that must be an instance of a class
+ * implementing this interface.
+ */
+public interface Response<T> {
+ /**
+ * @return Status of request processing
+ */
+ public Status getStatus();
+
+ /**
+ * @return Data associated with the response. e.g. A "discover servers"
+ * request will return the list of discovered servers.
+ */
+ public T getData();
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTask.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTask.java
new file mode 100644
index 00000000..1a9d63f6
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTask.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class RunningTask {
+
+ protected String id;
+ protected String type; // FormatDisk, MigrateDisk, VolumeRebalance
+ protected Object reference;
+ protected String description;
+ protected RunningTaskStatus status; // TODO redefine
+
+ public RunningTask() {
+
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public Object getReference() {
+ return reference;
+ }
+
+ public void setReference(Object reference) {
+ this.reference = reference;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public RunningTaskStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(RunningTaskStatus status) {
+ this.status = status;
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTaskListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTaskListResponse.java
new file mode 100644
index 00000000..79949c90
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTaskListResponse.java
@@ -0,0 +1,43 @@
+package com.gluster.storage.management.core.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "response")
+public class RunningTaskListResponse extends AbstractResponse {
+ private List<RunningTask> runningTasks = new ArrayList<RunningTask>();
+
+ public RunningTaskListResponse() {
+
+ }
+
+
+ public RunningTaskListResponse(Status status, List<RunningTask> runningTasks) {
+ setStatus(status);
+ setRunningTasks(runningTasks);
+ }
+
+ @XmlElementWrapper(name = "runningTasks")
+ @XmlElement(name = "runningTask", type=RunningTask.class)
+ public List<RunningTask> getRunningTasks() {
+ return runningTasks;
+ }
+
+ /**
+ * @param runningTasks
+ * the runningTasks to set
+ */
+ public void setRunningTasks(List<RunningTask> runningTasks) {
+ this.runningTasks = runningTasks;
+ }
+
+ @Override
+ public Object getData() {
+ return getRunningTasks();
+ }
+
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTaskStatus.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTaskStatus.java
new file mode 100644
index 00000000..7ffeb4b8
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTaskStatus.java
@@ -0,0 +1,41 @@
+package com.gluster.storage.management.core.model;
+
+public class RunningTaskStatus extends Status {
+
+ private String status;
+ private boolean isPercentageSupported;
+ private float percentCompleted;
+ private String description;
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public boolean isPercentageSupported() {
+ return isPercentageSupported;
+ }
+
+ public void setPercentageSupported(boolean isPercentageSupported) {
+ this.isPercentageSupported = isPercentageSupported;
+ }
+
+ public float getPercentCompleted() {
+ return percentCompleted;
+ }
+
+ public void getPercentCompleted(float percentCompleted) {
+ this.percentCompleted = percentCompleted;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+} \ No newline at end of file
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java
new file mode 100644
index 00000000..bc0c42bc
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import com.gluster.storage.management.core.utils.StringUtil;
+
+@XmlRootElement(name = "server")
+public class Server extends Entity {
+ private List<NetworkInterface> networkInterfaces = new ArrayList<NetworkInterface>();
+ private int numOfCPUs;
+ private double cpuUsage;
+ private double totalMemory;
+ private double memoryInUse;
+ private double totalDiskSpace = 0;
+ private double diskSpaceInUse = 0;
+ private List<Disk> disks = new ArrayList<Disk>();
+
+ public Server() {
+
+ }
+
+ public Server(String name) {
+ super(name, null);
+ }
+
+ public Server(String name, Entity parent, int numOfCPUs, double cpuUsage, double totalMemory, double memoryInUse) {
+ super(name, parent);
+ setNumOfCPUs(numOfCPUs);
+ setCpuUsage(cpuUsage);
+ setTotalMemory(totalMemory);
+ setMemoryInUse(memoryInUse);
+ }
+
+ public int getNumOfCPUs() {
+ return numOfCPUs;
+ }
+
+ public void setNumOfCPUs(int numOfCPUs) {
+ this.numOfCPUs = numOfCPUs;
+ }
+
+ public double getCpuUsage() {
+ return cpuUsage;
+ }
+
+ public void setCpuUsage(double cpuUsage) {
+ this.cpuUsage = cpuUsage;
+ }
+
+ public double getTotalMemory() {
+ return totalMemory;
+ }
+
+ public void setTotalMemory(double totalMemory) {
+ this.totalMemory = totalMemory;
+ }
+
+ public double getMemoryInUse() {
+ return memoryInUse;
+ }
+
+ public void setMemoryInUse(double memoryInUse) {
+ this.memoryInUse = memoryInUse;
+ }
+
+ public double getTotalDiskSpace() {
+ return totalDiskSpace;
+ }
+
+ /**
+ * Total disk space is automatically calculated, and hence this method should never be called. It is required only
+ * to make sure that the element "totalDiskSpace" gets added to the XML tag when jersey converts the server object
+ * to XML for sending to client.
+ */
+ public void setTotalDiskSpace(double totalDiskSpace) {
+ this.totalDiskSpace = totalDiskSpace;
+ }
+
+ public double getDiskSpaceInUse() {
+ return diskSpaceInUse;
+ }
+
+ @XmlElementWrapper(name = "networkInterfaces")
+ @XmlElement(name = "networkInterface", type = NetworkInterface.class)
+ public List<NetworkInterface> getNetworkInterfaces() {
+ return networkInterfaces;
+ }
+
+ public void setNetworkInterfaces(List<NetworkInterface> networkInterfaces) {
+ this.networkInterfaces = networkInterfaces;
+ }
+
+ @XmlElementWrapper(name = "disks")
+ @XmlElement(name = "disk", type = Disk.class)
+ public List<Disk> getDisks() {
+ return disks;
+ }
+
+ public void addNetworkInterface(NetworkInterface networkInterface) {
+ networkInterfaces.add(networkInterface);
+ }
+
+ public void addDisk(Disk disk) {
+ if (disks.add(disk)) {
+ totalDiskSpace += disk.getSpace();
+ diskSpaceInUse += disk.getSpaceInUse();
+ }
+ }
+
+ public void addDisks(List<Disk> disks) {
+ for (Disk disk : disks) {
+ addDisk(disk);
+ }
+ }
+
+ public void removeDisk(Disk disk) {
+ if (disks.remove(disk)) {
+ totalDiskSpace -= disk.getSpace();
+ diskSpaceInUse -= disk.getSpaceInUse();
+ }
+ }
+
+ public void removeAllDisks() {
+ disks.clear();
+ totalDiskSpace = 0;
+ diskSpaceInUse = 0;
+ }
+
+ public void setDisks(List<Disk> disks) {
+ removeAllDisks();
+ addDisks(disks);
+ }
+
+ public int getNumOfDisks() {
+ return disks.size();
+ }
+
+ public String getIpAddressesAsString() {
+ String ipAddresses = "";
+ for (NetworkInterface networkInterface : getNetworkInterfaces()) {
+ String ipAddr = networkInterface.getIpAddress();
+ ipAddresses += (ipAddresses.isEmpty() ? ipAddr : ", " + ipAddr);
+ }
+ return ipAddresses;
+ }
+
+ @Override
+ public boolean filter(String filterString, boolean caseSensitive) {
+ return StringUtil.filterString(getName() + getIpAddressesAsString(), filterString, caseSensitive);
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerListResponse.java
new file mode 100644
index 00000000..56f33992
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerListResponse.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+@XmlRootElement(name = "response")
+public class ServerListResponse extends AbstractResponse {
+ private List<Server> servers = new ArrayList<Server>();
+
+ public ServerListResponse() {
+ }
+
+ public ServerListResponse(Status status, List<Server> servers) {
+ setStatus(status);
+ setServers(servers);
+ }
+
+ @XmlElementWrapper(name = "servers")
+ @XmlElement(name = "server", type=Server.class)
+ public List<Server> getServers() {
+ return servers;
+ }
+
+ /**
+ * @param servers
+ * the servers to set
+ */
+ public void setServers(List<Server> servers) {
+ this.servers = servers;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.gluster.storage.management.core.model.Response#getData()
+ */
+ @Override
+ @XmlTransient
+ public List<Server> getData() {
+ return getServers();
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java
new file mode 100644
index 00000000..06d6efe1
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import com.gluster.storage.management.core.utils.ProcessResult;
+
+@XmlRootElement(name = "status")
+public class Status {
+ public static final int STATUS_CODE_SUCCESS = 0;
+ public static final int STATUS_CODE_FAILURE = 1;
+ public static final int STATUS_CODE_RUNNING = 2;
+ public static final Status STATUS_SUCCESS = new Status(STATUS_CODE_SUCCESS, "Success");
+ public static final Status STATUS_FAILURE = new Status(STATUS_CODE_FAILURE, "Failure");
+
+ // public static final Status
+
+ private Integer code;
+ private String message;
+
+ public Status() {
+ }
+
+ public boolean isSuccess() {
+ return code == STATUS_CODE_SUCCESS;
+ }
+
+ public Status(Integer code, String message) {
+ this.code = code;
+ this.message = message;
+ }
+
+ public Status(ProcessResult result) {
+ this.code = result.getExitValue();
+ this.message = result.getOutput();
+ }
+
+ @XmlElement(name = "code", type = Integer.class)
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer executionStatus) {
+ this.code = executionStatus;
+ }
+
+ @XmlElement
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ @Override
+ public String toString() {
+ return (isSuccess() ? "Success" : "Failure [" + getCode() + "]") + ": " + getMessage();
+ }
+} \ No newline at end of file
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/StringListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/StringListResponse.java
new file mode 100644
index 00000000..3304692d
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/StringListResponse.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "response")
+public class StringListResponse extends AbstractResponse {
+ private List<String> data = new ArrayList<String>();
+
+ public StringListResponse() {
+ }
+
+ public StringListResponse(List<String> data) {
+ this.data = data;
+ }
+
+ @Override
+ @XmlElementWrapper(name = "list")
+ @XmlElement(name = "value", type = String.class)
+ public List<String> getData() {
+ return data;
+ }
+} \ No newline at end of file
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/User.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/User.java
new file mode 100644
index 00000000..da92ca14
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/User.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class User {
+ private String userId;
+ private String password;
+
+ public String getUserId() {
+ return userId;
+ }
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+ public String getPassword() {
+ return password;
+ }
+ public void setPassword(String password) {
+ this.password = password;
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java
new file mode 100644
index 00000000..a7e498c4
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java
@@ -0,0 +1,252 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.model;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import com.gluster.storage.management.core.model.Disk.DISK_STATUS;
+import com.gluster.storage.management.core.utils.StringUtil;
+
+@XmlRootElement
+public class Volume extends Entity {
+ public enum VOLUME_STATUS {
+ ONLINE, OFFLINE
+ };
+
+ public enum VOLUME_TYPE {
+ PLAIN_DISTRIBUTE, DISTRIBUTED_MIRROR, DISTRIBUTED_STRIPE
+ };
+
+ public enum TRANSPORT_TYPE {
+ ETHERNET, INFINIBAND
+ };
+
+ public enum NAS_PROTOCOL {
+ GLUSTERFS, NFS
+ };
+
+ private static final String[] VOLUME_TYPE_STR = new String[] { "Plain Distribute", "Distributed Mirror",
+ "Distributed Stripe" };
+ private static final String[] TRANSPORT_TYPE_STR = new String[] { "Ethernet", "Infiniband" };
+ private static final String[] STATUS_STR = new String[] { "Online", "Offline" };
+ private static final String[] NAS_PROTOCOL_STR = new String[] { "Gluster", "NFS" };
+
+ private Cluster cluster;
+ private VOLUME_TYPE volumeType;
+ private TRANSPORT_TYPE transportType;
+ private VOLUME_STATUS status;
+ private int replicaCount;
+ private int stripeCount;
+ private Map<String, String> options = new LinkedHashMap<String, String>();
+
+ private double totalDiskSpace = 0;
+ private List<Disk> disks = new ArrayList<Disk>();
+
+ public Volume() {
+ }
+
+ // GlusterFS export is always enabled
+ private Set<NAS_PROTOCOL> nasProtocols = new LinkedHashSet<NAS_PROTOCOL>(
+ Arrays.asList(new NAS_PROTOCOL[] { NAS_PROTOCOL.GLUSTERFS }));
+
+ private String accessControlList = "*";
+
+ public String getVolumeTypeStr() {
+ return getVolumeTypeStr(getVolumeType());
+ }
+
+ public static String getVolumeTypeStr(VOLUME_TYPE volumeType) {
+ return VOLUME_TYPE_STR[volumeType.ordinal()];
+ }
+
+ public String getTransportTypeStr() {
+ return TRANSPORT_TYPE_STR[getTransportType().ordinal()];
+ }
+
+ public String getStatusStr() {
+ return STATUS_STR[getStatus().ordinal()];
+ }
+
+ public int getNumOfDisks() {
+ return disks.size();
+ }
+
+ public VOLUME_TYPE getVolumeType() {
+ return volumeType;
+ }
+
+ public void setVolumeType(VOLUME_TYPE volumeType) {
+ this.volumeType = volumeType;
+ }
+
+ public TRANSPORT_TYPE getTransportType() {
+ return transportType;
+ }
+
+ public void setTransportType(TRANSPORT_TYPE transportType) {
+ this.transportType = transportType;
+ }
+
+ public VOLUME_STATUS getStatus() {
+ return status;
+ }
+
+ public int getReplicaCount() {
+ return replicaCount;
+ }
+
+ public void setReplicaCount(int replicaCount) {
+ this.replicaCount = replicaCount;
+ }
+
+ public int getStripeCount() {
+ return stripeCount;
+ }
+
+ public void setStripeCount(int stripeCount) {
+ this.stripeCount = stripeCount;
+ }
+
+ public void setStatus(VOLUME_STATUS status) {
+ this.status = status;
+ }
+
+ @XmlTransient
+ public Cluster getCluster() {
+ return cluster;
+ }
+
+ public void setCluster(Cluster cluster) {
+ this.cluster = cluster;
+ }
+
+ public Set<NAS_PROTOCOL> getNASProtocols() {
+ return nasProtocols;
+ }
+
+ public void setNASProtocols(Set<NAS_PROTOCOL> nasProtocols) {
+ this.nasProtocols = nasProtocols;
+ }
+
+ public String getNASProtocolsStr() {
+ String protocolsStr = "";
+ for (NAS_PROTOCOL protocol : nasProtocols) {
+ String protocolStr = NAS_PROTOCOL_STR[protocol.ordinal()];
+ protocolsStr += (protocolsStr.isEmpty() ? protocolStr : ", " + protocolStr);
+ }
+ return protocolsStr;
+ }
+
+ public String getAccessControlList() {
+ return accessControlList;
+ }
+
+ public void setAccessControlList(String accessControlList) {
+ this.accessControlList = accessControlList;
+ }
+
+ public Map<String, String> getOptions() {
+ return options;
+ }
+
+ public void setOption(String key, String value) {
+ options.put(key, value);
+ }
+
+ public void setOptions(Map<String, String> options) {
+ this.options = options;
+ }
+
+ public double getTotalDiskSpace() {
+ return totalDiskSpace;
+ }
+
+ public List<Disk> getDisks() {
+ return disks;
+ }
+
+ public void addDisk(Disk disk) {
+ if (disks.add(disk) && disk.getStatus() != DISK_STATUS.OFFLINE) {
+ totalDiskSpace += disk.getSpace();
+ }
+ }
+
+ public void addDisks(List<Disk> disks) {
+ for (Disk disk : disks) {
+ addDisk(disk);
+ }
+ }
+
+ public void removeDisk(Disk disk) {
+ if (disks.remove(disk)) {
+ totalDiskSpace -= disk.getSpace();
+ }
+ }
+
+ public void removeAllDisks() {
+ disks.clear();
+ totalDiskSpace = 0;
+ }
+
+ public void setDisks(List<Disk> disks) {
+ removeAllDisks();
+ addDisks(disks);
+ }
+
+ public void enableNFS() {
+ nasProtocols.add(NAS_PROTOCOL.NFS);
+ }
+
+ public void disableNFS() {
+ nasProtocols.remove(NAS_PROTOCOL.NFS);
+ }
+
+ public Volume(String name, Entity parent, VOLUME_TYPE volumeType, TRANSPORT_TYPE transportType, VOLUME_STATUS status) {
+ super(name, parent);
+ setVolumeType(volumeType);
+ setTransportType(transportType);
+ setStatus(status);
+ }
+
+ public Volume(String name, Entity parent, Cluster cluster, VOLUME_TYPE volumeType, TRANSPORT_TYPE transportType,
+ VOLUME_STATUS status) {
+ this(name, parent, volumeType, transportType, status);
+
+ setCluster(cluster);
+ }
+
+ /**
+ * Filter matches if any of the properties name, volume type, transport type, status and number of disks contains
+ * the filter string
+ */
+ @Override
+ public boolean filter(String filterString, boolean caseSensitive) {
+ return StringUtil.filterString(getName() + getVolumeTypeStr() + getTransportTypeStr() + getStatusStr()
+ + getNumOfDisks(), filterString, caseSensitive);
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeOptionInfo.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeOptionInfo.java
new file mode 100644
index 00000000..44e45df5
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeOptionInfo.java
@@ -0,0 +1,66 @@
+/**
+ * VolumeOptionInfo.java
+ *
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+package com.gluster.storage.management.core.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * Class to hold information about a volume option
+ */
+@XmlRootElement(name = "volumeOption")
+public class VolumeOptionInfo {
+ private String name;
+ private String description;
+ private String defaultValue;
+
+ public VolumeOptionInfo() {
+ }
+
+ public VolumeOptionInfo(String name, String description, String defaultValue) {
+ setName(name);
+ setDescription(description);
+ setDefaultValue(defaultValue);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ public void setDefaultValue(String defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+} \ No newline at end of file
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/DateUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/DateUtil.java
new file mode 100644
index 00000000..1b284cb8
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/DateUtil.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.utils;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class DateUtil {
+ public static final String formatDate(Date inputDate) {
+ DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
+ return formatter.format(inputDate);
+ }
+
+ public static final String formatTime(Date inputDate) {
+ DateFormat formatter = new SimpleDateFormat("HH:mm:ss z");
+ return formatter.format(inputDate);
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/FileUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/FileUtil.java
new file mode 100644
index 00000000..c650d632
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/FileUtil.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
+
+public class FileUtil {
+ public String readFileAsString(File file) {
+ try {
+ FileInputStream fileInputStream = new FileInputStream(file);
+ byte[] data = new byte[fileInputStream.available()];
+ fileInputStream.read(data);
+ fileInputStream.close();
+
+ return new String(data);
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new GlusterRuntimeException("Could not read file [" + file + "]", e);
+ }
+ }
+
+ public InputStream loadResource(String resourcePath) {
+ return this.getClass().getClassLoader().getResourceAsStream(resourcePath);
+ }
+} \ No newline at end of file
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java
new file mode 100644
index 00000000..ad5b4c2b
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java
@@ -0,0 +1,218 @@
+/**
+ * GlusterUtil.java
+ *
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+package com.gluster.storage.management.core.utils;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.gluster.storage.management.core.constants.CoreConstants;
+import com.gluster.storage.management.core.model.Disk;
+import com.gluster.storage.management.core.model.GlusterServer;
+import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS;
+import com.gluster.storage.management.core.model.Volume;
+import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE;
+import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE;
+
+/**
+ *
+ */
+public class GlusterUtil {
+ private static final String HOSTNAME_PFX = "Hostname:";
+ private static final String UUID_PFX = "Uuid:";
+ private static final String STATE_PFX = "State:";
+ private static final String GLUSTER_SERVER_STATUS_ONLINE = "Connected";
+ private static final ProcessUtil processUtil = new ProcessUtil();
+
+ /**
+ * Extract value of given token from given line. It is assumed that the token, if present, will be of the following
+ * form: <code>token: value</code>
+ *
+ * @param line
+ * Line to be analyzed
+ * @param token
+ * Token whose value is to be extracted
+ * @return Value of the token, if present in the line
+ */
+ private final String extractToken(String line, String token) {
+ if (line.contains(token)) {
+ return line.split(token)[1].trim();
+ }
+ return null;
+ }
+
+ public List<GlusterServer> getGlusterServers() {
+ String output = getPeerStatus();
+ if (output == null) {
+ return null;
+ }
+
+ List<GlusterServer> glusterServers = new ArrayList<GlusterServer>();
+ GlusterServer server = null;
+ boolean foundHost = false;
+ boolean foundUuid = false;
+ for (String line : output.split(CoreConstants.NEWLINE)) {
+ if (foundHost && foundUuid) {
+ // Host and UUID is found, we should look for state
+ String state = extractToken(line, STATE_PFX);
+ if (state != null) {
+ server.setStatus(state.contains(GLUSTER_SERVER_STATUS_ONLINE) ? SERVER_STATUS.ONLINE
+ : SERVER_STATUS.OFFLINE);
+ // Completed populating current server. Add it to the list and reset all related variables.
+ glusterServers.add(server);
+
+ foundHost = false;
+ foundUuid = false;
+ server = null;
+ }
+ } else if (foundHost) {
+ // Host is found, look for UUID
+ String uuid = extractToken(line, UUID_PFX);
+ if (uuid != null) {
+ server.setUuid(uuid);
+ foundUuid = true;
+ }
+ } else {
+ // Look for the next host
+ if (server == null) {
+ server = new GlusterServer();
+ }
+ String hostName = extractToken(line, HOSTNAME_PFX);
+ if (hostName != null) {
+ server.setName(hostName);
+ foundHost = true;
+ }
+ }
+
+ }
+ return glusterServers;
+ }
+
+ public List<String> getGlusterServerNames() {
+ String output = getPeerStatus();
+ if(output == null) {
+ return null;
+ }
+
+ List<String> glusterServerNames = new ArrayList<String>();
+ for (String line : output.split(CoreConstants.NEWLINE)) {
+ String hostName = extractToken(line, HOSTNAME_PFX);
+ if (hostName != null) {
+ glusterServerNames.add(hostName);
+ }
+ }
+ return glusterServerNames;
+ }
+
+ private String getPeerStatus() {
+ String output;
+ ProcessResult result = processUtil.executeCommand("gluster", "peer", "status");
+ if (!result.isSuccess()) {
+ output = null;
+ }
+ output = result.getOutput();
+ return output;
+ }
+
+ public ProcessResult addServer(String serverName) {
+ return processUtil.executeCommand("gluster", "peer", "probe", serverName);
+ }
+
+
+ public ProcessResult startVolume(String volumeName) {
+ return processUtil.executeCommand("gluster", "volume", "start", volumeName);
+ }
+
+ public ProcessResult stopVolume(String volumeName) {
+ return processUtil.executeCommand("gluster", "--mode=script", "volume", "stop", volumeName);
+ }
+
+ public ProcessResult createVolume(Volume volume) {
+ int count=1; // replica or stripe count
+ String volumeType = null;
+ VOLUME_TYPE volType = volume.getVolumeType();
+ if(volType == VOLUME_TYPE.DISTRIBUTED_MIRROR) {
+ volumeType = "replica";
+ count = 2;
+ } else if(volType == VOLUME_TYPE.DISTRIBUTED_STRIPE) {
+ volumeType = "stripe";
+ count = 4;
+ }
+
+ String transportTypeStr = null;
+ TRANSPORT_TYPE transportType = volume.getTransportType();
+ transportTypeStr = (transportType == TRANSPORT_TYPE.ETHERNET) ? "tcp" : "rdma";
+
+ List<String> command = new ArrayList<String>();
+ command.add("gluster");
+ command.add("volume");
+ command.add("create");
+ command.add(volume.getName());
+ if(volumeType != null) {
+ command.add(volumeType);
+ command.add("" + count);
+ }
+ command.add("transport");
+ command.add(transportTypeStr);
+ for(Disk disk : volume.getDisks()) {
+ command.add(getBrickNotation(volume, disk));
+ }
+ return processUtil.executeCommand(command);
+ }
+
+ public ProcessResult setOption(List<String> command) {
+ return processUtil.executeCommand(command);
+ }
+
+ public ProcessResult setVolumeAccessControl(Volume volume) {
+ List<String> command = new ArrayList<String>();
+ command.add("gluster");
+ command.add("volume");
+ command.add("set");
+ command.add(volume.getName());
+ command.add("auth.allow");
+ command.add(volume.getAccessControlList());
+ return setOption(command);
+ }
+
+ /**
+ * @param disk
+ * @return
+ */
+ private String getBrickNotation(Volume vol, Disk disk) {
+ // TODO: Figure out an appropriate directory INSIDE the DISK having given NAME (e.g. sda, sdb, etc)
+ // String dirName = "/export/" + vol.getName() + "/" + disk.getName();
+
+ // if /export directory is not exist then create the directory
+ boolean exists = (new File("/export")).exists();
+
+ if (!exists) {
+ processUtil.executeCommand("mkdir", "/export");
+ }
+ String dirName = "/export/" + vol.getName() ;
+ return disk.getServerName() + ":" + dirName;
+ }
+
+ public static void main(String args[]) {
+ List<String> names = new GlusterUtil().getGlusterServerNames();
+ System.out.println(names);
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/MD5.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/MD5.java
new file mode 100644
index 00000000..e0daaf81
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/MD5.java
@@ -0,0 +1,504 @@
+/*
+ * MD5 in Java JDK Beta-2
+ * written Santeri Paavolainen, Helsinki Finland 1996
+ * (c) Santeri Paavolainen, Helsinki Finland 1996
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * See http://www.cs.hut.fi/~santtu/java/ for more information on this
+ * class.
+ *
+ * This is rather straight re-implementation of the reference implementation
+ * given in RFC1321 by RSA.
+ *
+ * Passes MD5 test suite as defined in RFC1321.
+ *
+ *
+ * This Java class has been derivedfrom the RSA Data Security, Inc. MD5
+ * Message-Digest Algorithm and its reference implementation.
+ *
+ *
+ * $Log: MD5.java,v $
+ * Revision 1.1 2004/07/12 13:35:20 aubryp
+ * initial commit
+ *
+ * Revision 1.3 2002/03/16 01:46:39 broccol
+ * Moved the MD5 classes into the md5 package to make 1.4 javac happy
+ *
+ * Revision 1.2 1999/11/04 21:38:00 broccol
+ * Got MD5Crypt calculating the same hash as the OpenBSD md5crypt.c routine.
+ *
+ * Revision 1.1 1999/08/05 22:07:03 broccol
+ * Added support for the MD5 classes.
+ *
+ * Revision 1.3 1996/04/15 07:28:09 santtu
+ * Added GPL statements, and RSA derivate statements.
+ *
+ * Revision 1.2 1996/03/04 08:05:48 santtu
+ * Added offsets to Update method
+ *
+ * Revision 1.1 1996/01/07 20:51:59 santtu
+ * Initial revision
+ *
+ */
+package com.gluster.storage.management.core.utils;
+
+/**
+ * Contains internal state of the MD5 class
+ *
+ * @author Santeri Paavolainen <sjpaavol@cc.helsinki.fi>
+ */
+
+class MD5State {
+ /**
+ * 128-byte state
+ */
+ int state[];
+
+ /**
+ * 64-bit character count (could be true Java long?)
+ */
+ int count[];
+
+ /**
+ * 64-byte buffer (512 bits) for storing to-be-hashed characters
+ */
+ byte buffer[];
+
+ public MD5State() {
+ buffer = new byte[64];
+ count = new int[2];
+ state = new int[4];
+
+ state[0] = 0x67452301;
+ state[1] = 0xefcdab89;
+ state[2] = 0x98badcfe;
+ state[3] = 0x10325476;
+
+ count[0] = count[1] = 0;
+ }
+
+ /** Create this State as a copy of another state */
+ public MD5State(MD5State from) {
+ this ();
+
+ int i;
+
+ for (i = 0; i < buffer.length; i++)
+ this .buffer[i] = from.buffer[i];
+
+ for (i = 0; i < state.length; i++)
+ this .state[i] = from.state[i];
+
+ for (i = 0; i < count.length; i++)
+ this .count[i] = from.count[i];
+ }
+};
+
+/**
+ * Implementation of RSA's MD5 hash generator
+ *
+ * @version $Revision: 1.1 $
+ * @author Santeri Paavolainen <sjpaavol@cc.helsinki.fi>
+ */
+
+public class MD5 {
+ /**
+ * MD5 state
+ */
+ MD5State state;
+
+ /**
+ * If Final() has been called, finals is set to the current finals
+ * state. Any Update() causes this to be set to null.
+ */
+ MD5State finals;
+
+ /**
+ * Padding for Final()
+ */
+ static byte padding[] = { (byte) 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+ /**
+ * Initialize MD5 internal state (object can be reused just by
+ * calling Init() after every Final()
+ */
+ public synchronized void Init() {
+ state = new MD5State();
+ finals = null;
+ }
+
+ /**
+ * Class constructor
+ */
+ public MD5() {
+ this .Init();
+ }
+
+ /**
+ * Initialize class, and update hash with ob.toString()
+ *
+ * @param ob Object, ob.toString() is used to update hash
+ * after initialization
+ */
+ public MD5(Object ob) {
+ this ();
+ Update(ob.toString());
+ }
+
+ public String debugDump() {
+ return asHex();
+ }
+
+ private int rotate_left(int x, int n) {
+ return (x << n) | (x >>> (32 - n));
+ }
+
+ /* I wonder how many loops and hoops you'll have to go through to
+ get unsigned add for longs in java */
+
+ private int uadd(int a, int b) {
+ long aa, bb;
+ aa = ((long) a) & 0xffffffffL;
+ bb = ((long) b) & 0xffffffffL;
+
+ aa += bb;
+
+ return (int) (aa & 0xffffffffL);
+ }
+
+ private int uadd(int a, int b, int c) {
+ return uadd(uadd(a, b), c);
+ }
+
+ private int uadd(int a, int b, int c, int d) {
+ return uadd(uadd(a, b, c), d);
+ }
+
+ private int FF(int a, int b, int c, int d, int x, int s, int ac) {
+ a = uadd(a, ((b & c) | (~b & d)), x, ac);
+ return uadd(rotate_left(a, s), b);
+ }
+
+ private int GG(int a, int b, int c, int d, int x, int s, int ac) {
+ a = uadd(a, ((b & d) | (c & ~d)), x, ac);
+ return uadd(rotate_left(a, s), b);
+ }
+
+ private int HH(int a, int b, int c, int d, int x, int s, int ac) {
+ a = uadd(a, (b ^ c ^ d), x, ac);
+ return uadd(rotate_left(a, s), b);
+ }
+
+ private int II(int a, int b, int c, int d, int x, int s, int ac) {
+ a = uadd(a, (c ^ (b | ~d)), x, ac);
+ return uadd(rotate_left(a, s), b);
+ }
+
+ private int[] Decode(byte buffer[], int len, int shift) {
+ int out[];
+ int i, j;
+
+ out = new int[16];
+
+ for (i = j = 0; j < len; i++, j += 4) {
+ out[i] = ((int) (buffer[j + shift] & 0xff))
+ | (((int) (buffer[j + 1 + shift] & 0xff)) << 8)
+ | (((int) (buffer[j + 2 + shift] & 0xff)) << 16)
+ | (((int) (buffer[j + 3 + shift] & 0xff)) << 24);
+ }
+
+ return out;
+ }
+
+ private void Transform(MD5State state, byte buffer[], int shift) {
+ int a = state.state[0], b = state.state[1], c = state.state[2], d = state.state[3], x[];
+
+ x = Decode(buffer, 64, shift);
+
+ /* Round 1 */
+ a = FF(a, b, c, d, x[0], 7, 0xd76aa478); /* 1 */
+ d = FF(d, a, b, c, x[1], 12, 0xe8c7b756); /* 2 */
+ c = FF(c, d, a, b, x[2], 17, 0x242070db); /* 3 */
+ b = FF(b, c, d, a, x[3], 22, 0xc1bdceee); /* 4 */
+ a = FF(a, b, c, d, x[4], 7, 0xf57c0faf); /* 5 */
+ d = FF(d, a, b, c, x[5], 12, 0x4787c62a); /* 6 */
+ c = FF(c, d, a, b, x[6], 17, 0xa8304613); /* 7 */
+ b = FF(b, c, d, a, x[7], 22, 0xfd469501); /* 8 */
+ a = FF(a, b, c, d, x[8], 7, 0x698098d8); /* 9 */
+ d = FF(d, a, b, c, x[9], 12, 0x8b44f7af); /* 10 */
+ c = FF(c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */
+ b = FF(b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */
+ a = FF(a, b, c, d, x[12], 7, 0x6b901122); /* 13 */
+ d = FF(d, a, b, c, x[13], 12, 0xfd987193); /* 14 */
+ c = FF(c, d, a, b, x[14], 17, 0xa679438e); /* 15 */
+ b = FF(b, c, d, a, x[15], 22, 0x49b40821); /* 16 */
+
+ /* Round 2 */
+ a = GG(a, b, c, d, x[1], 5, 0xf61e2562); /* 17 */
+ d = GG(d, a, b, c, x[6], 9, 0xc040b340); /* 18 */
+ c = GG(c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */
+ b = GG(b, c, d, a, x[0], 20, 0xe9b6c7aa); /* 20 */
+ a = GG(a, b, c, d, x[5], 5, 0xd62f105d); /* 21 */
+ d = GG(d, a, b, c, x[10], 9, 0x2441453); /* 22 */
+ c = GG(c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */
+ b = GG(b, c, d, a, x[4], 20, 0xe7d3fbc8); /* 24 */
+ a = GG(a, b, c, d, x[9], 5, 0x21e1cde6); /* 25 */
+ d = GG(d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */
+ c = GG(c, d, a, b, x[3], 14, 0xf4d50d87); /* 27 */
+ b = GG(b, c, d, a, x[8], 20, 0x455a14ed); /* 28 */
+ a = GG(a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */
+ d = GG(d, a, b, c, x[2], 9, 0xfcefa3f8); /* 30 */
+ c = GG(c, d, a, b, x[7], 14, 0x676f02d9); /* 31 */
+ b = GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */
+
+ /* Round 3 */
+ a = HH(a, b, c, d, x[5], 4, 0xfffa3942); /* 33 */
+ d = HH(d, a, b, c, x[8], 11, 0x8771f681); /* 34 */
+ c = HH(c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */
+ b = HH(b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */
+ a = HH(a, b, c, d, x[1], 4, 0xa4beea44); /* 37 */
+ d = HH(d, a, b, c, x[4], 11, 0x4bdecfa9); /* 38 */
+ c = HH(c, d, a, b, x[7], 16, 0xf6bb4b60); /* 39 */
+ b = HH(b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */
+ a = HH(a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */
+ d = HH(d, a, b, c, x[0], 11, 0xeaa127fa); /* 42 */
+ c = HH(c, d, a, b, x[3], 16, 0xd4ef3085); /* 43 */
+ b = HH(b, c, d, a, x[6], 23, 0x4881d05); /* 44 */
+ a = HH(a, b, c, d, x[9], 4, 0xd9d4d039); /* 45 */
+ d = HH(d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */
+ c = HH(c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */
+ b = HH(b, c, d, a, x[2], 23, 0xc4ac5665); /* 48 */
+
+ /* Round 4 */
+ a = II(a, b, c, d, x[0], 6, 0xf4292244); /* 49 */
+ d = II(d, a, b, c, x[7], 10, 0x432aff97); /* 50 */
+ c = II(c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */
+ b = II(b, c, d, a, x[5], 21, 0xfc93a039); /* 52 */
+ a = II(a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */
+ d = II(d, a, b, c, x[3], 10, 0x8f0ccc92); /* 54 */
+ c = II(c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */
+ b = II(b, c, d, a, x[1], 21, 0x85845dd1); /* 56 */
+ a = II(a, b, c, d, x[8], 6, 0x6fa87e4f); /* 57 */
+ d = II(d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */
+ c = II(c, d, a, b, x[6], 15, 0xa3014314); /* 59 */
+ b = II(b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */
+ a = II(a, b, c, d, x[4], 6, 0xf7537e82); /* 61 */
+ d = II(d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */
+ c = II(c, d, a, b, x[2], 15, 0x2ad7d2bb); /* 63 */
+ b = II(b, c, d, a, x[9], 21, 0xeb86d391); /* 64 */
+
+ state.state[0] += a;
+ state.state[1] += b;
+ state.state[2] += c;
+ state.state[3] += d;
+ }
+
+ /**
+ * Updates hash with the bytebuffer given (using at maximum length bytes from
+ * that buffer)
+ *
+ * @param stat Which state is updated
+ * @param buffer Array of bytes to be hashed
+ * @param offset Offset to buffer array
+ * @param length Use at maximum `length' bytes (absolute
+ * maximum is buffer.length)
+ */
+ public void Update(MD5State stat, byte buffer[], int offset,
+ int length) {
+ int index, partlen, i, start;
+
+ finals = null;
+
+ /* Length can be told to be shorter, but not inter */
+ if ((length - offset) > buffer.length)
+ length = buffer.length - offset;
+
+ /* compute number of bytes mod 64 */
+ index = (int) (stat.count[0] >>> 3) & 0x3f;
+
+ if ((stat.count[0] += (length << 3)) < (length << 3))
+ stat.count[1]++;
+
+ stat.count[1] += length >>> 29;
+
+ partlen = 64 - index;
+
+ if (length >= partlen) {
+ for (i = 0; i < partlen; i++)
+ stat.buffer[i + index] = buffer[i + offset];
+
+ Transform(stat, stat.buffer, 0);
+
+ for (i = partlen; (i + 63) < length; i += 64)
+ Transform(stat, buffer, i);
+
+ index = 0;
+ } else
+ i = 0;
+
+ /* buffer remaining input */
+ if (i < length) {
+ start = i;
+ for (; i < length; i++)
+ stat.buffer[index + i - start] = buffer[i + offset];
+ }
+ }
+
+ /*
+ * Update()s for other datatypes than byte[] also. Update(byte[], int)
+ * is only the main driver.
+ */
+
+ /**
+ * Plain update, updates this object
+ */
+
+ public void Update(byte buffer[], int offset, int length) {
+ Update(this .state, buffer, offset, length);
+ }
+
+ public void Update(byte buffer[], int length) {
+ Update(this .state, buffer, 0, length);
+ }
+
+ /**
+ * Updates hash with given array of bytes
+ *
+ * @param buffer Array of bytes to use for updating the hash
+ */
+ public void Update(byte buffer[]) {
+ Update(buffer, 0, buffer.length);
+ }
+
+ /**
+ * Updates hash with a single byte
+ *
+ * @param b Single byte to update the hash
+ */
+ public void Update(byte b) {
+ byte buffer[] = new byte[1];
+ buffer[0] = b;
+
+ Update(buffer, 1);
+ }
+
+ /**
+ * Update buffer with given string.
+ *
+ * @param s String to be update to hash (is used as
+ * s.getBytes())
+ */
+ public void Update(String s) {
+ byte chars[];
+
+ chars = s.getBytes();
+
+ Update(chars, chars.length);
+ }
+
+ private byte[] Encode(int input[], int len) {
+ int i, j;
+ byte out[];
+
+ out = new byte[len];
+
+ for (i = j = 0; j < len; i++, j += 4) {
+ out[j] = (byte) (input[i] & 0xff);
+ out[j + 1] = (byte) ((input[i] >>> 8) & 0xff);
+ out[j + 2] = (byte) ((input[i] >>> 16) & 0xff);
+ out[j + 3] = (byte) ((input[i] >>> 24) & 0xff);
+ }
+
+ return out;
+ }
+
+ /**
+ * Returns array of bytes (16 bytes) representing hash as of the
+ * current state of this object. Note: getting a hash does not
+ * invalidate the hash object, it only creates a copy of the real
+ * state which is finalized.
+ *
+ * @return Array of 16 bytes, the hash of all updated bytes
+ */
+ public synchronized byte[] Final() {
+ byte bits[];
+ int index, padlen;
+ MD5State fin;
+
+ if (finals == null) {
+ fin = new MD5State(state);
+
+ bits = Encode(fin.count, 8);
+
+ index = (int) ((fin.count[0] >>> 3) & 0x3f);
+ padlen = (index < 56) ? (56 - index) : (120 - index);
+
+ Update(fin, padding, 0, padlen);
+ /**/
+ Update(fin, bits, 0, 8);
+
+ /* Update() sets finalds to null */
+ finals = fin;
+ }
+
+ return Encode(finals.state, 16);
+ }
+
+ /**
+ * Turns array of bytes into string representing each byte as
+ * unsigned hex number.
+ *
+ * @param hash Array of bytes to convert to hex-string
+ * @return Generated hex string
+ */
+ public static String asHex(byte hash[]) {
+ StringBuffer buf = new StringBuffer(hash.length * 2);
+ int i;
+
+ for (i = 0; i < hash.length; i++) {
+ if (((int) hash[i] & 0xff) < 0x10)
+ buf.append("0");
+
+ buf.append(Long.toString((int) hash[i] & 0xff, 16));
+ }
+
+ return buf.toString();
+ }
+
+ /**
+ * Returns 32-character hex representation of this objects hash
+ *
+ * @return String of this object's hash
+ */
+ public String asHex() {
+ return asHex(this .Final());
+ }
+
+ /**
+ * One-stop md5 string encrypting.
+ */
+
+ public static String md5crypt(String input) {
+ MD5 md5 = new MD5();
+ md5.Init();
+ md5.Update(input);
+ return md5.asHex();
+ }
+} \ No newline at end of file
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/MD5Crypt.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/MD5Crypt.java
new file mode 100644
index 00000000..25c757a2
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/MD5Crypt.java
@@ -0,0 +1,339 @@
+/*------------------------------------------------------------------------------
+ class
+ MD5Crypt
+ ------------------------------------------------------------------------------*/
+
+package com.gluster.storage.management.core.utils;
+
+
+/**
+ * <p>This class defines a method,
+ * {@link MD5Crypt#crypt(java.lang.String, java.lang.String) crypt()}, which
+ * takes a password and a salt string and generates an OpenBSD/FreeBSD/Linux-compatible
+ * md5-encoded password entry.</p>
+ *
+ * <p>Created: 3 November 1999</p>
+ * <p>Release: $Name: $</p>
+ * <p>Version: $Revision: 1.1 $</p>
+ * <p>Last Mod Date: $Date: 2004/07/12 13:35:20 $</p>
+ * <p>Java Code By: Jonathan Abbey, jonabbey@arlut.utexas.edu</p>
+ * <p>Original C Version:<pre>
+ * ----------------------------------------------------------------------------
+ * "THE BEER-WARE LICENSE" (Revision 42):
+ * <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
+ * can do whatever you want with this stuff. If we meet some day, and you think
+ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
+ * ----------------------------------------------------------------------------
+ * </pre></p>
+ *
+ * @author Jonathan Abbey <jonabbey at arlut.utexas.edu>
+ */
+public final class MD5Crypt {
+
+ /**
+ *
+ * Command line test rig.
+ *
+ */
+
+ static public void main(String argv[]) {
+ if ((argv.length < 1) || (argv.length > 3)) {
+ System.err
+ .println("Usage: MD5Crypt [-apache] password salt");
+ System.exit(1);
+ }
+
+ if (argv.length == 3) {
+ System.err.println(MD5Crypt.apacheCrypt(argv[1], argv[2]));
+ } else if (argv.length == 2) {
+ System.err.println(MD5Crypt.crypt(argv[0], argv[1]));
+ } else {
+ System.err.println(MD5Crypt.crypt(argv[0]));
+ }
+
+ System.exit(0);
+ }
+
+ static private final String SALTCHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+
+ static private final String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+ static private final String to64(long v, int size) {
+ StringBuffer result = new StringBuffer();
+
+ while (--size >= 0) {
+ result.append(itoa64.charAt((int) (v & 0x3f)));
+ v >>>= 6;
+ }
+
+ return result.toString();
+ }
+
+ static private final void clearbits(byte bits[]) {
+ for (int i = 0; i < bits.length; i++) {
+ bits[i] = 0;
+ }
+ }
+
+ /**
+ * convert an encoded unsigned byte value into a int
+ * with the unsigned value.
+ */
+
+ static private final int bytes2u(byte inp) {
+ return (int) inp & 0xff;
+ }
+
+ /**
+ * <p>This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible
+ * md5-encoded password hash from a plaintext password and a
+ * salt.</p>
+ *
+ * <p>The resulting string will be in the form '$1$&lt;salt&gt;$&lt;hashed mess&gt;</p>
+ *
+ * @param password Plaintext password
+ *
+ * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field.
+ */
+
+ static public final String crypt(String password) {
+ StringBuffer salt = new StringBuffer();
+ java.util.Random randgen = new java.util.Random();
+
+ /* -- */
+
+ while (salt.length() < 8) {
+ int index = (int) (randgen.nextFloat() * SALTCHARS.length());
+ salt.append(SALTCHARS.substring(index, index + 1));
+ }
+
+ return MD5Crypt.crypt(password, salt.toString());
+ }
+
+ /**
+ * <p>This method actually generates a OpenBSD/FreeBSD/Linux PAM compatible
+ * md5-encoded password hash from a plaintext password and a
+ * salt.</p>
+ *
+ * <p>The resulting string will be in the form '$1$&lt;salt&gt;$&lt;hashed mess&gt;</p>
+ *
+ * @param password Plaintext password
+ * @param salt A short string to use to randomize md5. May start with $1$, which
+ * will be ignored. It is explicitly permitted to pass a pre-existing
+ * MD5Crypt'ed password entry as the salt. crypt() will strip the salt
+ * chars out properly.
+ *
+ * @return An OpenBSD/FreeBSD/Linux-compatible md5-hashed password field.
+ */
+
+ static public final String crypt(String password, String salt) {
+ return MD5Crypt.crypt(password, salt, "$1$");
+ }
+
+ /**
+ * <p>This method generates an Apache MD5 compatible
+ * md5-encoded password hash from a plaintext password and a
+ * salt.</p>
+ *
+ * <p>The resulting string will be in the form '$apr1$&lt;salt&gt;$&lt;hashed mess&gt;</p>
+ *
+ * @param password Plaintext password
+ *
+ * @return An Apache-compatible md5-hashed password string.
+ */
+
+ static public final String apacheCrypt(String password) {
+ StringBuffer salt = new StringBuffer();
+ java.util.Random randgen = new java.util.Random();
+
+ /* -- */
+
+ while (salt.length() < 8) {
+ int index = (int) (randgen.nextFloat() * SALTCHARS.length());
+ salt.append(SALTCHARS.substring(index, index + 1));
+ }
+
+ return MD5Crypt.apacheCrypt(password, salt.toString());
+ }
+
+ /**
+ * <p>This method actually generates an Apache MD5 compatible
+ * md5-encoded password hash from a plaintext password and a
+ * salt.</p>
+ *
+ * <p>The resulting string will be in the form '$apr1$&lt;salt&gt;$&lt;hashed mess&gt;</p>
+ *
+ * @param password Plaintext password
+ * @param salt A short string to use to randomize md5. May start with $apr1$, which
+ * will be ignored. It is explicitly permitted to pass a pre-existing
+ * MD5Crypt'ed password entry as the salt. crypt() will strip the salt
+ * chars out properly.
+ *
+ * @return An Apache-compatible md5-hashed password string.
+ */
+
+ static public final String apacheCrypt(String password, String salt) {
+ return MD5Crypt.crypt(password, salt, "$apr1$");
+ }
+
+ /**
+ * <p>This method actually generates md5-encoded password hash from
+ * a plaintext password, a salt, and a magic string.</p>
+ *
+ * <p>There are two magic strings that make sense to use here.. '$1$' is the
+ * magic string used by the FreeBSD/Linux/OpenBSD MD5Crypt algorithm, and
+ * '$apr1$' is the magic string used by the Apache MD5Crypt algorithm.</p>
+ *
+ * <p>The resulting string will be in the form '&lt;magic&gt;&lt;salt&gt;$&lt;hashed mess&gt;</p>
+ *
+ * @param password Plaintext password @param salt A short string to
+ * use to randomize md5. May start with the magic string, which
+ * will be ignored. It is explicitly permitted to pass a
+ * pre-existing MD5Crypt'ed password entry as the salt. crypt()
+ * will strip the salt chars out properly.
+ *
+ * @return An md5-hashed password string.
+ */
+
+ static public final String crypt(String password, String salt,
+ String magic) {
+ /* This string is magic for this algorithm. Having it this way,
+ * we can get get better later on */
+
+ byte finalState[];
+ MD5 ctx, ctx1;
+ long l;
+
+ /* -- */
+
+ /* Refine the Salt first */
+
+ /* If it starts with the magic string, then skip that */
+
+ if (salt.startsWith(magic)) {
+ salt = salt.substring(magic.length());
+ }
+
+ /* It stops at the first '$', max 8 chars */
+
+ if (salt.indexOf('$') != -1) {
+ salt = salt.substring(0, salt.indexOf('$'));
+ }
+
+ if (salt.length() > 8) {
+ salt = salt.substring(0, 8);
+ }
+
+ ctx = new MD5();
+
+ ctx.Update(password); // The password first, since that is what is most unknown
+ ctx.Update(magic); // Then our magic string
+ ctx.Update(salt); // Then the raw salt
+
+ /* Then just as many characters of the MD5(pw,salt,pw) */
+
+ ctx1 = new MD5();
+ ctx1.Update(password);
+ ctx1.Update(salt);
+ ctx1.Update(password);
+ finalState = ctx1.Final();
+
+ for (int pl = password.length(); pl > 0; pl -= 16) {
+ ctx.Update(finalState, pl > 16 ? 16 : pl);
+ }
+
+ /* the original code claimed that finalState was being cleared
+ to keep dangerous bits out of memory, but doing this is also
+ required in order to get the right output. */
+
+ clearbits(finalState);
+
+ /* Then something really weird... */
+
+ for (int i = password.length(); i != 0; i >>>= 1) {
+ if ((i & 1) != 0) {
+ ctx.Update(finalState, 1);
+ } else {
+ ctx.Update(password.getBytes(), 1);
+ }
+ }
+
+ finalState = ctx.Final();
+
+ /*
+ * and now, just to make sure things don't run too fast
+ * On a 60 Mhz Pentium this takes 34 msec, so you would
+ * need 30 seconds to build a 1000 entry dictionary...
+ *
+ * (The above timings from the C version)
+ */
+
+ for (int i = 0; i < 1000; i++) {
+ ctx1 = new MD5();
+
+ if ((i & 1) != 0) {
+ ctx1.Update(password);
+ } else {
+ ctx1.Update(finalState, 16);
+ }
+
+ if ((i % 3) != 0) {
+ ctx1.Update(salt);
+ }
+
+ if ((i % 7) != 0) {
+ ctx1.Update(password);
+ }
+
+ if ((i & 1) != 0) {
+ ctx1.Update(finalState, 16);
+ } else {
+ ctx1.Update(password);
+ }
+
+ finalState = ctx1.Final();
+ }
+
+ /* Now make the output string */
+
+ StringBuffer result = new StringBuffer();
+
+ result.append(magic);
+ result.append(salt);
+ result.append("$");
+
+ l = (bytes2u(finalState[0]) << 16)
+ | (bytes2u(finalState[6]) << 8)
+ | bytes2u(finalState[12]);
+ result.append(to64(l, 4));
+
+ l = (bytes2u(finalState[1]) << 16)
+ | (bytes2u(finalState[7]) << 8)
+ | bytes2u(finalState[13]);
+ result.append(to64(l, 4));
+
+ l = (bytes2u(finalState[2]) << 16)
+ | (bytes2u(finalState[8]) << 8)
+ | bytes2u(finalState[14]);
+ result.append(to64(l, 4));
+
+ l = (bytes2u(finalState[3]) << 16)
+ | (bytes2u(finalState[9]) << 8)
+ | bytes2u(finalState[15]);
+ result.append(to64(l, 4));
+
+ l = (bytes2u(finalState[4]) << 16)
+ | (bytes2u(finalState[10]) << 8)
+ | bytes2u(finalState[5]);
+ result.append(to64(l, 4));
+
+ l = bytes2u(finalState[11]);
+ result.append(to64(l, 2));
+
+ /* Don't leave anything around in vm they could use. */
+ clearbits(finalState);
+
+ return result.toString();
+ }
+}
+
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/NumberUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/NumberUtil.java
new file mode 100644
index 00000000..9b1cd5e2
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/NumberUtil.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.utils;
+
+import java.text.NumberFormat;
+
+public class NumberUtil {
+ public static final String formatNumber(double num) {
+ NumberFormat formatter = NumberFormat.getNumberInstance();
+ formatter.setMinimumFractionDigits(2);
+ formatter.setMaximumFractionDigits(2);
+ return formatter.format(num);
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/ProcessResult.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/ProcessResult.java
new file mode 100644
index 00000000..6c8b857d
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/ProcessResult.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.utils;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * Represents the result of a command execution in a separate process. Consists of the "exit status" of the process and
+ * output from the process. The output includes stdout as well as stderr streams
+ */
+@XmlRootElement
+public class ProcessResult {
+
+ public static final int SUCCESS = 0;
+ private int exitValue;
+ private String output;
+
+ // Required for JAXB de-serialization
+ public ProcessResult() {
+
+ }
+
+ public ProcessResult(int exitValue, String output) {
+ this.exitValue = exitValue;
+ this.output = output;
+ }
+
+ public int getExitValue() {
+ return exitValue;
+ }
+
+ public void setExitValue(int exitValue) {
+ this.exitValue = exitValue;
+ }
+
+ public String getOutput() {
+ return output;
+ }
+
+ public void setOutput(String output) {
+ this.output = output;
+ }
+
+ public boolean isSuccess() {
+ return exitValue == SUCCESS;
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/ProcessUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/ProcessUtil.java
new file mode 100644
index 00000000..507c6d95
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/ProcessUtil.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.utils;
+
+import static com.gluster.storage.management.core.constants.CoreConstants.NEWLINE;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
+
+/**
+ * Utility class for creating processes (foreground/background) with given
+ * command and checking the output/exit status
+ */
+public class ProcessUtil {
+
+ private static final ProcessUtil instance = new ProcessUtil();
+
+ public ProcessResult executeCommand(List<String> command) {
+ return executeCommand(true, command);
+ }
+
+ /**
+ * Executes given command in a separate process in FOREGROUND
+ * @param command
+ * @return {@link ProcessResult} object
+ */
+ public ProcessResult executeCommand(String... command) {
+ ArrayList<String> commandList = new ArrayList<String>();
+ for (String part : command) {
+ commandList.add(part);
+ }
+ return executeCommand(commandList);
+ }
+
+ /**
+ * Executes given command in foreground/background
+ * @param runInForeground Boolean flag indicating whether the command should
+ * be executed in foreground
+ * @param command
+ * @return {@link ProcessResult} object
+ */
+ public ProcessResult executeCommand(boolean runInForeground, List<String> command) {
+ StringBuilder output = new StringBuilder();
+ try {
+ Process process = new ProcessBuilder(command).redirectErrorStream(true).start();
+
+ if (runInForeground) {
+ process.waitFor(); // Wait for process to finish
+
+ InputStream is = process.getInputStream();
+ InputStreamReader isr = new InputStreamReader(is);
+ BufferedReader br = new BufferedReader(isr);
+ String line;
+
+ while ((line = br.readLine()) != null) {
+ output.append(line);
+ output.append(NEWLINE);
+ }
+ } else {
+ output.append("Command [");
+ output.append(command);
+ output.append("] triggerred in background.");
+ }
+
+ return new ProcessResult(process.exitValue(), output.toString());
+ } catch (Throwable e) {
+ throw new GlusterRuntimeException("Exception while executing command [" + command + "]", e);
+ }
+ }
+
+ public static void main(String args[]) {
+ ProcessResult result = new ProcessUtil().executeCommand("ls", "-lrt", "/");
+ System.out.println(result.getExitValue());
+ System.out.println(result.getOutput());
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/StringUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/StringUtil.java
new file mode 100644
index 00000000..1c4e6893
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/StringUtil.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console 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 Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.utils;
+
+public class StringUtil {
+ public static boolean filterString(String sourceString,
+ String filterString, boolean caseSensitive) {
+ return caseSensitive ? sourceString.contains(filterString)
+ : sourceString.toLowerCase().contains(
+ filterString.toLowerCase());
+ }
+}