package org.wso2.carbon.governance.generic.util;
/*
* Copyright (c) 2008, 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.
*/
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.util.AXIOMUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.governance.api.util.GovernanceConstants;
import org.wso2.carbon.governance.api.util.GovernanceUtils;
import org.wso2.carbon.governance.list.util.CommonUtil;
import org.wso2.carbon.registry.core.Registry;
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.extensions.utils.CommonConstants;
import javax.cache.Cache;
import javax.xml.namespace.QName;
public class GenericArtifactUtil {
private static final Log log = LogFactory.getLog(GenericArtifactUtil.class);
public final static String REL_RXT_BASE_PATH ;
static {
REL_RXT_BASE_PATH = GovernanceConstants.RXT_CONFIGS_PATH.
split(RegistryConstants.GOVERNANCE_REGISTRY_BASE_PATH)[1];
}
public static boolean addRXTResource(String path,String rxtConfig, Registry registry) throws RegistryException {
String rxtName = null;
Resource resource = null;
String rxtStoragePath = null;
try {
if(rxtConfig == null || rxtConfig.equals("")){
log.error("Failed to add RXT resource , because RXT content is null or empty");
return false;
}
OMElement element = buildOMElement(rxtConfig);
if (!CommonUtil.validateXMLConfigOnSchema(
RegistryUtils.decodeBytes(rxtConfig.getBytes()), "rxt-ui-config")) {
throw new RegistryException("Violation of RXT definition in" +
" configuration file, follow the schema correctly..!!");
}
if (element != null) {
rxtName = element.getAttributeValue(new QName("shortName"));
}
if (rxtName == null || rxtName.equals("")) {
return false; // invalid configuration
}
if (RegistryUtils.isRegistryReadOnly(registry.getRegistryContext())) {
return false;
}
if(path == null) {
resource = registry.newResource();
rxtStoragePath = getCalculatedRXTPath(rxtName);
} else if (registry.resourceExists(getGovernanceRelativePath(path))){
resource = registry.get(getGovernanceRelativePath(path));
rxtStoragePath = getGovernanceRelativePath(path);
}
Cache<String,Boolean> rxtConfigCache = GovernanceUtils.getRXTConfigCache(GovernanceConstants.RXT_CONFIG_CACHE_ID);
resource.setContent(rxtConfig.getBytes());
resource.setMediaType(CommonConstants.RXT_MEDIA_TYPE);
registry.beginTransaction();
registry.put(rxtStoragePath, resource);
registry.commitTransaction();
if(rxtConfigCache.containsKey(rxtStoragePath)){
rxtConfigCache.put(rxtStoragePath,rxtConfigCache.get(rxtStoragePath)^true);
}else{
rxtConfigCache.put(rxtStoragePath,true);
}
} catch (RegistryException e) {
registry.rollbackTransaction();
log.error("Error occurred while installing the RXT configuration " + rxtName, e);
throw new RegistryException("Unable to store the rxt resource ", e);
} catch (Exception e) {
registry.rollbackTransaction();
log.error("Error occurred while installing the RXT configuration " + rxtName, e);
throw new RegistryException("Unable to store the rxt resource ", e);
}
return true;
}
public static OMElement buildOMElement(String payload) throws RegistryException {
OMElement element;
try {
element = AXIOMUtil.stringToOM(payload);
element.build();
} catch (Exception e) {
String message = "Unable to parse the XML configuration. Please validate the XML configuration";
log.error(message, e);
throw new RegistryException(message, e);
}
return element;
}
public static String getRXTKeyFromContent(String payload) throws RegistryException {
OMElement element = buildOMElement(payload);
return element.getAttributeValue(new QName("shortName"));
}
public static String getArtifactUIContentFromConfig(String payload) throws RegistryException {
OMElement element = buildOMElement(payload);
OMElement content = element.getFirstChildWithName(new QName("content"));
if(content != null) {
return content.toString();
} else {
return null;
}
}
private static String getRXTNameFromShortName(String shortName) {
return shortName + ".rxt";
}
private static String getGovernanceRelativePath(String absPath){
return absPath.split(RegistryConstants.GOVERNANCE_REGISTRY_BASE_PATH)[1];
}
private static String getCalculatedRXTPath(String rxtName) {
getRXTNameFromShortName(rxtName);
StringBuilder storage = new StringBuilder();
storage.append(REL_RXT_BASE_PATH).append("/").append(rxtName).append(".rxt");
return storage.toString();
}
public static String getArtifactViewRequestParams(String payload) throws Exception {
String shortName = "";
String singuLarLabel = "";
String pluralLabel = "";
OMElement element = buildOMElement(payload);
if (element != null) {
shortName = element.getAttributeValue(new QName("shortName"));
singuLarLabel = element.getAttributeValue(new QName("singularLabel"));
pluralLabel = element.getAttributeValue(new QName("pluralLabel"));
}
String item = "governance_" + shortName + "_config_menu";
String addEditItem = "governance_add_" + shortName + "_menu";
return new StringBuilder("region=region1").append("&").append("item=").append(item).append("&").
append("key=").append(shortName).append("&").append("breadcrumb=").append(pluralLabel.
replaceAll(" ", "%20")).append("&").append("add_edit_region=region3").append("&").
append("add_edit_item=").append(addEditItem).append("&").append("lifecycleAttribute=null").
append("&").append("add_edit_breadcrumb=").append(singuLarLabel.replaceAll(" ", "%20")).
append("&").append("singularLabel=").append(singuLarLabel.replaceAll(" ", "%20")).append("&").
append("pluralLabel=").append(pluralLabel.replaceAll(" ", "%20")).toString();
}
}