diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 3989302..dd91376 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,14 +5,13 @@ - - - + + - - - - - - - - - - @@ -105,6 +89,7 @@ + diff --git a/src/fr/impl/CategoryImpl.java b/src/fr/impl/CategoryImpl.java index 235323e..2cbf235 100644 --- a/src/fr/impl/CategoryImpl.java +++ b/src/fr/impl/CategoryImpl.java @@ -1,7 +1,8 @@ package src.fr.impl; +import src.fr.api.Category; -public class CategoryImpl implements src.fr.api.Category { +public class CategoryImpl implements Category { private String name; public CategoryImpl(String name){ diff --git a/src/fr/impl/CompatibilityCheckerImpl.java b/src/fr/impl/CompatibilityCheckerImpl.java index 0b99b22..1df2b4d 100644 --- a/src/fr/impl/CompatibilityCheckerImpl.java +++ b/src/fr/impl/CompatibilityCheckerImpl.java @@ -3,9 +3,10 @@ package src.fr.impl; import java.util.HashMap; import java.util.Set; import src.fr.api.PartType; +import src.fr.api.CompatibilityChecker; -public class CompatibilityCheckerImpl implements src.fr.api.CompatibilityChecker { +public class CompatibilityCheckerImpl implements CompatibilityChecker { private HashMap> incompatibilities; private HashMap> requirements; diff --git a/src/fr/impl/CompatibilityManagerImpl.java b/src/fr/impl/CompatibilityManagerImpl.java index ab8ed60..409b9b9 100644 --- a/src/fr/impl/CompatibilityManagerImpl.java +++ b/src/fr/impl/CompatibilityManagerImpl.java @@ -5,8 +5,9 @@ import java.util.HashSet; import java.util.Set; import java.util.Objects; import src.fr.api.PartType; +import src.fr.api.CompatibilityManager; -public class CompatibilityManagerImpl implements src.fr.api.CompatibilityManager { +public class CompatibilityManagerImpl implements CompatibilityManager { private HashMap> incompatibilities; private HashMap> requirements; diff --git a/src/fr/impl/ConfigurationImpl.java b/src/fr/impl/ConfigurationImpl.java index 0f05797..5b157ee 100644 --- a/src/fr/impl/ConfigurationImpl.java +++ b/src/fr/impl/ConfigurationImpl.java @@ -3,12 +3,13 @@ package src.fr.impl; import src.fr.api.Category; import src.fr.api.PartType; import src.fr.api.CompatibilityManager; +import src.fr.api.Configuration; import src.fr.api.Part; import java.util.Set; -public class ConfigurationImpl implements src.fr.api.Configuration { - private Set selectedParts; +public class ConfigurationImpl implements Configuration { + private Set selectedParts; private CompatibilityManager compatibilityManager; private static int NB_CATEGORY = 4; @@ -16,7 +17,7 @@ public class ConfigurationImpl implements src.fr.api.Configuration { @Override public boolean isValid() { if (this.isComplete()){ - for(PartType pt: selectedParts){ + for(Part pt: selectedParts){ //Verifier Requirements for(PartType require : compatibilityManager.getRequirements(pt)){ if(!selectedParts.contains(require)) return false; diff --git a/src/fr/impl/ConfiguratorImpl.java b/src/fr/impl/ConfiguratorImpl.java index bb84a31..cbcb1f2 100644 --- a/src/fr/impl/ConfiguratorImpl.java +++ b/src/fr/impl/ConfiguratorImpl.java @@ -3,12 +3,13 @@ package src.fr.impl; import src.fr.api.Category; import src.fr.api.CompatibilityChecker; import src.fr.api.Configuration; +import src.fr.api.Configurator; import src.fr.api.PartType; import java.util.HashSet; import java.util.Set; -public class ConfiguratorImpl implements src.fr.api.Configurator { +public class ConfiguratorImpl implements Configurator { private Set categories; private Set partTypes; private Configuration configuration; diff --git a/src/fr/impl/PartImpl.java b/src/fr/impl/PartImpl.java index 27f772d..420b550 100644 --- a/src/fr/impl/PartImpl.java +++ b/src/fr/impl/PartImpl.java @@ -1,37 +1,79 @@ package src.fr.impl; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Supplier; +import src.fr.api.Part; import src.fr.api.Category; import src.fr.api.PartType; -public class PartImpl implements src.fr.api.Part { +public class PartImpl implements Part { private PartType type; + private class Property { + public final Supplier getter; + public final Consumer setter; + public final Set possibleValues; + + Property(Supplier getter, Consumer setter, Set possibleValues) { + this.getter = getter; + this.setter = setter; + this.possibleValues = possibleValues; + } + } + + private Map properties = new HashMap<>(); + + protected void addProperty(String name, Supplier getter, Consumer setter, Set possibleValues) { + properties.put(name, new Property(getter, setter, possibleValues)); + } + + @Override + public Set getPropertyNames() { + return Collections.unmodifiableSet(properties.keySet()); + } + + @Override + public Optional getProperty(String propertyName) { + Objects.requireNonNull(propertyName); + + if (properties.containsKey(propertyName)) { + return Optional.of(properties.get(propertyName).getter.get()); + } + return Optional.empty(); + } + + @Override + public void setProperty(String propertyName, String propertyValue) { + Objects.requireNonNull(propertyName); + Objects.requireNonNull(propertyValue); + + if ((properties.containsKey(propertyName)) && (properties.get(propertyName).setter != null)) { + properties.get(propertyName).setter.accept(propertyValue); + } else { + throw new IllegalArgumentException("bad property name or value: " + propertyName); + } + } + + @Override + public Set getAvailablePropertyValues(String propertyName) { + if (properties.containsKey(propertyName)) { + return Collections.unmodifiableSet(properties.get(propertyName).possibleValues); + } + return Collections.emptySet(); + } + public Category getCategory(){ return this.type.getCategory(); } public PartType getType(){ return this.type; } - @Override - public Set getPropertyNames() { - return null; - } - @Override - public Set getAvailablePropertyValues(String propertyName) { - return null; - } - @Override - public Optional getProperty(String propertyName) { - return null; - } - @Override - public void setProperty(String propertyName, String propertyValue) { - return; - }; } - - diff --git a/src/fr/impl/PartTypeImpl.java b/src/fr/impl/PartTypeImpl.java index fd22aab..d0ac9c2 100644 --- a/src/fr/impl/PartTypeImpl.java +++ b/src/fr/impl/PartTypeImpl.java @@ -1,19 +1,37 @@ package src.fr.impl; -import src.fr.api.Category; +import java.lang.reflect.Constructor; +import java.util.logging.Level; +import java.util.logging.Logger; -public class PartTypeImpl implements src.fr.api.PartType { +import src.fr.api.Category; +import src.fr.api.PartType; + +public class PartTypeImpl implements PartType { private String name; private Category category; //V2 implement private Class classRef; - public PartTypeImpl(String name, Category category ) { + public PartTypeImpl(String name,Class classref, Category category ) { this.name = name; + this.classRef= classref; this.category = category; } + public PartImpl newInstance(){ + Constructor constructor; + try{ + constructor = classRef.getConstructor(); + return constructor.newInstance(); + } catch(Exception e){ + Logger.getGlobal().log(Level.SEVERE, "constructor call failed",e); + System.exit(-1); + } + return null; + } + public String getName(){ return this.name; }