/*
* Copyright (C) 2014 GG-Net GmbH - Oliver Günther
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package eu.ggnet.dwoss.receipt.stub;
import eu.ggnet.dwoss.spec.entity.ProductModel;
import eu.ggnet.dwoss.spec.entity.BasicSpec;
import eu.ggnet.dwoss.spec.entity.piece.Display;
import eu.ggnet.dwoss.spec.entity.ProductFamily;
import eu.ggnet.dwoss.spec.entity.piece.Cpu;
import eu.ggnet.dwoss.spec.entity.Notebook;
import eu.ggnet.dwoss.spec.entity.piece.Gpu;
import eu.ggnet.dwoss.spec.entity.AllInOne;
import eu.ggnet.dwoss.spec.entity.Monitor;
import eu.ggnet.dwoss.spec.entity.Desktop;
import eu.ggnet.dwoss.spec.entity.ProductSpec;
import eu.ggnet.dwoss.spec.entity.ProductSeries;
import eu.ggnet.dwoss.spec.entity.SpecOfflineConstructor;
import java.util.*;
import javax.enterprise.inject.Alternative;
import javax.persistence.LockModeType;
import eu.ggnet.dwoss.receipt.ProductProcessor;
import eu.ggnet.dwoss.rules.ProductGroup;
import eu.ggnet.dwoss.rules.TradeName;
import eu.ggnet.dwoss.spec.SpecAgent;
import eu.ggnet.dwoss.spec.assist.SpecPu;
import eu.ggnet.dwoss.spec.entity.Desktop.Hdd;
import eu.ggnet.dwoss.spec.entity.Desktop.Odd;
import eu.ggnet.dwoss.spec.entity.Desktop.Os;
import eu.ggnet.dwoss.spec.entity.ProductSpec.Extra;
import static eu.ggnet.dwoss.rules.ProductGroup.*;
import static eu.ggnet.dwoss.rules.TradeName.ACER;
import static eu.ggnet.dwoss.rules.TradeName.PACKARD_BELL;
/**
* Stubclass for offline usage and testing.
*
* @author oliver.guenther
*/
@Alternative
public class ProductProcessorStub implements ProductProcessor {
private Set<ProductSeries> serieses;
private List<Gpu> gpus;
private List<Cpu> cpus;
private Map<String, ProductSpec> specs;
private SpecOfflineConstructor soc = SpecOfflineConstructor.getInstance();
public Desktop desktop;
public Notebook notebook;
public AllInOne allInOne;
public Monitor monitor;
public ProductProcessorStub() {
cpus = new ArrayList<Cpu>();
cpus.add(new Cpu(Cpu.Series.ATHLON, EnumSet.of(Cpu.Type.MOBILE), "A123"));
cpus.add(new Cpu(Cpu.Series.ATHLON, EnumSet.of(Cpu.Type.MOBILE), "B22"));
cpus.add(new Cpu(Cpu.Series.ATHLON, EnumSet.of(Cpu.Type.MOBILE), "B22"));
cpus.add(new Cpu(Cpu.Series.CORE, "Quad Q9000", Cpu.Type.MOBILE, 2.26, 4));
cpus.add(new Cpu(Cpu.Series.CORE, "Quad Q9100", Cpu.Type.MOBILE, 2.00, 4));
cpus.add(new Cpu(Cpu.Series.CORE, "Duo X6800", Cpu.Type.DESKTOP, 2.93, 2));
cpus.add(new Cpu(Cpu.Series.CORE, "Duo E6850", Cpu.Type.DESKTOP, 3.00, 2));
cpus.add(new Cpu(Cpu.Series.XEON, "X5670", Cpu.Type.DESKTOP, 2.93, 6));
cpus.add(new Cpu(Cpu.Series.XEON, "L5530", Cpu.Type.DESKTOP, 2.4, 4));
cpus.add(new Cpu(Cpu.Series.ATHLON, "X2 Dual-Core TK-53", Cpu.Type.MOBILE, 1.70, 2));
cpus.add(new Cpu(Cpu.Series.TURION, "II Ultra Dual-Core m660", Cpu.Type.MOBILE, 2.70, 2));
cpus.add(new Cpu(Cpu.Series.PHENOM, "II X4 805", Cpu.Type.DESKTOP, 2.50, 4));
cpus.add(new Cpu(Cpu.Series.CORE_I7, "860", Cpu.Type.DESKTOP, 2.8, 4));
cpus.add(new Cpu(Cpu.Series.CORE_I7, "930", Cpu.Type.DESKTOP, 2.8, 4));
cpus.add(new Cpu(Cpu.Series.CORE_I5, "750", Cpu.Type.DESKTOP, 2.66, 4));
cpus.add(new Cpu(Cpu.Series.CORE_I5, "650", Cpu.Type.DESKTOP, 3.2, 2));
cpus.add(new Cpu(Cpu.Series.CORE_I3, "2130", Cpu.Type.DESKTOP, 3.4, 2));
gpus = new ArrayList<Gpu>();
gpus.add(new Gpu(Gpu.Type.MOBILE, Gpu.Series.RADEON_HD_5000, "Mobility Radeon™ HD 540v Series"));
gpus.add(new Gpu(Gpu.Type.MOBILE, Gpu.Series.RADEON_HD_4000, "Mobility Radeon™ HD 4000"));
gpus.add(new Gpu(Gpu.Type.DESKTOP, Gpu.Series.RADEON_HD_5000, "5850 Graphics"));
gpus.add(new Gpu(Gpu.Type.DESKTOP, Gpu.Series.RADEON_HD_6000, "6990 Graphics"));
gpus.add(new Gpu(Gpu.Type.MOBILE, Gpu.Series.GEFORCE_500, "570M"));
gpus.add(new Gpu(Gpu.Type.MOBILE, Gpu.Series.GEFORCE_500, "525M"));
gpus.add(new Gpu(Gpu.Type.DESKTOP, Gpu.Series.GEFORCE_500, "590"));
gpus.add(new Gpu(Gpu.Type.DESKTOP, Gpu.Series.GEFORCE_200, "250"));
gpus.add(new Gpu(Gpu.Type.DESKTOP, Gpu.Series.INTEL_GRAPHICS, "Graphics Media Accelerator"));
gpus.add(new Gpu(Gpu.Type.DESKTOP, Gpu.Series.INTEL_GRAPHICS, "HD Graphics"));
gpus.add(new Gpu(Gpu.Type.MOBILE, Gpu.Series.INTEL_GRAPHICS, "Graphics Media Accelerator"));
gpus.add(new Gpu(Gpu.Type.MOBILE, Gpu.Series.INTEL_GRAPHICS, "HD Graphics"));
gpus.add(new Gpu(Gpu.Type.DESKTOP, Gpu.Series.GEFORCE_400, "460"));
serieses = new HashSet<ProductSeries>();
// ACER Series
ProductSeries veriton = soc.newProductSeries(ACER, DESKTOP, "Veriton");
ProductSeries aspire = soc.newProductSeries(ACER, DESKTOP, "Aspire");
ProductSeries aspire_n = soc.newProductSeries(ACER, NOTEBOOK, "Aspire");
ProductSeries travelmate = soc.newProductSeries(ACER, NOTEBOOK, "TravelMate");
ProductSeries tablet = soc.newProductSeries(ACER, MISC, "Tablet");
ProductSeries monitor_a = soc.newProductSeries(ACER, MONITOR, "A Series");
// PB Series
ProductSeries imedia = soc.newProductSeries(PACKARD_BELL, DESKTOP, "iMedia");
ProductSeries ixtreme = soc.newProductSeries(PACKARD_BELL, DESKTOP, "iXtreme");
ProductSeries ipower = soc.newProductSeries(PACKARD_BELL, DESKTOP, "iPower");
ProductSeries easynote = soc.newProductSeries(PACKARD_BELL, NOTEBOOK, "EasyNote");
ProductSeries dot = soc.newProductSeries(PACKARD_BELL, NOTEBOOK, "Dot");
serieses.add(veriton);
serieses.add(aspire);
serieses.add(aspire_n);
serieses.add(travelmate);
serieses.add(imedia);
serieses.add(ipower);
serieses.add(ixtreme);
serieses.add(easynote);
serieses.add(dot);
serieses.add(tablet);
serieses.add(monitor_a);
//ACER families
ProductFamily veriton_n = soc.newProductFamily();
ProductFamily veriton_m = soc.newProductFamily();
ProductFamily veriton_l = soc.newProductFamily();
ProductFamily aspiren_family = soc.newProductFamily();
ProductFamily aspiren_timelinex = soc.newProductFamily();
ProductFamily aspiren_ethos = soc.newProductFamily();
ProductFamily travelmate_family = soc.newProductFamily();
ProductFamily travelmate_timelinex = soc.newProductFamily();
ProductFamily aspire_m = soc.newProductFamily();
ProductFamily aspire_x = soc.newProductFamily();
ProductFamily predator = soc.newProductFamily();
ProductFamily tablet_A = soc.newProductFamily();
ProductFamily monitor_A23 = soc.newProductFamily();
veriton_m.setName("Veriton M");
veriton_n.setName("Veriton N");
veriton_l.setName("Veriton L");
aspiren_family.setName("Aspire");
aspire_m.setName("Aspire M");
aspire_x.setName("Aspire X");
predator.setName("Predator");
travelmate_family.setName("TravelMate");
aspiren_ethos.setName("Aspire Ethos");
aspiren_timelinex.setName("Aspire TimelineX");
travelmate_timelinex.setName("TravelMate TimelineX");
tablet_A.setName("Tablet Iconia A");
monitor_A23.setName("A230");
veriton.addFamily(veriton_m);
veriton.addFamily(veriton_n);
veriton.addFamily(veriton_l);
aspire.addFamily(aspire_x);
aspire.addFamily(aspire_m);
aspire.addFamily(predator);
aspire_n.addFamily(aspiren_ethos);
aspire_n.addFamily(aspiren_family);
aspire_n.addFamily(aspiren_timelinex);
travelmate.addFamily(travelmate_family);
travelmate.addFamily(travelmate_timelinex);
tablet.addFamily(tablet_A);
monitor_a.addFamily(monitor_A23);
ProductModel g7700 = soc.newProductModel();
ProductModel m1 = soc.newProductModel();
ProductModel m2 = soc.newProductModel();
ProductModel m3 = soc.newProductModel();
ProductModel l1 = soc.newProductModel();
ProductModel l2 = soc.newProductModel();
ProductModel a500 = soc.newProductModel();
ProductModel monitor_a231Bwsx = soc.newProductModel();
g7700.setName("Aspire Predator G7700");
m1.setName("Veriton M480G");
m2.setName("Veriton M460");
m3.setName("Veriton M420");
l1.setName("Veriton L480G");
l2.setName("Veriton L670");
a500.setName("Iconia A500");
monitor_a231Bwsx.setName("A231Bwsx");
predator.addModel(g7700);
veriton_m.addModel(m1);
veriton_m.addModel(m2);
veriton_m.addModel(m3);
veriton_l.addModel(l1);
veriton_l.addModel(l2);
tablet_A.addModel(a500);
monitor_A23.addModel(monitor_a231Bwsx);
specs = new HashMap<>();
BasicSpec one = soc.newBasicSpec();
one.setModel(a500);
one.setPartNo("AX.12345.999");
one.setProductId(5L);
one.setExtras(EnumSet.of(ProductSpec.Extra.BLUETOOTH, ProductSpec.Extra.SPEAKERS));
one.setComment("Ein toller Kommentar");
specs.put(one.getPartNo(), one);
monitor = soc.newMonitor();
monitor.setModel(monitor_a231Bwsx);
monitor.setPartNo("ET.99999.111");
monitor.setProductId(10L);
monitor.setExtras(EnumSet.of(ProductSpec.Extra.BLUETOOTH, ProductSpec.Extra.SPEAKERS));
monitor.setComment("Ein toller Kommentar");
monitor.setDisplay(new Display(Display.Size._10_1, Display.Resolution.VGA, Display.Type.MATT, Display.Ration.SIXTEEN_TO_TEN));
specs.put(monitor.getPartNo(), monitor);
desktop = new Desktop();
desktop.setPartNo("PP.XXXXX.AAA");
desktop.setOs(Desktop.Os.WINDOWS_7_HOME_PREMIUM_64);
desktop.setMemory(6144);
desktop.setCpu(cpus.get(0));
desktop.setGpu(gpus.get(0));
desktop.setExtras(ProductSpec.Extra.PS_2, ProductSpec.Extra.E_SATA);
desktop.setVideoPorts(EnumSet.of(BasicSpec.VideoPort.DISPLAY_PORT, BasicSpec.VideoPort.HDMI, BasicSpec.VideoPort.DVI));
desktop.setColor(BasicSpec.Color.RED);
desktop.setComment("Iss mal'n cooler PC dieser supermegacore delacrux");
desktop.add(Hdd.ROTATING_1000);
desktop.add(Hdd.SSD_0064);
desktop.add(Odd.DVD_SUPER_MULTI);
desktop.add(Odd.BLURAY_COMBO);
specs.put(desktop.getPartNo(), desktop);
notebook = new Notebook();
notebook.setPartNo("LX.12345.AAB");
notebook.setDisplay(new Display(Display.Size._18_4, Display.Resolution.FULL_HD, Display.Type.CRYSTAL_BRIGHT, Display.Ration.SIXTEEN_TO_NINE));
notebook.setOs(Os.WINDOWS_7_HOME_PREMIUM_64);
notebook.setCpu(cpus.get(2));
notebook.setGpu(gpus.get(3));
notebook.setMemory(1024);
notebook.setExtras(Extra.BLUETOOTH, Extra.WLAN_TO_N, Extra.KAMERA, Extra.CARD_READER);
notebook.add(Hdd.ROTATING_0500);
notebook.add(Odd.DVD_SUPER_MULTI);
notebook.setColor(BasicSpec.Color.RED);
specs.put(notebook.getPartNo(), notebook);
allInOne = new AllInOne();
allInOne.setPartNo("PB.XXXXA.123");
allInOne.setDisplay(new Display(Display.Size._18_4, Display.Resolution.FULL_HD, Display.Type.CRYSTAL_BRIGHT, Display.Ration.SIXTEEN_TO_NINE));
allInOne.setOs(Os.WINDOWS_7_HOME_PREMIUM_64);
allInOne.setCpu(cpus.get(2));
allInOne.setGpu(gpus.get(3));
allInOne.setMemory(1024);
allInOne.setExtras(Extra.CARD_READER, Extra.FINGER_SCANNER, Extra.SPEAKERS);
allInOne.add(Hdd.SSD_0016);
allInOne.add(Odd.BLURAY_SUPER_MULTI);
allInOne.setColor(BasicSpec.Color.ORANGE);
specs.put(allInOne.getPartNo(), allInOne);
}
public SpecAgent getSpecAgentStub() {
return new SpecAgent() {
@Override
public ProductSpec findProductSpecByPartNoEager(String partNo) {
return specs.get(partNo);
}
@Override
public <T> long count(Class<T> entityClass) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public <T> List<T> findAll(Class<T> entityClass) {
if ( entityClass.equals(Cpu.class) ) return (List<T>)cpus;
if ( entityClass.equals(Gpu.class) ) return (List<T>)gpus;
if ( entityClass.equals(ProductSeries.class) ) return (List<T>)new ArrayList<>(serieses);
if ( entityClass.equals(ProductSpec.class) ) return (List<T>)specs;
return null;
}
@Override
public <T> List<T> findAll(Class<T> entityClass, int start, int amount) {
return findAll(entityClass);
}
@Override
public <T> List<T> findAllEager(Class<T> entityClass) {
return findAll(entityClass);
}
@Override
public <T> List<T> findAllEager(Class<T> entityClass, int start, int amount) {
return findAll(entityClass);
}
@Override
public <T> T findById(Class<T> entityClass, Object id) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public <T> T findById(Class<T> entityClass, Object id, LockModeType lockModeType) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public <T> T findByIdEager(Class<T> entityClass, Object id) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public <T> T findByIdEager(Class<T> entityClass, Object id, LockModeType lockModeType) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
};
}
@Override
public ProductSpec create(ProductSpec spec, ProductModel model) {
specs.put(spec.getPartNo(), spec);
return spec;
}
@Override
public ProductSpec refresh(ProductSpec spec, ProductModel model) throws IllegalArgumentException {
spec.setModel(model);
return spec;
}
@Override
public ProductSpec update(ProductSpec spec) {
return spec;
}
@Override
public Cpu create(Cpu newCpu) {
System.out.println("create " + newCpu);
cpus.add(newCpu);
return newCpu;
}
@Override
public Cpu update(Cpu newCpu) {
System.out.println("update " + newCpu);
// nothing to do, should be the same instance.
return newCpu;
}
@Override
public Gpu create(Gpu newGpu) {
System.out.println("create " + newGpu);
return newGpu;
}
@Override
public Gpu update(Gpu newGpu) {
System.out.println("update " + newGpu);
// nothing to do, should be the same instance.
return newGpu;
}
/**
* Creates a new ProductModel and Persists it.
*
* How this works: If series is null, family is also as null asumed. - so a default series and a default family is selected. If family is null, a default
* one is selecte at the series. In both cases, if no default exists, create on. Now create a ProductModel with the family.
*
* @param brand may not be null
* @param group may not be null
* @param series if null, default is used
* @param family if null, default is used
* @param modelName the name of the model
* @return
*/
@Override
public ProductModel create(final TradeName brand, final ProductGroup group, ProductSeries series, ProductFamily family, final String modelName) {
if ( series == null ) { // implies, that family is also null
for (ProductSeries s : serieses) {
if ( s.getBrand().equals(brand) && s.getGroup().equals(group) && s.getName().equals(SpecPu.DEFAULT_NAME) ) {
series = s;
}
}
if ( series == null ) {
series = soc.newProductSeries(brand, group, SpecPu.DEFAULT_NAME);
serieses.add(series);
}
}
if ( family == null ) {
for (ProductFamily f : series.getFamilys()) {
if ( f.getName().equals(SpecPu.DEFAULT_NAME) ) {
family = f;
}
}
if ( family == null ) {
family = soc.newProductFamily();
family.setName(SpecPu.DEFAULT_NAME);
series.addFamily(family);
}
}
// TODO: Check if name exists, just to be sure
ProductModel model = soc.newProductModel();
model.setName(modelName);
model.setFamily(family);
return model;
}
@Override
public ProductFamily create(TradeName brand, ProductGroup group, ProductSeries series, String familyName) {
if ( series == null ) {
for (ProductSeries s : serieses) {
if ( s.getBrand().equals(brand) && s.getGroup().equals(group) && s.getName().equals(SpecPu.DEFAULT_NAME) ) {
series = s;
}
}
if ( series == null ) {
series = soc.newProductSeries(brand, group, SpecPu.DEFAULT_NAME);
serieses.add(series);
}
}
// TODO: Check if name exists, just to be sure
ProductFamily family = soc.newProductFamily();
family.setName(familyName);
family.setSeries(series);
return family;
}
}