#503 : modify admin pages

This commit is contained in:
Shinsuke Sugaya 2016-05-12 20:36:37 +09:00
parent db23c7b745
commit a3c1570280
12 changed files with 87 additions and 177 deletions

View file

@ -18,8 +18,6 @@ package org.codelibs.fess.app.web.admin.dict.seunjeon;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
@ -34,6 +32,7 @@ import org.codelibs.fess.app.web.admin.dict.AdminDictAction;
import org.codelibs.fess.app.web.base.FessAdminAction;
import org.codelibs.fess.dict.seunjeon.SeunjeonItem;
import org.codelibs.fess.util.RenderDataUtil;
import org.codelibs.fess.util.StreamUtil;
import org.dbflute.optional.OptionalEntity;
import org.dbflute.optional.OptionalThing;
import org.lastaflute.web.Execute;
@ -45,6 +44,7 @@ import org.lastaflute.web.validation.VaErrorHook;
/**
* @author nocode
* @author shinsuke
*/
public class AdminDictSeunjeonAction extends FessAdminAction {
@ -144,7 +144,6 @@ public class AdminDictSeunjeonAction extends FessAdminAction {
.getSeunjeonItem(form.dictId, form.id)
.ifPresent(entity -> {
form.inputs = entity.getInputsValue();
form.outputs = entity.getOutputsValue();
})
.orElse(() -> {
throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.getDisplayId()),
@ -176,7 +175,6 @@ public class AdminDictSeunjeonAction extends FessAdminAction {
.getSeunjeonItem(dictId, id)
.ifPresent(entity -> {
form.inputs = entity.getInputsValue();
form.outputs = entity.getOutputsValue();
})
.orElse(() -> {
throwValidationError(
@ -321,7 +319,7 @@ public class AdminDictSeunjeonAction extends FessAdminAction {
private OptionalEntity<SeunjeonItem> getEntity(final CreateForm form) {
switch (form.crudMode) {
case CrudMode.CREATE:
final SeunjeonItem entity = new SeunjeonItem(0, StringUtil.EMPTY_STRINGS, StringUtil.EMPTY_STRINGS);
final SeunjeonItem entity = new SeunjeonItem(0, StringUtil.EMPTY_STRINGS);
return OptionalEntity.of(entity);
case CrudMode.EDIT:
if (form instanceof EditForm) {
@ -339,9 +337,6 @@ public class AdminDictSeunjeonAction extends FessAdminAction {
final String[] newInputs = splitLine(form.inputs);
validateSeunjeonString(newInputs, "inputs", hook);
entity.setNewInputs(newInputs);
final String[] newOutputs = splitLine(form.outputs);
validateSeunjeonString(newOutputs, "outputs", hook);
entity.setNewOutputs(newOutputs);
return entity;
});
}
@ -361,32 +356,14 @@ public class AdminDictSeunjeonAction extends FessAdminAction {
if (values.length == 0) {
return;
}
for (final String value : values) {
if (value.indexOf(',') >= 0) {
throwValidationError(messages -> {
messages.addErrorsInvalidStrIsIncluded(propertyName, value, ",");
}, hook);
}
if (value.indexOf("=>") >= 0) {
throwValidationError(messages -> {
messages.addErrorsInvalidStrIsIncluded(propertyName, value, "=>");
}, hook);
}
}
// TODO validation
}
private String[] splitLine(final String value) {
if (StringUtil.isBlank(value)) {
return StringUtil.EMPTY_STRINGS;
}
final String[] values = value.split("[\r\n]");
final List<String> list = new ArrayList<>(values.length);
for (final String line : values) {
if (StringUtil.isNotBlank(line)) {
list.add(line.trim());
}
}
return list.toArray(new String[list.size()]);
return StreamUtil.of(value.split(",")).filter(s -> StringUtil.isNotBlank(s)).map(s -> s.trim()).toArray(n -> new String[n]);
}
// ===================================================================================

View file

@ -40,10 +40,6 @@ public class CreateForm implements Serializable {
@Size(max = 1000)
public String inputs;
@Required
@Size(max = 1000)
public String outputs;
public void initialize() {
crudMode = CrudMode.CREATE;
}

View file

@ -107,7 +107,6 @@ public class SeunjeonFile extends DictionaryFile<SeunjeonItem> {
public synchronized void delete(final SeunjeonItem item) {
final SeunjeonItem SeunjeonItem = item;
SeunjeonItem.setNewInputs(StringUtil.EMPTY_STRINGS);
SeunjeonItem.setNewOutputs(StringUtil.EMPTY_STRINGS);
try (SynonymUpdater updater = new SynonymUpdater(item)) {
reload(updater, null);
}
@ -127,60 +126,24 @@ public class SeunjeonFile extends DictionaryFile<SeunjeonItem> {
continue; // ignore empty lines and comments
}
String inputs[];
String outputs[];
final List<String> inputStrings = split(line, ",");
String[] inputs = new String[inputStrings.size()];
for (int i = 0; i < inputs.length; i++) {
inputs[i] = unescape(inputStrings.get(i)).trim();
}
final List<String> sides = split(line, "=>");
if (sides.size() > 1) { // explicit mapping
if (sides.size() != 2) {
throw new DictionaryException("more than one explicit mapping specified on the same line");
}
final List<String> inputStrings = split(sides.get(0), ",");
inputs = new String[inputStrings.size()];
for (int i = 0; i < inputs.length; i++) {
inputs[i] = unescape(inputStrings.get(i)).trim();
}
final List<String> outputStrings = split(sides.get(1), ",");
outputs = new String[outputStrings.size()];
for (int i = 0; i < outputs.length; i++) {
outputs[i] = unescape(outputStrings.get(i)).trim();
}
if (inputs.length > 0 && outputs.length > 0) {
id++;
final SeunjeonItem item = new SeunjeonItem(id, inputs, outputs);
if (updater != null) {
final SeunjeonItem newItem = updater.write(item);
if (newItem != null) {
itemList.add(newItem);
} else {
id--;
}
if (inputs.length > 0) {
id++;
final SeunjeonItem item = new SeunjeonItem(id, inputs);
if (updater != null) {
final SeunjeonItem newItem = updater.write(item);
if (newItem != null) {
itemList.add(newItem);
} else {
itemList.add(item);
}
}
} else {
final List<String> inputStrings = split(line, ",");
inputs = new String[inputStrings.size()];
for (int i = 0; i < inputs.length; i++) {
inputs[i] = unescape(inputStrings.get(i)).trim();
}
if (inputs.length > 0) {
id++;
final SeunjeonItem item = new SeunjeonItem(id, inputs, inputs);
if (updater != null) {
final SeunjeonItem newItem = updater.write(item);
if (newItem != null) {
itemList.add(newItem);
} else {
id--;
}
} else {
itemList.add(item);
id--;
}
} else {
itemList.add(item);
}
}
}
@ -297,13 +260,12 @@ public class SeunjeonFile extends DictionaryFile<SeunjeonItem> {
// update
writer.write(item.toLineString());
writer.write(Constants.LINE_SEPARATOR);
return new SeunjeonItem(item.getId(), item.getNewInputs(), item.getNewOutputs());
return new SeunjeonItem(item.getId(), item.getNewInputs());
} else {
return null;
}
} finally {
item.setNewInputs(null);
item.setNewOutputs(null);
}
} else {
throw new DictionaryException("Seunjeon file was updated: old=" + oldItem + " : new=" + item);

View file

@ -24,25 +24,15 @@ import org.codelibs.fess.dict.DictionaryItem;
public class SeunjeonItem extends DictionaryItem {
private final String[] inputs;
private final String[] outputs;
private String[] newInputs;
private String[] newOutputs;
public SeunjeonItem(final long id, final String[] inputs, final String[] outputs) {
public SeunjeonItem(final long id, final String[] inputs) {
this.id = id;
this.inputs = inputs;
this.outputs = outputs;
Arrays.sort(inputs);
if (inputs != outputs) {
Arrays.sort(outputs);
}
if (id == 0) {
// create
newInputs = inputs;
newOutputs = outputs;
}
}
@ -54,14 +44,6 @@ public class SeunjeonItem extends DictionaryItem {
this.newInputs = newInputs;
}
public String[] getNewOutputs() {
return newOutputs;
}
public void setNewOutputs(final String[] newOutputs) {
this.newOutputs = newOutputs;
}
public String[] getInputs() {
return inputs;
}
@ -70,49 +52,22 @@ public class SeunjeonItem extends DictionaryItem {
if (inputs == null) {
return StringUtil.EMPTY;
}
return String.join("\n", inputs);
}
public String[] getOutputs() {
return outputs;
}
public String getOutputsValue() {
if (outputs == null) {
return StringUtil.EMPTY;
}
return String.join("\n", outputs);
return String.join(",", inputs);
}
public boolean isUpdated() {
return newInputs != null && newOutputs != null;
return newInputs != null;
}
public boolean isDeleted() {
return isUpdated() && newInputs.length == 0;
}
public void sort() {
if (inputs != null) {
Arrays.sort(inputs);
}
if (outputs != null) {
Arrays.sort(outputs);
}
if (newInputs != null) {
Arrays.sort(newInputs);
}
if (newOutputs != null) {
Arrays.sort(newOutputs);
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(inputs);
result = prime * result + Arrays.hashCode(outputs);
return result;
}
@ -128,36 +83,22 @@ public class SeunjeonItem extends DictionaryItem {
return false;
}
final SeunjeonItem other = (SeunjeonItem) obj;
sort();
other.sort();
if (!Arrays.equals(inputs, other.inputs)) {
return false;
}
if (!Arrays.equals(outputs, other.outputs)) {
return false;
}
return true;
}
@Override
public String toString() {
return "SynonymItem [id=" + id + ", inputs=" + Arrays.toString(inputs) + ", outputs=" + Arrays.toString(outputs) + ", newInputs="
+ Arrays.toString(newInputs) + ", newOutputs=" + Arrays.toString(newOutputs) + "]";
return "SynonymItem [id=" + id + ", inputs=" + Arrays.toString(inputs) + ", newInputs=" + Arrays.toString(newInputs) + "]";
}
public String toLineString() {
if (isUpdated()) {
if (Arrays.equals(newInputs, newOutputs)) {
return StringUtils.join(newInputs, ",");
} else {
return StringUtils.join(newInputs, ",") + "=>" + StringUtils.join(newOutputs, ",");
}
return StringUtils.join(newInputs, ",");
} else {
if (Arrays.equals(inputs, outputs)) {
return StringUtils.join(inputs, ",");
} else {
return StringUtils.join(inputs, ",") + "=>" + StringUtils.join(outputs, ",");
}
return StringUtils.join(inputs, ",");
}
}

View file

@ -1755,6 +1755,45 @@ public class FessLabels extends ActionMessages {
/** The key of the message: Synonym File */
public static final String LABELS_dict_synonym_file = "{labels.dict_synonym_file}";
/** The key of the message: Seunjeon List */
public static final String LABELS_dict_seunjeon_configuration = "{labels.dict_seunjeon_configuration}";
/** The key of the message: Seunjeon List */
public static final String LABELS_dict_seunjeon_title = "{labels.dict_seunjeon_title}";
/** The key of the message: List */
public static final String LABELS_dict_seunjeon_list_link = "{labels.dict_seunjeon_list_link}";
/** The key of the message: Create New */
public static final String LABELS_dict_seunjeon_link_create = "{labels.dict_seunjeon_link_create}";
/** The key of the message: Edit */
public static final String LABELS_dict_seunjeon_link_edit = "{labels.dict_seunjeon_link_edit}";
/** The key of the message: Delete */
public static final String LABELS_dict_seunjeon_link_delete = "{labels.dict_seunjeon_link_delete}";
/** The key of the message: Details */
public static final String LABELS_dict_seunjeon_link_details = "{labels.dict_seunjeon_link_details}";
/** The key of the message: Download */
public static final String LABELS_dict_seunjeon_link_download = "{labels.dict_seunjeon_link_download}";
/** The key of the message: Upload */
public static final String LABELS_dict_seunjeon_link_upload = "{labels.dict_seunjeon_link_upload}";
/** The key of the message: Source */
public static final String LABELS_dict_seunjeon_source = "{labels.dict_seunjeon_source}";
/** The key of the message: Download */
public static final String LABELS_dict_seunjeon_button_download = "{labels.dict_seunjeon_button_download}";
/** The key of the message: Upload */
public static final String LABELS_dict_seunjeon_button_upload = "{labels.dict_seunjeon_button_upload}";
/** The key of the message: Seunjeon File */
public static final String LABELS_dict_seunjeon_file = "{labels.dict_seunjeon_file}";
/** The key of the message: Kuromoji List */
public static final String LABELS_dict_kuromoji_configuration = "{labels.dict_kuromoji_configuration}";

View file

@ -575,6 +575,19 @@ labels.dict_synonym_target=Target
labels.dict_synonym_button_download=Download
labels.dict_synonym_button_upload=Upload
labels.dict_synonym_file=Synonym File
labels.dict_seunjeon_configuration = Seunjeon List
labels.dict_seunjeon_title = Seunjeon List
labels.dict_seunjeon_list_link = List
labels.dict_seunjeon_link_create = Create New
labels.dict_seunjeon_link_edit = Edit
labels.dict_seunjeon_link_delete = Delete
labels.dict_seunjeon_link_details = Details
labels.dict_seunjeon_link_download = Download
labels.dict_seunjeon_link_upload = Upload
labels.dict_seunjeon_source = Source
labels.dict_seunjeon_button_download = Download
labels.dict_seunjeon_button_upload = Upload
labels.dict_seunjeon_file = Seunjeon File
labels.dict_kuromoji_configuration=Kuromoji List
labels.dict_kuromoji_title=Kuromoji List
labels.dict_kuromoji_list_link=List

View file

@ -585,7 +585,6 @@ labels.dict_seunjeon_link_details = Details
labels.dict_seunjeon_link_download = Download
labels.dict_seunjeon_link_upload = Upload
labels.dict_seunjeon_source = Source
labels.dict_seunjeon_target = Target
labels.dict_seunjeon_button_download = Download
labels.dict_seunjeon_button_upload = Upload
labels.dict_seunjeon_file = Seunjeon File

View file

@ -571,8 +571,8 @@ labels.dict_synonym_target=\u5909\u63db\u5f8c
labels.dict_synonym_button_download=\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9
labels.dict_synonym_button_upload=\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9
labels.dict_synonym_file=\u540c\u7fa9\u8a9e\u30d5\u30a1\u30a4\u30eb
labels.dict_seunjeon_configuration = Seunjeon\u4e00\u89a7
labels.dict_seunjeon_title = Seunjeon\u4e00\u89a7
labels.dict_seunjeon_configuration = Seunjeon\u5358\u8a9e\u4e00\u89a7
labels.dict_seunjeon_title = Seunjeon\u5358\u8a9e\u4e00\u89a7
labels.dict_seunjeon_list_link = \u4e00\u89a7
labels.dict_seunjeon_link_create = \u65b0\u898f\u4f5c\u6210
labels.dict_seunjeon_link_edit = \u7de8\u96c6
@ -580,13 +580,12 @@ labels.dict_seunjeon_link_delete = \u524a\u9664
labels.dict_seunjeon_link_details = \u8a73\u7d30
labels.dict_seunjeon_link_download = \u30c0\u30a6\u30f3\u30ed\u30fc\u30c9
labels.dict_seunjeon_link_upload = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9
labels.dict_seunjeon_source = \u5909\u63db\u5143
labels.dict_seunjeon_target = \u5909\u63db\u5f8c
labels.dict_seunjeon_source = \u5358\u8a9e\u60c5\u5831
labels.dict_seunjeon_button_download = \u30c0\u30a6\u30f3\u30ed\u30fc\u30c9
labels.dict_seunjeon_button_upload = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9
labels.dict_seunjeon_file = Seunjeon\u30d5\u30a1\u30a4\u30eb
labels.dict_kuromoji_configuration=Kuromoji\u4e00\u89a7
labels.dict_kuromoji_title=Kuromoji\u4e00\u89a7
labels.dict_kuromoji_configuration=Kuromoji\u5358\u8a9e\u4e00\u89a7
labels.dict_kuromoji_title=Kuromoji\u5358\u8a9e\u4e00\u89a7
labels.dict_kuromoji_list_link=\u4e00\u89a7
labels.dict_kuromoji_link_create=\u65b0\u898f\u4f5c\u6210
labels.dict_kuromoji_link_edit=\u7de8\u96c6

View file

@ -580,7 +580,6 @@ labels.dict_seunjeon_link_details = \uc0c1\uc138
labels.dict_seunjeon_link_download = \ub2e4\uc6b4\ub85c\ub4dc
labels.dict_seunjeon_link_upload = \uc5c5\ub85c\ub4dc
labels.dict_seunjeon_source = \uc6d0\ubcf8
labels.dict_seunjeon_target = \ubcc0\ud658 \ud6c4
labels.dict_seunjeon_button_download = \ub2e4\uc6b4\ub85c\ub4dc
labels.dict_seunjeon_button_upload = \uc5c5\ub85c\ub4dc
labels.dict_seunjeon_file = Seunjeon \ud30c\uc77c

View file

@ -85,7 +85,6 @@
<thead>
<tr>
<th><la:message key="labels.dict_seunjeon_source" /></th>
<th><la:message key="labels.dict_seunjeon_target" /></th>
</tr>
</thead>
<tbody>
@ -93,8 +92,7 @@
items="${seunjeonItemItems}">
<tr
data-href="${contextPath}/admin/dict/seunjeon/details/${f:u(dictId)}/4/${f:u(data.id)}">
<td>${f:h(data.inputs)}</td>
<td>${f:h(data.outputs)}</td>
<td>${f:h(data.inputsValue)}</td>
</tr>
</c:forEach>
</tbody>

View file

@ -99,11 +99,7 @@
<tr>
<th><la:message
key="labels.dict_seunjeon_source" /></th>
<td>${f:br(f:h(inputs))}<la:hidden property="inputs" /></td>
</tr>
<tr>
<th><la:message key="labels.dict_seunjeon_target" /></th>
<td>${f:br(f:h(outputs))}<la:hidden property="outputs" /></td>
<td>${f:h(inputs)}<la:hidden property="inputs" /></td>
</tr>
</tbody>
</table>

View file

@ -96,16 +96,7 @@
key="labels.dict_seunjeon_source" /></label>
<div class="col-sm-9">
<la:errors property="inputs" />
<la:textarea property="inputs" rows="5"
styleClass="form-control" />
</div>
</div>
<div class="form-group">
<label for="outputs" class="col-sm-3 control-label"><la:message
key="labels.dict_seunjeon_target" /></label>
<div class="col-sm-9">
<la:errors property="outputs" />
<la:textarea property="outputs" rows="5"
<la:text property="inputs"
styleClass="form-control" />
</div>
</div>