GP-4390 Collapse DomainObject Undoable interfaces and refactor Command processing.

This commit is contained in:
ghidra1 2024-03-08 12:49:50 -05:00
parent 136b933af2
commit 445494ba25
214 changed files with 2862 additions and 3813 deletions

View file

@ -322,8 +322,7 @@ public class TraceRmiHandler implements TraceRmiConnection {
}
}
protected DomainFolder getOrCreateNewTracesFolder()
throws InvalidNameException, IOException {
protected DomainFolder getOrCreateNewTracesFolder() throws InvalidNameException, IOException {
return getOrCreateFolder(plugin.getTool().getProject().getProjectData().getRootFolder(),
"New Traces");
}
@ -494,10 +493,8 @@ public class TraceRmiHandler implements TraceRmiConnection {
return rep == null ? null : rep.build();
}
catch (Throwable e) {
return rep
.setError(ReplyError.newBuilder()
.setMessage(
e.getMessage() + "\n" + ExceptionUtils.getStackTrace(e)))
return rep.setError(ReplyError.newBuilder()
.setMessage(e.getMessage() + "\n" + ExceptionUtils.getStackTrace(e)))
.build();
}
}
@ -509,8 +506,8 @@ public class TraceRmiHandler implements TraceRmiConnection {
req.getRequestActivate().getOid().getId(),
req.getRequestActivate().getObject().getId(),
req.getRequestActivate().getObject().getPath().getPath());
case REQUEST_END_TX -> "endTx(%d)".formatted(
req.getRequestEndTx().getTxid().getId());
case REQUEST_END_TX -> "endTx(%d)"
.formatted(req.getRequestEndTx().getTxid().getId());
case REQUEST_START_TX -> "startTx(%d,%s)".formatted(
req.getRequestStartTx().getTxid().getId(),
req.getRequestStartTx().getDescription());
@ -530,49 +527,40 @@ public class TraceRmiHandler implements TraceRmiConnection {
}
final Dispatcher dispatchNegotiate = (req, rep) -> switch (req.getMsgCase()) {
case REQUEST_NEGOTIATE -> rep
.setReplyNegotiate(handleNegotiate(req.getRequestNegotiate()));
case REQUEST_NEGOTIATE -> rep.setReplyNegotiate(handleNegotiate(req.getRequestNegotiate()));
default -> throw new InvalidRequestError(req);
};
final Dispatcher dispatchNominal = (req, rep) -> switch (req.getMsgCase()) {
case REQUEST_ACTIVATE -> rep
.setReplyActivate(handleActivate(req.getRequestActivate()));
case REQUEST_ACTIVATE -> rep.setReplyActivate(handleActivate(req.getRequestActivate()));
case REQUEST_CLOSE_TRACE -> rep
.setReplyCloseTrace(handleCloseTrace(req.getRequestCloseTrace()));
case REQUEST_CREATE_OBJECT -> rep
.setReplyCreateObject(handleCreateObject(req.getRequestCreateObject()));
case REQUEST_CREATE_OVERLAY -> rep
.setReplyCreateOverlay(
handleCreateOverlay(req.getRequestCreateOverlay()));
.setReplyCreateOverlay(handleCreateOverlay(req.getRequestCreateOverlay()));
case REQUEST_CREATE_ROOT_OBJECT -> rep
.setReplyCreateObject(
handleCreateRootObject(req.getRequestCreateRootObject()));
.setReplyCreateObject(handleCreateRootObject(req.getRequestCreateRootObject()));
case REQUEST_CREATE_TRACE -> rep
.setReplyCreateTrace(handleCreateTrace(req.getRequestCreateTrace()));
case REQUEST_DELETE_BYTES -> rep
.setReplyDeleteBytes(handleDeleteBytes(req.getRequestDeleteBytes()));
case REQUEST_DELETE_REGISTER_VALUE -> rep
.setReplyDeleteRegisterValue(
handleDeleteRegisterValue(req.getRequestDeleteRegisterValue()));
case REQUEST_DELETE_REGISTER_VALUE -> rep.setReplyDeleteRegisterValue(
handleDeleteRegisterValue(req.getRequestDeleteRegisterValue()));
case REQUEST_DISASSEMBLE -> rep
.setReplyDisassemble(handleDisassemble(req.getRequestDisassemble()));
case REQUEST_END_TX -> rep
.setReplyEndTx(handleEndTx(req.getRequestEndTx()));
case REQUEST_END_TX -> rep.setReplyEndTx(handleEndTx(req.getRequestEndTx()));
case REQUEST_GET_OBJECT -> rep
.setReplyGetObject(handleGetObject(req.getRequestGetObject()));
case REQUEST_GET_VALUES -> rep
.setReplyGetValues(handleGetValues(req.getRequestGetValues()));
case REQUEST_GET_VALUES_INTERSECTING -> rep
.setReplyGetValues(
handleGetValuesIntersecting(req.getRequestGetValuesIntersecting()));
case REQUEST_GET_VALUES_INTERSECTING -> rep.setReplyGetValues(
handleGetValuesIntersecting(req.getRequestGetValuesIntersecting()));
case REQUEST_INSERT_OBJECT -> rep
.setReplyInsertObject(handleInsertObject(req.getRequestInsertObject()));
case REQUEST_PUT_BYTES -> rep
.setReplyPutBytes(handlePutBytes(req.getRequestPutBytes()));
case REQUEST_PUT_BYTES -> rep.setReplyPutBytes(handlePutBytes(req.getRequestPutBytes()));
case REQUEST_PUT_REGISTER_VALUE -> rep
.setReplyPutRegisterValue(
handlePutRegisterValue(req.getRequestPutRegisterValue()));
.setReplyPutRegisterValue(handlePutRegisterValue(req.getRequestPutRegisterValue()));
case REQUEST_REMOVE_OBJECT -> rep
.setReplyRemoveObject(handleRemoveObject(req.getRequestRemoveObject()));
case REQUEST_RETAIN_VALUES -> rep
@ -580,14 +568,10 @@ public class TraceRmiHandler implements TraceRmiConnection {
case REQUEST_SAVE_TRACE -> rep
.setReplySaveTrace(handleSaveTrace(req.getRequestSaveTrace()));
case REQUEST_SET_MEMORY_STATE -> rep
.setReplySetMemoryState(
handleSetMemoryState(req.getRequestSetMemoryState()));
case REQUEST_SET_VALUE -> rep
.setReplySetValue(handleSetValue(req.getRequestSetValue()));
case REQUEST_SNAPSHOT -> rep
.setReplySnapshot(handleSnapshot(req.getRequestSnapshot()));
case REQUEST_START_TX -> rep
.setReplyStartTx(handleStartTx(req.getRequestStartTx()));
.setReplySetMemoryState(handleSetMemoryState(req.getRequestSetMemoryState()));
case REQUEST_SET_VALUE -> rep.setReplySetValue(handleSetValue(req.getRequestSetValue()));
case REQUEST_SNAPSHOT -> rep.setReplySnapshot(handleSnapshot(req.getRequestSnapshot()));
case REQUEST_START_TX -> rep.setReplyStartTx(handleStartTx(req.getRequestStartTx()));
case XREPLY_INVOKE_METHOD -> handleXInvokeMethod(req.getXreplyInvokeMethod());
default -> throw new InvalidRequestError(req);
};
@ -666,15 +650,11 @@ public class TraceRmiHandler implements TraceRmiConnection {
}
protected static ObjSpec makeObjSpec(TraceObject object) {
return ObjSpec.newBuilder()
.setId(object.getKey())
.build();
return ObjSpec.newBuilder().setId(object.getKey()).build();
}
protected static ObjPath makeObjPath(TraceObjectKeyPath path) {
return ObjPath.newBuilder()
.setPath(path.toString())
.build();
return ObjPath.newBuilder().setPath(path.toString()).build();
}
protected static ObjDesc makeObjDesc(TraceObject object) {
@ -767,15 +747,13 @@ public class TraceRmiHandler implements TraceRmiConnection {
if (value instanceof int[] ia) {
return Value.newBuilder()
.setIntArrValue(
IntArr.newBuilder()
.addAllArr(IntStream.of(ia).mapToObj(i -> i).toList()))
IntArr.newBuilder().addAllArr(IntStream.of(ia).mapToObj(i -> i).toList()))
.build();
}
if (value instanceof long[] la) {
return Value.newBuilder()
.setLongArrValue(
LongArr.newBuilder()
.addAllArr(LongStream.of(la).mapToObj(l -> l).toList()))
LongArr.newBuilder().addAllArr(LongStream.of(la).mapToObj(l -> l).toList()))
.build();
}
if (value instanceof String[] sa) {
@ -847,8 +825,7 @@ public class TraceRmiHandler implements TraceRmiConnection {
protected ReplyCreateObject handleCreateObject(RequestCreateObject req) {
OpenTrace open = requireOpenTrace(req.getOid());
TraceObject object =
open.trace.getObjectManager().createObject(toKeyPath(req.getPath()));
TraceObject object = open.trace.getObjectManager().createObject(toKeyPath(req.getPath()));
return ReplyCreateObject.newBuilder().setObject(makeObjSpec(object)).build();
}
@ -904,8 +881,7 @@ public class TraceRmiHandler implements TraceRmiConnection {
return ReplyDeleteBytes.getDefaultInstance();
}
protected ReplyDeleteRegisterValue handleDeleteRegisterValue(
RequestDeleteRegisterValue req) {
protected ReplyDeleteRegisterValue handleDeleteRegisterValue(RequestDeleteRegisterValue req) {
OpenTrace open = requireOpenTrace(req.getOid());
long snap = req.getSnap().getSnap();
AddressSpace space = open.trace.getBaseAddressFactory().getAddressSpace(req.getSpace());
@ -932,15 +908,13 @@ public class TraceRmiHandler implements TraceRmiConnection {
// Want addresses satisfying {@code known | (readOnly & everKnown)}
TraceMemoryManager memoryManager = open.trace.getMemoryManager();
AddressSetView readOnly =
memoryManager.getRegionsAddressSetWith(snap, r -> !r.isWrite());
AddressSetView readOnly = memoryManager.getRegionsAddressSetWith(snap, r -> !r.isWrite());
AddressSetView everKnown = memoryManager.getAddressesWithState(Lifespan.since(snap),
s -> s == TraceMemoryState.KNOWN);
AddressSetView roEverKnown = new IntersectionAddressSetView(readOnly, everKnown);
AddressSetView known =
memoryManager.getAddressesWithState(snap, s -> s == TraceMemoryState.KNOWN);
AddressSetView disassemblable =
new AddressSet(new UnionAddressSetView(known, roEverKnown));
AddressSetView disassemblable = new AddressSet(new UnionAddressSetView(known, roEverKnown));
Address start = open.toAddress(req.getStart(), true);
TracePlatform host = open.trace.getPlatformManager().getHostPlatform();
@ -950,7 +924,7 @@ public class TraceRmiHandler implements TraceRmiConnection {
host.getLanguage(), host.getLanguage().getLanguageID(), start));
try (CloseableTaskMonitor monitor = plugin.createMonitor()) {
dis.applyToTyped(open.trace.getFixedProgramView(snap), monitor);
dis.applyTo(open.trace.getFixedProgramView(snap), monitor);
}
return ReplyDisassemble.newBuilder()
@ -988,21 +962,19 @@ public class TraceRmiHandler implements TraceRmiConnection {
OpenTrace open = requireOpenTrace(req.getOid());
return ReplyGetValues.newBuilder()
.addAllValues(open.trace.getObjectManager()
.getValuePaths(toLifespan(req.getSpan()),
toPathPattern(req.getPattern()))
.getValuePaths(toLifespan(req.getSpan()), toPathPattern(req.getPattern()))
.map(TraceRmiHandler::makeValDesc)
.sorted(Comparator.comparing(ValDesc::getKey))
.toList())
.build();
}
protected ReplyGetValues handleGetValuesIntersecting(
RequestGetValuesIntersecting req) throws AddressOverflowException {
protected ReplyGetValues handleGetValuesIntersecting(RequestGetValuesIntersecting req)
throws AddressOverflowException {
OpenTrace open = requireOpenTrace(req.getOid());
AddressRange range = open.toRange(req.getBox().getRange(), false);
String key = req.getKey() == "" ? null : req.getKey();
Collection<? extends TraceObjectValue> col = range == null
? List.of()
Collection<? extends TraceObjectValue> col = range == null ? List.of()
: open.trace.getObjectManager()
.getValuesIntersecting(toLifespan(req.getBox().getSpan()), range, key);
return ReplyGetValues.newBuilder()
@ -1018,9 +990,7 @@ public class TraceRmiHandler implements TraceRmiConnection {
.stream()
.map(TraceObjectValue::getLifespan)
.reduce(Lifespan.ALL, Lifespan::intersect);
return ReplyInsertObject.newBuilder()
.setSpan(makeSpan(span))
.build();
return ReplyInsertObject.newBuilder().setSpan(makeSpan(span)).build();
}
protected ReplyNegotiate handleNegotiate(RequestNegotiate req) {
@ -1031,8 +1001,8 @@ public class TraceRmiHandler implements TraceRmiConnection {
}
for (Method m : req.getMethodsList()) {
RemoteMethod rm = new RecordRemoteMethod(this, m.getName(),
ActionName.name(m.getAction()), m.getDisplay(),
m.getDescription(), m.getParametersList()
ActionName.name(m.getAction()), m.getDisplay(), m.getDescription(),
m.getParametersList()
.stream()
.collect(Collectors.toMap(MethodParameter::getName, this::makeParameter)),
new SchemaName(m.getReturnType().getName()));
@ -1141,8 +1111,7 @@ public class TraceRmiHandler implements TraceRmiConnection {
return ReplySetMemoryState.getDefaultInstance();
}
protected ReplySetValue handleSetValue(RequestSetValue req)
throws AddressOverflowException {
protected ReplySetValue handleSetValue(RequestSetValue req) throws AddressOverflowException {
ValSpec value = req.getValue();
OpenTrace open = requireOpenTrace(req.getOid());
Object objVal = open.toValue(value.getValue());
@ -1152,8 +1121,8 @@ public class TraceRmiHandler implements TraceRmiConnection {
return ReplySetValue.newBuilder().setSpan(makeSpan(Lifespan.EMPTY)).build();
}
TraceObjectValue val = object.setValue(toLifespan(value.getSpan()), value.getKey(),
objVal, toResolution(req.getResolution()));
TraceObjectValue val = object.setValue(toLifespan(value.getSpan()), value.getKey(), objVal,
toResolution(req.getResolution()));
return ReplySetValue.newBuilder()
.setSpan(makeSpan(val == null ? Lifespan.EMPTY : val.getLifespan()))
.build();