/*
* Copyright (c) 2002-2012 Alibaba Group Holding Limited.
* All rights reserved.
*
* 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 com.alibaba.citrus.dev.handler.impl.visitor;
import static com.alibaba.citrus.util.Assert.*;
import static com.alibaba.citrus.util.CollectionUtil.*;
import static com.alibaba.citrus.util.FileUtil.*;
import static com.alibaba.citrus.util.StringEscapeUtil.*;
import static com.alibaba.citrus.util.StringUtil.*;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.alibaba.citrus.dev.handler.impl.ExplorerHandler.ExplorerVisitor;
import com.alibaba.citrus.service.resource.Resource;
import com.alibaba.citrus.service.resource.ResourceLoadingService;
import com.alibaba.citrus.service.resource.ResourceNotFoundException;
import com.alibaba.citrus.service.resource.ResourceTrace;
import com.alibaba.citrus.service.resource.ResourceTraceElement;
import com.alibaba.citrus.util.IllegalPathException;
import com.alibaba.citrus.util.templatelite.Template;
import com.alibaba.citrus.webx.handler.RequestHandlerContext;
public class ResourcesVisitor extends AbstractFallbackVisitor<ExplorerVisitor> {
private final ResourceLoadingService resourceLoadingService;
private final String resourceName;
private String title;
private String content;
public ResourcesVisitor(RequestHandlerContext context, ExplorerVisitor v,
ResourceLoadingService resourceLoadingService) {
super(context, v);
this.resourceLoadingService = assertNotNull(resourceLoadingService, "resourceLoadingService");
String resourceName;
try {
resourceName = defaultIfEmpty(normalizeAbsolutePath(context.getRequest().getParameter("resource")), "/");
} catch (IllegalPathException e) {
resourceName = "/";
}
this.resourceName = resourceName;
}
public void visitService(Template serviceNotAvailableTemplate, Template serviceTemplate) {
if (resourceLoadingService == null) {
serviceNotAvailableTemplate.accept(this);
} else {
serviceTemplate.accept(this);
}
}
public void visitResourceName() {
out().print(escapeHtml(resourceName));
}
private ResourceTraceElement traceElement;
private Resource result;
public void visitTraceResource(Template traceResourceTemplate) {
traceResourceTemplate.accept(this);
}
public void visitTrace(Template traceElementTemplate, Template resultTemplate, Template resultNotExistTemplate,
Template resultNotFoundTemplate) {
ResourceTrace trace = resourceLoadingService.trace(resourceName, ResourceLoadingService.FOR_CREATE);
for (ResourceTraceElement traceElement : trace) {
this.traceElement = traceElement;
traceElementTemplate.accept(this);
}
result = trace.getResult();
if (result == null) {
resultNotFoundTemplate.accept(this);
} else if (!result.exists()) {
resultNotExistTemplate.accept(this);
} else {
resultTemplate.accept(this);
}
}
public void visitTrace(String param) {
if ("resourceName".equals(param)) {
out().print(escapeHtml(traceElement.getResourceName()));
} else if ("patternType".equals(param)) {
out().print(escapeHtml(traceElement.getPatternType()));
} else if ("patternName".equals(param)) {
out().print(escapeHtml(traceElement.getPatternName()));
} else if ("serviceName".equals(param)) {
out().print(escapeHtml(traceElement.getBeanName()));
} else if ("serviceLocation".equals(param)) {
out().print(escapeHtml(traceElement.getConfigLocation()));
} else if ("serviceLocationShort".equals(param)) {
out().print(escapeHtml(traceElement.getShortLocation()));
} else {
unreachableCode();
}
}
public void visitInternal(Template internalTemplate) {
if (traceElement.isInternalPattern()) {
internalTemplate.accept(this);
}
}
public void visitResult() {
out().print(escapeHtml(result.toString()));
}
private List<String> subResourceNames;
private String fullSubResourceName;
private String relativeSubResourceName;
public void visitSubResources(Template subResourcesTemplate) {
try {
subResourceNames = createArrayList(resourceLoadingService.list(resourceName,
ResourceLoadingService.FOR_CREATE));
} catch (ResourceNotFoundException e) {
subResourceNames = createArrayList();
}
Collections.sort(subResourceNames, new Comparator<String>() {
public int compare(String o1, String o2) {
int d1 = o1.endsWith("/") ? 0 : 1;
int d2 = o2.endsWith("/") ? 0 : 1;
if (d1 == d2) {
return o1.compareTo(o2);
} else {
return d1 - d2;
}
}
});
try {
normalizeAbsolutePath(resourceName + "/..");
subResourceNames.add(0, "..");
} catch (IllegalPathException e) {
}
subResourcesTemplate.accept(this);
}
public void visitSubResource(Template subResourceTemplate) {
for (String subResourceName : subResourceNames) {
fullSubResourceName = normalizeAbsolutePath(resourceName + "/" + subResourceName);
relativeSubResourceName = subResourceName;
subResourceTemplate.accept(this);
}
}
public void visitSubResourceName(String type) {
if ("relative".equals(type)) {
out().print(escapeHtml(relativeSubResourceName));
} else {
out().print(escapeHtml(fullSubResourceName));
}
}
private String pattern;
public void visitPatterns(Template patternsTemplate) {
patternsTemplate.accept(this);
}
public void visitPattern(Template patternTemplate) {
for (String pattern : resourceLoadingService.getPatterns(true)) {
this.pattern = pattern;
patternTemplate.accept(this);
}
}
public void visitPattern() {
out().print(escapeHtml(pattern));
}
public void visitTitle() {
out().print(escapeHtml(title));
}
public void visitBoxContent() {
out().print(escapeHtml(content));
}
}