From 78cce328039810027616b0dfe4fb3362f5b573af Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Wed, 24 Apr 2013 17:10:05 -0400 Subject: [PATCH 01/16] Adds SP extensions to Pazpar2 commands and parameters --- .../mkjsf/pazpar2/commands/BytargetCommand.java | 14 +++++++++- .../mkjsf/pazpar2/commands/InitCommand.java | 16 ++++++++++- .../mkjsf/pazpar2/commands/Pazpar2Command.java | 20 ++++++-------- .../mkjsf/pazpar2/commands/PingCommand.java | 14 +++++++++- .../mkjsf/pazpar2/commands/RecordCommand.java | 13 ++++++++- .../mkjsf/pazpar2/commands/SearchCommand.java | 8 +++++- .../mkjsf/pazpar2/commands/SettingsCommand.java | 16 ++++++++++- .../mkjsf/pazpar2/commands/ShowCommand.java | 8 +++++- .../mkjsf/pazpar2/commands/StatCommand.java | 17 +++++++++++- .../mkjsf/pazpar2/commands/TermlistCommand.java | 19 ++++++++++++- .../mkjsf/pazpar2/commands/sp/AuthCommand.java | 29 ++++++++++++++++++++ .../mkjsf/pazpar2/commands/sp/RecordCommandSp.java | 26 ++++++++++++++++++ .../pazpar2/commands/sp/ServiceProxyCommand.java | 5 ++++ .../mkjsf/pazpar2/sp/ServiceProxyClient.java | 10 +++---- 14 files changed, 189 insertions(+), 26 deletions(-) create mode 100644 src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/AuthCommand.java create mode 100644 src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/RecordCommandSp.java create mode 100644 src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/ServiceProxyCommand.java diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/BytargetCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/BytargetCommand.java index 57c66de..7f39b70 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/BytargetCommand.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/BytargetCommand.java @@ -1,8 +1,9 @@ package com.indexdata.mkjsf.pazpar2.commands; +import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand; import com.indexdata.mkjsf.pazpar2.state.StateManager; -public class BytargetCommand extends Pazpar2Command { +public class BytargetCommand extends Pazpar2Command implements ServiceProxyCommand { private static final long serialVersionUID = 9070458716105294392L; @@ -10,4 +11,15 @@ public class BytargetCommand extends Pazpar2Command { super("bytarget",stateMgr); } + public BytargetCommand copy () { + BytargetCommand newCommand = new BytargetCommand(stateMgr); + for (String parameterName : parameters.keySet()) { + newCommand.setParameterInState(parameters.get(parameterName).copy()); + } + return newCommand; + } + + public ServiceProxyCommand getSp() { + return this; + } } diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/InitCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/InitCommand.java index 2ae51a5..144a1a7 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/InitCommand.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/InitCommand.java @@ -1,8 +1,9 @@ package com.indexdata.mkjsf.pazpar2.commands; +import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand; import com.indexdata.mkjsf.pazpar2.state.StateManager; -public class InitCommand extends Pazpar2Command { +public class InitCommand extends Pazpar2Command implements ServiceProxyCommand { private static final long serialVersionUID = -4915976465898889987L; @@ -27,5 +28,18 @@ public class InitCommand extends Pazpar2Command { public String getSession () { throw new UnsupportedOperationException("Cannot set or get session id on init command"); } + + public InitCommand copy () { + InitCommand newCommand = new InitCommand(stateMgr); + for (String parameterName : parameters.keySet()) { + newCommand.setParameterInState(parameters.get(parameterName).copy()); + } + return newCommand; + } + + public ServiceProxyCommand getSp() { + return this; + } + } diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Command.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Command.java index 9a3695b..871eb30 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Command.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Command.java @@ -6,29 +6,24 @@ import java.util.Map; import org.apache.log4j.Logger; +import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand; import com.indexdata.mkjsf.pazpar2.state.StateManager; -public class Pazpar2Command implements Serializable { +public abstract class Pazpar2Command implements Serializable { private static Logger logger = Logger.getLogger(Pazpar2Command.class); private static final long serialVersionUID = -6825491856480675917L; - private String name = ""; + protected String name = ""; protected Map parameters = new HashMap(); - StateManager stateMgr; + protected StateManager stateMgr; public Pazpar2Command (String name, StateManager stateMgr) { this.name = name; this.stateMgr = stateMgr; } - public Pazpar2Command copy () { - Pazpar2Command newCommand = new Pazpar2Command(name,stateMgr); - for (String parameterName : parameters.keySet()) { - newCommand.setParameterInState(parameters.get(parameterName).copy()); - } - return newCommand; - } + public abstract Pazpar2Command copy (); public String getName() { return name; @@ -125,7 +120,7 @@ public class Pazpar2Command implements Serializable { } public String getParameterValue(String parameterName) { - return getParameter(parameterName).getValueWithExpressions(); + return getParameter(parameterName)==null ? "" : getParameter(parameterName).getValueWithExpressions(); } @@ -148,4 +143,7 @@ public class Pazpar2Command implements Serializable { logger.info("Command '" + command.getName() + "' not affecting state (history) as no state manager was defined for this command."); } } + + public abstract ServiceProxyCommand getSp(); + } diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/PingCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/PingCommand.java index 05c1934..5a75e56 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/PingCommand.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/PingCommand.java @@ -1,8 +1,9 @@ package com.indexdata.mkjsf.pazpar2.commands; +import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand; import com.indexdata.mkjsf.pazpar2.state.StateManager; -public class PingCommand extends Pazpar2Command { +public class PingCommand extends Pazpar2Command implements ServiceProxyCommand { private static final long serialVersionUID = 8876721711326535847L; @@ -10,4 +11,15 @@ public class PingCommand extends Pazpar2Command { super("ping",stateMgr); } + public PingCommand copy () { + PingCommand newCommand = new PingCommand(stateMgr); + for (String parameterName : parameters.keySet()) { + newCommand.setParameterInState(parameters.get(parameterName).copy()); + } + return newCommand; + } + + public ServiceProxyCommand getSp() { + return this; + } } diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/RecordCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/RecordCommand.java index 8713ece..028b0d5 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/RecordCommand.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/RecordCommand.java @@ -1,8 +1,10 @@ package com.indexdata.mkjsf.pazpar2.commands; +import com.indexdata.mkjsf.pazpar2.commands.sp.RecordCommandSp; +import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand; import com.indexdata.mkjsf.pazpar2.state.StateManager; -public class RecordCommand extends Pazpar2Command { +public class RecordCommand extends Pazpar2Command implements ServiceProxyCommand { private static final long serialVersionUID = 2817539422114569506L; @@ -70,4 +72,13 @@ public class RecordCommand extends Pazpar2Command { } return newCommand; } + + + /** + * Returns a record command object with Service Proxy extension parameters + * + */ + public RecordCommandSp getSp () { + return new RecordCommandSp(this); + } } diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java index 5e4e07b..cae510e 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java @@ -4,10 +4,11 @@ import javax.enterprise.context.SessionScoped; import org.apache.log4j.Logger; +import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand; import com.indexdata.mkjsf.pazpar2.state.StateManager; @SessionScoped -public class SearchCommand extends Pazpar2Command { +public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand { private static final long serialVersionUID = -1888520867838597236L; private static Logger logger = Logger.getLogger(SearchCommand.class); @@ -202,4 +203,9 @@ public class SearchCommand extends Pazpar2Command { return newCommand; } + @Override + public ServiceProxyCommand getSp() { + return this; + } + } diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SettingsCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SettingsCommand.java index 55a417e..11d624f 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SettingsCommand.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SettingsCommand.java @@ -1,8 +1,9 @@ package com.indexdata.mkjsf.pazpar2.commands; +import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand; import com.indexdata.mkjsf.pazpar2.state.StateManager; -public class SettingsCommand extends Pazpar2Command { +public class SettingsCommand extends Pazpar2Command implements ServiceProxyCommand { private static final long serialVersionUID = 2291179325470387102L; @@ -10,5 +11,18 @@ public class SettingsCommand extends Pazpar2Command { super("settings",stateMgr); // TODO Auto-generated constructor stub } + + public SettingsCommand copy () { + SettingsCommand newCommand = new SettingsCommand(stateMgr); + for (String parameterName : parameters.keySet()) { + newCommand.setParameterInState(parameters.get(parameterName).copy()); + } + return newCommand; + } + + @Override + public ServiceProxyCommand getSp() { + return this; + } } diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/ShowCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/ShowCommand.java index f9e7931..375f600 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/ShowCommand.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/ShowCommand.java @@ -1,8 +1,9 @@ package com.indexdata.mkjsf.pazpar2.commands; +import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand; import com.indexdata.mkjsf.pazpar2.state.StateManager; -public class ShowCommand extends Pazpar2Command { +public class ShowCommand extends Pazpar2Command implements ServiceProxyCommand { private static final long serialVersionUID = -8242768313266051307L; @@ -99,4 +100,9 @@ public class ShowCommand extends Pazpar2Command { return newCommand; } + @Override + public ServiceProxyCommand getSp() { + return this; + } + } diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/StatCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/StatCommand.java index 6b885bc..0243315 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/StatCommand.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/StatCommand.java @@ -1,13 +1,28 @@ package com.indexdata.mkjsf.pazpar2.commands; +import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand; import com.indexdata.mkjsf.pazpar2.state.StateManager; -public class StatCommand extends Pazpar2Command { +public class StatCommand extends Pazpar2Command implements ServiceProxyCommand { private static final long serialVersionUID = 3980630346114157336L; public StatCommand(StateManager stateMgr) { super("stat",stateMgr); } + + public StatCommand copy () { + StatCommand newCommand = new StatCommand(stateMgr); + for (String parameterName : parameters.keySet()) { + newCommand.setParameterInState(parameters.get(parameterName).copy()); + } + return newCommand; + } + + @Override + public ServiceProxyCommand getSp() { + return this; + } + } diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/TermlistCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/TermlistCommand.java index 3188b64..bc3e8c2 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/TermlistCommand.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/TermlistCommand.java @@ -1,8 +1,9 @@ package com.indexdata.mkjsf.pazpar2.commands; +import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand; import com.indexdata.mkjsf.pazpar2.state.StateManager; -public class TermlistCommand extends Pazpar2Command { +public class TermlistCommand extends Pazpar2Command implements ServiceProxyCommand { private static final long serialVersionUID = -7067878552863021727L; @@ -25,4 +26,20 @@ public class TermlistCommand extends Pazpar2Command { public String getNum () { return getParameterValue("num"); } + + public TermlistCommand copy () { + TermlistCommand newCommand = new TermlistCommand(stateMgr); + for (String parameterName : parameters.keySet()) { + newCommand.setParameterInState(parameters.get(parameterName).copy()); + } + return newCommand; + } + + @Override + public ServiceProxyCommand getSp() { + return this; + } + + + } diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/AuthCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/AuthCommand.java new file mode 100644 index 0000000..698f265 --- /dev/null +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/AuthCommand.java @@ -0,0 +1,29 @@ +package com.indexdata.mkjsf.pazpar2.commands.sp; + +import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Command; +import com.indexdata.mkjsf.pazpar2.state.StateManager; + +public class AuthCommand extends Pazpar2Command implements ServiceProxyCommand { + + private static final long serialVersionUID = 5487611235664162578L; + + public AuthCommand(StateManager stateMgr) { + super("auth", stateMgr); + // TODO Auto-generated constructor stub + } + + public AuthCommand copy () { + AuthCommand newCommand = new AuthCommand(stateMgr); + for (String parameterName : parameters.keySet()) { + newCommand.setParameterInState(parameters.get(parameterName).copy()); + } + return newCommand; + } + + @Override + public ServiceProxyCommand getSp() { + return this; + } + + +} diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/RecordCommandSp.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/RecordCommandSp.java new file mode 100644 index 0000000..2775ccb --- /dev/null +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/RecordCommandSp.java @@ -0,0 +1,26 @@ +package com.indexdata.mkjsf.pazpar2.commands.sp; + +import java.io.Serializable; + +import com.indexdata.mkjsf.pazpar2.commands.CommandParameter; +import com.indexdata.mkjsf.pazpar2.commands.RecordCommand; + +public class RecordCommandSp implements Serializable, ServiceProxyCommand { + + private static final long serialVersionUID = -3901864271733337221L; + private RecordCommand command = null; + + public RecordCommandSp(RecordCommand command) { + this.command = command; + } + + public void setRecordquery (String recordQuery) { + command.setParameter(new CommandParameter("recordquery","=",recordQuery)); + } + + public String getRecordquery() { + return command.getParameterValue("recordquery"); + } + + +} diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/ServiceProxyCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/ServiceProxyCommand.java new file mode 100644 index 0000000..65a06d0 --- /dev/null +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/ServiceProxyCommand.java @@ -0,0 +1,5 @@ +package com.indexdata.mkjsf.pazpar2.commands.sp; + +public interface ServiceProxyCommand { + +} diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java index 520ca3e..fdf0e97 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java @@ -12,9 +12,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.enterprise.context.SessionScoped; -import javax.inject.Inject; - import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; @@ -43,6 +40,7 @@ import com.indexdata.mkjsf.pazpar2.CommandResponse; import com.indexdata.mkjsf.pazpar2.SearchClient; import com.indexdata.mkjsf.pazpar2.commands.CommandParameter; import com.indexdata.mkjsf.pazpar2.commands.Pazpar2Command; +import com.indexdata.mkjsf.pazpar2.commands.sp.AuthCommand; import com.indexdata.mkjsf.pazpar2.sp.auth.ServiceProxyUser; import com.indexdata.mkjsf.utils.Utils; @@ -76,9 +74,9 @@ public class ServiceProxyClient implements SearchClient { config = configReader.getConfiguration(this); serviceUrl = config.getMandatory(SERVICE_PROXY_URL); this.initDocPaths = getMultiProperty(config.get(SP_INIT_DOC_PATHS)); - checkAuth = new Pazpar2Command("auth",null); + checkAuth = new AuthCommand(null); checkAuth.setParameterInState(new CommandParameter("action","=","check")); - ipAuth = new Pazpar2Command("auth",null); + ipAuth = new AuthCommand(null); ipAuth.setParameterInState(new CommandParameter("action","=","ipauth")); } catch (ConfigurationException c) { c.printStackTrace(); @@ -98,7 +96,7 @@ public class ServiceProxyClient implements SearchClient { public boolean authenticate (ServiceProxyUser user) { try { logger.info("Authenticating [" + user.getProperty("name") + "]"); - Pazpar2Command auth = new Pazpar2Command("auth",null); + Pazpar2Command auth = new AuthCommand(null); auth.setParametersInState(new CommandParameter("action","=","login"), new CommandParameter("username","=",user.getProperty("name")), new CommandParameter("password","=",user.getProperty("password"))); -- 1.7.10.4 From 28b5abb240eda1749703712a0ba19a5843f84ebc Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Wed, 24 Apr 2013 17:13:04 -0400 Subject: [PATCH 02/16] Do record despite no previous search IF it has recordquery. And defaults UI accessible serviceProxyUrl from config --- src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java | 4 ++-- src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java index d617f14..98f4c71 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java @@ -112,7 +112,7 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { public String update (String commands) { if (! errors.hasConfigurationErrors()) { if (commandsAreValid(commands)) { - if (hasQuery()) { + if (hasQuery() || (commands.equals("record") && pzreq.getCommand("record").hasParameterSet("recordquery"))) { handleQueryStateChanges(commands); logger.debug("Processing request for " + commands); List threadList = new ArrayList(); @@ -137,7 +137,7 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { Pazpar2ResponseData responseObject = Pazpar2ResponseParser.getParser().getDataObject(response); pzresp.put(commandName, responseObject); } - if (commands.equals("record")) { + if (commands.equals("record")) { logger.debug("Record: Active clients: "+pzresp.getRecord().getActiveClients()); return pzresp.getRecord().getActiveClients(); } else { diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java index 4209aa2..6e74ed0 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java @@ -41,6 +41,7 @@ public class Pz2ProxyBean extends Pz2Bean implements ServiceProxyInterface { + Utils.objectId(configurator) + "]" ); configureClient(searchClient,configurator); stateMgr.addStateListener(this); + serviceProxyUrl = searchClient.getConfiguration().get(ServiceProxyClient.SERVICE_PROXY_URL); } else { logger.debug("Pz2ProxyBean:postConstruct: searchClient already instantiated " + "during construction of parent object Pz2Bean."); -- 1.7.10.4 From ef55f155913eeba0d1f2b1c37f189f49af17aad3 Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Thu, 25 Apr 2013 12:29:21 -0400 Subject: [PATCH 03/16] Adds support for 'acefilter' parameter to record command --- .../indexdata/mkjsf/pazpar2/commands/sp/RecordCommandSp.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/RecordCommandSp.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/RecordCommandSp.java index 2775ccb..99846b5 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/RecordCommandSp.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/sp/RecordCommandSp.java @@ -21,6 +21,14 @@ public class RecordCommandSp implements Serializable, ServiceProxyCommand { public String getRecordquery() { return command.getParameterValue("recordquery"); } + + public void setAcefilter (String aceFilter) { + command.setParameter(new CommandParameter("acefilter","=",aceFilter)); + } + + public String getAcefilter () { + return command.getParameterValue("acefilter"); + } } -- 1.7.10.4 From d12251cb80269a1a0c084de5be88e616009e6563 Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Thu, 25 Apr 2013 12:32:17 -0400 Subject: [PATCH 04/16] Adds to debug info regarding activeclients --- src/META-INF/resources/pz2utils/pz2watch.xhtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/META-INF/resources/pz2utils/pz2watch.xhtml b/src/META-INF/resources/pz2utils/pz2watch.xhtml index f18e46d..0ca45f9 100644 --- a/src/META-INF/resources/pz2utils/pz2watch.xhtml +++ b/src/META-INF/resources/pz2utils/pz2watch.xhtml @@ -35,9 +35,9 @@ - + - + -- 1.7.10.4 From 28f8fc1f7a9c010900f73c3f6f95066471e21aee Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Thu, 25 Apr 2013 12:33:31 -0400 Subject: [PATCH 05/16] Clears user info when changing service URL --- .../com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java | 27 ++++++++------------ .../mkjsf/pazpar2/sp/auth/ServiceProxyUser.java | 5 ++++ 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java index 6e74ed0..751e919 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java @@ -24,7 +24,6 @@ public class Pz2ProxyBean extends Pz2Bean implements ServiceProxyInterface { private static Logger logger = Logger.getLogger(Pz2ProxyBean.class); private String initDocFileName = ""; private String initDocResponse = ""; - private String serviceProxyUrl = ""; @Inject ConfigurationReader configurator; @Inject ServiceProxyUser user; @@ -40,8 +39,7 @@ public class Pz2ProxyBean extends Pz2Bean implements ServiceProxyInterface { logger.info("Using [" + Utils.objectId(searchClient) + "] configured by [" + Utils.objectId(configurator) + "]" ); configureClient(searchClient,configurator); - stateMgr.addStateListener(this); - serviceProxyUrl = searchClient.getConfiguration().get(ServiceProxyClient.SERVICE_PROXY_URL); + stateMgr.addStateListener(this); } else { logger.debug("Pz2ProxyBean:postConstruct: searchClient already instantiated " + "during construction of parent object Pz2Bean."); @@ -77,15 +75,18 @@ public class Pz2ProxyBean extends Pz2Bean implements ServiceProxyInterface { @Override public void setServiceProxyUrl(String url) { - logger.info("Setting Service Proxy url: " + url); - serviceProxyUrl = url; - pzreq.getRecord().removeParametersInState(); - pzreq.getSearch().removeParametersInState(); - pzresp.reset(); + logger.info("Setting Service Proxy url: " + url); + if (url!=null & !url.equals(((ServiceProxyClient)searchClient).getServiceProxyUrl())) { + pzreq.getRecord().removeParametersInState(); + pzreq.getSearch().removeParametersInState(); + pzresp.reset(); + user.clear(); + ((ServiceProxyClient)searchClient).setServiceProxyUrl(url); + } } public String getServiceProxyUrl() { - return serviceProxyUrl; + return ((ServiceProxyClient)searchClient).getServiceProxyUrl(); } public String getInitDocPath () { @@ -128,12 +129,4 @@ public class Pz2ProxyBean extends Pz2Bean implements ServiceProxyInterface { return initDocResponse; } - public void setAceFilter(String filterExpression) { - //setCommandParameter("record",new CommandParameter("acefilter","=",filterExpression)); - } - - public String getAceFilter () { - return null; - // return getCommandParameterValue("record","acefilter",""); - } } diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java index ed6d0ba..b8a68af 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java @@ -76,5 +76,10 @@ public class ServiceProxyUser implements AuthenticationEntity { return possibleProperties; } + public void clear() { + actualProperties = new HashMap(); + authenticated = false; + } + } -- 1.7.10.4 From 2816078831605dbc1c18147760e1212dd30909a8 Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Sat, 27 Apr 2013 19:56:09 -0400 Subject: [PATCH 06/16] Adds support for offset and binary parameters Thus support for handling unknow document types. Still lacks option to show binary response. --- .../java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java | 31 +++++++++++++++----- .../mkjsf/pazpar2/commands/CommandParameter.java | 4 +++ .../mkjsf/pazpar2/commands/Pazpar2Command.java | 12 +++++--- .../mkjsf/pazpar2/commands/RecordCommand.java | 4 +++ .../mkjsf/pazpar2/commands/SearchCommand.java | 2 +- .../mkjsf/pazpar2/data/Pazpar2ResponseParser.java | 13 ++++++-- .../mkjsf/pazpar2/data/Pazpar2Responses.java | 8 +++++ .../mkjsf/pazpar2/data/RecordOffsetResponse.java | 8 +++++ .../mkjsf/pazpar2/data/RecordResponse.java | 4 +-- 9 files changed, 69 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordOffsetResponse.java diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java index 98f4c71..f5a0675 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java @@ -110,9 +110,10 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { * @return Number of activeclients at the time of the 'show' command */ public String update (String commands) { + try { if (! errors.hasConfigurationErrors()) { if (commandsAreValid(commands)) { - if (hasQuery() || (commands.equals("record") && pzreq.getCommand("record").hasParameterSet("recordquery"))) { + if (hasQuery() || (commands.equals("record") && pzreq.getCommand("record").hasParameterValue("recordquery"))) { handleQueryStateChanges(commands); logger.debug("Processing request for " + commands); List threadList = new ArrayList(); @@ -135,10 +136,19 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { String response = thread.getResponse(); responseLogger.debug("Response was: " + response); Pazpar2ResponseData responseObject = Pazpar2ResponseParser.getParser().getDataObject(response); - pzresp.put(commandName, responseObject); + if (Pazpar2ResponseParser.docTypes.contains(responseObject.getType())) { + pzresp.put(commandName, responseObject); + } else { + if (commandName.equals("record") && pzreq.getRecord().hasParameterValue("offset")) { + RecordResponse recordResponse = new RecordResponse(); + recordResponse.setType("record"); + recordResponse.setXml(responseObject.getXml()); + recordResponse.setAttribute("activeclients", "0"); + pzresp.put(commandName, recordResponse); + } + } } - if (commands.equals("record")) { - logger.debug("Record: Active clients: "+pzresp.getRecord().getActiveClients()); + if (commands.equals("record")) { return pzresp.getRecord().getActiveClients(); } else { return pzresp.getActiveClients(); @@ -156,12 +166,19 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { logger.error("Did not attempt to execute query since there are configuration errors."); return "0"; } + } catch (ClassCastException cce) { + cce.printStackTrace(); + return ""; + } catch (NullPointerException npe) { + npe.printStackTrace(); + return ""; + } } public boolean commandsAreValid(String commands) { if (commands.equals("record")) { - if (!pzreq.getCommand("record").hasParameterSet("id")) { + if (!pzreq.getCommand("record").hasParameterValue("id")) { logger.error("Attempt to send record command without the id parameter"); return false; } @@ -194,7 +211,7 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { } protected boolean hasQuery() { - return pzreq.getCommand("search").hasParameterSet("query"); + return pzreq.getCommand("search").hasParameterValue("query"); } @@ -220,7 +237,7 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { if (stateMgr.hasPendingStateChange("record") && ! commands.equals("record")) { logger.debug("Found pending record ID change. Doing record before updating " + commands); stateMgr.hasPendingStateChange("record",false); - if (pzreq.getCommand("record").hasParameterSet("id")) { + if (pzreq.getCommand("record").hasParameterValue("id")) { update("record"); } else { pzresp.put("record", new RecordResponse()); diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/CommandParameter.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/CommandParameter.java index f97497f..2f0aa03 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/CommandParameter.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/CommandParameter.java @@ -75,6 +75,10 @@ public class CommandParameter implements Serializable { return operator != null; } + public boolean hasValue() { + return value != null && value.length()>0; + } + public String getEncodedQueryString () { try { return name + operator + URLEncoder.encode(getValueWithExpressions(),"UTF-8"); diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Command.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Command.java index 871eb30..8176512 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Command.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/Pazpar2Command.java @@ -83,14 +83,16 @@ public abstract class Pazpar2Command implements Serializable { return (parameters.keySet().size()>0); } - public boolean hasParameterSet(String parameterName) { - return (parameters.get(parameterName) != null); + public boolean hasParameterValue(String parameterName) { + return (parameters.get(parameterName) != null && parameters.get(parameterName).hasValue()); } public String getEncodedQueryString () { StringBuilder queryString = new StringBuilder("command="+name); for (CommandParameter parameter : parameters.values()) { - queryString.append("&"+parameter.getEncodedQueryString()); + if (parameter.hasValue()) { + queryString.append("&"+parameter.getEncodedQueryString()); + } } return queryString.toString(); } @@ -98,7 +100,9 @@ public abstract class Pazpar2Command implements Serializable { public String getValueWithExpressions() { StringBuilder value = new StringBuilder(""); for (CommandParameter parameter : parameters.values()) { - value.append("&" + parameter.getName() + parameter.operator + parameter.getValueWithExpressions()); + if (parameter.hasValue()) { + value.append("&" + parameter.getName() + parameter.operator + parameter.getValueWithExpressions()); + } } return value.toString(); } diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/RecordCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/RecordCommand.java index 028b0d5..93f7782 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/RecordCommand.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/RecordCommand.java @@ -63,6 +63,10 @@ public class RecordCommand extends Pazpar2Command implements ServiceProxyCommand public void setBinary (String binary) { setParameter(new CommandParameter("binary","=",binary)); } + + public String getBinary () { + return getParameterValue("binary"); + } @Override public RecordCommand copy () { diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java index cae510e..4dcb108 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java @@ -36,7 +36,7 @@ public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand public void addFilter(String filterExpression) { // TODO: implement - if (hasParameterSet("filter")) { + if (hasParameterValue("filter")) { setFilter(filterExpression); } else { getParameter("filter"); diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseParser.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseParser.java index 7cf41df..f9f607b 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseParser.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseParser.java @@ -11,6 +11,7 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; +import org.apache.log4j.Logger; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -37,8 +38,9 @@ public class Pazpar2ResponseParser extends DefaultHandler { private Stack dataElements = new Stack(); private Pazpar2ResponseData result = null; private String xml = null; + private static Logger logger = Logger.getLogger(Pazpar2ResponseParser.class); - private static final List docTypes = + public static final List docTypes = Arrays.asList("bytarget","termlist","show","stat","record","search"); public Pazpar2ResponseParser() { @@ -134,9 +136,14 @@ public class Pazpar2ResponseParser extends DefaultHandler { currentElement.setType(localName); for (int i=0; i< atts.getLength(); i++) { currentElement.setAttribute(atts.getLocalName(i), atts.getValue(i)); - } + } if (!docTypes.contains(localName)) { - dataElements.peek().addElement(localName, currentElement); + if (dataElements.size() == 0) { + logger.info("Encountered unknown top level element [" + localName + "]"); + currentElement.setType(localName); + } else { + dataElements.peek().addElement(localName, currentElement); + } } if (this.xml != null) { // Store XML for doc level elements currentElement.setXml(xml); diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Responses.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Responses.java index b3748f8..09e96d5 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Responses.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Responses.java @@ -88,6 +88,10 @@ public class Pazpar2Responses implements Serializable { } public RecordResponse getRecord() { + logger.info("Request to get record response."); + logger.info("Has record response: [" + ((dataObjects.get("record")!=null) ? "true" : "false") + "]"); + logger.info("Its of type record: [" + ((dataObjects.get("record") instanceof RecordResponse) ? "true" : "false") +"]"); + logger.info("It has xml: [" + ((dataObjects.get("record").getXml()!=null) ? "true" : "false") + "]"); return ((RecordResponse) dataObjects.get("record")); } @@ -111,6 +115,10 @@ public class Pazpar2Responses implements Serializable { return ((ByTarget) dataObjects.get("bytarget")); } + public Pazpar2ResponseData getResponseObject (String name) { + return dataObjects.get(name); + } + public boolean hasRecords () { return getStat().getRecords() > 0 && getShow().getHits() != null diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordOffsetResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordOffsetResponse.java new file mode 100644 index 0000000..8e4ab25 --- /dev/null +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordOffsetResponse.java @@ -0,0 +1,8 @@ +package com.indexdata.mkjsf.pazpar2.data; + +public class RecordOffsetResponse extends Pazpar2ResponseData { + + private static final long serialVersionUID = -601620728296476450L; + + +} diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordResponse.java index 0ba7988..fa5c9c8 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordResponse.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordResponse.java @@ -56,8 +56,8 @@ public class RecordResponse extends Pazpar2ResponseData { } public String getActiveClients () { + logger.info("Request to get activeclients"); return getOneElementValue("activeclients"); } - - + } -- 1.7.10.4 From ea445c5a431fc84116de10c2cb0bb476a3b98eef Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Sat, 27 Apr 2013 19:57:54 -0400 Subject: [PATCH 07/16] Adds option to configure multiple SP URLs For selecting an SP runtime from pre-configured list. --- .../com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java | 11 ++++- .../mkjsf/pazpar2/sp/ServiceProxyClient.java | 50 ++++++++++++-------- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java index 751e919..989cc06 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java @@ -2,6 +2,8 @@ package com.indexdata.mkjsf.pazpar2; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; import javax.annotation.PostConstruct; import javax.enterprise.context.SessionScoped; @@ -88,6 +90,13 @@ public class Pz2ProxyBean extends Pz2Bean implements ServiceProxyInterface { public String getServiceProxyUrl() { return ((ServiceProxyClient)searchClient).getServiceProxyUrl(); } + + public List getServiceProxyUrls() { + List urls = new ArrayList(); + urls.add(""); + urls.addAll(((ServiceProxyClient)searchClient).getServiceProxyUrls()); + return urls; + } public String getInitDocPath () { return searchClient.getConfiguration().get("INIT_DOC_PATH"); @@ -106,7 +115,7 @@ public class Pz2ProxyBean extends Pz2Bean implements ServiceProxyInterface { @Override public String postInit() throws UnsupportedEncodingException, IOException { - String initDocPath = ((ServiceProxyClient)searchClient).getInitDocPaths()[0]; + String initDocPath = ((ServiceProxyClient)searchClient).getInitDocPaths().get(0); logger.info("Paths: " + ((ServiceProxyClient)searchClient).getInitDocPaths()); logger.info("Path: " + initDocPath); pzresp.reset(); diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java index fdf0e97..14bec03 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.StringTokenizer; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; @@ -31,7 +32,6 @@ import org.apache.http.impl.conn.PoolingClientConnectionManager; import org.apache.http.util.EntityUtils; import org.apache.log4j.Logger; -import com.indexdata.masterkey.config.MissingMandatoryParameterException; import com.indexdata.masterkey.pazpar2.client.exceptions.Pazpar2ErrorException; import com.indexdata.mkjsf.config.Configuration; import com.indexdata.mkjsf.config.ConfigurationReader; @@ -51,8 +51,9 @@ public class ServiceProxyClient implements SearchClient { public static final String MODULENAME = "proxyclient"; public static final String SERVICE_PROXY_URL = "SERVICE_PROXY_URL"; public static final String SP_INIT_DOC_PATHS = "SP_INIT_DOC_PATHS"; - private String serviceUrl = "undefined"; - private String[] initDocPaths = null; + private String selectedServiceUrl = ""; + private List serviceUrls = new ArrayList(); + private List initDocPaths = null; private Configuration config = null; ProxyPz2ResponseHandler handler = new ProxyPz2ResponseHandler(); @@ -72,7 +73,10 @@ public class ServiceProxyClient implements SearchClient { logger.info(Utils.objectId(this) + " is configuring using the provided " + Utils.objectId(configReader)); try { config = configReader.getConfiguration(this); - serviceUrl = config.getMandatory(SERVICE_PROXY_URL); + serviceUrls = getMultiProperty(config.get(SERVICE_PROXY_URL)); + if (serviceUrls.size()==1) { + selectedServiceUrl = serviceUrls.get(0); + } this.initDocPaths = getMultiProperty(config.get(SP_INIT_DOC_PATHS)); checkAuth = new AuthCommand(null); checkAuth.setParameterInState(new CommandParameter("action","=","check")); @@ -80,17 +84,18 @@ public class ServiceProxyClient implements SearchClient { ipAuth.setParameterInState(new CommandParameter("action","=","ipauth")); } catch (ConfigurationException c) { c.printStackTrace(); - } catch (MissingMandatoryParameterException mmp) { - mmp.printStackTrace(); } } - private String[] getMultiProperty(String prop) { - if (prop != null) { - return prop.split(","); - } else { - return null; + private List getMultiProperty(String prop) { + List props = new ArrayList(); + if (prop != null) { + StringTokenizer tokenizer = new StringTokenizer(prop,","); + while (tokenizer.hasMoreElements()) { + props.add(tokenizer.nextToken()); + } } + return props; } public boolean authenticate (ServiceProxyUser user) { @@ -188,7 +193,7 @@ public class ServiceProxyClient implements SearchClient { * @throws IOException */ private byte[] send(Pazpar2Command command) throws ClientProtocolException, IOException { - String url = serviceUrl + "?" + command.getEncodedQueryString(); + String url = selectedServiceUrl + "?" + command.getEncodedQueryString(); logger.info("Sending request "+url); HttpGet httpget = new HttpGet(url); byte[] response = client.execute(httpget, handler); @@ -240,7 +245,8 @@ public class ServiceProxyClient implements SearchClient { logger.debug("Cloning Pz2Client"); ServiceProxyClient clone = new ServiceProxyClient(); clone.client = this.client; - clone.serviceUrl = this.serviceUrl; + clone.serviceUrls = this.serviceUrls; + clone.selectedServiceUrl = this.selectedServiceUrl; clone.initDocPaths = this.initDocPaths; return clone; } @@ -258,13 +264,13 @@ public class ServiceProxyClient implements SearchClient { @Override public List documentConfiguration () { List doc = new ArrayList(); - doc.add(nl+ MODULENAME + " was configured to access the Pazpar2 service proxy at: " + serviceUrl); + doc.add(nl+ MODULENAME + " was configured to access the Pazpar2 service proxy at: " + (selectedServiceUrl.length()>0 ? selectedServiceUrl : "[not defined yet]")); return null; } public byte[] postInitDoc (String filePath) throws IOException { logger.info("Looking to post the file in : [" + filePath +"]"); - HttpPost post = new HttpPost(serviceUrl+"?command=init&includeDebug=yes"); + HttpPost post = new HttpPost(selectedServiceUrl+"?command=init&includeDebug=yes"); File initDoc = new File(filePath); logger.info("Posting to SP: "); if (logger.isDebugEnabled()) { @@ -281,14 +287,14 @@ public class ServiceProxyClient implements SearchClient { return response; } - public String[] getInitDocPaths () { + public List getInitDocPaths () { logger.debug("Get init doc paths "); - logger.debug("length: " + initDocPaths.length); + logger.debug("length: " + initDocPaths.size()); return initDocPaths; } public byte[] postInitDoc(byte[] initDoc) throws IOException { - HttpPost post = new HttpPost(serviceUrl+"?command=init&includeDebug=yes"); + HttpPost post = new HttpPost(selectedServiceUrl+"?command=init&includeDebug=yes"); post.setEntity(new ByteArrayEntity(initDoc)); byte[] response = client.execute(post, handler); logger.debug("Response on POST was: " + new String(response,"UTF-8")); @@ -296,13 +302,17 @@ public class ServiceProxyClient implements SearchClient { } public void setServiceProxyUrl (String url) { - serviceUrl = url; + selectedServiceUrl = url; } public String getServiceProxyUrl () { - return serviceUrl; + return selectedServiceUrl; } + public List getServiceProxyUrls () { + return serviceUrls; + } + public Configuration getConfiguration () { return config; } -- 1.7.10.4 From 4e4ec6c08e54b7872b22495a54a7c2fb6439c4fd Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Tue, 30 Apr 2013 11:44:14 -0400 Subject: [PATCH 08/16] Makes init doc debug response optional --- src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java | 10 ++++++---- .../com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java | 4 ++-- .../indexdata/mkjsf/pazpar2/sp/ServiceProxyInterface.java | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java index 989cc06..09e500a 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java @@ -70,7 +70,10 @@ public class Pz2ProxyBean extends Pz2Bean implements ServiceProxyInterface { } public void ipAuthenticate (ServiceProxyUser user) { - if (!user.isAuthenticated()) { + if (!user.isIpAuthenticated()) { + if (user.isAuthenticated()) { + user.clear(); + } ((ServiceProxyClient)searchClient).ipAuthenticate(user); } } @@ -125,14 +128,13 @@ public class Pz2ProxyBean extends Pz2Bean implements ServiceProxyInterface { } @Override - public String postInit(byte[] initDoc) throws UnsupportedEncodingException, IOException { + public String postInit(byte[] initDoc, boolean includeDebug) throws UnsupportedEncodingException, IOException { pzresp.reset(); - byte[] response = ((ServiceProxyClient)searchClient).postInitDoc(initDoc); + byte[] response = ((ServiceProxyClient)searchClient).postInitDoc(initDoc,includeDebug); initDocResponse = new String(response,"UTF-8"); return initDocResponse; } - @Override public String getInitResponse() { return initDocResponse; diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java index 14bec03..fb3c867 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java @@ -293,8 +293,8 @@ public class ServiceProxyClient implements SearchClient { return initDocPaths; } - public byte[] postInitDoc(byte[] initDoc) throws IOException { - HttpPost post = new HttpPost(selectedServiceUrl+"?command=init&includeDebug=yes"); + public byte[] postInitDoc(byte[] initDoc, boolean includeDebug) throws IOException { + HttpPost post = new HttpPost(selectedServiceUrl+"?command=init" + (includeDebug? "&includeDebug=yes" : "")); post.setEntity(new ByteArrayEntity(initDoc)); byte[] response = client.execute(post, handler); logger.debug("Response on POST was: " + new String(response,"UTF-8")); diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyInterface.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyInterface.java index 46d4e77..abbb1ec 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyInterface.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyInterface.java @@ -10,7 +10,7 @@ public interface ServiceProxyInterface extends Pz2Interface { public void setInitFileName (String fileName); public String getInitFileName(); public String postInit() throws UnsupportedEncodingException, IOException; - public String postInit(byte[] initDoc) throws UnsupportedEncodingException, IOException; + public String postInit(byte[] initDoc, boolean includeDebug) throws UnsupportedEncodingException, IOException; public String getInitResponse(); public void setServiceProxyUrl(String url); public String getServiceProxyUrl(); -- 1.7.10.4 From 0854abaf58f4d25c186ed1f326e4e7aad17b397c Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Tue, 30 Apr 2013 11:44:50 -0400 Subject: [PATCH 09/16] Adds support for record checksum --- src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java index f5a0675..ba2f0d7 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2Bean.java @@ -139,7 +139,9 @@ public class Pz2Bean implements Pz2Interface, StateListener, Serializable { if (Pazpar2ResponseParser.docTypes.contains(responseObject.getType())) { pzresp.put(commandName, responseObject); } else { - if (commandName.equals("record") && pzreq.getRecord().hasParameterValue("offset")) { + if (commandName.equals("record") && + (pzreq.getRecord().hasParameterValue("offset") || + pzreq.getRecord().hasParameterValue("checksum"))) { RecordResponse recordResponse = new RecordResponse(); recordResponse.setType("record"); recordResponse.setXml(responseObject.getXml()); -- 1.7.10.4 From b9751d81b16e9286a7ad40d086f3aab516ac6dd4 Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Tue, 30 Apr 2013 11:45:25 -0400 Subject: [PATCH 10/16] Tweaks IP authentication --- .../indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java index b8a68af..43971df 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java @@ -20,14 +20,12 @@ public class ServiceProxyUser implements AuthenticationEntity { private Map actualProperties = new HashMap(); private static Logger logger = Logger.getLogger(ServiceProxyUser.class); private boolean authenticated = false; + private boolean ipAuthenticated = false; public ServiceProxyUser() { logger.debug("ServiceProxyUser instantiated: " + Utils.objectId(this)); } - public void setAuthenticationMethod() { - } - public String getName() { return actualProperties.get("name"); } @@ -56,10 +54,18 @@ public class ServiceProxyUser implements AuthenticationEntity { this.authenticated = authenticated; } + public void isIpAuthenticated (boolean authenticated) { + this.ipAuthenticated = authenticated; + } + public boolean isAuthenticated() { return authenticated; } + public boolean isIpAuthenticated () { + return ipAuthenticated; + } + @Override public String getProperty(String key) { @@ -79,6 +85,7 @@ public class ServiceProxyUser implements AuthenticationEntity { public void clear() { actualProperties = new HashMap(); authenticated = false; + ipAuthenticated = false; } -- 1.7.10.4 From 2d0e3e85c08c0e25b077e6a140019ad3f6e57505 Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Tue, 30 Apr 2013 13:24:37 -0400 Subject: [PATCH 11/16] Adds support for show-block --- .../java/com/indexdata/mkjsf/pazpar2/commands/ShowCommand.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/ShowCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/ShowCommand.java index 375f600..90e3cd0 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/ShowCommand.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/ShowCommand.java @@ -92,6 +92,11 @@ public class ShowCommand extends Pazpar2Command implements ServiceProxyCommand { setParameterInState(new CommandParameter("block","=",block)); } + public String getBlock() { + return getParameterValue("block"); + } + + public ShowCommand copy () { ShowCommand newCommand = new ShowCommand(stateMgr); for (String parameterName : parameters.keySet()) { -- 1.7.10.4 From ba27c4faf0e54d9bf741b19d97a551e462bd1060 Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Tue, 30 Apr 2013 13:25:10 -0400 Subject: [PATCH 12/16] Makes all stats ints (except progress) --- .../indexdata/mkjsf/pazpar2/data/StatResponse.java | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/StatResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/StatResponse.java index 9f808b1..941c0e9 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/data/StatResponse.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/data/StatResponse.java @@ -22,28 +22,28 @@ public class StatResponse extends Pazpar2ResponseData { return getIntValue("records"); } - public String getUnconnected() { - return getOneElementValue("unconnected"); + public int getUnconnected() { + return getIntValue("unconnected"); } - public String getConnecting() { - return getOneElementValue("connecting"); + public int getConnecting() { + return getIntValue("connecting"); } - public String getWorking() { - return getOneElementValue("working"); + public int getWorking() { + return getIntValue("working"); } - public String getIdle() { - return getOneElementValue("idle"); + public int getIdle() { + return getIntValue("idle"); } - public String getFailed() { - return getOneElementValue("failed"); + public int getFailed() { + return getIntValue("failed"); } - public String getError() { - return getOneElementValue("error"); + public int getError() { + return getIntValue("error"); } public String getProgress() { -- 1.7.10.4 From 8ff427b73c71fa994f74edd35b106185cf94d22a Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Tue, 30 Apr 2013 21:13:14 -0400 Subject: [PATCH 13/16] Adds methods for displaying authentication status --- .../com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java | 4 ++ .../mkjsf/pazpar2/sp/ServiceProxyClient.java | 13 ++-- .../pazpar2/sp/auth/AuthenticationEntity.java | 3 - .../mkjsf/pazpar2/sp/auth/ServiceProxyUser.java | 67 +++++++++++++++----- 4 files changed, 61 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java index 09e500a..f5c0ad0 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java @@ -94,6 +94,10 @@ public class Pz2ProxyBean extends Pz2Bean implements ServiceProxyInterface { return ((ServiceProxyClient)searchClient).getServiceProxyUrl(); } + public boolean getServiceProxyUrlIsDefined() { + return ((ServiceProxyClient)searchClient).getServiceProxyUrl().length()>0; + } + public List getServiceProxyUrls() { List urls = new ArrayList(); urls.add(""); diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java index fb3c867..92e46a7 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/ServiceProxyClient.java @@ -109,10 +109,10 @@ public class ServiceProxyClient implements SearchClient { String responseStr = new String(response,"UTF-8"); logger.info(responseStr); if (responseStr.contains("FAIL")) { - user.isAuthenticated(false); + user.credentialsAuthenticationSucceeded(false); return false; } else { - user.isAuthenticated(true); + user.credentialsAuthenticationSucceeded(true); return true; } } catch (ClientProtocolException e) { @@ -132,10 +132,9 @@ public class ServiceProxyClient implements SearchClient { logger.info(new String(response,"UTF-8")); String responseStr = new String(response,"UTF-8"); if (responseStr.contains("FAIL")) { - user.isAuthenticated(false); + user.authenticationCheckFailed(); return false; - } else { - user.isAuthenticated(true); + } else { return true; } } catch (ClientProtocolException e) { @@ -155,10 +154,10 @@ public class ServiceProxyClient implements SearchClient { logger.info(new String(response,"UTF-8")); String responseStr = new String(response,"UTF-8"); if (responseStr.contains("FAIL")) { - user.isAuthenticated(false); + user.ipAuthenticationSucceeded(false); return false; } else { - user.isAuthenticated(true); + user.ipAuthenticationSucceeded(true); return true; } } catch (ClientProtocolException e) { diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/AuthenticationEntity.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/AuthenticationEntity.java index 9f8b0cb..8d05fd6 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/AuthenticationEntity.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/AuthenticationEntity.java @@ -1,7 +1,6 @@ package com.indexdata.mkjsf.pazpar2.sp.auth; import java.io.Serializable; -import java.util.List; import java.util.Map; public interface AuthenticationEntity extends Serializable{ @@ -10,7 +9,5 @@ public interface AuthenticationEntity extends Serializable{ public String getProperty(String key); public Map getPropertyMap(); - - public List getPossibleProperties(); } diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java index 43971df..0c4cb92 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/sp/auth/ServiceProxyUser.java @@ -1,8 +1,6 @@ package com.indexdata.mkjsf.pazpar2.sp.auth; -import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Map; import javax.enterprise.context.SessionScoped; @@ -16,11 +14,12 @@ import com.indexdata.mkjsf.utils.Utils; public class ServiceProxyUser implements AuthenticationEntity { private static final long serialVersionUID = 2351542518778803071L; - private List possibleProperties = Arrays.asList("name","password","realm"); private Map actualProperties = new HashMap(); private static Logger logger = Logger.getLogger(ServiceProxyUser.class); - private boolean authenticated = false; + private boolean credsAuthenticated = false; private boolean ipAuthenticated = false; + private boolean ipAuthFailure = false; + private boolean credsAuthFailure = false; public ServiceProxyUser() { logger.debug("ServiceProxyUser instantiated: " + Utils.objectId(this)); @@ -50,22 +49,59 @@ public class ServiceProxyUser implements AuthenticationEntity { return actualProperties.get("realm"); } - public void isAuthenticated(boolean authenticated) { - this.authenticated = authenticated; + public void credentialsAuthenticationSucceeded (boolean success) { + this.credsAuthFailure = !success; + this.credsAuthenticated = success; + this.ipAuthenticated = false; + this.ipAuthFailure = false; } - public void isIpAuthenticated (boolean authenticated) { - this.ipAuthenticated = authenticated; + public void ipAuthenticationSucceeded (boolean success) { + this.ipAuthFailure = !success; + this.ipAuthenticated = success; + this.credsAuthenticated = false; + this.credsAuthFailure = false; } public boolean isAuthenticated() { - return authenticated; + return (ipAuthenticated || credsAuthenticated); } public boolean isIpAuthenticated () { return ipAuthenticated; } + public boolean isCredentialsAuthenticated () { + return credsAuthenticated; + } + + public boolean hasIpAuthFailure () { + return ipAuthFailure; + } + + public boolean hasCredsAuthFailure () { + return credsAuthFailure; + } + + public boolean hasAuthenticationFailure () { + return credsAuthFailure || ipAuthFailure; + } + + public void authenticationCheckFailed () { + ipAuthenticated = false; + credsAuthenticated = false; + } + + public String getAuthenticationStatus () { + return (isAuthenticated() ? + (isIpAuthenticated()? "IP authenticated" : + (isCredentialsAuthenticated() ? "Authenticated by credentials" : "Unknown authentication method")) : + (hasAuthenticationFailure() ? + (hasIpAuthFailure() ? "Authentication by IP address failed" : + (hasCredsAuthFailure() ? "Authentication by credentials failed" : "Unknown authentication failure")) : + "Not authenticated")); + } + @Override public String getProperty(String key) { @@ -76,16 +112,15 @@ public class ServiceProxyUser implements AuthenticationEntity { public Map getPropertyMap() { return actualProperties; } - - @Override - public List getPossibleProperties() { - return possibleProperties; - } public void clear() { actualProperties = new HashMap(); - authenticated = false; - ipAuthenticated = false; + credsAuthenticated = false; + ipAuthenticated = false; + } + + public void setSpResponse (String responseXml) { + } -- 1.7.10.4 From 73413d2d4e13844bf8f0880c72d9cc9ab0d8dc45 Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Wed, 1 May 2013 13:22:44 -0400 Subject: [PATCH 14/16] Clears requests and responses on new ip auth --- src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java index f5c0ad0..87daf80 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/Pz2ProxyBean.java @@ -74,6 +74,9 @@ public class Pz2ProxyBean extends Pz2Bean implements ServiceProxyInterface { if (user.isAuthenticated()) { user.clear(); } + pzreq.getRecord().removeParametersInState(); + pzreq.getSearch().removeParametersInState(); + pzresp.reset(); ((ServiceProxyClient)searchClient).ipAuthenticate(user); } } -- 1.7.10.4 From 0ac90b80d7eaf67f64c57c90b97bd59ca2d57bb2 Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Thu, 2 May 2013 23:07:49 -0400 Subject: [PATCH 15/16] Tweaks logs --- .../com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseParser.java | 2 +- .../java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Responses.java | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseParser.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseParser.java index f9f607b..3bff69a 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseParser.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2ResponseParser.java @@ -139,7 +139,7 @@ public class Pazpar2ResponseParser extends DefaultHandler { } if (!docTypes.contains(localName)) { if (dataElements.size() == 0) { - logger.info("Encountered unknown top level element [" + localName + "]"); + logger.info("Encountered unknown top level element [" + localName + "]. Creating generic data object."); currentElement.setType(localName); } else { dataElements.peek().addElement(localName, currentElement); diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Responses.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Responses.java index 09e96d5..fd0b9f0 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Responses.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Pazpar2Responses.java @@ -88,10 +88,6 @@ public class Pazpar2Responses implements Serializable { } public RecordResponse getRecord() { - logger.info("Request to get record response."); - logger.info("Has record response: [" + ((dataObjects.get("record")!=null) ? "true" : "false") + "]"); - logger.info("Its of type record: [" + ((dataObjects.get("record") instanceof RecordResponse) ? "true" : "false") +"]"); - logger.info("It has xml: [" + ((dataObjects.get("record").getXml()!=null) ? "true" : "false") + "]"); return ((RecordResponse) dataObjects.get("record")); } -- 1.7.10.4 From 3d2e0f114bc4f80e13b82799324538b6a2a03bdf Mon Sep 17 00:00:00 2001 From: "Niels Erik G. Nielsen" Date: Thu, 2 May 2013 23:09:15 -0400 Subject: [PATCH 16/16] Exposing location checksums and offsets to ui/client --- .../com/indexdata/mkjsf/pazpar2/data/Location.java | 16 +++++++++++++++- .../indexdata/mkjsf/pazpar2/data/RecordResponse.java | 10 ++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Location.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Location.java index a3e6441..1dcb6c3 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/data/Location.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/data/Location.java @@ -6,11 +6,17 @@ import com.indexdata.mkjsf.pazpar2.data.Pazpar2ResponseData; public class Location extends Pazpar2ResponseData { private static final long serialVersionUID = -1386527442857478225L; - + private int seqno = -1; + public String getId() { return getAttribute("id"); } + public String getChecksum() { + logger.debug("Request to get checksum"); + return getAttribute("checksum"); + } + public String getName () { return getAttribute("name"); } @@ -19,6 +25,14 @@ public class Location extends Pazpar2ResponseData { return getOneElementValue("md-subject"); } + public void setSequenceNumber(int num) { + seqno = num; + } + + public int getSequenceNumber () { + return seqno; + } + public String getSubjects() { StringBuilder builder = new StringBuilder(""); for (Pazpar2ResponseData data : getElements("md-subject")) { diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordResponse.java b/src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordResponse.java index fa5c9c8..566ea09 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordResponse.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/data/RecordResponse.java @@ -16,8 +16,14 @@ public class RecordResponse extends Pazpar2ResponseData { public List getLocations() { List locations = new ArrayList(); - for (Pazpar2ResponseData element : getElements("location")) { - locations.add((Location)element); + if (getElements("location")!=null) { + int i = 0; + for (Pazpar2ResponseData element : getElements("location")) { + ((Location)element).setSequenceNumber(i++); + locations.add((Location)element); + } + } else { + logger.debug("Found no locations"); } return locations; } -- 1.7.10.4