Browse Source

add EsApiManager, modify error pages and minor fixes

Shinsuke Sugaya 9 years ago
parent
commit
0eacf8bf21
34 changed files with 389 additions and 887 deletions
  1. 1 1
      pom.xml
  2. 57 2
      src/main/java/org/codelibs/fess/api/es/EsApiManager.java
  3. 7 3
      src/main/java/org/codelibs/fess/app/web/RootAction.java
  4. 0 37
      src/main/java/org/codelibs/fess/app/web/RootForm.java
  5. 2 79
      src/main/java/org/codelibs/fess/app/web/admin/system/AdminSystemAction.java
  6. 0 32
      src/main/java/org/codelibs/fess/app/web/admin/system/SystemForm.java
  7. 3 2
      src/main/java/org/codelibs/fess/app/web/cache/CacheForm.java
  8. 3 2
      src/main/java/org/codelibs/fess/app/web/error/ErrorForm.java
  9. 1 3
      src/main/java/org/codelibs/fess/app/web/go/GoForm.java
  10. 7 3
      src/main/java/org/codelibs/fess/app/web/help/HelpAction.java
  11. 0 8
      src/main/java/org/codelibs/fess/app/web/help/HelpForm.java
  12. 3 2
      src/main/java/org/codelibs/fess/app/web/login/LoginForm.java
  13. 1 1
      src/main/java/org/codelibs/fess/app/web/osdd/OsddAction.java
  14. 0 8
      src/main/java/org/codelibs/fess/app/web/osdd/OsddForm.java
  15. 2 2
      src/main/java/org/codelibs/fess/app/web/screenshot/ScreenshotForm.java
  16. 2 3
      src/main/java/org/codelibs/fess/app/web/search/SearchAction.java
  17. 13 2
      src/main/java/org/codelibs/fess/app/web/search/SearchForm.java
  18. 14 0
      src/main/java/org/codelibs/fess/es/exentity/User.java
  19. 10 2
      src/main/java/org/codelibs/fess/mylasta/action/FessUserBean.java
  20. 4 97
      src/main/resources/app.xml
  21. 1 6
      src/main/resources/fess.xml
  22. 46 0
      src/main/resources/fess_ad.xml
  23. 9 2
      src/main/resources/fess_api.xml
  24. 11 0
      src/main/resources/fess_config.xml
  25. 22 0
      src/main/resources/fess_dict.xml
  26. 47 0
      src/main/resources/fess_screenshot.xml
  27. 0 376
      src/main/webapp/WEB-INF/validator-rules.xml
  28. 2 86
      src/main/webapp/WEB-INF/view/admin/system/index.jsp
  29. 5 4
      src/main/webapp/WEB-INF/view/error/badRequest.jsp
  30. 0 11
      src/main/webapp/WEB-INF/view/error/error_message.jsp
  31. 3 4
      src/main/webapp/WEB-INF/view/error/footer.jsp
  32. 102 100
      src/main/webapp/WEB-INF/view/error/header.jsp
  33. 6 5
      src/main/webapp/WEB-INF/view/error/notFound.jsp
  34. 5 4
      src/main/webapp/WEB-INF/view/error/system.jsp

+ 1 - 1
pom.xml

@@ -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>

+ 57 - 2
src/main/java/org/codelibs/fess/api/es/EsApiManager.java

@@ -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);
+    }
 }

+ 7 - 3
src/main/java/org/codelibs/fess/app/web/RootAction.java

@@ -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();
         });
     }

+ 0 - 37
src/main/java/org/codelibs/fess/app/web/RootForm.java

@@ -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;
-}

+ 2 - 79
src/main/java/org/codelibs/fess/app/web/admin/system/AdminSystemAction.java

@@ -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);
     }
 
 }

+ 0 - 32
src/main/java/org/codelibs/fess/app/web/admin/system/SystemForm.java

@@ -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;
-
-}

+ 3 - 2
src/main/java/org/codelibs/fess/app/web/cache/CacheForm.java

@@ -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;
 
 }

+ 3 - 2
src/main/java/org/codelibs/fess/app/web/error/ErrorForm.java

@@ -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;
 

+ 1 - 3
src/main/java/org/codelibs/fess/app/web/go/GoForm.java

@@ -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")

+ 7 - 3
src/main/java/org/codelibs/fess/app/web/help/HelpAction.java

@@ -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();
         });
     }

+ 0 - 8
src/main/java/org/codelibs/fess/app/web/help/HelpForm.java

@@ -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;
-
-}

+ 3 - 2
src/main/java/org/codelibs/fess/app/web/login/LoginForm.java

@@ -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

+ 1 - 1
src/main/java/org/codelibs/fess/app/web/osdd/OsddAction.java

@@ -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;

+ 0 - 8
src/main/java/org/codelibs/fess/app/web/osdd/OsddForm.java

@@ -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;
-}

+ 2 - 2
src/main/java/org/codelibs/fess/app/web/screenshot/ScreenshotForm.java

@@ -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;

+ 2 - 3
src/main/java/org/codelibs/fess/app/web/search/SearchAction.java

@@ -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()) {

+ 13 - 2
src/main/java/org/codelibs/fess/app/web/search/SearchForm.java

@@ -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)

+ 14 - 0
src/main/java/org/codelibs/fess/es/exentity/User.java

@@ -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]);
+    }
 }

+ 10 - 2
src/main/java/org/codelibs/fess/mylasta/action/FessUserBean.java

@@ -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)));
     }
 }

+ 4 - 97
src/main/resources/app.xml

@@ -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>

+ 1 - 6
src/main/resources/fess.xml

@@ -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>

+ 46 - 0
src/main/resources/fess_ad.xml

@@ -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>

+ 9 - 2
src/main/resources/fess_api.xml

@@ -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>
 		</postConstruct>
 		<postConstruct name="add">
- 			<arg>jsonApiManager</arg>
+			<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>

+ 11 - 0
src/main/resources/fess_config.xml

@@ -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>

+ 22 - 0
src/main/resources/fess_dict.xml

@@ -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>

+ 47 - 0
src/main/resources/fess_screenshot.xml

@@ -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>

+ 0 - 376
src/main/webapp/WEB-INF/validator-rules.xml

@@ -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>

+ 2 - 86
src/main/webapp/WEB-INF/view/admin/system/index.jsp

@@ -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>

+ 5 - 4
src/main/webapp/WEB-INF/view/error/badRequest.jsp

@@ -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>

+ 0 - 11
src/main/webapp/WEB-INF/view/error/error_message.jsp

@@ -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"/>

+ 3 - 4
src/main/webapp/WEB-INF/view/error/footer.jsp

@@ -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>

+ 102 - 100
src/main/webapp/WEB-INF/view/error/header.jsp

@@ -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:message key="labels.search" />
+<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>
-					<a href="#searchOptions" role="button" class="btn"
-						data-toggle="modal"><la:message
-							key="labels.header_form_option_btn" /></a>
+					<h4 class="modal-title" id="searchOptionsLabel">
+						<la:message key="labels.search_options" />
+					</h4>
 				</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;">
+				<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>
-							<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;">
+							<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>
-							<option value="created.asc">
+							<la:option value="created.asc">
 								<la:message key="labels.search_result_sort_created_asc" />
-							</option>
-							<option value="created.desc">
+							</la:option>
+							<la:option value="created.desc">
 								<la:message key="labels.search_result_sort_created_desc" />
-							</option>
-							<option value="contentLength.asc">
+							</la:option>
+							<la:option value="contentLength.asc">
 								<la:message key="labels.search_result_sort_contentLength_asc" />
-							</option>
-							<option value="contentLength.desc">
+							</la:option>
+							<la:option value="contentLength.desc">
 								<la:message key="labels.search_result_sort_contentLength_desc" />
-							</option>
-							<option value="lastModified.asc">
+							</la:option>
+							<la:option value="lastModified.asc">
 								<la:message key="labels.search_result_sort_lastModified_asc" />
-							</option>
-							<option value="lastModified.desc">
+							</la:option>
+							<la: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">
+							</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}">
-								<option value="${f:u(item.value)}">
+								<la:option value="${f:u(item.value)}">
 													${f:h(item.label)}
-												</option>
+												</la: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">
+						</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}">
-									<option value="${f:u(item.value)}">
+									<la:option value="${f:u(item.value)}">
 														${f:h(item.label)}
-													</option>
+													</la: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>
+							</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>
+				</div>
+			</div>
 		</div>
 	</div>
-</form>
+</la:form>
 

+ 6 - 5
src/main/webapp/WEB-INF/view/error/notFound.jsp

@@ -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>

+ 5 - 4
src/main/webapp/WEB-INF/view/error/system.jsp

@@ -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>