/*
* 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.api.generic.dataobjects;
import org.apache.axiom.om.OMElement;
import org.wso2.carbon.governance.api.common.dataobjects.GovernanceArtifact;
import org.wso2.carbon.governance.api.common.dataobjects.GovernanceArtifactImpl;
import org.wso2.carbon.governance.api.exception.GovernanceException;
import org.wso2.carbon.governance.api.util.GovernanceUtils;
import org.wso2.carbon.registry.core.Registry;
import org.wso2.carbon.registry.core.Resource;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
import org.wso2.carbon.registry.core.utils.RegistryUtils;
import javax.xml.namespace.QName;
import java.lang.String;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.UUID;
/**
* Represents a generic governance artifact.
*/
public class GenericArtifactImpl extends GovernanceArtifactImpl implements GenericArtifact {
private QName qName;
private String mediaType;
private byte[] content;
/**
* Copy constructor used for cloning.
*
* @param artifact the object to be copied.
*/
protected GenericArtifactImpl(GovernanceArtifact artifact, String mediaType) {
super((GovernanceArtifactImpl)artifact);
this.qName = artifact.getQName();
setArtifactPath(((GovernanceArtifactImpl) artifact).getArtifactPath());
setLcName(((GovernanceArtifactImpl) artifact).getLcName());
setLcState(((GovernanceArtifactImpl) artifact).getLcState());
this.mediaType = mediaType;
}
protected GenericArtifactImpl(GovernanceArtifact artifact, String mediaType, List<String> uniqueAttributes) {
super((GovernanceArtifactImpl)artifact, uniqueAttributes);
this.qName = artifact.getQName();
setArtifactPath(((GovernanceArtifactImpl) artifact).getArtifactPath());
setLcName(((GovernanceArtifactImpl) artifact).getLcName());
setLcState(((GovernanceArtifactImpl) artifact).getLcState());
this.mediaType = mediaType;
}
/**
* Constructor accepting resource identifier and the qualified name.
*
* @param id the resource identifier.
* @param qName the qualified name.
*/
public GenericArtifactImpl(String id, QName qName, String mediaType) {
super(id);
this.qName = qName;
this.mediaType = mediaType;
}
public GenericArtifactImpl(String id, QName qName, String mediaType, List<String> uniqueAttributes) {
this(id, qName, mediaType);
setUniqueAttributes(uniqueAttributes);
}
public GenericArtifactImpl(QName qName, String mediaType) {
super(UUID.randomUUID().toString());
this.qName = qName;
this.mediaType = mediaType;
}
public GenericArtifactImpl(QName qName, String mediaType, List<String> uniqueAttributes) {
this(qName, mediaType);
setUniqueAttributes(uniqueAttributes);
}
public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
/**
* Method to load the details into this artifact.
*
* @throws GovernanceException if the operation failed.
*/
public void loadDetails() throws GovernanceException {
checkRegistryResourceAssociation();
Registry registry = getAssociatedRegistry();
String path = getPath();
String id = getId();
Resource resource;
try {
resource = registry.get(path);
this.content = (byte[]) resource.getContent();
this.mediaType = resource.getMediaType();
} catch (RegistryException e) {
throw new GovernanceException("Error in getting the qualified name for the artifact. " +
"artifact id: " + id + ", " + "path: " + path + ".", e);
}
// get the target namespace.
String fileName = RegistryUtils.getResourceName(path);
this.qName = new QName(null, fileName);
// and then iterate all the properties and add.
Properties properties = resource.getProperties();
if (properties != null) {
Set keySet = properties.keySet();
if (keySet != null) {
for (Object keyObj : keySet) {
String key = (String) keyObj;
List values = (List) properties.get(key);
if (values != null) {
for (Object valueObj : values) {
String value = (String) valueObj;
addAttribute(key, value);
}
}
}
}
}
}
/**
* Constructor accepting resource identifier and the artifact content.
*
* @param id the resource identifier.
* @param artifactContentElement an XML element containing the content.
* @param artifactNameAttribute the attribute that specifies the name of the artifact.
* @param artifactNamespaceAttribute the attribute that specifies the namespace of the artifact.
* @param artifactElementNamespace the attribute that specifies the artifact element's
* namespace.
*
* @throws GovernanceException if the construction fails.
*/
public GenericArtifactImpl(String id, OMElement artifactContentElement,
String artifactNameAttribute,
String artifactNamespaceAttribute,
String artifactElementNamespace,
String mediaType) throws GovernanceException {
super(id, artifactContentElement);
String name = GovernanceUtils.getAttributeValue(artifactContentElement,
artifactNameAttribute, artifactElementNamespace);
String namespace = (artifactNamespaceAttribute != null) ?
GovernanceUtils.getAttributeValue(artifactContentElement,
artifactNamespaceAttribute, artifactElementNamespace) : null;
if (name != null && !name.equals("")) {
this.qName = new QName(namespace, name);
}
this.mediaType = mediaType;
}
/**
* Constructor accepting resource identifier and the artifact content.
*
* @param id the resource identifier.
* @param registry the registry instance to fetch artifact content.
*
* @throws GovernanceException if the construction fails.
*/
public GenericArtifactImpl(String id, Registry registry) throws GovernanceException {
super(id);
associateRegistry(registry);
loadDetails();
}
public QName getQName() {
return qName;
}
public String getMediaType() {
return mediaType;
}
/**
* Method to set the qualified name of this artifact.
*
* @param qName the qualified name.
*
* @throws GovernanceException if the operation failed.
*/
public void setQName(QName qName) {
// the path will be synced with the qualified name
this.qName = qName;
}
}