/*
* Copyright (c) 2006, WSO2 Inc. (http://www.wso2.org) 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 org.wso2.carbon.registry.relations.services.utils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.registry.core.Association;
import org.wso2.carbon.registry.core.Collection;
import org.wso2.carbon.registry.core.Resource;
import org.wso2.carbon.registry.core.ResourcePath;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
import org.wso2.carbon.registry.core.session.UserRegistry;
import org.wso2.carbon.registry.relations.beans.AssociationTreeBean;
import org.wso2.carbon.registry.common.CommonConstants;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class AssociationTreeBeanPopulator {
private static final Log log = LogFactory.getLog(AssociationTreeBeanPopulator.class);
private static List paths;
public static AssociationTreeBean populate(UserRegistry userRegistry, String resourcePath, String associationType) {
paths = new ArrayList();
AssociationTreeBean associationTreeBean = new AssociationTreeBean();
associationTreeBean.setResourcePath(resourcePath);
associationTreeBean.setAssoType(associationType);
associationTreeBean.setAssoIndex(0);
try {
List fatherAsso = provideChildAssociations(resourcePath, associationType, userRegistry);
if (fatherAsso != null) {
Iterator ifatherAssofaterAsso = fatherAsso.iterator();
while (ifatherAssofaterAsso.hasNext()) {
Association asso = (Association) ifatherAssofaterAsso.next();
associationTreeBean.setAssociationTree(associationTreeBean.getAssociationTree() +
createAssociationTree(
asso, associationTreeBean, userRegistry));
}
}
String [] pathArray = new String [paths.size()];
for(int i=0; i<paths.size(); i++) {
pathArray[i] = (String) paths.get(i);
}
associationTreeBean.setTreeCache(pathArray);
} catch (RegistryException e) {
String msg = "Failed to generate association tree of the resource " +
resourcePath + ". " + e.getMessage();
log.error(msg, e);
associationTreeBean.setErrorMessage(msg);
}
return associationTreeBean;
}
private static String createAssociationTree(Association tmpAsso, AssociationTreeBean associationTreeBean, UserRegistry registry) throws RegistryException {
String path = tmpAsso.getDestinationPath();
associationTreeBean.setAssoIndex(associationTreeBean.getAssoIndex() + 1);
StringBuffer associationTreePart = new StringBuffer();
if (registry.resourceExists(path)) {
Resource father = registry.get(path);
String fatherResourceType = father instanceof Collection ? "collection" : "resource";
List fatherAsso = provideChildAssociations(path, associationTreeBean.getAssoType(), registry);
paths.add(path);
boolean foundInfinite = false;
if (fatherAsso == null) foundInfinite = true;
associationTreePart.append("<div class=\"father-object\" >");
if (associationTreeBean.getAssoType().equals(CommonConstants.ASSOCIATION_TYPE01)) {
associationTreePart.append("<ul class=\"tree-row-object\"><li>");
} else {
associationTreePart.append("<ul class=\"tree-row-object\"><li class=\"first\">");
}
if (!foundInfinite) {
if (!fatherAsso.isEmpty()) {
boolean showChildren = false;
Iterator iFaterAsso = fatherAsso.iterator();
while (iFaterAsso.hasNext()) {
Association asso = (Association) iFaterAsso.next();
// if path is equal to the destination path, it is a backward association. we are only displaying
// the forward associations here
if (!path.equals(asso.getDestinationPath())) {
if (!paths.contains(asso.getDestinationPath())) {
showChildren = true;
break;
}
}
}
if (showChildren) {
associationTreePart.append("<a onclick=\"showHideCommon('y_").append(
associationTreeBean.getAssoIndex()).append(
"');showHideCommon('xminus_").append(
associationTreeBean.getAssoIndex()).append(
"');showHideCommon('xplus_").append(
associationTreeBean.getAssoIndex()).append(
"');\">").append(
"<img src=\"../resources/images/icon-tree-minus.gif\"").append(
"id=\"xminus_").append(associationTreeBean.getAssoIndex()).append(
"\" style=\"margin-right:2px;\" />").append(
"<img src=\"../resources/images/icon-tree-plus.gif\"").append(
"id=\"xplus_").append(associationTreeBean.getAssoIndex()).append(
"\" style=\"margin-right:2px;display:none;\" /></a>");
}
} else {
associationTreePart.append("<img src=\"../resources/images/spacer.gif\" style=\"width:15px;\" />");
}
} else {
associationTreePart.append("<img src=\"../resources/images/spacer.gif\" style=\"width:15px;\" />");
}
if (fatherResourceType.equals("collection")) {
associationTreePart.append("<img src=\"../resources/images/icon-folder-small.gif\" style=\"margin-right:2px;\" />");
} else {
associationTreePart.append("<img src=\"../resources/images/editshred.png\" style=\"margin-right:2px;\" />");
}
//associationTreePart += "<a title=\"" + path + "\" href=\"resource.jsp?path=" + calculateRelativePath(path) + "\">";
String tempPath = path;
if (tempPath != null) {
try {
tempPath = URLEncoder.encode(tempPath, "UTF-8");
} catch (UnsupportedEncodingException ignored) {
}
}
associationTreePart.append("<a title=\"").append(path).append(
"\" href=\"../resources/resource.jsp?region=region3&item=resource_browser_menu&viewType=std&path=").append(
tempPath).append("\">");
String pathSmall = getShortnedPath(associationTreeBean, path);
if (foundInfinite) {
associationTreePart.append(pathSmall).append("(infinite loop..)");
} else {
associationTreePart.append(pathSmall);
}
associationTreePart.append("</a></li>");
if (!associationTreeBean.getAssoType().equals(CommonConstants.ASSOCIATION_TYPE01))
associationTreePart.append("<li class=\"second\">").append(
tmpAsso.getAssociationType()).append("</li>");
associationTreePart.append("</ul></div>");
if (!foundInfinite && !fatherAsso.isEmpty()) {
associationTreePart.append("<div class=\"child-objects\" id=\"y_").append(
associationTreeBean.getAssoIndex()).append("\">");
Iterator iFaterAsso = fatherAsso.iterator();
while (iFaterAsso.hasNext()) {
Association asso = (Association) iFaterAsso.next();
// if path is equal to the destination path, it is a backward association. we are only displaying
// the forward associations here
if (!path.equals(asso.getDestinationPath())) {
if (!paths.contains(asso.getDestinationPath())) {
associationTreePart.append(createAssociationTree(asso, associationTreeBean, registry));
}
}
}
associationTreePart.append("</div>");
}
father.discard();
} else {
associationTreePart.append("<div class=\"father-object\" >");
if (associationTreeBean.getAssoType().equals(CommonConstants.ASSOCIATION_TYPE01)) {
associationTreePart.append("<ul class=\"tree-row-object\"><li>");
} else {
associationTreePart.append("<ul class=\"tree-row-object\"><li class=\"first\">");
}
associationTreePart.append("<img src=\"../resources/images/spacer.gif\"").append(
"style=\"width:15px;\" />");
String pathSmall = getShortnedPath(associationTreeBean, path);
associationTreePart.append("<img src=\"../resources/images/goto_url.gif\" style=\"margin-right:2px;\" />");
associationTreePart.append("<a target=\"_blank\" title=\"").append(path).append("\" href=\"").append(
path).append("\">");
associationTreePart.append(pathSmall).append("</a></li>");
if (!associationTreeBean.getAssoType().equals(CommonConstants.ASSOCIATION_TYPE01))
associationTreePart.append("<li class=\"second\">").append(
tmpAsso.getAssociationType()).append("</li>");
associationTreePart.append("</ul></div>");
}
//associationTreeBean.setAssociationTree(associationTreeBean.getAssociationTree() + associationTreePart);
return associationTreePart.toString();
}
private static String getShortnedPath(AssociationTreeBean associationTreeBean, String path) {
String pathSmall = path;
if (pathSmall != null) {
if (associationTreeBean.getAssoType().equals(CommonConstants.ASSOCIATION_TYPE01)) {
if (pathSmall.length() >= 108) {
pathSmall = pathSmall.substring(0, 50) + " .... " +
pathSmall.substring(pathSmall.length() - 50, pathSmall.length());
}
} else {
if (pathSmall.length() >= 68) {
pathSmall = pathSmall.substring(0, 30) + " .... " +
pathSmall.substring(pathSmall.length() - 30, pathSmall.length());
}
}
}
return pathSmall;
}
/*private static String calculateRelativePath(String resourcePath) {
if (resourcePath.startsWith("http://")) {
return resourcePath;
}
String relativePath = resourcePath;
if (RegistryConstants.ROOT_PATH.equals(resourcePath)) {
relativePath = "";
} else {
if (resourcePath.startsWith(RegistryConstants.PATH_SEPARATOR)) {
relativePath = resourcePath.substring(1, resourcePath.length());
}
}
return relativePath;
}*/
private static List provideChildAssociations(
String path, String assoType, UserRegistry registry)
throws RegistryException {
List tmpAssociations = new ArrayList();
List associations = new ArrayList();
ResourcePath resourcePath = new ResourcePath(path);
Resource resource = registry.get(path);
Association[] asso = CommonUtil.getAssociations(registry, (resourcePath.isCurrentVersion() ?
resourcePath.getPath() : resourcePath.getPathWithVersion()));
tmpAssociations.addAll(Arrays.asList(asso));
Iterator iAssociations = tmpAssociations.iterator();
while (iAssociations.hasNext()) {
Association tmpAsso = (Association) iAssociations.next();
//Get all associations filtered by it's association type
if (tmpAsso.getAssociationType().equals(CommonConstants.ASSOCIATION_TYPE01)
&& assoType.equals(CommonConstants.ASSOCIATION_TYPE01) && tmpAsso.getSourcePath().equals(path))
associations.add(tmpAsso);
if (!tmpAsso.getAssociationType().equals(CommonConstants.ASSOCIATION_TYPE01)
&& !assoType.equals(CommonConstants.ASSOCIATION_TYPE01) && tmpAsso.getSourcePath().equals(path))
associations.add(tmpAsso);
}
resource.discard();
// if path is equal to the destination path, it is a backward association. we are only displaying
// the forward associations here
return associations;
}
}