/*
* Copyright (c) 2005-2009, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you 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.governance.list.ui.internal;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMException;
import org.apache.axiom.om.xpath.AXIOMXPath;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jaxen.JaxenException;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.component.ComponentContext;
import org.wso2.carbon.governance.api.util.GovernanceArtifactConfiguration;
import org.wso2.carbon.governance.api.util.GovernanceUtils;
import org.wso2.carbon.registry.core.ActionConstants;
import org.wso2.carbon.registry.core.RegistryConstants;
import org.wso2.carbon.registry.core.Resource;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
import org.wso2.carbon.registry.core.utils.RegistryUtils;
import org.wso2.carbon.registry.ws.client.registry.WSRegistryServiceClient;
import org.wso2.carbon.ui.CarbonUIAuthenticator;
import org.wso2.carbon.ui.CarbonUIUtil;
import org.wso2.carbon.ui.MenuAdminClient;
import org.wso2.carbon.ui.UIAuthenticationExtender;
import org.wso2.carbon.ui.deployment.ComponentBuilder;
import org.wso2.carbon.ui.deployment.beans.Component;
import org.wso2.carbon.ui.deployment.beans.Menu;
import org.wso2.carbon.user.core.service.RealmService;
import org.wso2.carbon.utils.ServerConstants;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.xml.namespace.QName;
import java.util.*;
/**
* The List UI Declarative Service Component.
*
* @scr.component name="org.wso2.carbon.governance.list.ui"
* immediate="true"
* @scr.reference name="ui.authenticator"
* interface="org.wso2.carbon.ui.CarbonUIAuthenticator" cardinality="1..1"
* policy="dynamic" bind="setCarbonUIAuthenticator" unbind="unsetCarbonUIAuthenticator"
*/
@SuppressWarnings({"unused", "JavaDoc"})
public class GovernanceListUIServiceComponent {
private static Log log = LogFactory.getLog(GovernanceListUIServiceComponent.class);
private ServiceRegistration serviceRegistration;
private static final String DEFAULT_LIFECYCLE_GENERATOR_CLASS
= "org.wso2.carbon.governance.services.ui.utils.LifecycleListPopulator";
private int menuOrder = 50;
protected void activate(ComponentContext context) {
UIAuthenticationExtender authenticationExtender = new UIAuthenticationExtender() {
public void onSuccessAdminLogin(HttpServletRequest request, String s, String s1,
String s2) {
if(CarbonUIUtil.isUserAuthorized(request,"/permission/admin/manage/resources/ws-api")){
HttpSession session = request.getSession();
String cookie =
(String) session.getAttribute(ServerConstants.ADMIN_SERVICE_COOKIE);
try {
WSRegistryServiceClient registry = new WSRegistryServiceClient(s2, cookie);
List<GovernanceArtifactConfiguration> configurations =
GovernanceUtils.findGovernanceArtifactConfigurations(registry);
Map<String, String> customAddUIMap = new LinkedHashMap<String, String>();
Map<String, String> customViewUIMap = new LinkedHashMap<String, String>();
List<Menu> userCustomMenuItemsList = new LinkedList<Menu>();
for (GovernanceArtifactConfiguration configuration : configurations) {
Component component = new Component();
OMElement uiConfigurations = configuration.getUIConfigurations();
String key = configuration.getKey();
String configurationPath = RegistryConstants.CONFIG_REGISTRY_BASE_PATH +
RegistryConstants.GOVERNANCE_COMPONENT_PATH +
"/configuration/";
String layoutStoragePath = configurationPath
+ key;
RealmService realmService = registry.getRegistryContext().getRealmService();
if (realmService.getTenantUserRealm(realmService.getTenantManager().getTenantId(s1))
.getAuthorizationManager().isUserAuthorized(s, configurationPath, ActionConstants.PUT)
|| registry.resourceExists(layoutStoragePath)) {
List<Menu> menuList = component.getMenusList();
if (uiConfigurations != null) {
ComponentBuilder
.processMenus("artifactType", uiConfigurations, component);
ComponentBuilder.processCustomUIs(uiConfigurations, component);
}
if (menuList.size() == 0) {
// if no menu definitions were present, define the default ones.
buildMenuList(request, configuration, menuList, key);
}
userCustomMenuItemsList.addAll(menuList);
customAddUIMap.putAll(component.getCustomAddUIMap());
Map<String, String> viewUIMap =
component.getCustomViewUIMap();
if (viewUIMap.isEmpty()) {
// if no custom UI definitions were present, define the default.
buildViewUI(configuration, viewUIMap, key);
}
customViewUIMap.putAll(viewUIMap);
OMElement layout = configuration.getContentDefinition();
if (layout != null && !registry.resourceExists(layoutStoragePath)) {
Resource resource = registry.newResource();
resource.setContent(RegistryUtils.encodeString(layout.toString()));
resource.setMediaType("application/xml");
registry.put(layoutStoragePath, resource);
}
}
}
session.setAttribute(MenuAdminClient.USER_CUSTOM_MENU_ITEMS,
userCustomMenuItemsList.toArray(
new Menu[userCustomMenuItemsList.size()]));
session.setAttribute("customAddUI", customAddUIMap);
session.setAttribute("customViewUI",customViewUIMap);
} catch (RegistryException e) {
log.error("unable to create connection to registry");
} catch (org.wso2.carbon.user.api.UserStoreException e) {
log.error("unable to realm service");
}
}
}
};
serviceRegistration = context.getBundleContext().registerService(
UIAuthenticationExtender.class.getName(), authenticationExtender, null);
log.debug("******* Governance List UI bundle is activated ******* ");
}
private void buildViewUI(GovernanceArtifactConfiguration configuration,
Map<String, String> viewUIMap, String key) {
String singularLabel = configuration.getSingularLabel();
String pluralLabel = configuration.getPluralLabel();
String lifecycleAttribute = key + "Lifecycle_lifecycleName";
lifecycleAttribute = BuilLifecycleAttribute(configuration, DEFAULT_LIFECYCLE_GENERATOR_CLASS, lifecycleAttribute);
if (singularLabel == null || pluralLabel == null) {
log.error("The singular label and plural label have not " +
"been defined for the artifact type: " + key);
} else {
String contentURL = configuration.getContentURL();
if (contentURL != null) {
if (!contentURL.toLowerCase().equals("default")) {
viewUIMap.put(configuration.getMediaType(), contentURL);
}
} else {
String path = "../generic/edit_ajaxprocessor.jsp?hideEditView=true&key=" + key +
"&lifecycleAttribute=" + lifecycleAttribute +"&add_edit_breadcrumb=" +
singularLabel + "&add_edit_region=region3&add_edit_item=governance_add_" +
key + "_menu&breadcrumb=" + singularLabel;
viewUIMap.put(configuration.getMediaType(), path);
}
}
}
/*
* This method is used to capture the lifecycle attribute from the configuration.
*
* expected configuration elements are
*
* <field type="options">
<name label="Lifecycle Name" >Lifecycle Name</name>
<values class="org.wso2.carbon.governance.services.ui.utils.LifecycleListPopulator"/>
</field>
*
* or
*
* <field type="options">
<name label="Lifecycle Name" >Lifecycle Name</name>
<values class="com.foo.bar.LifecycleListPopulator" isLifecycle="true"/>
</field>
* */
private String BuilLifecycleAttribute(GovernanceArtifactConfiguration configuration,
String defaultLifecycleGeneratorClass, String lifecycleAttribute) {
try {
// This part checks whether the user has given a lifecycle populates.
// If not, then we check whether there is an attribute called, "isLifecycle"
// This attribute will identify the lifecycle attribute from the configuration.
OMElement configurationElement = configuration.getContentDefinition();
String xpathExpression = "//@class";
AXIOMXPath xpath = new AXIOMXPath(xpathExpression);
List resultNodes = xpath.selectNodes(configurationElement);
if (resultNodes != null && resultNodes.size() > 0) {
String lifecycleParentName = null;
String lifecycleName = null;
for (Object resultNode : resultNodes) {
OMElement parentElement = ((OMAttribute)resultNode).getOwner();
if(parentElement.getAttributeValue(new QName("class")).equals(defaultLifecycleGeneratorClass)){
Iterator childrenIterator = parentElement.getParent().getChildrenWithLocalName("name");
while (childrenIterator.hasNext()) {
OMElement next = (OMElement) childrenIterator.next();
lifecycleName = next.getAttributeValue(new QName("label"));
}
OMElement rootElement = (OMElement) ((OMElement) parentElement.getParent()).getParent();
lifecycleParentName = rootElement.getAttributeValue(new QName("name"));
break;
}else if(parentElement.getAttributeValue(new QName("isLifecycle")) != null && parentElement.getAttributeValue(new QName("isLifecycle")).equals("true")){
Iterator childrenIterator = parentElement.getParent().getChildrenWithLocalName("name");
while (childrenIterator.hasNext()) {
OMElement next = (OMElement) childrenIterator.next();
lifecycleName = next.getAttributeValue(new QName("label"));
}
OMElement rootElement = (OMElement) ((OMElement) parentElement.getParent()).getParent();
lifecycleParentName = rootElement.getAttributeValue(new QName("name"));
break;
}
}
if (lifecycleParentName != null && lifecycleName != null) {
return convertName(lifecycleParentName.split(" "))
+ "_" + convertName(lifecycleName.split(" "));
}
}
} catch (OMException e) {
log.error("Governance artifact configuration of configuration key:" + configuration.getKey() + " is invalid", e);
} catch (JaxenException e) {
log.error("Error in getting the lifecycle attribute",e);
}
return null;
}
private String convertName(String[] nameParts) {
String convertedName = null;
// making widget name camel case
for (String namePart : nameParts) {
int i;
for (i = 0; i < namePart.length(); i++) {
char c = namePart.charAt(i);
if (!Character.isLetter(c) || Character.isLowerCase(c)) {
break;
}
}
if (namePart.equals(nameParts[0])) {
namePart = namePart.substring(0, i).toLowerCase() + namePart.substring(i);
}
if (convertedName == null) {
convertedName = namePart;
} else {
convertedName += namePart;
}
}
return convertedName;
}
private void buildMenuList(HttpServletRequest request,
GovernanceArtifactConfiguration configuration, List<Menu> menuList,
String key) {
String singularLabel = configuration.getSingularLabel();
String pluralLabel = configuration.getPluralLabel();
boolean hasNamespace = configuration.hasNamespace();
String lifecycleAttribute = key + "Lifecycle_lifecycleName";
lifecycleAttribute = BuilLifecycleAttribute(configuration, DEFAULT_LIFECYCLE_GENERATOR_CLASS, lifecycleAttribute);
if (singularLabel == null || pluralLabel == null) {
log.error("The singular label and plural label have not " +
"been defined for the artifact type: " + key);
} else {
int iconSet = configuration.getIconSet();
if (CarbonUIUtil.isUserAuthorized(request,
"/permission/admin/manage/resources/govern/" + key + "/add") &&
CarbonUIUtil.isUserAuthorized(request,
"/permission/admin/manage/resources/browse") &&
CarbonUIUtil.isUserAuthorized(request,
"/permission/admin/manage/resources/ws-api")) {
Menu addMenu = new Menu();
addMenu.setId("governance_add_" + key + "_menu");
addMenu.setI18nKey(singularLabel);
addMenu.setParentMenu("add_sub_menu");
if (configuration.getExtension() == null) {
addMenu.setLink("../generic/add_edit.jsp");
addMenu.setUrlParameters("key=" + key + "&lifecycleAttribute=" +
lifecycleAttribute + "&breadcrumb=" + singularLabel);
} else {
addMenu.setLink("../generic/add_content.jsp");
addMenu.setUrlParameters("key=" + key + "&lifecycleAttribute=" +
lifecycleAttribute + "&breadcrumb=" + singularLabel + "&mediaType=" +
configuration.getMediaType() + "&extension=" +
configuration.getExtension() + "&singularLabel=" + singularLabel +
"&pluralLabel=" + pluralLabel + "&hasNamespace" + hasNamespace);
}
addMenu.setRegion("region3");
addMenu.setOrder(String.valueOf(menuOrder));
addMenu.setStyleClass("manage");
if (iconSet > 0) {
addMenu.setIcon("../generic/images/add" + iconSet + ".png");
} else {
addMenu.setIcon("../images/add.gif");
}
addMenu.setAllPermissionsRequired(true);
addMenu.setRequirePermission(
new String[]{"/permission/admin/manage/resources/govern/" + key + "/add",
"/permission/admin/manage/resources/browse",
"/permission/admin/manage/resources/ws-api"});
menuList.add(addMenu);
}
if (CarbonUIUtil.isUserAuthorized(request,
"/permission/admin/manage/resources/govern/" + key + "/list") &&
CarbonUIUtil.isUserAuthorized(request,
"/permission/admin/manage/resources/ws-api")) {
Menu listMenu = new Menu();
listMenu.setId("governance_list_" + key + "_menu");
listMenu.setI18nKey(pluralLabel);
listMenu.setParentMenu("list_sub_menu");
if (configuration.getExtension() == null) {
listMenu.setLink("../generic/list.jsp");
listMenu.setUrlParameters("key=" + key + "&breadcrumb=" + pluralLabel +
"&singularLabel=" + singularLabel + "&pluralLabel=" + pluralLabel);
} else {
listMenu.setLink("../generic/list_content.jsp");
listMenu.setUrlParameters("key=" + key + "&lifecycleAttribute=" +
lifecycleAttribute + "&breadcrumb=" + singularLabel + "&mediaType=" +
configuration.getMediaType() + "&singularLabel=" + singularLabel +
"&pluralLabel=" + pluralLabel + "&hasNamespace=" + hasNamespace);
}
listMenu.setRegion("region3");
listMenu.setOrder(String.valueOf(menuOrder));
listMenu.setStyleClass("manage");
if (iconSet > 0) {
listMenu.setIcon("../generic/images/list" + iconSet + ".png");
} else {
listMenu.setIcon("../images/list.gif");
}
listMenu.setAllPermissionsRequired(true);
listMenu.setRequirePermission(
new String[]{"/permission/admin/manage/resources/govern/" + key + "/list",
"/permission/admin/manage/resources/ws-api"});
menuList.add(listMenu);
}
/*if (CarbonUIUtil.isUserAuthorized(request,
"/permission/admin/configure/governance/" + key + "-ui")) {
Menu configureMenu = new Menu();
configureMenu.setId("governance_" + key + "_config_menu");
configureMenu.setI18nKey(pluralLabel);
configureMenu.setParentMenu("configure_menu");
configureMenu.setLink("../generic/configure.jsp");
configureMenu.setUrlParameters("key=" + key + "&breadcrumb=" + pluralLabel +
"&add_edit_region=region3&add_edit_item=governance_add_" + key + "_menu" +
"&lifecycleAttribute=" + lifecycleAttribute +
"&add_edit_breadcrumb=" + singularLabel + "&singularLabel=" + singularLabel +
"&pluralLabel=" + pluralLabel);
configureMenu.setRegion("region1");
configureMenu.setOrder("40");
configureMenu.setStyleClass("manage");
if (iconSet > 0) {
configureMenu.setIcon("../generic/images/configure" + iconSet + ".png");
} else {
configureMenu.setIcon("../generic/images/services1.gif");
}
configureMenu.setRequirePermission(
new String[]{"/permission/admin/configure/governance/" + key + "-ui"});
menuList.add(configureMenu);
}*/
menuOrder++;
}
}
protected void deactivate(ComponentContext context) {
if (serviceRegistration != null) {
serviceRegistration.unregister();
serviceRegistration = null;
}
log.debug("Governance List UI bundle is deactivated ");
}
protected void setCarbonUIAuthenticator(CarbonUIAuthenticator uiAuthenticator) {
}
protected void unsetCarbonUIAuthenticator(CarbonUIAuthenticator uiAuthenticator) {
}
}