summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEndi S. Dewata <edewata@redhat.com>2013-09-24 10:08:48 -0400
committerEndi S. Dewata <edewata@redhat.com>2013-10-01 19:25:39 -0400
commite339952dfad45bc0ba1768a9386817eadd49b9dc (patch)
tree9654dfcee299337c23d3536e913478f8c3dabcaa
parenta3ac3ef0ca5e720a4cd5b17e9181124c17d17ea7 (diff)
downloadpki-e339952dfad45bc0ba1768a9386817eadd49b9dc.tar.gz
pki-e339952dfad45bc0ba1768a9386817eadd49b9dc.tar.xz
pki-e339952dfad45bc0ba1768a9386817eadd49b9dc.zip
Refactored TPS configuration resource.
The REST interface for TPS configuration has been modified to provide access to TPS general configuration as originally designed. The configuration database has been modified such that it can be reused by other configuration resources. Ticket #652
-rw-r--r--base/common/src/com/netscape/certsrv/tps/config/ConfigClient.java12
-rw-r--r--base/common/src/com/netscape/certsrv/tps/config/ConfigData.java44
-rw-r--r--base/common/src/com/netscape/certsrv/tps/config/ConfigResource.java13
-rw-r--r--base/java-tools/src/com/netscape/cmstools/tps/config/ConfigCLI.java42
-rw-r--r--base/java-tools/src/com/netscape/cmstools/tps/config/ConfigFindCLI.java86
-rw-r--r--base/java-tools/src/com/netscape/cmstools/tps/config/ConfigModifyCLI.java15
-rw-r--r--base/java-tools/src/com/netscape/cmstools/tps/config/ConfigShowCLI.java13
-rw-r--r--base/tps-tomcat/src/CMakeLists.txt9
-rw-r--r--base/tps-tomcat/src/org/dogtagpki/server/tps/TPSApplication.java6
-rw-r--r--base/tps-tomcat/src/org/dogtagpki/server/tps/TPSSubsystem.java24
-rw-r--r--base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigDatabase.java191
-rw-r--r--base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigRecord.java117
-rw-r--r--base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigService.java142
13 files changed, 401 insertions, 313 deletions
diff --git a/base/common/src/com/netscape/certsrv/tps/config/ConfigClient.java b/base/common/src/com/netscape/certsrv/tps/config/ConfigClient.java
index c3876bf83..9c707e494 100644
--- a/base/common/src/com/netscape/certsrv/tps/config/ConfigClient.java
+++ b/base/common/src/com/netscape/certsrv/tps/config/ConfigClient.java
@@ -44,17 +44,13 @@ public class ConfigClient extends Client {
resource = createProxy(ConfigResource.class);
}
- public ConfigCollection findConfigs() {
- return resource.findConfigs();
+ public ConfigData getConfig() {
+ return resource.getConfig();
}
- public ConfigData getConfig(String configID) {
- return resource.getConfig(configID);
- }
-
- public ConfigData updateConfig(String configID, ConfigData configData) {
+ public ConfigData updateConfig(ConfigData configData) {
@SuppressWarnings("unchecked")
- ClientResponse<ConfigData> response = (ClientResponse<ConfigData>)resource.updateConfig(configID, configData);
+ ClientResponse<ConfigData> response = (ClientResponse<ConfigData>)resource.updateConfig(configData);
return client.getEntity(response);
}
}
diff --git a/base/common/src/com/netscape/certsrv/tps/config/ConfigData.java b/base/common/src/com/netscape/certsrv/tps/config/ConfigData.java
index 1b3688f5e..2a36f3fa8 100644
--- a/base/common/src/com/netscape/certsrv/tps/config/ConfigData.java
+++ b/base/common/src/com/netscape/certsrv/tps/config/ConfigData.java
@@ -57,27 +57,18 @@ public class ConfigData {
}
}
- String id;
- String displayName;
+ String status;
Map<String, String> properties = new LinkedHashMap<String, String>();
- Link link;
-
- @XmlAttribute(name="id")
- public String getID() {
- return id;
- }
- public void setID(String id) {
- this.id = id;
- }
+ Link link;
- @XmlElement(name="DisplayName")
- public String getDisplayName() {
- return displayName;
+ @XmlElement(name="Status")
+ public String getStatus() {
+ return status;
}
- public void setDisplayName(String displayName) {
- this.displayName = displayName;
+ public void setStatus(String status) {
+ this.status = status;
}
@XmlElement(name="Properties")
@@ -156,10 +147,9 @@ public class ConfigData {
public int hashCode() {
final int prime = 31;
int result = 1;
- result = prime * result + ((displayName == null) ? 0 : displayName.hashCode());
- result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((link == null) ? 0 : link.hashCode());
result = prime * result + ((properties == null) ? 0 : properties.hashCode());
+ result = prime * result + ((status == null) ? 0 : status.hashCode());
return result;
}
@@ -172,16 +162,6 @@ public class ConfigData {
if (getClass() != obj.getClass())
return false;
ConfigData other = (ConfigData) obj;
- if (displayName == null) {
- if (other.displayName != null)
- return false;
- } else if (!displayName.equals(other.displayName))
- return false;
- if (id == null) {
- if (other.id != null)
- return false;
- } else if (!id.equals(other.id))
- return false;
if (link == null) {
if (other.link != null)
return false;
@@ -192,6 +172,11 @@ public class ConfigData {
return false;
} else if (!properties.equals(other.properties))
return false;
+ if (status == null) {
+ if (other.status != null)
+ return false;
+ } else if (!status.equals(other.status))
+ return false;
return true;
}
@@ -217,8 +202,7 @@ public class ConfigData {
public static void main(String args[]) throws Exception {
ConfigData before = new ConfigData();
- before.setID("test");
- before.setDisplayName("Test Config");
+ before.setStatus("ENABLED");
before.setProperty("param1", "value1");
before.setProperty("param2", "value2");
diff --git a/base/common/src/com/netscape/certsrv/tps/config/ConfigResource.java b/base/common/src/com/netscape/certsrv/tps/config/ConfigResource.java
index a15730a4b..e1076a48e 100644
--- a/base/common/src/com/netscape/certsrv/tps/config/ConfigResource.java
+++ b/base/common/src/com/netscape/certsrv/tps/config/ConfigResource.java
@@ -21,7 +21,6 @@ import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@@ -32,22 +31,16 @@ import org.jboss.resteasy.annotations.ClientResponseType;
/**
* @author Endi S. Dewata
*/
-@Path("configs")
+@Path("config")
public interface ConfigResource {
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
- public ConfigCollection findConfigs();
-
- @GET
- @Path("{configID}")
- @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
- public ConfigData getConfig(@PathParam("configID") String configID);
+ public ConfigData getConfig();
@PUT
- @Path("{configID}")
@ClientResponseType(entityType=ConfigData.class)
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
- public Response updateConfig(@PathParam("configID") String configID, ConfigData configData);
+ public Response updateConfig(ConfigData configData);
}
diff --git a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigCLI.java
index 9d913517e..584cf81af 100644
--- a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigCLI.java
+++ b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigCLI.java
@@ -19,7 +19,7 @@
package com.netscape.cmstools.tps.config;
import java.io.IOException;
-import java.util.Arrays;
+import java.util.Map;
import org.jboss.resteasy.plugins.providers.atom.Link;
@@ -37,7 +37,6 @@ public class ConfigCLI extends CLI {
public ConfigCLI(CLI parent) {
super("config", "Configuration management commands", parent);
- addModule(new ConfigFindCLI(this));
addModule(new ConfigModifyCLI(this));
addModule(new ConfigShowCLI(this));
}
@@ -47,41 +46,18 @@ public class ConfigCLI extends CLI {
client = parent.getClient();
configClient = (ConfigClient)parent.getClient("config");
- if (args.length == 0) {
- printHelp();
- System.exit(1);
- }
-
- String command = args[0];
- String[] commandArgs = Arrays.copyOfRange(args, 1, args.length);
-
- if (command == null) {
- printHelp();
- System.exit(1);
- }
-
- CLI module = getModule(command);
- if (module != null) {
- module.execute(commandArgs);
-
- } else {
- System.err.println("Error: Invalid command \"" + command + "\"");
- printHelp();
- System.exit(1);
- }
+ super.execute(args);
}
- public static void printConfigData(ConfigData configData, boolean showProperties) throws IOException {
+ public static void printConfigData(ConfigData configData) throws IOException {
- System.out.println(" Config ID: " + configData.getID());
- System.out.println(" Display Name: " + configData.getDisplayName());
+ if (configData.getStatus() != null) System.out.println(" Status: " + configData.getStatus());
- if (showProperties) {
- System.out.println(" Properties:");
- for (String name : configData.getPropertyNames()) {
- String value = configData.getProperty(name);
- System.out.println(" " + name + ": " + value);
- }
+ System.out.println(" Properties:");
+ Map<String, String> properties = configData.getProperties();
+ for (String name : properties.keySet()) {
+ String value = properties.get(name);
+ System.out.println(" " + name + ": " + value);
}
Link link = configData.getLink();
diff --git a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigFindCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigFindCLI.java
deleted file mode 100644
index c7ab18738..000000000
--- a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigFindCLI.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// --- BEGIN COPYRIGHT BLOCK ---
-// 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; version 2 of the License.
-//
-// 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.,
-// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-//
-// (C) 2013 Red Hat, Inc.
-// All rights reserved.
-// --- END COPYRIGHT BLOCK ---
-
-package com.netscape.cmstools.tps.config;
-
-import java.util.Collection;
-
-import org.apache.commons.cli.CommandLine;
-
-import com.netscape.certsrv.tps.config.ConfigCollection;
-import com.netscape.certsrv.tps.config.ConfigData;
-import com.netscape.cmstools.cli.CLI;
-import com.netscape.cmstools.cli.MainCLI;
-
-/**
- * @author Endi S. Dewata
- */
-public class ConfigFindCLI extends CLI {
-
- public ConfigCLI configCLI;
-
- public ConfigFindCLI(ConfigCLI configCLI) {
- super("find", "Find configurations", configCLI);
- this.configCLI = configCLI;
- }
-
- public void printHelp() {
- formatter.printHelp(getFullName(), options);
- }
-
- public void execute(String[] args) throws Exception {
-
- CommandLine cmd = null;
-
- try {
- cmd = parser.parse(options, args);
-
- } catch (Exception e) {
- System.err.println("Error: " + e.getMessage());
- printHelp();
- System.exit(1);
- }
-
- String[] cmdArgs = cmd.getArgs();
-
- if (cmdArgs.length != 0) {
- printHelp();
- System.exit(1);
- }
-
- ConfigCollection result = configCLI.configClient.findConfigs();
-
- Collection<ConfigData> entries = result.getConfigs();
-
- MainCLI.printMessage(entries.size() + " entries matched");
- boolean first = true;
-
- for (ConfigData configData : entries) {
-
- if (first) {
- first = false;
- } else {
- System.out.println();
- }
-
- ConfigCLI.printConfigData(configData, false);
- }
-
- MainCLI.printMessage("Number of entries returned " + entries.size());
- }
-}
diff --git a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigModifyCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigModifyCLI.java
index 3344a8c9e..fb7e2f09f 100644
--- a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigModifyCLI.java
+++ b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigModifyCLI.java
@@ -39,22 +39,22 @@ public class ConfigModifyCLI extends CLI {
public ConfigCLI configCLI;
public ConfigModifyCLI(ConfigCLI configCLI) {
- super("mod", "Modify configuration", configCLI);
+ super("mod", "Modify general properties", configCLI);
this.configCLI = configCLI;
}
public void printHelp() {
- formatter.printHelp(getFullName() + " <Config ID> [OPTIONS...]", options);
+ formatter.printHelp(getFullName() + " [OPTIONS...]", options);
}
public void execute(String[] args) throws Exception {
- Option option = new Option(null, "input", true, "Input configuration file.");
+ Option option = new Option(null, "input", true, "Input file containing general properties.");
option.setArgName("file");
option.setRequired(true);
options.addOption(option);
- option = new Option(null, "output", true, "Output configuration file.");
+ option = new Option(null, "output", true, "Output file to store general properties.");
option.setArgName("file");
options.addOption(option);
@@ -71,12 +71,11 @@ public class ConfigModifyCLI extends CLI {
String[] cmdArgs = cmd.getArgs();
- if (cmdArgs.length != 1) {
+ if (cmdArgs.length != 0) {
printHelp();
System.exit(1);
}
- String configID = args[0];
String input = cmd.getOptionValue("input");
String output = cmd.getOptionValue("output");
@@ -100,12 +99,12 @@ public class ConfigModifyCLI extends CLI {
configData = ConfigData.valueOf(sw.toString());
}
- configData = configCLI.configClient.updateConfig(configID, configData);
+ configData = configCLI.configClient.updateConfig(configData);
MainCLI.printMessage("Updated configuration");
if (output == null) {
- ConfigCLI.printConfigData(configData, true);
+ ConfigCLI.printConfigData(configData);
} else {
try (PrintWriter out = new PrintWriter(new FileWriter(output))) {
diff --git a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigShowCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigShowCLI.java
index 77f77c94f..33bc781ac 100644
--- a/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigShowCLI.java
+++ b/base/java-tools/src/com/netscape/cmstools/tps/config/ConfigShowCLI.java
@@ -36,17 +36,17 @@ public class ConfigShowCLI extends CLI {
public ConfigCLI configCLI;
public ConfigShowCLI(ConfigCLI configCLI) {
- super("show", "Show configuration", configCLI);
+ super("show", "Show general properties", configCLI);
this.configCLI = configCLI;
}
public void printHelp() {
- formatter.printHelp(getFullName() + " <Config ID>", options);
+ formatter.printHelp(getFullName(), options);
}
public void execute(String[] args) throws Exception {
- Option option = new Option(null, "output", true, "Output file to store config attributes.");
+ Option option = new Option(null, "output", true, "Output file to store general properties.");
option.setArgName("file");
options.addOption(option);
@@ -63,19 +63,18 @@ public class ConfigShowCLI extends CLI {
String[] cmdArgs = cmd.getArgs();
- if (cmdArgs.length != 1) {
+ if (cmdArgs.length != 0) {
printHelp();
System.exit(1);
}
- String configID = cmdArgs[0];
String output = cmd.getOptionValue("output");
- ConfigData configData = configCLI.configClient.getConfig(configID);
+ ConfigData configData = configCLI.configClient.getConfig();
if (output == null) {
MainCLI.printMessage("Configuration");
- ConfigCLI.printConfigData(configData, true);
+ ConfigCLI.printConfigData(configData);
} else {
try (PrintWriter out = new PrintWriter(new FileWriter(output))) {
diff --git a/base/tps-tomcat/src/CMakeLists.txt b/base/tps-tomcat/src/CMakeLists.txt
index 4798d2004..a0a7ac505 100644
--- a/base/tps-tomcat/src/CMakeLists.txt
+++ b/base/tps-tomcat/src/CMakeLists.txt
@@ -1,5 +1,12 @@
project(pki-tps_java NONE)
+find_file(APACHE_COMMONS_LANG_JAR
+ NAMES
+ apache-commons-lang.jar
+ PATHS
+ /usr/share/java
+)
+
find_file(LDAPJDK_JAR
NAMES
ldapjdk.jar
@@ -100,7 +107,7 @@ javac(pki-tps-classes
CLASSPATH
${PKI_CERTSRV_JAR} ${PKI_CMS_JAR} ${PKI_CMSCORE_JAR}
${PKI_CMSUTIL_JAR} ${PKI_NSUTIL_JAR}
- ${LDAPJDK_JAR} ${JAXRS_API_JAR} ${RESTEASY_ATOM_PROVIDER_JAR}
+ ${APACHE_COMMONS_LANG_JAR} ${LDAPJDK_JAR} ${JAXRS_API_JAR} ${RESTEASY_ATOM_PROVIDER_JAR}
${JSS_JAR} ${COMMONS_CODEC_JAR} ${SYMKEY_JAR} ${SERVLET_JAR}
OUTPUT_DIR
${CMAKE_BINARY_DIR}/classes
diff --git a/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSApplication.java b/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSApplication.java
index c3c6195f5..e90d8bbcc 100644
--- a/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSApplication.java
+++ b/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSApplication.java
@@ -73,15 +73,15 @@ public class TPSApplication extends Application {
// authenticators
classes.add(AuthenticatorService.class);
+ // certificates
+ classes.add(TPSCertService.class);
+
// config
classes.add(ConfigService.class);
// connections
classes.add(ConnectionService.class);
- // certificates
- classes.add(TPSCertService.class);
-
// tokens
classes.add(TokenService.class);
diff --git a/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSSubsystem.java b/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSSubsystem.java
index d00378a1d..58ed12233 100644
--- a/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSSubsystem.java
+++ b/base/tps-tomcat/src/org/dogtagpki/server/tps/TPSSubsystem.java
@@ -19,6 +19,7 @@ package org.dogtagpki.server.tps;
import org.dogtagpki.server.tps.authenticator.AuthenticatorDatabase;
import org.dogtagpki.server.tps.cert.TPSCertDatabase;
+import org.dogtagpki.server.tps.config.ConfigDatabase;
import org.dogtagpki.server.tps.connection.ConnectionDatabase;
import org.dogtagpki.server.tps.logging.ActivityDatabase;
import org.dogtagpki.server.tps.token.TokenDatabase;
@@ -53,9 +54,10 @@ public class TPSSubsystem implements IAuthority, ISubsystem {
public IConfigStore config;
public ActivityDatabase activityDatabase;
- public AuthenticatorDatabase authenticatorDatabase = new AuthenticatorDatabase();
+ public AuthenticatorDatabase authenticatorDatabase;
public TPSCertDatabase certDatabase;
- public ConnectionDatabase connectionDatabase = new ConnectionDatabase();
+ public ConfigDatabase configDatabase;
+ public ConnectionDatabase connectionDatabase;
public TokenDatabase tokenDatabase;
@Override
@@ -84,7 +86,11 @@ public class TPSSubsystem implements IAuthority, ISubsystem {
String tokenDatabaseDN = cs.getString("tokendb.baseDN");
tokenDatabase = new TokenDatabase(dbSubsystem, tokenDatabaseDN);
- }
+
+ configDatabase = new ConfigDatabase();
+ authenticatorDatabase = new AuthenticatorDatabase();
+ connectionDatabase = new ConnectionDatabase();
+}
@Override
public void startup() throws EBaseException {
@@ -139,14 +145,18 @@ public class TPSSubsystem implements IAuthority, ISubsystem {
return authenticatorDatabase;
}
- public ConnectionDatabase getConnectionDatabase() {
- return connectionDatabase;
- }
-
public TPSCertDatabase getCertDatabase() {
return certDatabase;
}
+ public ConfigDatabase getConfigDatabase() {
+ return configDatabase;
+ }
+
+ public ConnectionDatabase getConnectionDatabase() {
+ return connectionDatabase;
+ }
+
public TokenDatabase getTokenDatabase() {
return tokenDatabase;
}
diff --git a/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigDatabase.java b/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigDatabase.java
new file mode 100644
index 000000000..8a3850165
--- /dev/null
+++ b/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigDatabase.java
@@ -0,0 +1,191 @@
+// --- BEGIN COPYRIGHT BLOCK ---
+// 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; version 2 of the License.
+//
+// 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.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// (C) 2013 Red Hat, Inc.
+// All rights reserved.
+// --- END COPYRIGHT BLOCK ---
+
+package org.dogtagpki.server.tps.config;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.commons.lang.StringUtils;
+
+import com.netscape.certsrv.apps.CMS;
+import com.netscape.certsrv.base.BadRequestException;
+import com.netscape.certsrv.base.EBaseException;
+import com.netscape.certsrv.base.IConfigStore;
+import com.netscape.certsrv.base.ResourceNotFoundException;
+import com.netscape.cmscore.dbs.Database;
+
+/**
+ * This class implements in-memory connection database. In the future this
+ * will be replaced with LDAP database.
+ *
+ * @author Endi S. Dewata
+ */
+public class ConfigDatabase extends Database<ConfigRecord> {
+
+ IConfigStore configStore = CMS.getConfigStore();
+ Map<String, String> map;
+
+ public ConfigDatabase() throws EBaseException {
+ super("Configuration");
+
+ map = configStore.getProperties();
+ }
+
+ public String createFilter(ConfigRecord record, String key) {
+ String pattern = record.getPattern();
+ if (key == null) return pattern;
+ return pattern.replace("$name", key);
+ }
+
+ @Override
+ public Collection<ConfigRecord> getRecords() throws Exception {
+
+ CMS.debug("ConfigDatabase.getRecords()");
+
+ Collection<ConfigRecord> result = new ArrayList<ConfigRecord>();
+
+ Collection<String> configIDs = new LinkedHashSet<String>();
+ configIDs.add("Generals");
+
+ String list = map.get("target.configure.list");
+ if (list != null) {
+ configIDs.addAll(Arrays.asList(list.split(",")));
+ }
+
+ list = map.get("target.agent_approve.list");
+ if (list != null) {
+ configIDs.addAll(Arrays.asList(list.split(",")));
+ }
+
+ for (String configID : configIDs) {
+ ConfigRecord configData = getRecord(configID);
+ result.add(configData);
+ }
+
+ return result;
+ }
+
+ @Override
+ public ConfigRecord getRecord(String configID) throws Exception {
+
+ CMS.debug("ConfigDatabase.getRecord(\"" + configID + "\")");
+
+ ConfigRecord record = new ConfigRecord();
+ record.setID(configID);
+
+ String displayName = map.get("target." + configID + ".displayname");
+ if (displayName == null) {
+ throw new ResourceNotFoundException("Configuration " + configID + " not found.");
+ }
+ record.setDisplayName(displayName);
+
+ String pattern = map.get("target." + configID + ".pattern");
+ if (pattern == null) {
+ throw new ResourceNotFoundException("Missing pattern for " + configID + " configuration.");
+ }
+
+ // replace \| with |
+ record.setPattern(pattern.replace("\\|", "|"));
+
+ String list = map.get("target." + configID + ".list");
+ if (list != null) {
+ record.setKeys(Arrays.asList(list.split(",")));
+ }
+
+ return record;
+ }
+
+
+ @Override
+ public void updateRecord(String configID, ConfigRecord newRecord) throws Exception {
+
+ CMS.debug("ConfigDatabase.updateRecord(\"" + configID + "\")");
+
+ configStore.put("target." + configID + ".displayname", newRecord.getDisplayName());
+ configStore.put("target." + configID + ".pattern", newRecord.getPattern());
+ configStore.put("target." + configID + ".list", StringUtils.join(newRecord.getKeys(), ","));
+
+ configStore.commit(true);
+ map = configStore.getProperties();
+ }
+
+ public Map<String, String> getProperties(ConfigRecord record, String key) {
+
+ CMS.debug("ConfigDatabase.getProperties(\"" + record.getID() + "\")");
+
+ Map<String, String> properties = new TreeMap<String, String>();
+
+ // get properties that match the filter
+ String filter = createFilter(record, key);
+ for (String name : map.keySet()) {
+ if (!name.matches(filter)) continue;
+
+ String value = map.get(name);
+ properties.put(name, value);
+ }
+
+ return properties;
+ }
+
+ public void validateProperties(ConfigRecord record, String key, Map<String, String> properties) throws Exception {
+
+ CMS.debug("ConfigDatabase.validateProperties(\"" + record.getID() + "\")");
+
+ String filter = createFilter(record, key);
+ for (String name : properties.keySet()) {
+ if (name.matches(filter)) continue;
+ throw new BadRequestException("Invalid property: " + name);
+ }
+ }
+
+ public void addProperties(ConfigRecord record, String key, Map<String, String> properties) throws Exception {
+
+ CMS.debug("ConfigDatabase.addProperties(\"" + record.getID() + "\")");
+
+ for (String name : properties.keySet()) {
+ String value = properties.get(name);
+ configStore.put(name, value);
+ }
+ }
+
+ public void removeProperties(ConfigRecord record, String key) throws Exception {
+
+ CMS.debug("ConfigDatabase.removeProperties(\"" + record.getID() + "\")");
+
+ Map<String, String> oldProperties = getProperties(record, key);
+ for (String name : oldProperties.keySet()) {
+ configStore.remove(name);
+ }
+ }
+
+ public void commit() throws Exception {
+
+ CMS.debug("ConfigDatabase.commit()");
+
+ // save configuration
+ configStore.commit(true);
+
+ // reload configuration
+ map = configStore.getProperties();
+ }
+}
diff --git a/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigRecord.java b/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigRecord.java
new file mode 100644
index 000000000..25978212e
--- /dev/null
+++ b/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigRecord.java
@@ -0,0 +1,117 @@
+// --- BEGIN COPYRIGHT BLOCK ---
+// 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; version 2 of the License.
+//
+// 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.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// (C) 2013 Red Hat, Inc.
+// All rights reserved.
+// --- END COPYRIGHT BLOCK ---
+
+package org.dogtagpki.server.tps.config;
+
+import java.util.Collection;
+import java.util.LinkedHashSet;
+
+/**
+ * @author Endi S. Dewata
+ */
+public class ConfigRecord {
+
+ String id;
+ String displayName;
+ String pattern;
+ Collection<String> keys = new LinkedHashSet<String>();
+
+ public String getID() {
+ return id;
+ }
+
+ public void setID(String id) {
+ this.id = id;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String getPattern() {
+ return pattern;
+ }
+
+ public void setPattern(String pattern) {
+ this.pattern = pattern;
+ }
+
+ public Collection<String> getKeys() {
+ return keys;
+ }
+
+ public void setKeys(Collection<String> keys) {
+ this.keys.clear();
+ this.keys.addAll(keys);
+ }
+
+ public void addKey(String key) {
+ keys.add(key);
+ }
+
+ public void removeKey(String key) {
+ keys.remove(key);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((displayName == null) ? 0 : displayName.hashCode());
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ result = prime * result + ((keys == null) ? 0 : keys.hashCode());
+ result = prime * result + ((pattern == null) ? 0 : pattern.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ConfigRecord other = (ConfigRecord) obj;
+ if (displayName == null) {
+ if (other.displayName != null)
+ return false;
+ } else if (!displayName.equals(other.displayName))
+ return false;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ if (keys == null) {
+ if (other.keys != null)
+ return false;
+ } else if (!keys.equals(other.keys))
+ return false;
+ if (pattern == null) {
+ if (other.pattern != null)
+ return false;
+ } else if (!pattern.equals(other.pattern))
+ return false;
+ return true;
+ }
+}
diff --git a/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigService.java b/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigService.java
index 41a8c1714..8f338e330 100644
--- a/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigService.java
+++ b/base/tps-tomcat/src/org/dogtagpki/server/tps/config/ConfigService.java
@@ -20,11 +20,6 @@ package org.dogtagpki.server.tps.config;
import java.io.UnsupportedEncodingException;
import java.net.URI;
-import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.LinkedHashSet;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
@@ -38,11 +33,7 @@ import javax.ws.rs.core.UriInfo;
import org.jboss.resteasy.plugins.providers.atom.Link;
import com.netscape.certsrv.apps.CMS;
-import com.netscape.certsrv.base.BadRequestException;
-import com.netscape.certsrv.base.IConfigStore;
import com.netscape.certsrv.base.PKIException;
-import com.netscape.certsrv.base.ResourceNotFoundException;
-import com.netscape.certsrv.tps.config.ConfigCollection;
import com.netscape.certsrv.tps.config.ConfigData;
import com.netscape.certsrv.tps.config.ConfigResource;
import com.netscape.cms.servlet.base.PKIService;
@@ -70,107 +61,28 @@ public class ConfigService extends PKIService implements ConfigResource {
CMS.debug("ConfigService.<init>()");
}
- public Collection<String> getPatterns(String configID, Map<String, String> map) {
- Collection<String> patterns = new ArrayList<String>();
-
- String pattern = map.get("target." + configID + ".pattern");
- if (pattern != null) {
- // replace \| with |
- pattern = pattern.replace("\\|", "|");
-
- String list = map.get("target." + configID + ".list");
- if (list == null) {
- patterns.add(pattern);
-
- } else {
- for (String value : list.split(",")) {
- patterns.add(pattern.replace("$name", value));
- }
- }
- }
-
- return patterns;
- }
-
- public ConfigData createConfigData(String configID, Map<String, String> map) throws UnsupportedEncodingException {
-
- String displayName = map.get("target." + configID + ".displayname");
- if (displayName == null) {
- throw new ResourceNotFoundException("Configuration " + configID + " not found.");
- }
+ public ConfigData createConfigData(Map<String, String> properties) throws UnsupportedEncodingException {
ConfigData configData = new ConfigData();
- configData.setID(configID);
- configData.setDisplayName(displayName);
-
- // add properties that fit the patterns
- Collection<String> patterns = getPatterns(configID, map);
- for (String pattern : patterns) {
- for (String name : map.keySet()) {
- if (!name.matches(pattern)) continue;
-
- String value = map.get(name);
- configData.setProperty(name, value);
- }
- }
+ configData.setProperties(properties);
- configID = URLEncoder.encode(configID, "UTF-8");
- URI uri = uriInfo.getBaseUriBuilder().path(ConfigResource.class).path("{configID}").build(configID);
+ URI uri = uriInfo.getBaseUriBuilder().path(ConfigResource.class).build();
configData.setLink(new Link("self", uri));
return configData;
}
@Override
- public ConfigCollection findConfigs() {
-
- CMS.debug("ConfigService.findConfigs()");
-
- try {
- IConfigStore configStore = CMS.getConfigStore();
- Map<String, String> map = configStore.getProperties();
-
- ConfigCollection result = new ConfigCollection();
-
- Collection<String> configIDs = new LinkedHashSet<String>();
- configIDs.add("Generals");
-
- String list = map.get("target.configure.list");
- if (list != null) {
- configIDs.addAll(Arrays.asList(list.split(",")));
- }
-
- list = map.get("target.agent_approve.list");
- if (list != null) {
- configIDs.addAll(Arrays.asList(list.split(",")));
- }
-
- for (String configID : configIDs) {
- ConfigData configData = createConfigData(configID, map);
- result.addConfig(configData);
- }
-
- return result;
-
- } catch (PKIException e) {
- throw e;
-
- } catch (Exception e) {
- e.printStackTrace();
- throw new PKIException(e.getMessage());
- }
- }
-
- @Override
- public ConfigData getConfig(String configID) {
+ public ConfigData getConfig() {
CMS.debug("ConfigService.getConfig()");
try {
- IConfigStore configStore = CMS.getConfigStore();
- Map<String, String> map = configStore.getProperties();
+ ConfigDatabase configDatabase = new ConfigDatabase();
+ ConfigRecord configRecord = configDatabase.getRecord("Generals");
- return createConfigData(configID, map);
+ Map<String, String> properties = configDatabase.getProperties(configRecord, null);
+ return createConfigData(properties);
} catch (PKIException e) {
throw e;
@@ -182,41 +94,31 @@ public class ConfigService extends PKIService implements ConfigResource {
}
@Override
- public Response updateConfig(String configID, ConfigData newConfigData) {
+ public Response updateConfig(ConfigData configData) {
CMS.debug("ConfigService.updateConfig()");
try {
- IConfigStore configStore = CMS.getConfigStore();
- Map<String, String> map = configStore.getProperties();
-
- // verify that new properties fit the patterns
- Collection<String> patterns = getPatterns(configID, map);
- for (String pattern : patterns) {
- for (String name : newConfigData.getPropertyNames()) {
- if (name.matches(pattern)) continue;
- throw new BadRequestException("Invalid property: " + name);
- }
- }
+ ConfigDatabase configDatabase = new ConfigDatabase();
+ ConfigRecord configRecord = configDatabase.getRecord("Generals");
+
+ // validate new properties
+ Map<String, String> properties = configData.getProperties();
+ configDatabase.validateProperties(configRecord, null, properties);
// remove old properties
- ConfigData configData = createConfigData(configID, map);
- for (String name : configData.getPropertyNames()) {
- configStore.remove(name);
- }
+ configDatabase.removeProperties(configRecord, null);
- // store new properties
- for (String name : newConfigData.getPropertyNames()) {
- String value = newConfigData.getProperty(name);
- configStore.put(name, value);
- }
+ // add new properties
+ configDatabase.addProperties(configRecord, null, properties);
- configStore.commit(true);
+ configDatabase.commit();
- newConfigData = getConfig(configID);
+ properties = configDatabase.getProperties(configRecord, null);
+ configData = createConfigData(properties);
return Response
- .ok(newConfigData)
+ .ok(configData)
.type(MediaType.APPLICATION_XML)
.build();