| | 968 | /** |
|---|
| | 969 | * Zeigt das Eingabefeld fuer das Umbenennen der Schiffe der Flotte |
|---|
| | 970 | * |
|---|
| | 971 | */ |
|---|
| | 972 | @Action(ActionType.DEFAULT) |
|---|
| | 973 | public void renameShipsAction() { |
|---|
| | 974 | TemplateEngine t = getTemplateEngine(); |
|---|
| | 975 | |
|---|
| | 976 | t.setVar( "show.renameShips", 1, |
|---|
| | 977 | "fleet.id", this.fleet.getId(), |
|---|
| | 978 | "fleet.name", Common._plaintitle(this.fleet.getName()) ); |
|---|
| | 979 | } |
|---|
| | 980 | |
|---|
| | 981 | /** |
|---|
| | 982 | * Teil eines Formatierungsstrings fuer Schiffsnamen |
|---|
| | 983 | */ |
|---|
| | 984 | private static interface NamePatternElement { |
|---|
| | 985 | /** |
|---|
| | 986 | * Gibt den Text fuer das naechste Schiff zurueck |
|---|
| | 987 | * @return Der Text |
|---|
| | 988 | */ |
|---|
| | 989 | public String next(); |
|---|
| | 990 | } |
|---|
| | 991 | |
|---|
| | 992 | private static class StringNamePatternElement implements NamePatternElement { |
|---|
| | 993 | private String text; |
|---|
| | 994 | |
|---|
| | 995 | StringNamePatternElement(String text) { |
|---|
| | 996 | this.text = text; |
|---|
| | 997 | } |
|---|
| | 998 | |
|---|
| | 999 | public String next() { |
|---|
| | 1000 | return text; |
|---|
| | 1001 | } |
|---|
| | 1002 | } |
|---|
| | 1003 | |
|---|
| | 1004 | private static class NumberNamePatternElement implements NamePatternElement { |
|---|
| | 1005 | private int counter = 1; |
|---|
| | 1006 | |
|---|
| | 1007 | NumberNamePatternElement() { |
|---|
| | 1008 | // EMPTY |
|---|
| | 1009 | } |
|---|
| | 1010 | |
|---|
| | 1011 | public String next() { |
|---|
| | 1012 | return Integer.toString(counter++); |
|---|
| | 1013 | } |
|---|
| | 1014 | } |
|---|
| | 1015 | |
|---|
| | 1016 | private static class RomanNumberNamePatternElement implements NamePatternElement { |
|---|
| | 1017 | private static final String[] base = { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" }; |
|---|
| | 1018 | private static final String[] tens = { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" }; |
|---|
| | 1019 | private static final String[] hundreds = { "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" }; |
|---|
| | 1020 | private static final String[] thousands = { "", "M", "MM", "MMM" }; |
|---|
| | 1021 | |
|---|
| | 1022 | private int counter = 1; |
|---|
| | 1023 | |
|---|
| | 1024 | RomanNumberNamePatternElement() { |
|---|
| | 1025 | // EMPTY |
|---|
| | 1026 | } |
|---|
| | 1027 | |
|---|
| | 1028 | public String next() { |
|---|
| | 1029 | int number = counter++; |
|---|
| | 1030 | |
|---|
| | 1031 | if( counter == 4000 ) { |
|---|
| | 1032 | counter = 1; |
|---|
| | 1033 | } |
|---|
| | 1034 | |
|---|
| | 1035 | return thousands[ (number / 1000) ] + |
|---|
| | 1036 | hundreds[ (number / 100) % 10 ] + |
|---|
| | 1037 | tens[ (number / 10) % 10 ] + |
|---|
| | 1038 | base[ number % 10 ]; |
|---|
| | 1039 | } |
|---|
| | 1040 | } |
|---|
| | 1041 | |
|---|
| | 1042 | /** |
|---|
| | 1043 | * Konvertiert das angegebene Formatierungsmuster fuer Schiffsnamen in eine Liste |
|---|
| | 1044 | * von <code>NamePatternElements</code>. |
|---|
| | 1045 | * Die Sortierung entspricht ihrem vorkommen im String. |
|---|
| | 1046 | * @param name Der Formatierungsstring |
|---|
| | 1047 | * @return Die Liste |
|---|
| | 1048 | */ |
|---|
| | 1049 | private List<NamePatternElement> parseNamePattern(String name) { |
|---|
| | 1050 | List<NamePatternElement> nameParts = new ArrayList<NamePatternElement>(); |
|---|
| | 1051 | do { |
|---|
| | 1052 | if( name.startsWith("$(") ) { |
|---|
| | 1053 | int end = name.indexOf(')'); |
|---|
| | 1054 | if( end == -1 ) { |
|---|
| | 1055 | nameParts.add(new StringNamePatternElement(name)); |
|---|
| | 1056 | break; |
|---|
| | 1057 | } |
|---|
| | 1058 | |
|---|
| | 1059 | String partName = name.substring(2, end); |
|---|
| | 1060 | |
|---|
| | 1061 | if( "number".equalsIgnoreCase(partName) ) { |
|---|
| | 1062 | nameParts.add(new NumberNamePatternElement()); |
|---|
| | 1063 | } |
|---|
| | 1064 | else if( "roman".equalsIgnoreCase(partName) ) { |
|---|
| | 1065 | nameParts.add(new RomanNumberNamePatternElement()); |
|---|
| | 1066 | } |
|---|
| | 1067 | else { |
|---|
| | 1068 | nameParts.add(new StringNamePatternElement("$("+partName+")")); |
|---|
| | 1069 | } |
|---|
| | 1070 | |
|---|
| | 1071 | if( end == name.length()+1 ) { |
|---|
| | 1072 | break; |
|---|
| | 1073 | } |
|---|
| | 1074 | |
|---|
| | 1075 | name = name.substring(end+1); |
|---|
| | 1076 | } |
|---|
| | 1077 | else { |
|---|
| | 1078 | int index = name.indexOf("$("); |
|---|
| | 1079 | if( index != -1 ) { |
|---|
| | 1080 | nameParts.add(new StringNamePatternElement(name.substring(0,index))); |
|---|
| | 1081 | name = name.substring(index); |
|---|
| | 1082 | } |
|---|
| | 1083 | else { |
|---|
| | 1084 | nameParts.add(new StringNamePatternElement(name)); |
|---|
| | 1085 | break; |
|---|
| | 1086 | } |
|---|
| | 1087 | } |
|---|
| | 1088 | } |
|---|
| | 1089 | while( name.contains("$(") ); |
|---|
| | 1090 | |
|---|
| | 1091 | return nameParts; |
|---|
| | 1092 | } |
|---|
| | 1093 | |
|---|
| | 1094 | /** |
|---|
| | 1095 | * Generiert aus einer Liste von Namensteilen den Gesamtnamen fuer das naechste Schiff |
|---|
| | 1096 | * @param nameParts Die Namensteile |
|---|
| | 1097 | * @return Der Gesamtname |
|---|
| | 1098 | */ |
|---|
| | 1099 | private String generateNextShipName(List<NamePatternElement> nameParts) { |
|---|
| | 1100 | StringBuilder builder = new StringBuilder(); |
|---|
| | 1101 | |
|---|
| | 1102 | for( int i=0; i < nameParts.size(); i++ ) { |
|---|
| | 1103 | builder.append(nameParts.get(i).next()); |
|---|
| | 1104 | } |
|---|
| | 1105 | |
|---|
| | 1106 | return builder.toString(); |
|---|
| | 1107 | } |
|---|
| | 1108 | |
|---|
| | 1109 | /** |
|---|
| | 1110 | * Benennt die Schiffe der Flotte um |
|---|
| | 1111 | * @urlparam String name Das Namensmuster |
|---|
| | 1112 | * |
|---|
| | 1113 | */ |
|---|
| | 1114 | @Action(ActionType.DEFAULT) |
|---|
| | 1115 | public void renameShips2Action() { |
|---|
| | 1116 | org.hibernate.Session db = getDB(); |
|---|
| | 1117 | TemplateEngine t = getTemplateEngine(); |
|---|
| | 1118 | |
|---|
| | 1119 | parameterString("name"); |
|---|
| | 1120 | final String name = getString("name"); |
|---|
| | 1121 | |
|---|
| | 1122 | List<NamePatternElement> nameParts = parseNamePattern(name); |
|---|
| | 1123 | |
|---|
| | 1124 | List ships = db.createQuery("from Ship where id>0 and fleet=?" ) |
|---|
| | 1125 | .setEntity(0, this.fleet) |
|---|
| | 1126 | .list(); |
|---|
| | 1127 | |
|---|
| | 1128 | for( Iterator iter=ships.iterator(); iter.hasNext(); ) { |
|---|
| | 1129 | Ship ship = (Ship)iter.next(); |
|---|
| | 1130 | |
|---|
| | 1131 | ship.setName(generateNextShipName(nameParts)); |
|---|
| | 1132 | } |
|---|
| | 1133 | |
|---|
| | 1134 | t.setVar( "fleetmgnt.message", "Die Namen wurden geändert", |
|---|
| | 1135 | "jscript.reloadmain", 1 ); |
|---|
| | 1136 | |
|---|
| | 1137 | this.redirect(); |
|---|
| | 1138 | } |
|---|
| | 1139 | |
|---|