/**
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
* This file is part of the LDP4j Project:
* http://www.ldp4j.org/
*
* Center for Open Middleware
* http://www.centeropenmiddleware.com/
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
* Copyright (C) 2014-2016 Center for Open Middleware.
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
* Artifact : org.ldp4j.tutorial.client:eswc-2015-client:1.0.0
* Bundle : eswc-2015-client-1.0.0.jar
* #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
*/
package org.ldp4j.tutorial.client;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public final class ContactsShell {
private static final class DefaultCommandContext implements CommandContext {
private final String commandName;
private final String commandLine;
private final CommandLine helper;
private DefaultCommandContext(String commandName, String commandLine, CommandLine helper) {
this.commandName = commandName;
this.commandLine = commandLine;
this.helper = helper;
}
@Override
public String commandName() {
return this.commandName;
}
@Override
public String commandLine() {
return this.commandLine;
}
@Override
public boolean hasEntityTag() {
return this.helper.hasOption("et");
}
@Override
public String entityTag() {
return this.helper.getOptionValue("et");
}
@Override
public boolean hasLastModified() {
return this.helper.hasOption("lm");
}
@Override
public String lastModified() {
return this.helper.getOptionValue("lm");
}
@Override
public boolean hasEntity() {
return this.helper.hasOption("e");
}
@Override
public String entity() {
return this.helper.getOptionValue("e");
}
@Override
public boolean hasOptions() {
return this.helper.getOptions().length>0;
}
@Override
public boolean hasContentType() {
return this.helper.hasOption("e");
}
@Override
public String contentType() {
return this.helper.getOptionValue("ct");
}
@Override
public boolean hasTarget() {
return target()!=null;
}
@Override
public String target() {
List<String> argList = this.helper.getArgList();
if(argList!=null && !argList.isEmpty()) {
return argList.get(0);
}
return null;
}
}
private final Options options;
private final ShellConsole console;
private final ResourceRepository repository;
private final CachedRepresentationManager manager;
private ContactsShell(ShellConsole console, ResourceRepository repository, CachedRepresentationManager manager) {
this.manager=manager;
this.console = console;
this.repository = repository;
this.options =
new Options().
addOption("et","entity-tag", true, "use entity tag").
addOption("lm","last-modified", true, "use last modified date").
addOption("ct","content-type", true, "use content type").
addOption("e", "entity", true, "use entity");
}
private CommandContext createCommandContext(String rawCommandLine) throws ParseException {
String[] commandLineParts=ShellUtil.split(rawCommandLine);
String command=ShellUtil.extractCommandName(commandLineParts);
String[] commandArgs=ShellUtil.extractCommandArguments(commandLineParts);
CommandLineParser parser = new DefaultParser();
CommandLine commandLine = parser.parse(this.options,commandArgs);
// debug(command, commandLine);
return new DefaultCommandContext(command,rawCommandLine,commandLine);
}
protected void debug(String command, CommandLine commandLine) {
this.console.message("- Command: ").metadata(command).message("%n");
for(Option opt:options.getOptions()) {
if(commandLine.hasOption(opt.getOpt())) {
if(!opt.hasArg()) {
this.console.metadata(" + %s%n",opt.getOpt());
} else {
if(!opt.hasArgs()) {
this.console.metadata(" + %s: ",opt.getOpt()).data("%s%n",commandLine.getOptionValue(opt.getOpt()));
} else {
this.console.metadata(" + %s: ",opt.getOpt()).data("%s%n",Arrays.toString(commandLine.getOptionValues(opt.getOpt())));
}
}
}
}
List<String> argList = commandLine.getArgList();
if(!argList.isEmpty()) {
this.console.metadata(" + Arguments:%n");
for(String arg:argList) {
this.console.metadata(" * ").data("%s%n",arg);
}
}
}
public void execute() {
boolean continueExecution=true;
while(continueExecution) {
this.console.prompt("contacts> ");
String commandLine = this.console.readLine();
if(commandLine.trim().isEmpty()) {
continue;
}
try {
CommandContext context = createCommandContext(commandLine);
CommandProcessor processor=ShellUtil.createProcessor(context.commandName());
processor.setConsole(this.console);
processor.setRepository(this.repository);
processor.setContentManager(this.manager);
if(processor.canExecute(context)) {
continueExecution=processor.execute(context);
}
} catch (ParseException e) {
this.console.error("ERROR: Could not process command (%s)%n",e.getMessage());
}
}
}
public static void main(String... args) {
File cacheDirectory = new File(".cache");
CachedRepresentationManager manager=CachedRepresentationManager.create(cacheDirectory);
try {
ShellConsole console = ShellUtil.console();
console.
title("ESWC 2015 - LDP4j Tutorial - Contacts Application Shell ").
message("v%s%n",System.getProperty("shell.build","XXX"));
ContactsShell shell=new ContactsShell(console,ResourceRepository.create(),manager);
shell.execute();
console.title("Bye!!!");
} finally {
manager.dispose();
}
}
}