/*
* 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.spec.entity;
import java.util.*;
import javax.persistence.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.*;
import eu.ggnet.dwoss.spec.entity.ProductSpec.Extra;
import eu.ggnet.dwoss.spec.entity.piece.Cpu;
import eu.ggnet.dwoss.spec.entity.piece.Gpu;
import eu.ggnet.dwoss.util.INoteModel;
import static eu.ggnet.dwoss.spec.entity.ProductSpec.Extra.*;
import static javax.persistence.CascadeType.*;
/**
* Represents a {@link Desktop} computer.
* <p>
* @has 1 - n Cpu
* @has 1 - n Gpu
* @has n - m Desktop.Hdd
* @has n - m Desktop.Odd
* @has 1 - n Desktop.Os
*/
@Entity
public class Desktop extends BasicSpec {
/**
* Allowed values for Memory Size.
*/
public final static Integer[] MEMORY_SIZES = {0, 512, 1024, 2048, 3072, 4096, 5120, 6144,
7268, 8192, 10240, 12288, 16384, 24576, 32768, 65536};
public static enum OsCategory {
MISC(
Os.LINUX,
Os.FREE_DOS,
Os.ANDROID,
Os.CHROME_OS,
Os.I_OS,
Os.MAC_OS_X,
Os.WINDOWS_HOME_SERVER,
Os.WINDOWS_XP_PROFESSIONAL,
Os.WINDOWS_XP_PROFESSIONAL_64,
Os.WINDOWS_XP_HOME,
Os.WINDOWS_XP_TABLET_PC,
Os.WINDOWS_XP_MEDIA_CENTER_EDITION,
Os.WINDOWS_VISTA_HOME_BASIC_32,
Os.WINDOWS_VISTA_HOME_PREMIUM_32,
Os.WINDOWS_VISTA_HOME_PREMIUM_64,
Os.WINDOWS_VISTA_BUSINESS_32,
Os.WINDOWS_VISTA_ULTIMATE_32),
WINDOWS_7(
Os.WINDOWS_7_STARTER_32,
Os.WINDOWS_7_HOME_BASIC_32,
Os.WINDOWS_7_HOME_PREMIUM_32,
Os.WINDOWS_7_HOME_PREMIUM_64,
Os.WINDOWS_7_PROFESSIONAL_32,
Os.WINDOWS_7_PROFESSIONAL_64,
Os.WINDOWS_7_ULTIMATE_32,
Os.WINDOWS_7_ULTIMATE_64,
Os.WINDOWS_7_EMBEDDED),
WINDOWS_8(
Os.WINDOWS_8_RT,
Os.WINDOWS_8_32,
Os.WINDOWS_8_64,
Os.WINDOWS_8_PROFESSIONAL_32,
Os.WINDOWS_8_PROFESSIONAL_64,
Os.WINDOWS_8_1_32,
Os.WINDOWS_8_1_64,
Os.WINDOWS_8_1_PROFESSIONAL_32,
Os.WINDOWS_8_1_PROFESSIONAL_64),
WINDOWS_10(
Os.WINDOWS_10_HOME_32,
Os.WINDOWS_10_HOME_64,
Os.WINDOWS_10_PRO_32,
Os.WINDOWS_10_PRO_64);
private Os[] oss;
private OsCategory(Os... oss) {
this.oss = oss;
}
public Os[] getOss() {
return oss;
}
}
/**
*
* @has 1 - n Desktop.OsCategory
*/
public static enum Os implements INoteModel {
LINUX("Linux"),
WINDOWS_XP_HOME("Windows XP Home"),
WINDOWS_XP_PROFESSIONAL("Windows XP Professional"),
WINDOWS_XP_TABLET_PC("Windows XP Tablet PC Edition"),
WINDOWS_XP_PROFESSIONAL_64("Windows XP Professional 64"),
WINDOWS_XP_MEDIA_CENTER_EDITION("Windows XP Media Center Edition"),
WINDOWS_VISTA_HOME_BASIC_32("Windows Vista Home Basic 32"),
WINDOWS_VISTA_HOME_PREMIUM_32("Windows Vista Home Premium 32"),
WINDOWS_VISTA_HOME_PREMIUM_64("Windows Vista Home Premium 64"),
WINDOWS_VISTA_BUSINESS_32("Windows Vista Business 32"),
WINDOWS_VISTA_ULTIMATE_32("Windows Vista Ultimate 32"),
WINDOWS_7_HOME_PREMIUM_32("Windows 7 Home Premium 32"),
WINDOWS_7_HOME_PREMIUM_64("Windows 7 Home Premium 64"),
WINDOWS_7_HOME_BASIC_32("Windows 7 Home basic 32"),
WINDOWS_7_STARTER_32("Windows 7 Starter"),
WINDOWS_7_PROFESSIONAL_32("Windows 7 Professional 32"),
WINDOWS_7_PROFESSIONAL_64("Windows 7 Professional 64"),
WINDOWS_7_ULTIMATE_32("Windows 7 Ultimate 32"),
WINDOWS_7_ULTIMATE_64("Windows 7 Ultimate 64"),
FREE_DOS("FreeDos"),
ANDROID("Android"),
WINDOWS_HOME_SERVER("Windows Home Server"),
WINDOWS_8_RT("Windows 8 RT"),
WINDOWS_8_32("Windows 8 32"),
WINDOWS_8_64("Windows 8 64"),
WINDOWS_8_PROFESSIONAL_32("Windows 8 Professional 32"),
WINDOWS_8_PROFESSIONAL_64("Windows 8 Professional 64"),
CHROME_OS("Chrome OS"),
I_OS("iOS"),
MAC_OS_X("Mac OS X"),
WINDOWS_8_1_64("Windows 8.1 64"),
WINDOWS_8_1_32("Windows 8.1 32"),
WINDOWS_7_EMBEDDED("Windows 7 Embedded Standard"),
WINDOWS_10_HOME_32("Windows 10 Home 32"),
WINDOWS_10_HOME_64("Windows 10 Home 64"),
WINDOWS_10_PRO_32("Windows 10 Professional 32"),
WINDOWS_10_PRO_64("Windows 10 Professional 64"),
WINDOWS_8_1_PROFESSIONAL_32("Windows 8.1 Professional 32"),
WINDOWS_8_1_PROFESSIONAL_64("Windows 8.1 Professional 64");
private final String note;
private final double economicValue;
private Os(String note) {
this(note, 0);
}
private Os(String note, double economicValue) {
this.note = note;
this.economicValue = economicValue;
}
@Override
public String getNote() {
return note;
}
public double getEconomicValue() {
return economicValue;
}
public OsCategory getCategory() {
for (OsCategory osCategory : OsCategory.values()) {
for (Os os1 : osCategory.getOss()) {
if ( os1.equals(this) ) return osCategory;
}
}
throw new RuntimeException(this + " has no Category");
}
}
public static enum Odd implements INoteModel {
DVD_SUPER_MULTI("DVD Super Multi"),
DVD_ROM("DVD-ROM"),
BLURAY_COMBO("Blu-Ray Combo"),
BLURAY_SUPER_MULTI("Blu-Ray Super Multi");
private String note;
private final double economicValue;
private Odd(String note) {
this(note, 0);
}
private Odd(String note, double economicValue) {
this.note = note;
this.economicValue = economicValue;
}
public double getEconomicValue() {
return economicValue;
}
@Override
public String getNote() {
return note;
}
}
/**
* @has 1 - n Desktop.Hdd.Type
*/
public static enum Hdd implements INoteModel {
SSD_0008(Type.SSD, 8, "8GB SSD"),
SSD_0016(Type.SSD, 16, "16GB SSD"),
SSD_0020(Type.SSD, 20, "20GB SSD"),
SSD_0032(Type.SSD, 32, "32GB SSD"),
SSD_0060(Type.SSD, 60, "60GB SSD"),
SSD_0064(Type.SSD, 64, "64GB SSD"),
SSD_0080(Type.SSD, 80, "80GB SSD"),
SSD_0090(Type.SSD, 90, "90GB SSD"),
SSD_0120(Type.SSD, 120, "120GB SSD"),
SSD_0128(Type.SSD, 128, "128GB SSD"),
SSD_0160(Type.SSD, 160, "160GB SSD"),
SSD_0256(Type.SSD, 256, "256GB SSD"),
SSD_0512(Type.SSD, 512, "512GB SSD"),
ROTATING_0080(Type.ROTATING, 80, "80GB HDD"),
ROTATING_0120(Type.ROTATING, 120, "120GB HDD"),
ROTATING_0160(Type.ROTATING, 160, "160GB HDD"),
ROTATING_0250(Type.ROTATING, 250, "250GB HDD"),
ROTATING_0320(Type.ROTATING, 320, "320GB HDD"),
ROTATING_0500(Type.ROTATING, 500, "500GB HDD"),
ROTATING_0640(Type.ROTATING, 640, "640GB HDD"),
ROTATING_0750(Type.ROTATING, 750, "750GB HDD"),
ROTATING_1000(Type.ROTATING, 1000, "1000GB HDD"),
ROTATING_1500(Type.ROTATING, 1500, "1500GB HDD"),
ROTATING_2000(Type.ROTATING, 2000, "2000GB HDD"),
ROTATING_3000(Type.ROTATING, 3000, "3000GB HDD"),
SSD_0240(Type.SSD, 240, "240GB SSD"),
SSD_0004(Type.SSD, 4, "4GB SSD"),
SSD_0096(Type.SSD, 96, "96GB SSD");
public static enum Type {
SSD, ROTATING
}
public static Set<Hdd> getByType(Type type) {
if ( type == null ) return EnumSet.noneOf(Hdd.class);
Set<Hdd> result = EnumSet.noneOf(Hdd.class);
for (Hdd hdd : Hdd.values()) {
if ( hdd.getType() == type ) result.add(hdd);
}
return result;
}
private Type type;
private int size;
private String note;
private final double economicValue;
private Hdd(Type type, int size, String note) {
this(type, size, note, 0);
}
private Hdd(Type type, int size, String note, double economicValue) {
this.type = type;
this.size = size;
this.note = note;
this.economicValue = economicValue;
}
public Type getType() {
return type;
}
public int getSize() {
return size;
}
public double getEconomicValue() {
return economicValue;
}
@Override
public String getNote() {
return note;
}
}
@XmlAttribute
private Os os;
@NotNull
@Valid
@ManyToOne(cascade = {DETACH, MERGE, REFRESH, PERSIST}, optional = false)
private Cpu cpu;
@XmlElement(name = "hdd")
@XmlElementWrapper
@NotNull
@ElementCollection
private List<Hdd> hdds = new ArrayList<>();
@XmlElement(name = "odd")
@XmlElementWrapper
@NotNull
@ElementCollection
private List<Odd> odds = new ArrayList<>();
@NotNull
@Valid
@ManyToOne(cascade = {DETACH, MERGE, REFRESH, PERSIST}, optional = false)
private Gpu gpu;
@XmlAttribute
private int memory;
public Desktop(String partNo, Long productId) {
super(partNo, productId);
}
public Desktop() {
this(null, null, null, null, null, 0, null);
}
public Desktop(Os os, Cpu cpu, List<Hdd> hdds, Gpu gpu, List<Odd> odds, int memory, Set<Extra> extras) {
this.hdds = new ArrayList<>();
this.odds = new ArrayList<>();
this.os = os;
this.cpu = cpu;
this.gpu = gpu;
this.memory = memory;
if ( hdds != null ) {
this.hdds.addAll(hdds);
}
if ( odds != null ) {
this.odds.addAll(odds);
}
if ( extras != null ) {
setExtras(extras);
}
}
@Override
public Set<Extra> getDefaultExtras() {
return EnumSet.of(CARD_READER, E_SATA, PS_2, SPEAKERS, USB_3, WLAN_TO_N, WLAN_TO_G, MEDIA_STATION, TV_TUNER, INFRARED_RESCEIVER, DUAL_LOAD,
BLUETOOTH, THUNDERBOLT, LIGHTNING, WLAN_AC, USB_TYPE_C);
}
public Cpu getCpu() {
return cpu;
}
public Desktop setCpu(Cpu cpu) {
this.cpu = cpu;
return this;
}
public Gpu getGpu() {
return gpu;
}
public void setGpu(Gpu graphics) {
this.gpu = graphics;
}
public List<Hdd> getHdds() {
return Collections.unmodifiableList(hdds);
}
public List<Odd> getOdds() {
return Collections.unmodifiableList(odds);
}
public void setHdds(List<Hdd> hdds) {
this.hdds = hdds;
}
public void setOdds(List<Odd> odds) {
this.odds = odds;
}
public void add(Hdd hdd) {
hdds.add(hdd);
}
public void add(Odd odd) {
odds.add(odd);
}
public void remove(Hdd hdd) {
hdds.remove(hdd);
}
public void remove(Odd odd) {
odds.remove(odd);
}
public int getMemory() {
return memory;
}
public void setMemory(int memory) {
this.memory = memory;
}
public Os getOs() {
return os;
}
public void setOs(Os os) {
this.os = os;
}
@Override
public String toString() {
return "Desktop{" + super.toString() + ",os=" + os + ", cpu=" + cpu + ", hdds=" + hdds
+ ", odds=" + odds + ", gpu=" + gpu + ", memory=" + memory + '}';
}
// Eager init off collections.
@PostLoad
private void loadCollections() {
hdds.size();
odds.size();
}
}