/*
* Copyright 2008-2010 the T2 Project ant 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.t2framework.confeito.action.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.t2framework.confeito.action.PageDescFinder;
import org.t2framework.confeito.contexts.WebContext;
import org.t2framework.confeito.internal.PathUtil;
import org.t2framework.confeito.model.PageComponent;
import org.t2framework.confeito.urltemplate.UrlTemplate;
/**
* <#if locale="en">
* <p>
* An implementation of {@link PageDescFinder}.{@link PageComponent} will find
* by sorted list of {@link PageComponent} which is done at
* {@link PageDescFinderImpl#initialize(Map)}.More specifically, the list is
* sorted by following rule:
* <ul>
* <li>Sort to longer url comes before shorter one</li>
* <li>variables(things like {aaa}) is completely removed at evaluation time</li>
* </ul>
* </p>
* <#else>
* <p>
* {@link PageDescFinder}の実装クラス.{@link PageComponent}は、{@link PageComponent}
* のリストから検索します. このリストは、{@link PageDescFinderImpl#initialize(Map)}時にソートされます.
* リストのソートは、次のルールで行われます:
* <ul>
* <li>urlが長いものから順に並びます</li>
* <li>url中の変数({aaa}のような部分)については、その長さはurlの長さには含めません</li>
* </ul>
* </p>
* </#if>
*
* @author shot
*
*/
public class PageDescFinderImpl implements PageDescFinder {
/**
* <#if locale="en">
* <p>
* Sorted list of {@link PageComponent}.
* </p>
* <#else>
* <p>
* ソート済みの{@link PageComponent}のリスト.
* </p>
* </#if>
*/
protected List<PageComponent> pageDescList;
/**
* <#if locale="en">
* <p>
* Create sorted list of {@link PageComponent} from given {@link Map}.
* </p>
* <#else>
* <p>
* 引数の{@link Map}から、ソート済みの{@link PageComponent}のリストを生成します.
* </p>
* </#if>
*/
@Override
public void initialize(Map<String, PageComponent> pageDescMap) {
List<PageComponent> list = new ArrayList<PageComponent>();
list.addAll(pageDescMap.values());
Collections.sort(list, new Comparator<PageComponent>() {
@Override
public int compare(PageComponent o1, PageComponent o2) {
final String pageTemplatePath2 = o2.getPageTemplatePath()
.replaceAll("\\{.*\\}", "");
final String pageTemplatePath1 = o1.getPageTemplatePath()
.replaceAll("\\{.*\\}", "");
return pageTemplatePath2.length() - pageTemplatePath1.length();
}
});
this.pageDescList = list;
}
/**
* <#if locale="en">
* <p>
* Return list of {@link PageComponent} if requested path, which is
* calculated by {@link UrlTemplate}, is matched.
* </p>
* <#else>
* <p>
* pageDescList内の{@link PageComponent}のうち、リクエストされたパスと{@link UrlTemplate}
* がマッチするものを返します.
* </p>
* </#if>
*
* @see org.t2framework.confeito.internal.PathUtil
*/
@Override
public List<PageComponent> find(final WebContext context) {
final List<PageComponent> ret = new ArrayList<PageComponent>();
final HttpServletRequest req = context.getRequest().getNativeResource();
final String path = PathUtil.getPagePath(req);
for (PageComponent pd : this.pageDescList) {
if (pd.getUrlTemplate().match(path)) {
ret.add(pd);
}
}
return ret;
}
}