package com.yoursway.ide.application.view.impl.commands; import static com.yoursway.utils.DebugOutputHelper.simpleNameOf; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import java.util.Collection; public abstract class AbstractCommand implements Command { private final String debuggingName; private final Class<? extends Handler> handlerContract; public AbstractCommand(Class<? extends Handler> handlerContract) { this.handlerContract = handlerContract; this.debuggingName = interfaceToName(handlerContract); } public AbstractCommand(String debuggingName) { this.debuggingName = debuggingName; this.handlerContract = null; } public AbstractCommand() { this.debuggingName = commandToName(getClass()); this.handlerContract = null; } public Collection<? extends Object> tags() { if (handlerContract == null) return emptyList(); else return singletonList(handlerContract); } public boolean invokeSpecificHandler(Handler handler) { return false; } private static String interfaceToName(Class<? extends Handler> handlerContract) { String name = simpleNameOf(handlerContract); name = name.replaceAll("^HandlerOf", ""); name = name.replaceAll("^Handler", ""); name = name.replaceAll("Handler$", ""); name.replaceAll("([A-Z])", " $1"); return name.trim(); } private static String commandToName(Class<?> commandClass) { String name = simpleNameOf(commandClass); name = name.replaceAll("Command$", ""); name.replaceAll("([A-Z])", " $1"); return name.trim(); } @Override public String toString() { return debuggingName; } @Override public int hashCode() { return getClass().hashCode(); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; return (getClass() == obj.getClass()); } }