add EsApiManager, modify error pages and minor fixes

This commit is contained in:
Shinsuke Sugaya 2015-10-17 07:25:53 +09:00
parent 87a28313e3
commit 0eacf8bf21
34 changed files with 405 additions and 903 deletions

View file

@ -63,7 +63,7 @@
<!-- Elasticsearch -->
<elasticsearch.version>1.7.2</elasticsearch.version>
<cluster.runner.version>1.7.0.0</cluster.runner.version>
<cluster.runner.version>1.7.0.1-SNAPSHOT</cluster.runner.version>
<!-- Tomcat -->
<tomcat.boot.version>0.3.7</tomcat.boot.version>

View file

@ -1,17 +1,37 @@
package org.codelibs.fess.api.es;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;
import javax.annotation.Resource;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.codelibs.core.exception.IORuntimeException;
import org.codelibs.core.io.CopyUtil;
import org.codelibs.core.io.InputStreamUtil;
import org.codelibs.core.misc.DynamicProperties;
import org.codelibs.elasticsearch.runner.net.Curl.Method;
import org.codelibs.elasticsearch.runner.net.CurlRequest;
import org.codelibs.fess.Constants;
import org.codelibs.fess.api.BaseApiManager;
import org.codelibs.fess.app.web.base.login.FessLoginAssist;
import org.codelibs.fess.util.ComponentUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class EsApiManager extends BaseApiManager {
private static final Logger logger = LoggerFactory.getLogger(EsApiManager.class);
@Resource
protected DynamicProperties crawlerProperties;
protected String[] acceptedRoles = new String[] { "admin" };
public EsApiManager() {
@ -30,12 +50,47 @@ public class EsApiManager extends BaseApiManager {
@Override
public void process(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
String path = request.getServletPath().substring(pathPrefix.length());
if (!path.startsWith("/")) {
path = "/" + path;
}
Method httpMethod = Method.valueOf(request.getMethod().toUpperCase(Locale.ROOT));
CurlRequest curlRequest = new CurlRequest(httpMethod, getUrl() + path);
request.getParameterMap().entrySet().stream().forEach(entry -> {
if (entry.getValue().length > 1) {
curlRequest.param(entry.getKey(), String.join(",", entry.getValue()));
} else if (entry.getValue().length == 1) {
curlRequest.param(entry.getKey(), entry.getValue()[0]);
}
});
curlRequest.onConnect((req, con) -> {
con.setDoOutput(true);
if (httpMethod != Method.GET) {
try (ServletInputStream in = request.getInputStream(); OutputStream out = con.getOutputStream()) {
CopyUtil.copy(in, out);
} catch (IOException e) {
throw new IORuntimeException(e);
}
}
}).execute(con -> {
try (InputStream in = con.getInputStream(); ServletOutputStream out = response.getOutputStream()) {
response.setStatus(con.getResponseCode());
CopyUtil.copy(in, out);
} catch (IOException e) {
try (InputStream err = con.getErrorStream()) {
logger.error(new String(InputStreamUtil.getBytes(err), Constants.CHARSET_UTF_8));
} catch (IOException e1) {}
throw new IORuntimeException(e);
}
});
// TODO exception
}
public void setAcceptedRoles(String[] acceptedRoles) {
this.acceptedRoles = acceptedRoles;
}
protected String getUrl() {
return crawlerProperties.getProperty(Constants.ELASTICSEARCH_WEB_URL_PROPERTY, Constants.ELASTICSEARCH_WEB_URL);
}
}

View file

@ -17,6 +17,7 @@
package org.codelibs.fess.app.web;
import org.codelibs.fess.app.web.base.FessSearchAction;
import org.codelibs.fess.app.web.search.SearchForm;
import org.lastaflute.web.Execute;
import org.lastaflute.web.response.HtmlResponse;
@ -34,11 +35,14 @@ public class RootAction extends FessSearchAction {
// Search Execute
// ==============
@Execute
public HtmlResponse index(final RootForm form) {
public HtmlResponse index() {
searchAvailable();
return asHtml(path_IndexJsp).renderWith(data -> {
buildLabelParams(form.fields);
return asHtml(path_IndexJsp).useForm(SearchForm.class, op -> {
op.setup(form -> {
buildLabelParams(form.fields);
});
}).renderWith(data -> {
buildInitParams();
});
}

View file

@ -1,37 +0,0 @@
/*
* Copyright 2009-2015 the CodeLibs Project and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.codelibs.fess.app.web;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
public class RootForm implements Serializable {
private static final long serialVersionUID = 1L;
public Map<String, String[]> fields = new HashMap<>();
//@Maxbytelength(maxbytelength = 1000)
public String query;
public String sort;
public String num;
public String[] lang;
}

View file

@ -16,27 +16,16 @@
package org.codelibs.fess.app.web.admin.system;
import java.util.List;
import java.util.Set;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import org.codelibs.core.lang.StringUtil;
import org.codelibs.core.misc.DynamicProperties;
import org.codelibs.fess.annotation.Token;
import org.codelibs.fess.app.service.ScheduledJobService;
import org.codelibs.fess.app.web.base.FessAdminAction;
import org.codelibs.fess.es.client.FessEsClient;
import org.codelibs.fess.es.exentity.ScheduledJob;
import org.codelibs.fess.helper.JobHelper;
import org.codelibs.fess.helper.SystemHelper;
import org.lastaflute.web.Execute;
import org.lastaflute.web.callback.ActionRuntime;
import org.lastaflute.web.response.HtmlResponse;
import org.lastaflute.web.util.LaRequestUtil;
/**
* @author shinsuke
* @author Keiichi Watanabe
*/
public class AdminSystemAction extends FessAdminAction {
@ -44,18 +33,9 @@ public class AdminSystemAction extends FessAdminAction {
// ===================================================================================
// Attribute
// =========
private static final String STARTING_CRAWL_PROCESS = "startingCrawlProcess";
@Resource
private SystemHelper systemHelper;
@Resource
protected DynamicProperties crawlerProperties;
@Resource
protected JobHelper jobHelper;
@Resource
protected ScheduledJobService scheduledJobService;
@Resource
protected FessEsClient fessEsClient;
// ===================================================================================
// Hook
@ -71,64 +51,7 @@ public class AdminSystemAction extends FessAdminAction {
// ==============
@Execute
public HtmlResponse index() {
return asHtml(path_AdminSystem_IndexJsp).useForm(SystemForm.class).renderWith(data -> {
data.register("clusterName", fessEsClient.getClusterName());
data.register("clusterStatus", fessEsClient.getStatus());
data.register("crawlerRunning", isCrawlerRunning());
data.register("runningSessionIds", getRunningSessionIds());
});
}
@Token(save = false, validate = true)
@Execute
public HtmlResponse start(final SystemForm form) {
if (!jobHelper.isCrawlProcessRunning()) {
final List<ScheduledJob> scheduledJobList = scheduledJobService.getCrawlerJobList();
for (final ScheduledJob scheduledJob : scheduledJobList) {
scheduledJob.start();
}
saveInfo(messages -> messages.addSuccessStartCrawlProcess(GLOBAL));
LaRequestUtil.getRequest().getSession().setAttribute(STARTING_CRAWL_PROCESS, Boolean.TRUE);
} else {
saveInfo(messages -> messages.addErrorsFailedToStartCrawlProcess(GLOBAL));
}
return redirect(getClass());
}
@Token(save = false, validate = true)
@Execute
public HtmlResponse stop(final SystemForm form) {
if (jobHelper.isCrawlProcessRunning()) {
if (StringUtil.isNotBlank(form.sessionId)) {
jobHelper.destroyCrawlerProcess(form.sessionId);
} else {
for (final String sessionId : jobHelper.getRunningSessionIdSet()) {
jobHelper.destroyCrawlerProcess(sessionId);
}
}
saveInfo(messages -> messages.addSuccessStoppingCrawlProcess(GLOBAL));
} else {
saveInfo(messages -> messages.addErrorsNoRunningCrawlProcess(GLOBAL));
}
return redirect(getClass());
}
public boolean isCrawlerRunning() {
final HttpSession session = LaRequestUtil.getRequest().getSession(false);
if (session != null) {
final Object obj = session.getAttribute(STARTING_CRAWL_PROCESS);
if (obj != null) {
session.removeAttribute(STARTING_CRAWL_PROCESS);
return true;
}
}
return jobHelper.isCrawlProcessRunning();
}
public String[] getRunningSessionIds() {
final Set<String> idSet = jobHelper.getRunningSessionIdSet();
return idSet.toArray(new String[idSet.size()]);
return asHtml(path_AdminSystem_IndexJsp);
}
}

View file

@ -1,32 +0,0 @@
/*
* Copyright 2009-2015 the CodeLibs Project and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.codelibs.fess.app.web.admin.system;
import java.io.Serializable;
/**
* @author codelibs
* @author Keiichi Watanabe
*/
public class SystemForm implements Serializable {
private static final long serialVersionUID = 1L;
//@Required(target = "delete")
public String sessionId;
}

View file

@ -1,13 +1,14 @@
package org.codelibs.fess.app.web.cache;
import org.codelibs.fess.app.web.RootForm;
import java.io.Serializable;
public class CacheForm extends RootForm {
public class CacheForm implements Serializable {
private static final long serialVersionUID = 1L;
//@Required(target = "go,cache")
//@Maxbytelength(maxbytelength = 100)
public String docId;
public String[] hq;
}

View file

@ -16,9 +16,10 @@
package org.codelibs.fess.app.web.error;
import java.io.Serializable;
import org.codelibs.fess.app.web.search.SearchForm;
public class ErrorForm implements Serializable {
// TODO workaround
public class ErrorForm extends SearchForm {
private static final long serialVersionUID = 1L;

View file

@ -1,8 +1,6 @@
package org.codelibs.fess.app.web.go;
import org.codelibs.fess.app.web.RootForm;
public class GoForm extends RootForm {
public class GoForm {
private static final long serialVersionUID = 1L;
//@Required(target = "go,cache")

View file

@ -17,6 +17,7 @@
package org.codelibs.fess.app.web.help;
import org.codelibs.fess.app.web.base.FessSearchAction;
import org.codelibs.fess.app.web.search.SearchForm;
import org.lastaflute.web.Execute;
import org.lastaflute.web.response.HtmlResponse;
@ -39,9 +40,12 @@ public class HelpAction extends FessSearchAction {
// ==============
@Execute
public HtmlResponse index(final HelpForm form) {
return asHtml(path_HelpJsp).renderWith(data -> {
buildLabelParams(form.fields);
public HtmlResponse index() {
return asHtml(path_HelpJsp).useForm(SearchForm.class, op -> {
op.setup(form -> {
buildLabelParams(form.fields);
});
}).renderWith(data -> {
buildInitParams();
});
}

View file

@ -1,8 +0,0 @@
package org.codelibs.fess.app.web.help;
import org.codelibs.fess.app.web.RootForm;
public class HelpForm extends RootForm {
private static final long serialVersionUID = 1L;
}

View file

@ -1,9 +1,10 @@
package org.codelibs.fess.app.web.login;
import org.codelibs.fess.app.web.RootForm;
import java.io.Serializable;
import org.hibernate.validator.constraints.NotBlank;
public class LoginForm extends RootForm {
public class LoginForm implements Serializable {
private static final long serialVersionUID = 1L;
@NotBlank

View file

@ -40,7 +40,7 @@ public class OsddAction extends FessSearchAction {
// ==============
@Execute
public HtmlResponse index(final OsddForm form) {
public HtmlResponse index() {
searchAvailable();
openSearchHelper.write(LaResponseUtil.getResponse());
return null;

View file

@ -1,8 +0,0 @@
package org.codelibs.fess.app.web.osdd;
import org.codelibs.fess.app.web.RootForm;
public class OsddForm extends RootForm {
private static final long serialVersionUID = 1L;
}

View file

@ -1,8 +1,8 @@
package org.codelibs.fess.app.web.screenshot;
import org.codelibs.fess.app.web.RootForm;
import java.io.Serializable;
public class ScreenshotForm extends RootForm {
public class ScreenshotForm implements Serializable {
private static final long serialVersionUID = 1L;
public String docId;

View file

@ -34,7 +34,6 @@ import org.apache.commons.lang3.StringUtils;
import org.codelibs.core.lang.StringUtil;
import org.codelibs.fess.Constants;
import org.codelibs.fess.app.web.RootAction;
import org.codelibs.fess.app.web.RootForm;
import org.codelibs.fess.app.web.base.FessSearchAction;
import org.codelibs.fess.es.client.FessEsClient.SearchConditionBuilder;
import org.codelibs.fess.es.exentity.SearchLog;
@ -449,7 +448,7 @@ public class SearchAction extends FessSearchAction {
}
}
protected String getDisplayQuery(final RootForm form, final List<Map<String, String>> labelTypeItems) {
protected String getDisplayQuery(final SearchForm form, final List<Map<String, String>> labelTypeItems) {
final StringBuilder buf = new StringBuilder(100);
buf.append(form.query);
if (!form.fields.isEmpty() && form.fields.containsKey(LABEL_FIELD)) {
@ -473,7 +472,7 @@ public class SearchAction extends FessSearchAction {
return buf.toString();
}
protected void normalizePageNum(final RootForm form) {
protected void normalizePageNum(final SearchForm form) {
try {
final int num = Integer.parseInt(form.num);
if (num > getMaxPageSize()) {

View file

@ -16,17 +16,28 @@
package org.codelibs.fess.app.web.search;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.codelibs.fess.app.web.RootForm;
import org.codelibs.fess.entity.FacetInfo;
import org.codelibs.fess.entity.GeoInfo;
public class SearchForm extends RootForm {
public class SearchForm implements Serializable {
private static final long serialVersionUID = 1L;
public Map<String, String[]> fields = new HashMap<>();
//@Maxbytelength(maxbytelength = 1000)
public String query;
public String sort;
public String num;
public String[] lang;
public String additional[];
//@Maxbytelength(maxbytelength = 10)

View file

@ -1,5 +1,9 @@
package org.codelibs.fess.es.exentity;
import java.util.Base64;
import java.util.stream.Stream;
import org.codelibs.fess.Constants;
import org.codelibs.fess.es.bsentity.BsUser;
/**
@ -8,4 +12,14 @@ import org.codelibs.fess.es.bsentity.BsUser;
public class User extends BsUser {
private static final long serialVersionUID = 1L;
public String[] getRoleNames() {
return Stream.of(getRoles()).map(role -> new String(Base64.getDecoder().decode(role), Constants.CHARSET_UTF_8))
.toArray(n -> new String[n]);
}
public String[] getGroupNames() {
return Stream.of(getGroups()).map(group -> new String(Base64.getDecoder().decode(group), Constants.CHARSET_UTF_8))
.toArray(n -> new String[n]);
}
}

View file

@ -63,10 +63,18 @@ public class FessUserBean extends TypicalUserBean<String> { // #change_it also L
}
public boolean hasRole(String role) {
return Stream.of(user.getRoles()).anyMatch(s -> s.equals(role));
return Stream.of(user.getRoleNames()).anyMatch(s -> s.equals(role));
}
public boolean hasRoles(String[] acceptedRoles) {
return Stream.of(user.getRoles()).anyMatch(s1 -> Stream.of(acceptedRoles).anyMatch(s2 -> s2.equals(s1)));
return Stream.of(user.getRoleNames()).anyMatch(s1 -> Stream.of(acceptedRoles).anyMatch(s2 -> s2.equals(s1)));
}
public boolean hasGroup(String group) {
return Stream.of(user.getGroupNames()).anyMatch(s -> s.equals(group));
}
public boolean hasGroups(String[] acceptedGroups) {
return Stream.of(user.getGroupNames()).anyMatch(s1 -> Stream.of(acceptedGroups).anyMatch(s2 -> s2.equals(s1)));
}
}

View file

@ -6,8 +6,11 @@
<include path="lastaflute.xml"/>
<include path="fess.xml"/>
<include path="fess_job.xml"/>
<include path="fess_ad.xml"/>
<include path="fess_api.xml"/>
<include path="fess_dict.xml"/>
<include path="fess_job.xml"/>
<include path="fess_screenshot.xml"/>
<include path="crawler/client.xml" />
<include path="crawler/mimetype.xml" />
@ -237,103 +240,7 @@
<arg>"Mozilla/5.0 (compatible; Fess/" + org.codelibs.fess.Constants.FESS_VERSION + "; +http://fess.codelibs.org/bot.html)"</arg>
</component>
<component name="adProperties" class="java.util.Properties">
<postConstruct name="put">
<arg>"java.naming.factory.initial"</arg>
<arg>"com.sun.jndi.ldap.LdapCtxFactory"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"java.naming.provider.url"</arg>
<arg>"ldap://[host]:[port]"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"java.naming.security.principal"</arg>
<arg>"[loginId]@[domain]"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"java.naming.security.credentials"</arg>
<arg>"password"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"com.sun.jndi.ldap.connect.timeout"</arg>
<arg>"10000"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"com.sun.jndi.ldap.connect.pool"</arg>
<arg>"true"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"com.sun.jndi.connect.pool.timeout"</arg>
<arg>"30000"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"com.sun.jndi.connect.pool.debug"</arg>
<arg>"all"</arg>
</postConstruct>
</component>
<component name="adRoleHelper" class="org.codelibs.fess.helper.AdRoleHelper">
<postConstruct name="setAdProperties">
<arg>adProperties</arg>
</postConstruct>
</component>
<component name="suggestHelper" class="org.codelibs.fess.helper.SuggestHelper">
</component>
<component name="screenShotManager" class="org.codelibs.fess.screenshot.ScreenShotManager">
<!--
<postConstruct name="add">
<arg>htmlScreenShotGenerator</arg>
</postConstruct>
-->
</component>
<!--
<component name="webDriver" class="org.openqa.selenium.phantomjs.PhantomJSDriver">
<arg>
<component class="org.openqa.selenium.remote.DesiredCapabilities">
<postConstruct name="setCapability">
<arg>"phantomjs.binary.path"</arg>
<arg>"/usr/bin/phantomjs"</arg>
</postConstruct>
</component>
</arg>
<preDestroy name="quit"></preDestroy>
</component>
<component name="htmlScreenShotGenerator" class="org.codelibs.fess.screenshot.impl.WebDriverGenerator">
<property name="webDriver">webDriver</property>
<postConstruct name="addCondition">
<arg>"mimetype"</arg>
<arg>"text/html"</arg>
</postConstruct>
</component>
-->
<!--
<component name="htmlScreenShotGenerator" class="org.codelibs.fess.screenshot.impl.CommandGenerator">
<property name="commandList">
{"bash",
"/opt/fess/bin/html-screenshot.sh",
"${url}",
"${outputFile}"}
</property>
<postConstruct name="addCondition">
<arg>"mimetype"</arg>
<arg>"text/html"</arg>
</postConstruct>
</component>
-->
<component name="dictionaryManager" class="org.codelibs.fess.dict.DictionaryManager">
<postConstruct name="addCreator">
<arg>userDictCreator</arg>
</postConstruct>
<postConstruct name="addCreator">
<arg>synonymCreator</arg>
</postConstruct>
</component>
<component name="synonymCreator" class="org.codelibs.fess.dict.synonym.SynonymCreator">
</component>
<component name="userDictCreator" class="org.codelibs.fess.dict.kuromoji.KuromojiCreator">
</component>
</components>

View file

@ -2,15 +2,10 @@
<!DOCTYPE components PUBLIC "-//DBFLUTE//DTD LastaDi 1.0//EN"
"http://dbflute.org/meta/lastadi10.dtd">
<components>
<include path="fess_config.xml"/>
<include path="fess_ds.xml"/>
<include path="fess_es.xml"/>
<component name="crawlerProperties" class="org.codelibs.core.misc.DynamicProperties">
<arg>
org.codelibs.fess.util.ResourceUtil.getConfPath("crawler.properties")
</arg>
</component>
<component name="searchLogHelper" class="org.codelibs.fess.helper.impl.SearchLogHelperImpl">
<!--
<property name="userCheckInterval">5 * 60 * 1000</property>

View file

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//DBFLUTE//DTD LastaDi 1.0//EN"
"http://dbflute.org/meta/lastadi10.dtd">
<components>
<component name="adProperties" class="java.util.Properties">
<postConstruct name="put">
<arg>"java.naming.factory.initial"</arg>
<arg>"com.sun.jndi.ldap.LdapCtxFactory"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"java.naming.provider.url"</arg>
<arg>"ldap://[host]:[port]"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"java.naming.security.principal"</arg>
<arg>"[loginId]@[domain]"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"java.naming.security.credentials"</arg>
<arg>"password"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"com.sun.jndi.ldap.connect.timeout"</arg>
<arg>"10000"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"com.sun.jndi.ldap.connect.pool"</arg>
<arg>"true"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"com.sun.jndi.connect.pool.timeout"</arg>
<arg>"30000"</arg>
</postConstruct>
<postConstruct name="put">
<arg>"com.sun.jndi.connect.pool.debug"</arg>
<arg>"all"</arg>
</postConstruct>
</component>
<component name="adRoleHelper" class="org.codelibs.fess.helper.AdRoleHelper">
<postConstruct name="setAdProperties">
<arg>adProperties</arg>
</postConstruct>
</component>
</components>

View file

@ -2,12 +2,17 @@
<!DOCTYPE components PUBLIC "-//DBFLUTE//DTD LastaDi 1.0//EN"
"http://dbflute.org/meta/lastadi10.dtd">
<components>
<include path="fess_config.xml"/>
<component name="webApiManagerFactory" class="org.codelibs.fess.api.WebApiManagerFactory">
<postConstruct name="add">
<arg>xmlApiManager</arg>
<arg>xmlApiManager</arg>
</postConstruct>
<postConstruct name="add">
<arg>jsonApiManager</arg>
<arg>jsonApiManager</arg>
</postConstruct>
<postConstruct name="add">
<arg>esApiManager</arg>
</postConstruct>
</component>
@ -15,5 +20,7 @@
</component>
<component name="jsonApiManager" class="org.codelibs.fess.api.json.JsonApiManager">
</component>
<component name="esApiManager" class="org.codelibs.fess.api.es.EsApiManager">
</component>
</components>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//DBFLUTE//DTD LastaDi 1.0//EN"
"http://dbflute.org/meta/lastadi10.dtd">
<components>
<component name="crawlerProperties" class="org.codelibs.core.misc.DynamicProperties">
<arg>
org.codelibs.fess.util.ResourceUtil.getConfPath("crawler.properties")
</arg>
</component>
</components>

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//DBFLUTE//DTD LastaDi 1.0//EN"
"http://dbflute.org/meta/lastadi10.dtd">
<components>
<include path="fess_config.xml"/>
<component name="dictionaryManager" class="org.codelibs.fess.dict.DictionaryManager">
<postConstruct name="addCreator">
<arg>userDictCreator</arg>
</postConstruct>
<postConstruct name="addCreator">
<arg>synonymCreator</arg>
</postConstruct>
</component>
<component name="synonymCreator"
class="org.codelibs.fess.dict.synonym.SynonymCreator">
</component>
<component name="userDictCreator"
class="org.codelibs.fess.dict.kuromoji.KuromojiCreator">
</component>
</components>

View file

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//DBFLUTE//DTD LastaDi 1.0//EN"
"http://dbflute.org/meta/lastadi10.dtd">
<components>
<component name="screenShotManager" class="org.codelibs.fess.screenshot.ScreenShotManager">
<!--
<postConstruct name="add">
<arg>htmlScreenShotGenerator</arg>
</postConstruct>
-->
</component>
<!--
<component name="webDriver" class="org.openqa.selenium.phantomjs.PhantomJSDriver">
<arg>
<component class="org.openqa.selenium.remote.DesiredCapabilities">
<postConstruct name="setCapability">
<arg>"phantomjs.binary.path"</arg>
<arg>"/usr/bin/phantomjs"</arg>
</postConstruct>
</component>
</arg>
<preDestroy name="quit"></preDestroy>
</component>
<component name="htmlScreenShotGenerator" class="org.codelibs.fess.screenshot.impl.WebDriverGenerator">
<property name="webDriver">webDriver</property>
<postConstruct name="addCondition">
<arg>"mimetype"</arg>
<arg>"text/html"</arg>
</postConstruct>
</component>
-->
<!--
<component name="htmlScreenShotGenerator" class="org.codelibs.fess.screenshot.impl.CommandGenerator">
<property name="commandList">
{"bash",
"/opt/fess/bin/html-screenshot.sh",
"${url}",
"${outputFile}"}
</property>
<postConstruct name="addCondition">
<arg>"mimetype"</arg>
<arg>"text/html"</arg>
</postConstruct>
</component>
-->
</components>

View file

@ -1,376 +0,0 @@
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<!--
This file contains the default Struts Validator pluggable validator
definitions. It should be placed somewhere under /WEB-INF and
referenced in the struts-config.xml under the plug-in element
for the ValidatorPlugIn.
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,
/WEB-INF/validation.xml"/>
</plug-in>
These are the default error messages associated with
each validator defined in this file. They should be
added to your projects ApplicationResources.properties
file or you can associate new ones by modifying the
pluggable validators msg attributes in this file.
# Struts Validator Error Messages
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.
errors.float={0} must be a float.
errors.double={0} must be a double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is an invalid credit card number.
errors.email={0} is an invalid e-mail address.
errors.url={0} is an invalid url (web address).
errors.minbytelength={0} can not be less than {1} bytes.
errors.maxbytelength={0} can not be greater than {1} bytes.
Note: Starting in Struts 1.2.0 the default javascript definitions have
been consolidated to commons-validator. The default can be overridden
by supplying a <javascript> element with a CDATA section, just as
in struts 1.1.
-->
<form-validation>
<global>
<validator name="required"
classname="org.apache.struts.validator.FieldChecks"
method="validateRequired"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
msg="errors.required"/>
<validator name="requiredif"
classname="org.apache.struts.validator.FieldChecks"
method="validateRequiredIf"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
msg="errors.required"/>
<validator name="validwhen"
msg="errors.required"
classname="org.apache.struts.validator.validwhen.ValidWhen"
method="validateValidWhen"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"/>
<validator name="minlength"
classname="org.apache.struts.validator.FieldChecks"
method="validateMinLength"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.minlength"
jsFunction="org.apache.commons.validator.javascript.validateMinLength"/>
<validator name="maxlength"
classname="org.apache.struts.validator.FieldChecks"
method="validateMaxLength"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.maxlength"
jsFunction="org.apache.commons.validator.javascript.validateMaxLength"/>
<validator name="mask"
classname="org.apache.struts.validator.FieldChecks"
method="validateMask"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.invalid"/>
<validator name="byte"
classname="org.apache.struts.validator.FieldChecks"
method="validateByte"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.byte"
jsFunctionName="ByteValidations"/>
<validator name="short"
classname="org.apache.struts.validator.FieldChecks"
method="validateShort"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.short"
jsFunctionName="ShortValidations"/>
<validator name="integer"
classname="org.apache.struts.validator.FieldChecks"
method="validateInteger"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.integer"
jsFunctionName="IntegerValidations"/>
<validator name="long"
classname="org.apache.struts.validator.FieldChecks"
method="validateLong"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.long"/>
<validator name="float"
classname="org.apache.struts.validator.FieldChecks"
method="validateFloat"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.float"
jsFunctionName="FloatValidations"/>
<validator name="double"
classname="org.apache.struts.validator.FieldChecks"
method="validateDouble"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.double"/>
<validator name="date"
classname="org.apache.struts.validator.FieldChecks"
method="validateDate"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.date"
jsFunctionName="DateValidations"/>
<validator name="intRange"
classname="org.apache.struts.validator.FieldChecks"
method="validateIntRange"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends="integer"
msg="errors.range"/>
<validator name="floatRange"
classname="org.apache.struts.validator.FieldChecks"
method="validateFloatRange"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends="float"
msg="errors.range"/>
<validator name="doubleRange"
classname="org.apache.struts.validator.FieldChecks"
method="validateDoubleRange"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends="double"
msg="errors.range"/>
<validator name="creditCard"
classname="org.apache.struts.validator.FieldChecks"
method="validateCreditCard"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.creditcard"/>
<validator name="email"
classname="org.apache.struts.validator.FieldChecks"
method="validateEmail"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.email"/>
<validator name="url"
classname="org.apache.struts.validator.FieldChecks"
method="validateUrl"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.url"/>
<validator name="minbytelength"
classname="org.seasar.struts.validator.S2FieldChecks"
method="validateMinByteLength"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.minbytelength"/>
<validator name="maxbytelength"
classname="org.seasar.struts.validator.S2FieldChecks"
method="validateMaxByteLength"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.maxbytelength"/>
<validator name="longRange"
classname="org.seasar.struts.validator.S2FieldChecks"
method="validateLongRange"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends="long"
msg="errors.range"/>
<validator name="cronExpression"
classname="org.codelibs.fess.validator.CronExpressionChecks"
method="validateCronExpression"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.cronexpression"/>
<validator name="uriType"
classname="org.codelibs.fess.validator.UriTypeChecks"
method="validateUriType"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.uritype"/>
<!--
This simply allows struts to include the validateUtilities into a page, it should
not be used as a validation rule.
-->
<validator name="includeJavaScriptUtilities"
classname=""
method=""
methodParams=""
depends=""
msg=""
jsFunction="org.apache.commons.validator.javascript.validateUtilities"/>
</global>
</form-validation>

View file

@ -14,93 +14,9 @@
</jsp:include>
<div class="content-wrapper">
<%-- Content Header --%>
<%-- Message --%>
<div>
<la:info id="msg" message="true">
<div class="alert-message info">${msg}</div>
</la:info>
<la:errors />
</div>
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box">
<%-- Box Header --%>
<div class="box-header">
<h3 class="box-title">
<la:message key="labels.system_title_system_status" />
</h3>
</div>
<%-- Box Body --%>
<div class="box-body">
<table class="table table-bordered table-hover table-striped">
<tbody>
<tr>
<th class="col-xs-3"><la:message
key="labels.es_cluster_name" /></th>
<td>${f:h(clusterName)}
(${f:h(clusterStatus)})</td>
</tr>
</tbody>
</table>
</div>
</div>
<la:form>
<div class="box">
<%-- Box Header --%>
<div class="box-header">
<h3 class="box-title">
<la:message key="labels.crawler_status_title" />
</h3>
</div>
<%-- Box Body --%>
<div class="box-body">
<%-- Message --%>
<table class="table table-bordered table-hover table-striped">
<tbody>
<tr>
<th class="col-xs-3"><la:message
key="labels.crawler_process_running" /></th>
<td><c:if test="${crawlerRunning}">
<la:message key="labels.crawler_running" />
</c:if>
<c:if test="${!crawlerRunning}">
<la:message key="labels.crawler_stopped" />
</c:if></td>
</tr>
<tr>
<th><la:message key="labels.crawler_process_action" />
</th>
<td><c:if test="${!crawlerRunning}">
<input type="submit" class="btn" name="start"
value="<la:message key="labels.crawler_button_start"/>" />
</c:if> <c:if test="${crawlerRunning}">
<div class="form-inline">
<la:select property="sessionId" styleClass="form-control">
<option value=""><la:message
key="labels.crawler_sessionid_all" /></option>
<c:forEach var="runningSessionId"
items="${runningSessionIds}">
<option value="${f:h(runningSessionId)}">${f:h(runningSessionId)}</option>
</c:forEach>
</la:select>
<input type="submit" class="btn" name="stop"
value="<la:message key="labels.crawler_button_stop"/>" />
</div>
</c:if></td>
</tr>
</tbody>
</table>
</div>
</div>
</la:form>
</div>
</div>
</section>
<iframe src="<%=request.getContextPath()%>/admin/server/_plugin/kopf/" width="100%" height="800" seamless></iframe>
</div>
<jsp:include page="/WEB-INF/view/common/admin/footer.jsp"></jsp:include>
</div>
<jsp:include page="/WEB-INF/view/common/admin/foot.jsp"></jsp:include>

View file

@ -2,10 +2,10 @@
<!DOCTYPE html>
<% try{ %>
<html>
<head>
<head profile="http://a9.com/-/spec/opensearch/1.1/">
<meta charset="utf-8">
<meta http-equiv="content-style-type" content="text/css" />
<meta http-equiv="content-script-type" content="text/javascript" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title><la:message key="labels.system_error_title" /></title>
<link href="${f:url('/css/style-base.css')}" rel="stylesheet"
type="text/css" />
@ -17,7 +17,7 @@
<div class="container">
<div class="content">
<div class="center row">
<div class="span10">
<div class="col-md-12">
<h2>
<la:message key="labels.request_error_title" />
</h2>
@ -27,6 +27,7 @@
</div>
<jsp:include page="footer.jsp" />
</div>
<input type="hidden" id="contextPath" value="<%=request.getContextPath()%>" />
<script type="text/javascript"
src="${f:url('/js/jquery-2.1.4.min.js')}"></script>
<script type="text/javascript" src="${f:url('/js/bootstrap.js')}"></script>

View file

@ -1,11 +0,0 @@
<c:import url="${viewPrefix}/common/header.jsp">
<c:param name="title" value="エラー通知"/>
</c:import>
<div class="contents">
<h2><la:message key="labels.header.title.error.message"/></h2>
<html:errors/>
<div class="listback">
<la:link href="/member/list/">会員一覧へ</la:link>
</div>
</div>
<c:import url="${viewPrefix}/common/footer.jsp"/>

View file

@ -1,9 +1,8 @@
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<hr/>
<footer class="footer">
<div id="footer" class="row center">
<p class="left"></p>
<p class="right">
<footer class="bd-footer text-muted" role="contentinfo">
<div id="footer" class="container center">
<p>
<la:message key="labels.footer.copyright" />
</p>
</div>

View file

@ -1,124 +1,126 @@
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<form action="${contextPath}/search" method="get">
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="brand" href="${contextPath}/">
<img src="${f:url('/images/logo-head.gif')}"
alt="<la:message key="labels.header_brand_name" />" />
</a>
<div class="navbar-form pull-right">
<input type="text" name="query" maxlength="1000" id="query" />
<button class="btn medium btn-primary" type="submit" name="search"
id="searchButton">
<la:form action="/search" method="get" styleId="searchForm" styleClass="searchResultForm">
${fe:facetForm()}${fe:geoForm()}
<nav class="navbar navbar-dark bg-inverse navbar-static-top pos-f-t">
<la:link styleClass="navbar-brand" href="/">
<img src="${f:url('/images/logo-head.gif')}" alt="<la:message key="labels.header_brand_name" />" />
</la:link>
<div class="form-inline navbar-form pull-right">
<la:text property="query" maxlength="1000" styleId="query" styleClass="form-control" autocomplete="off"/>
<button class="btn medium btn-primary" type="submit" name="search" id="searchButton">
<i class="icon-search icon-white"></i><span class="hidden-phone"><la:message key="labels.search" /></span>
</button>
<a href="#searchOptions" role="button" class="btn btn-secondary" data-toggle="modal"><i class="icon-cog"></i><span
class="hidden-phone"
><la:message key="labels.header_form_option_btn" /></span></a>
</div>
</nav>
<div class="modal fade" id="searchOptions" tabindex="-1" role="dialog" aria-labelledby="searchOptionsLabel"
aria-hidden="true"
>
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span> <span class="sr-only">Close</span>
</button>
<h4 class="modal-title" id="searchOptionsLabel">
<la:message key="labels.search_options" />
</h4>
</div>
<div class="modal-body">
<fieldset class="form-group">
<label for="contentNum"><la:message key="labels.index_num" /></label>
<la:select property="num" styleId="numSearchOption" styleClass="form-control" style="display:block;">
<option value="">
<la:message key="labels.search_result_select_num" />
</option>
<la:option value="10">10</la:option>
<la:option value="20">20</la:option>
<la:option value="30">30</la:option>
<la:option value="40">40</la:option>
<la:option value="50">50</la:option>
<la:option value="100">100</la:option>
</la:select>
</fieldset>
<fieldset class="form-group">
<label for="contentSort"><la:message key="labels.index_sort" /></label>
<la:select property="sort" styleId="sortSearchOption" styleClass="form-control" style="display:block;">
<option value="">
<la:message key="labels.search_result_select_sort" />
</option>
<la:option value="created.asc">
<la:message key="labels.search_result_sort_created_asc" />
</la:option>
<la:option value="created.desc">
<la:message key="labels.search_result_sort_created_desc" />
</la:option>
<la:option value="contentLength.asc">
<la:message key="labels.search_result_sort_contentLength_asc" />
</la:option>
<la:option value="contentLength.desc">
<la:message key="labels.search_result_sort_contentLength_desc" />
</la:option>
<la:option value="lastModified.asc">
<la:message key="labels.search_result_sort_lastModified_asc" />
</la:option>
<la:option value="lastModified.desc">
<la:message key="labels.search_result_sort_lastModified_desc" />
</la:option>
<c:if test="${searchLogSupport}">
<la:option value="clickCount_l_x_dv.asc">
<la:message key="labels.search_result_sort_clickCount_asc" />
</la:option>
<la:option value="clickCount_l_x_dv.desc">
<la:message key="labels.search_result_sort_clickCount_desc" />
</la:option>
</c:if>
<c:if test="${favoriteSupport}">
<la:option value="favoriteCount_l_x_dv.asc">
<la:message key="labels.search_result_sort_favoriteCount_asc" />
</la:option>
<la:option value="favoriteCount_l_x_dv.desc">
<la:message key="labels.search_result_sort_favoriteCount_desc" />
</la:option>
</c:if>
</la:select>
</fieldset>
<fieldset class="form-group">
<label for="contentLang"><la:message key="labels.index_lang" /></label>
<la:select property="lang" styleId="langSearchOption" multiple="true" styleClass="form-control">
<c:forEach var="item" items="${langItems}">
<la:option value="${f:u(item.value)}">
${f:h(item.label)}
</la:option>
</c:forEach>
</la:select>
</fieldset>
<c:if test="${displayLabelTypeItems}">
<fieldset class="form-group">
<label for="contentLabelType"><la:message key="labels.index_label" /></label>
<la:select property="fields.label" styleId="labelTypeSearchOption" multiple="true" styleClass="form-control">
<c:forEach var="item" items="${labelTypeItems}">
<la:option value="${f:u(item.value)}">
${f:h(item.label)}
</la:option>
</c:forEach>
</la:select>
</fieldset>
</c:if>
</div>
<div class="modal-footer">
<button class="btn btn-secondary" id="searchOptionsClearButton">
<la:message key="labels.search_options_clear" />
</button>
<button class="btn btn-secondary" data-dismiss="modal" aria-hidden="true">
<la:message key="labels.search_options_close" />
</button>
<button class="btn btn-primary" type="submit">
<la:message key="labels.search" />
</button>
<a href="#searchOptions" role="button" class="btn"
data-toggle="modal"><la:message
key="labels.header_form_option_btn" /></a>
</div>
</div>
</div>
</div>
<div class="modal hide fade" id="searchOptions">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"
aria-hidden="true">&times;</button>
<h3>
<la:message key="labels.search_options" />
</h3>
</div>
<div class="modal-body">
<fieldset>
<div class="clearfix">
<label for="contentNum"><la:message
key="labels.index_num" /></label>
<div class="input">
<select name="num" id="contentNum"
class="span4" style="display:block;">
<option value="">
<la:message key="labels.search_result_select_num" />
</option>
<option value="10">10</option>
<option value="20">20</option>
<option value="30">30</option>
<option value="40">40</option>
<option value="50">50</option>
<option value="100">100</option>
</select>
</div>
</div>
<div class="clearfix">
<label for="contentSort"><la:message
key="labels.index_sort" /></label>
<div class="input">
<select name="sort" id="contentSort"
class="span4" style="display:block;">
<option value="">
<la:message key="labels.search_result_select_sort" />
</option>
<option value="created.asc">
<la:message key="labels.search_result_sort_created_asc" />
</option>
<option value="created.desc">
<la:message key="labels.search_result_sort_created_desc" />
</option>
<option value="contentLength.asc">
<la:message key="labels.search_result_sort_contentLength_asc" />
</option>
<option value="contentLength.desc">
<la:message key="labels.search_result_sort_contentLength_desc" />
</option>
<option value="lastModified.asc">
<la:message key="labels.search_result_sort_lastModified_asc" />
</option>
<option value="lastModified.desc">
<la:message key="labels.search_result_sort_lastModified_desc" />
</option>
</select>
</div>
</div>
<div class="clearfix">
<label for="contentLang"><la:message
key="labels.index_lang" /></label>
<div class="input">
<select name="lang"
id="langSearchOption" multiple="true"
class="span4">
<c:forEach var="item" items="${langItems}">
<option value="${f:u(item.value)}">
${f:h(item.label)}
</option>
</c:forEach>
</select>
</div>
</div>
<c:if test="${displayLabelTypeItems}">
<div class="clearfix">
<label for="contentLabelType"><la:message
key="labels.index_label" /></label>
<div class="input">
<select name="fields.label" id="contentLabelType"
multiple="true" class="span4">
<c:forEach var="item" items="${labelTypeItems}">
<option value="${f:u(item.value)}">
${f:h(item.label)}
</option>
</c:forEach>
</select>
</div>
</div>
</c:if>
</fieldset>
</div>
<div class="modal-footer">
<button class="btn" id="searchOptionsClearButton">
<la:message key="labels.search_options_clear" />
</button>
<button class="btn" data-dismiss="modal" aria-hidden="true">
<la:message key="labels.search_options_close" />
</button>
</div>
</div>
</form>
</la:form>

View file

@ -1,10 +1,10 @@
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="content-style-type" content="text/css" />
<meta http-equiv="content-script-type" content="text/javascript" />
<head profile="http://a9.com/-/spec/opensearch/1.1/">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title><la:message key="labels.system_error_title" /></title>
<link href="${f:url('/css/style-base.css')}" rel="stylesheet"
type="text/css" />
@ -16,7 +16,7 @@
<div class="container">
<div class="content">
<div class="center row">
<div class="span10">
<div class="col-md-12">
<h2>
<la:message key="labels.page_not_found_title" />
</h2>
@ -29,6 +29,7 @@
</div>
<jsp:include page="footer.jsp" />
</div>
<input type="hidden" id="contextPath" value="<%=request.getContextPath()%>" />
<script type="text/javascript"
src="${f:url('/js/jquery-2.1.4.min.js')}"></script>
<script type="text/javascript" src="${f:url('/js/bootstrap.js')}"></script>

View file

@ -2,10 +2,10 @@
<!DOCTYPE html>
<% try{ %>
<html>
<head>
<head profile="http://a9.com/-/spec/opensearch/1.1/">
<meta charset="utf-8">
<meta http-equiv="content-style-type" content="text/css" />
<meta http-equiv="content-script-type" content="text/javascript" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title><la:message key="labels.system_error_title" /></title>
<link href="${f:url('/css/style-base.css')}" rel="stylesheet"
type="text/css" />
@ -17,7 +17,7 @@
<div class="container">
<div class="content">
<div class="center row">
<div class="span10">
<div class="col-md-12">
<h2>
<la:message key="labels.system_error_title" />
</h2>
@ -27,6 +27,7 @@
</div>
<jsp:include page="footer.jsp" />
</div>
<input type="hidden" id="contextPath" value="<%=request.getContextPath()%>" />
<script type="text/javascript"
src="${f:url('/js/jquery-2.1.4.min.js')}"></script>
<script type="text/javascript" src="${f:url('/js/bootstrap.js')}"></script>