Skip to content

Commit

Permalink
Merge pull request #34 from ashleyy2444/branch-addProgrammingLanguages
Browse files Browse the repository at this point in the history
Branch add programming languages
  • Loading branch information
dabzpengu authored Mar 21, 2024
2 parents 07916e2 + 5cd9551 commit 17647f2
Show file tree
Hide file tree
Showing 30 changed files with 545 additions and 58 deletions.
5 changes: 4 additions & 1 deletion src/main/java/seedu/address/logic/commands/AddCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_INTERVIEWTIME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PROGRAMMING_LANGUAGE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;

Expand Down Expand Up @@ -35,6 +36,7 @@ public class AddCommand extends Command {
+ PREFIX_SALARY + "SALARY "
+ PREFIX_INFO + "INFO "
+ "[" + PREFIX_TAG + "TAG]...\n"
+ "[" + PREFIX_PROGRAMMING_LANGUAGE + "PROGRAMMING-LANGUAGE]...\n"
+ "Example: " + COMMAND_WORD + " "
+ PREFIX_COMPANY_NAME + "Google "
+ PREFIX_NAME + "John Doe "
Expand All @@ -45,7 +47,8 @@ public class AddCommand extends Command {
+ PREFIX_SALARY + "Salary: 0$ "
+ PREFIX_INFO + "Birthday: 12 May 2001 "
+ PREFIX_TAG + "friends "
+ PREFIX_TAG + "owesMoney";
+ PREFIX_TAG + "owesMoney"
+ PREFIX_PROGRAMMING_LANGUAGE + "Java";

public static final String MESSAGE_SUCCESS = "New person added: %1$s";
public static final String MESSAGE_DUPLICATE_PERSON = "This person already exists in the address book";
Expand Down
34 changes: 31 additions & 3 deletions src/main/java/seedu/address/logic/commands/EditCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_INTERVIEWTIME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PROGRAMMING_LANGUAGE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
Expand All @@ -25,6 +26,7 @@
import seedu.address.logic.Messages;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.Model;
import seedu.address.model.language.ProgrammingLanguage;
import seedu.address.model.person.Address;
import seedu.address.model.person.CompanyName;
import seedu.address.model.person.Email;
Expand Down Expand Up @@ -56,6 +58,7 @@ public class EditCommand extends Command {
+ "[" + PREFIX_SALARY + "SALARY] "
+ "[" + PREFIX_INFO + "INFO] "
+ "[" + PREFIX_TAG + "TAG]...\n"
+ "[" + PREFIX_PROGRAMMING_LANGUAGE + "PROGRAMMING-LANGUAGE]...\n"
+ "Example: " + COMMAND_WORD + " 1 "
+ PREFIX_PHONE + "91234567 "
+ PREFIX_EMAIL + "[email protected]";
Expand Down Expand Up @@ -115,10 +118,12 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript
Salary updatedSalary = editPersonDescriptor.getSalary().orElse(personToEdit.getSalary());
Info updatedInfo = editPersonDescriptor.getInfo().orElse(personToEdit.getInfo());
Set<Tag> updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags());
Set<ProgrammingLanguage> updatedProgrammingLanguages = editPersonDescriptor.getProgrammingLanguages()
.orElse(personToEdit.getProgrammingLanguages());

return new Person(
updatedCompanyName, updatedName, updatedPhone, updatedEmail,
updatedAddress, updatedDateTime, updatedSalary, updatedInfo, updatedTags);
updatedAddress, updatedDateTime, updatedSalary, updatedInfo, updatedTags, updatedProgrammingLanguages);
}

@Override
Expand Down Expand Up @@ -159,6 +164,7 @@ public static class EditPersonDescriptor {
private Salary salary;
private Info info;
private Set<Tag> tags;
private Set<ProgrammingLanguage> programmingLanguages;

public EditPersonDescriptor() {}

Expand All @@ -176,13 +182,15 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) {
setSalary(toCopy.salary);
setInfo(toCopy.info);
setTags(toCopy.tags);
setProgrammingLanguages(toCopy.programmingLanguages);
}

/**
* Returns true if at least one field is edited.
*/
public boolean isAnyFieldEdited() {
return CollectionUtil.isAnyNonNull(name, phone, email, address, dateTime, salary, info, tags);
return CollectionUtil.isAnyNonNull(name, phone, email, address, dateTime, salary, info, tags,
programmingLanguages);
}
public void setCompanyName(CompanyName companyName) {
this.companyName = companyName;
Expand Down Expand Up @@ -261,6 +269,24 @@ public Optional<Set<Tag>> getTags() {
return (tags != null) ? Optional.of(Collections.unmodifiableSet(tags)) : Optional.empty();
}

/**
* Sets {@code programmingLanguages} to this object's {@code programmingLanguages}.
* A defensive copy of {@code programmingLanguages} is used internally.
*/
public void setProgrammingLanguages(Set<ProgrammingLanguage> programmingLanguages) {
this.programmingLanguages = (programmingLanguages != null) ? new HashSet<>(programmingLanguages) : null;
}

/**
* Returns an unmodifiable programmingLanguages set, which throws {@code UnsupportedOperationException}
* if modification is attempted.
* Returns {@code Optional#empty()} if {@code programmingLanguages} is null.
*/
public Optional<Set<ProgrammingLanguage>> getProgrammingLanguages() {
return (programmingLanguages != null) ? Optional.of(Collections
.unmodifiableSet(programmingLanguages)) : Optional.empty();
}

@Override
public boolean equals(Object other) {
if (other == this) {
Expand All @@ -281,7 +307,8 @@ public boolean equals(Object other) {
&& Objects.equals(dateTime, otherEditPersonDescriptor.dateTime)
&& Objects.equals(salary, otherEditPersonDescriptor.salary)
&& Objects.equals(info, otherEditPersonDescriptor.info)
&& Objects.equals(tags, otherEditPersonDescriptor.tags);
&& Objects.equals(tags, otherEditPersonDescriptor.tags)
&& Objects.equals(programmingLanguages, otherEditPersonDescriptor.programmingLanguages);
}

@Override
Expand All @@ -296,6 +323,7 @@ public String toString() {
.add("salary", salary)
.add("info", info)
.add("tags", tags)
.add("programmingLanguages", programmingLanguages)
.toString();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_INTERVIEWTIME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PROGRAMMING_LANGUAGE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;

Expand All @@ -16,6 +17,7 @@

import seedu.address.logic.commands.AddCommand;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.language.ProgrammingLanguage;
import seedu.address.model.person.Address;
import seedu.address.model.person.CompanyName;
import seedu.address.model.person.Email;
Expand All @@ -41,7 +43,7 @@ public AddCommand parse(String args) throws ParseException {
ArgumentMultimap argMultimap =
ArgumentTokenizer.tokenize(
args, PREFIX_COMPANY_NAME, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS,
PREFIX_INTERVIEWTIME, PREFIX_TAG, PREFIX_SALARY, PREFIX_INFO);
PREFIX_INTERVIEWTIME, PREFIX_TAG, PREFIX_SALARY, PREFIX_INFO, PREFIX_PROGRAMMING_LANGUAGE);


if (!arePrefixesPresent(argMultimap, PREFIX_COMPANY_NAME, PREFIX_NAME, PREFIX_ADDRESS,
Expand All @@ -60,8 +62,11 @@ public AddCommand parse(String args) throws ParseException {
Salary salary = ParserUtil.parseSalary(argMultimap.getValue(PREFIX_SALARY).orElse("0"));
Info info = ParserUtil.parseInfo(argMultimap.getValue(PREFIX_INFO).orElse(""));
Set<Tag> tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));
Set<ProgrammingLanguage> programmingLanguageList = ParserUtil.parseProgrammingLanguages(argMultimap
.getAllValues(PREFIX_PROGRAMMING_LANGUAGE));

Person person = new Person(companyName, name, phone, email, address, interviewTime, salary, info, tagList);
Person person = new Person(companyName, name, phone, email, address, interviewTime, salary, info, tagList,
programmingLanguageList);

return new AddCommand(person);
}
Expand Down
1 change: 1 addition & 0 deletions src/main/java/seedu/address/logic/parser/CliSyntax.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@ public class CliSyntax {
public static final Prefix PREFIX_INTERVIEWTIME = new Prefix("tt/");
public static final Prefix PREFIX_SALARY = new Prefix("s/");
public static final Prefix PREFIX_INFO = new Prefix("i/");
public static final Prefix PREFIX_PROGRAMMING_LANGUAGE = new Prefix("pl/");

}
30 changes: 28 additions & 2 deletions src/main/java/seedu/address/logic/parser/EditCommandParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_INTERVIEWTIME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PROGRAMMING_LANGUAGE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_SALARY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;

Expand All @@ -21,6 +22,7 @@
import seedu.address.logic.commands.EditCommand;
import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.language.ProgrammingLanguage;
import seedu.address.model.tag.Tag;

/**
Expand All @@ -39,8 +41,8 @@ public EditCommand parse(String args) throws ParseException {
ArgumentMultimap argMultimap =
ArgumentTokenizer.tokenize(
args, PREFIX_COMPANY_NAME, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL,
PREFIX_ADDRESS, PREFIX_INTERVIEWTIME,
PREFIX_SALARY, PREFIX_INFO, PREFIX_TAG);
PREFIX_ADDRESS, PREFIX_INTERVIEWTIME, PREFIX_SALARY, PREFIX_INFO,
PREFIX_TAG, PREFIX_PROGRAMMING_LANGUAGE);

Index index;

Expand Down Expand Up @@ -82,6 +84,8 @@ public EditCommand parse(String args) throws ParseException {
editPersonDescriptor.setInfo(ParserUtil.parseInfo(argMultimap.getValue(PREFIX_INFO).get()));
}
parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);
parseProgrammingLanguagesForEdit(argMultimap.getAllValues(PREFIX_PROGRAMMING_LANGUAGE))
.ifPresent(editPersonDescriptor::setProgrammingLanguages);

if (!editPersonDescriptor.isAnyFieldEdited()) {
throw new ParseException(EditCommand.MESSAGE_NOT_EDITED);
Expand All @@ -103,4 +107,26 @@ private Optional<Set<Tag>> parseTagsForEdit(Collection<String> tags) throws Pars
Collection<String> tagSet = tags.size() == 1 && tags.contains("") ? Collections.emptySet() : tags;
return Optional.of(ParserUtil.parseTags(tagSet));
}

/**
* Parses a collection of programming language names into a set of ProgrammingLanguages if the collection is
* non-empty. If the collection contains only one element which is an empty string, it will be parsed into a
* set containing zero programming languages.
*
* @param programmingLanguages A collection of programming language names to be parsed.
* @return An Optional containing set of ProgrammingLanguages if collection is non-empty, otherwise empty Optional.
* @throws ParseException If any of the programming language names is invalid.
*/
private Optional<Set<ProgrammingLanguage>> parseProgrammingLanguagesForEdit(Collection<String> programmingLanguages)
throws ParseException {
assert programmingLanguages != null;

if (programmingLanguages.isEmpty()) {
return Optional.empty();
}
Collection<String> languageSet = programmingLanguages.size() == 1 && programmingLanguages.contains("")
? Collections.emptySet() : programmingLanguages;
return Optional.of(ParserUtil.parseProgrammingLanguages(languageSet));
}

}
37 changes: 37 additions & 0 deletions src/main/java/seedu/address/logic/parser/ParserUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import seedu.address.commons.core.index.Index;
import seedu.address.commons.util.StringUtil;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.language.ProgrammingLanguage;
import seedu.address.model.person.Address;
import seedu.address.model.person.CompanyName;
import seedu.address.model.person.Email;
Expand Down Expand Up @@ -179,4 +180,40 @@ public static Info parseInfo(String info) {
String trimmedInfo = info.trim();
return new Info(trimmedInfo);
}

/**
* Parses a string representing a programming language into a {@code ProgrammingLanguage} object.
* Leading and trailing whitespaces will be trimmed.
*
* @param programmingLanguageString A string representing a programming language.
* @return A {@code ProgrammingLanguage} object parsed from the input string.
* @throws ParseException if the given {@code programmingLanguageString} is invalid.
*/
public static ProgrammingLanguage parseProgrammingLanguage(String programmingLanguageString) throws ParseException {
requireNonNull(programmingLanguageString);
String trimmedProgrammingLanguage = programmingLanguageString.trim();
if (!ProgrammingLanguage.isValidLanguageName(trimmedProgrammingLanguage)) {
throw new ParseException(ProgrammingLanguage.MESSAGE_CONSTRAINTS);
}
return new ProgrammingLanguage(trimmedProgrammingLanguage);
}

/**
* Parses collection of strings representing programming languages into set of {@code ProgrammingLanguage} objects.
*
* @param programmingLanguages A collection of strings representing programming languages.
* @return A set of {@code ProgrammingLanguage} objects parsed from the input collection.
* @throws ParseException if any of the programming language strings are invalid.
*/
public static Set<ProgrammingLanguage> parseProgrammingLanguages(Collection<String> programmingLanguages)
throws ParseException {
requireNonNull(programmingLanguages);
final Set<ProgrammingLanguage> programmingLanguageSet = new HashSet<>();
for (String programmingLanguage : programmingLanguages) {
programmingLanguageSet.add(parseProgrammingLanguage(programmingLanguage));
}
return programmingLanguageSet;
}


}
4 changes: 4 additions & 0 deletions src/main/java/seedu/address/model/ModelManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -145,4 +145,8 @@ public boolean equals(Object other) {
&& filteredPersons.equals(otherModelManager.filteredPersons);
}

@Override
public String toString() {
return String.format("%s, %s, %s", this.addressBook, this.userPrefs, this.filteredPersons);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package seedu.address.model.language;

import static java.util.Objects.requireNonNull;
import static seedu.address.commons.util.AppUtil.checkArgument;

/**
* Represents a Programming Language in the address book.
* Guarantees: immutable; name is valid as declared in {@link #isValidLanguageName(String)}
*/
public class ProgrammingLanguage {

public static final String MESSAGE_CONSTRAINTS =
"Programming Languages should be alphanumeric and may contain some special characters (+ and #)"
+ ", and must be less than 50 characters";
public static final String VALIDATION_REGEX = "[\\p{Alnum}+#\\s]{1,50}";
public final String languageName;

/**
* Constructs a {@code ProgrammingLanguage}.
*
* @param languageName A valid programming language name.
*/
public ProgrammingLanguage(String languageName) {
requireNonNull(languageName);
checkArgument(isValidLanguageName(languageName), MESSAGE_CONSTRAINTS);
this.languageName = languageName;
}

/**
* Returns true if a given string is a valid programming language name.
*
* @param test The string to test for validity.
* @return {@code true} if the string is a valid programming language name, {@code false} otherwise.
*/
public static boolean isValidLanguageName(String test) {
return test.matches(VALIDATION_REGEX);
}

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

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

ProgrammingLanguage otherLanguage = (ProgrammingLanguage) other;
return languageName.equals(otherLanguage.languageName);
}

@Override
public int hashCode() {
return languageName.hashCode();
}

/**
* Returns the string representation of this programming language.
*
* @return The string representation of this programming language.
*/
@Override
public String toString() {
return "[Programming Language: " + languageName + "]";
}
}
Loading

0 comments on commit 17647f2

Please sign in to comment.