Skip to content

Commit

Permalink
Merge pull request #1 from bryanyee33/edit-asset-fix
Browse files Browse the repository at this point in the history
Fix EditAssetCommand
  • Loading branch information
fivetran-tangyetong authored Mar 20, 2024
2 parents db1c999 + c2c036b commit 3da9ad9
Show file tree
Hide file tree
Showing 17 changed files with 148 additions and 314 deletions.
9 changes: 0 additions & 9 deletions src/main/java/seedu/address/logic/Messages.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;

import seedu.address.model.asset.Asset;
import seedu.address.model.person.Person;
import seedu.address.model.person.fields.Prefix;

Expand All @@ -15,7 +14,6 @@ public class Messages {

public static final String MESSAGE_UNKNOWN_COMMAND = "Unknown command";
public static final String MESSAGE_INVALID_COMMAND_FORMAT = "Invalid command format! \n%1$s";
public static final String MESSAGE_INVALID_ASSET_DISPLAYED = "The asset name provided is invalid";
public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX = "The person index provided is invalid";
public static final String MESSAGE_PERSONS_LISTED_OVERVIEW = "%1$d persons listed!";
public static final String MESSAGE_DUPLICATE_FIELDS =
Expand Down Expand Up @@ -55,11 +53,4 @@ public static String format(Person person) {
return builder.toString();
}

/**
* Formats the {@code asset} for display to the user.
*/
public static String format(Asset asset) {
return asset.get();
}

}
3 changes: 2 additions & 1 deletion src/main/java/seedu/address/logic/commands/AddCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ public class AddCommand extends Command {
+ PREFIX_PHONE + "PHONE "
+ PREFIX_EMAIL + "EMAIL "
+ PREFIX_ADDRESS + "ADDRESS "
+ "[" + PREFIX_TAG + "TAG]...\n"
+ "[" + PREFIX_TAG + "TAG]..."
+ "[" + PREFIX_ASSET + "ASSET]...\n"
+ "Example: " + COMMAND_WORD + " "
+ PREFIX_NAME + "John Doe "
+ PREFIX_PHONE + "98765432 "
Expand Down
172 changes: 45 additions & 127 deletions src/main/java/seedu/address/logic/commands/EditAssetCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,101 +2,65 @@

import static java.util.Objects.requireNonNull;
import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
import static seedu.address.model.person.fields.Name.PREFIX_NAME;

import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;

import seedu.address.commons.util.ToStringBuilder;
import seedu.address.logic.Messages;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.logic.util.ArgumentMultimap;
import seedu.address.logic.util.ArgumentTokenizer;
import seedu.address.logic.util.ParserUtil;
import seedu.address.model.Model;
import seedu.address.model.asset.Asset;
import seedu.address.model.person.Person;
import seedu.address.model.person.fields.Address;
import seedu.address.model.person.fields.Assets;
import seedu.address.model.person.fields.Email;
import seedu.address.model.person.fields.Name;
import seedu.address.model.person.fields.Phone;
import seedu.address.model.person.fields.Tags;
import seedu.address.model.person.fields.Prefix;

/**
* Edits the details of an asset in the address book.
*/
public class EditAssetCommand extends Command {

public static final String COMMAND_WORD = "edita";
public static final Prefix PREFIX_OLD = new Prefix("old/");
public static final Prefix PREFIX_NEW = new Prefix("new/");

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the details of the asset identified "
+ "by the index number used in the displayed asset list. "
+ "Existing values will be overwritten by the input values.\n"
+ "Parameters: NAME (must be an existing asset) "
+ "[NAME]"
+ "Example: " + COMMAND_WORD + " Aircon Hammer";
+ "Parameters: " + PREFIX_OLD + "OLDNAME " + PREFIX_NEW + "NEWNAME\n"
+ "OLDNAME must be an existing asset name"
+ "Example: " + COMMAND_WORD + " " + PREFIX_OLD + "Aircon " + PREFIX_NEW + "Hammer";

public static final String MESSAGE_EDIT_ASSET_SUCCESS = "Edited Asset: %1$s";
public static final String MESSAGE_SUCCESS = "Edited Asset: %1$s";
public static final String MESSAGE_NOT_EDITED = "At least one field to edit must be provided.";
public static final String MESSAGE_INVALID_ASSET_NAME = "The asset name provided is invalid";

private final Asset assetToEdit;
private final EditAssetDescriptor editAssetDescriptor;
private final Asset target;
private final Asset editedAsset;

/**
* @param assetToEdit asset to edit
* @param editAssetDescriptor details to edit the person with
* @param target Previous asset to replace.
* @param editedAsset New asset to replace with.
*/
public EditAssetCommand(Asset assetToEdit, EditAssetDescriptor editAssetDescriptor) {
requireNonNull(assetToEdit);
requireNonNull(editAssetDescriptor);
public EditAssetCommand(Asset target, Asset editedAsset) {
requireNonNull(target);
requireNonNull(editedAsset);

if (editAssetDescriptor.getName().toString().equals(assetToEdit.get())) {
throw new IllegalArgumentException(EditAssetCommand.MESSAGE_NOT_EDITED);
}

this.assetToEdit = assetToEdit;
this.editAssetDescriptor = new EditAssetDescriptor(editAssetDescriptor);
this.target = target;
this.editedAsset = editedAsset;
}

@Override
public String execute(Model model) throws CommandException {
requireNonNull(model);
List<Person> lastShownList = model.getFilteredPersonList();

if (!model.hasAsset(assetToEdit)) {
throw new CommandException(Messages.MESSAGE_INVALID_ASSET_DISPLAYED);
if (target.equals(editedAsset)) {
throw new CommandException(MESSAGE_NOT_EDITED);
}

for (Person p: lastShownList) {
if (p.hasAsset(assetToEdit)) {
Person editedPersonWithAsset = createEditedPersonWithAsset(assetToEdit, p, editAssetDescriptor);
model.setPerson(p, editedPersonWithAsset);
}
if (!model.hasAsset(target)) {
throw new CommandException(MESSAGE_INVALID_ASSET_NAME);
}

model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
return String.format(MESSAGE_EDIT_ASSET_SUCCESS, Messages.format(assetToEdit));
}
model.editAsset(target, editedAsset);

/**
* Creates and returns a {@code Person} with the details of {@code personToEdit}
* edited with {@code editPersonDescriptor}.
*/
private static Person createEditedPersonWithAsset(Asset assetToEdit, Person personToEdit,
EditAssetDescriptor editAssetDescriptor) {
assert personToEdit != null;

Name updatedName = personToEdit.getName();
Phone updatedPhone = personToEdit.getPhone();
Email updatedEmail = personToEdit.getEmail();
Address updatedAddress = personToEdit.getAddress();
Tags updatedTags = personToEdit.getTags();
Assets updatedAssets = personToEdit.updateAsset(assetToEdit,
Asset.of(editAssetDescriptor.getName().toString()));

return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags, updatedAssets);
return String.format(MESSAGE_SUCCESS, editedAsset);
}

/**
Expand All @@ -106,26 +70,28 @@ private static Person createEditedPersonWithAsset(Asset assetToEdit, Person pers
*/
public static EditAssetCommand of(String args) throws IllegalArgumentException {
requireNonNull(args);
ArgumentMultimap argMultimap = ArgumentTokenizer.tokenizeEditAsset(args);
ArgumentMultimap argMultimap =
ArgumentTokenizer.tokenize(args, PREFIX_OLD, PREFIX_NEW);

Asset asset;

try {
asset = ParserUtil.parseAsset(argMultimap.getAssetToEdit());
} catch (IllegalArgumentException ie) {
throw new IllegalArgumentException(
String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditAssetCommand.MESSAGE_USAGE), ie);
if (!arePrefixesPresent(argMultimap, PREFIX_OLD, PREFIX_NEW)
|| !argMultimap.getPreamble().isEmpty()) {
throw new IllegalArgumentException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,
EditAssetCommand.MESSAGE_USAGE));
}

EditAssetDescriptor editAssetDescriptor = new EditAssetDescriptor();

editAssetDescriptor.setName(Name.of(argMultimap.getValue(PREFIX_NAME).get()));
argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_OLD, PREFIX_NEW);
Asset target = Asset.of(argMultimap.getValue(PREFIX_OLD).get());
Asset editedAsset = Asset.of(argMultimap.getValue(PREFIX_NEW).get());

if (editAssetDescriptor.getName().toString().equals(asset.get())) {
throw new IllegalArgumentException(EditAssetCommand.MESSAGE_NOT_EDITED);
}
return new EditAssetCommand(target, editedAsset);
}

return new EditAssetCommand(asset, editAssetDescriptor);
/**
* Returns true if none of the prefixes contains empty {@code Optional} values in the given
* {@code ArgumentMultimap}.
*/
private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {
return Stream.of(prefixes).allMatch(prefix -> argumentMultimap.getValue(prefix).isPresent());
}

@Override
Expand All @@ -140,63 +106,15 @@ public boolean equals(Object other) {
}

EditAssetCommand otherEditCommand = (EditAssetCommand) other;
return assetToEdit.equals(otherEditCommand.assetToEdit)
&& editAssetDescriptor.equals(otherEditCommand.editAssetDescriptor);
return target.equals(otherEditCommand.target)
&& editedAsset.equals(otherEditCommand.editedAsset);
}

@Override
public String toString() {
return new ToStringBuilder(this)
.add("assetToEdit", assetToEdit)
.add("editAssetDescriptor", editAssetDescriptor)
.add("target", target)
.add("editedAsset", editedAsset)
.toString();
}

/**
* Stores the details to edit the asset with. Each non-empty field value will replace the
* corresponding field value of the person.
*/
public static class EditAssetDescriptor {
private Name name;

public EditAssetDescriptor() {}

/**
* Copy constructor.
* A defensive copy of {@code tags} is used internally.
*/
public EditAssetDescriptor(EditAssetDescriptor toCopy) {
setName(toCopy.name);
}

public void setName(Name name) {
this.name = name;
}

public Name getName() {
return name;
}

@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}

// instanceof handles nulls
if (!(other instanceof EditAssetDescriptor)) {
return false;
}

EditAssetDescriptor otherEditPersonDescriptor = (EditAssetDescriptor) other;
return Objects.equals(name, otherEditPersonDescriptor.name);
}

@Override
public String toString() {
return new ToStringBuilder(this)
.add("name", name)
.toString();
}
}
}
9 changes: 0 additions & 9 deletions src/main/java/seedu/address/logic/util/ArgumentMultimap.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package seedu.address.logic.util;

import static seedu.address.model.person.fields.Assets.PREFIX_ASSET;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
Expand Down Expand Up @@ -64,13 +62,6 @@ public String getPreamble() {
return getValue(new Prefix("")).orElse("");
}

/**
* Returns the asset to edit. Trims any leading/trailing spaces.
*/
public String getAssetToEdit() {
return getValue(PREFIX_ASSET).orElse("");
}

/**
* Throws a {@code ParseException} if any of the prefixes given in {@code prefixes} appeared more than
* once among the arguments.
Expand Down
25 changes: 0 additions & 25 deletions src/main/java/seedu/address/logic/util/ArgumentTokenizer.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package seedu.address.logic.util;

import static seedu.address.model.person.fields.Assets.PREFIX_ASSET;
import static seedu.address.model.person.fields.Name.PREFIX_NAME;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
Expand Down Expand Up @@ -33,28 +30,6 @@ public static ArgumentMultimap tokenize(String argsString, Prefix... prefixes) {
return extractArguments(argsString, positions);
}

/**
* Tokenizes an arguments string and returns an {@code ArgumentMultimap} object that simply returns the name of
* the assetToEdit and newAsset.
*
* @param argsString Arguments string of the form: {@code preamble <prefix>value <prefix>value ...}
* @return ArgumentMultimap object that maps prefixes to their arguments
*/
public static ArgumentMultimap tokenizeEditAsset(String argsString) {
ArgumentMultimap argMultimap = new ArgumentMultimap();

String trimmedArgsString = argsString.trim();

if (!trimmedArgsString.contains(" ")) {
return argMultimap;
}

argMultimap.put(PREFIX_ASSET, trimmedArgsString.substring(0, trimmedArgsString.indexOf(" ")));
argMultimap.put(PREFIX_NAME, trimmedArgsString.substring(trimmedArgsString.lastIndexOf(" ") + 1));

return argMultimap;
}

/**
* Finds all zero-based prefix positions in the given arguments string.
*
Expand Down
14 changes: 0 additions & 14 deletions src/main/java/seedu/address/logic/util/ParserUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@

import seedu.address.commons.core.index.Index;
import seedu.address.commons.util.StringUtil;
import seedu.address.model.asset.Asset;

/**
* Contains utility methods used for parsing strings.
*/
public class ParserUtil {

public static final String MESSAGE_INVALID_ASSET = "Asset cannot be empty.";
public static final String MESSAGE_INVALID_INDEX = "Index is not a non-zero unsigned integer.";

/**
Expand All @@ -25,16 +23,4 @@ public static Index parseIndex(String oneBasedIndex) throws IllegalArgumentExcep
return Index.fromOneBased(Integer.parseInt(trimmedIndex));
}

/**
* Parses {@code assetToEdit} into an {@code Asset} and returns it. Leading and trailing whitespaces will be
* trimmed.
* @throws IllegalArgumentException if the specified index is invalid (not non-zero unsigned integer).
*/
public static Asset parseAsset(String assetToEdit) throws IllegalArgumentException {
String trimmedAssetToEdit = assetToEdit.trim();
if (trimmedAssetToEdit.isEmpty()) {
throw new IllegalArgumentException(MESSAGE_INVALID_ASSET);
}
return Asset.of(trimmedAssetToEdit);
}
}
18 changes: 17 additions & 1 deletion src/main/java/seedu/address/model/AddressBook.java
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,23 @@ public void removePerson(Person key) {
*/
public boolean hasAsset(Asset asset) {
requireNonNull(asset);
return persons.asUnmodifiableObservableList().stream().anyMatch(person -> person.hasAsset(asset));
return persons.asUnmodifiableObservableList()
.stream()
.anyMatch(person -> person.hasAsset(asset));
}

/**
* Changes all assets that equal target to editedAsset.
*/
public void editAsset(Asset target, Asset editedAsset) {
requireNonNull(target);
save();
for (Person person : getPersonList()) {
if (person.getAssets().contains(target)) {
Person editedPerson = person.editAsset(target, editedAsset);
persons.setPerson(person, editedPerson);
}
}
}

//// util methods
Expand Down
Loading

0 comments on commit 3da9ad9

Please sign in to comment.