1 /*
  2  * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.  Oracle designates this
  8  * particular file as subject to the "Classpath" exception as provided
  9  * by Oracle in the LICENSE file that accompanied this code.
 10  *
 11  * This code is distributed in the hope that it will be useful, but WITHOUT
 12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 14  * version 2 for more details (a copy is included in the LICENSE file that
 15  * accompanied this code).
 16  *
 17  * You should have received a copy of the GNU General Public License version
 18  * 2 along with this work; if not, write to the Free Software Foundation,
 19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 20  *
 21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 22  * or visit www.oracle.com if you need additional information or have any
 23  * questions.
 24  */
 25 
 26 package sun.print;
 27 
 28 import java.io.Serial;
 29 import java.util.ArrayList;
 30 import java.util.Objects;
 31 import java.util.Map;
 32 import java.util.HashMap;
 33 
 34 import javax.print.attribute.EnumSyntax;
 35 import javax.print.attribute.standard.Media;
 36 import javax.print.attribute.standard.MediaTray;
 37 
 38 public class CustomMediaTray extends MediaTray {
 39     private static ArrayList<String> customStringTable = new ArrayList<>();
 40     private static ArrayList<MediaTray> customEnumTable = new ArrayList<>();
 41     private static Map<NameChoiceItem, CustomMediaTray> customMap = new HashMap<>();
 42     private String choiceName;
 43 
 44     private CustomMediaTray(int x) {
 45         super(x);
 46 
 47     }
 48 
 49     private static synchronized int nextValue(String name) {
 50       customStringTable.add(name);
 51       return (customStringTable.size()-1);
 52     }
 53 
 54 
 55     public CustomMediaTray(String name, String choice) {
 56         super(nextValue(name));
 57         choiceName = choice;
 58         customEnumTable.add(this);
 59     }
 60 
 61     /**
 62      * Use serialVersionUID from JDK 1.5 for interoperability.
 63      */
 64     @Serial
 65     private static final long serialVersionUID = 1019451298193987013L;
 66 
 67 
 68     /**
 69      * Returns the command string for this media tray.
 70      */
 71     public String getChoiceName() {
 72         return choiceName;
 73     }
 74 
 75 
 76     /**
 77      * Returns the string table for super class MediaTray.
 78      */
 79     public Media[] getSuperEnumTable() {
 80       return (Media[])super.getEnumValueTable();
 81     }
 82 
 83 
 84     /**
 85      * Returns the string table for class CustomMediaTray.
 86      */
 87     protected String[] getStringTable() {
 88       String[] nameTable = new String[customStringTable.size()];
 89       return customStringTable.toArray(nameTable);
 90     }
 91 
 92     /**
 93      * Returns the enumeration value table for class CustomMediaTray.
 94      */
 95     protected EnumSyntax[] getEnumValueTable() {
 96       MediaTray[] enumTable = new MediaTray[customEnumTable.size()];
 97       return customEnumTable.toArray(enumTable);
 98     }
 99 
100     public static CustomMediaTray create(String name, String choice) {
101         NameChoiceItem key = new NameChoiceItem(name, choice);
102         CustomMediaTray value = customMap.get(key);
103         if (value == null) {
104             value = new CustomMediaTray(name, choice);
105             customMap.put(key, value);
106         }
107         return value;
108     }
109 
110     private static class NameChoiceItem {
111 
112         private final String name;
113         private final String choice;
114 
115         public NameChoiceItem(String name, String choice) {
116             this.name = name;
117             this.choice = choice;
118         }
119 
120         public boolean equals(Object object) {
121             if (this == object) return true;
122             if (object == null || getClass() != object.getClass()) return false;
123             NameChoiceItem that = (NameChoiceItem) object;
124             return Objects.equals(this.name, that.name)
125                     && Objects.equals(this.choice, that.choice);
126         }
127 
128         public int hashCode() {
129             return Objects.hash(name, choice);
130         }
131     }
132 }