blob: 0c3fb45d893a980bd1916db594dfd516e1630bf3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.apache.felix.obr.plugin;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* this class describe all information by bundle.
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class ResourcesBundle
{
/**
* store the bundle symbolic name.
*/
private String m_symbolicName;
/**
* store the bundle presentation name.
*/
private String m_presentationName;
/**
* store the bundle version.
*/
private String m_version;
/**
* store the bundle URI.
*/
private String m_uri;
/**
* store the bundle description.
*/
private String m_description;
/**
* store the bundle size.
*/
private String m_size;
/**
* store the bundle documentation.
*/
private String m_documentation;
/**
* store the bundle source.
*/
private String m_source;
/**
* store the bundle license.
*/
private String m_license;
/**
* store the bundle id.
*/
private String m_id;
/**
* store the bundle categories.
*/
private List m_category = new ArrayList();
/**
* store the bundle capabilities.
*/
private List m_capability = new ArrayList();
/**
* store the bundle requirement.
*/
private List m_require = new ArrayList();
/**
* get the plugin logger.
*/
private Log m_logger;
/**
* initialize logger.
* @param log log use by plugin
*/
public ResourcesBundle( Log log )
{
m_logger = log;
}
public List getCapability()
{
return m_capability;
}
public void setCapability( List capability )
{
this.m_capability = capability;
}
public List getCategory()
{
return m_category;
}
public void setCategory( List category )
{
this.m_category = category;
}
public String getLicense()
{
return m_license;
}
public void setLicense( String license )
{
this.m_license = license;
}
public String getDescription()
{
return m_description;
}
public void setDescription( String description )
{
this.m_description = description;
}
public String getDocumentation()
{
return m_documentation;
}
public void setDocumentation( String documentation )
{
this.m_documentation = documentation;
}
public String getPresentationName()
{
return m_presentationName;
}
public void setPresentationName( String name )
{
m_presentationName = name;
}
public String getSize()
{
return m_size;
}
public void setSize( String size )
{
this.m_size = size;
}
public String getSymbolicName()
{
return m_symbolicName;
}
public void setSymbolicName( String name )
{
m_symbolicName = name;
}
public String getUri()
{
return m_uri;
}
public void setUri( String url )
{
this.m_uri = url;
}
public String getVersion()
{
return m_version;
}
public void setVersion( String version )
{
this.m_version = version;
}
public List getRequire()
{
return m_require;
}
public void setRequire( List require )
{
this.m_require = require;
}
public String getSource()
{
return m_source;
}
public void setSource( String source )
{
this.m_source = source;
}
public String getId()
{
return m_id;
}
public void setId( String id )
{
this.m_id = id;
}
/**
* add a new capability for this bundle description.
* @param capability the Capability to add
*/
public void addCapability( Capability capability )
{
m_capability.add( capability );
}
/**
* add a new requirement for this bundle description.
* @param require th Require to add
*/
public void addRequire( Require require )
{
m_require.add( require );
}
/**
* add a new category for this bundle decription.
* @param category the Category to add
*/
public void addCategory( Category category )
{
m_category.add( category );
}
/**
* transform this object to Node.
* tranform all sub-object to node also
* @param father father document for create Node
* @return node
*/
public Node getNode( Document father )
{
// return the complete resource tree
if ( !this.isValid() || this.getId() == null )
{
m_logger.error( "those properties was not defined:" + this.getInvalidProperties() );
return null;
}
Element resource = father.createElement( "resource" );
Element description = father.createElement( "description" );
Element size = father.createElement( "size" );
Element documentation = father.createElement( "documentation" );
Element source = father.createElement( "source" );
Element license = father.createElement( "license" );
resource.setAttribute( "id", this.getId() );
resource.setAttribute( "symbolicname", this.getSymbolicName() );
resource.setAttribute( "presentationname", this.getPresentationName() );
resource.setAttribute( "uri", this.getUri() );
resource.setAttribute( "version", this.getVersion() );
XmlHelper.setTextContent( description, this.getDescription() );
resource.appendChild( description );
XmlHelper.setTextContent( size, this.getSize() );
resource.appendChild( size );
if ( this.getDocumentation() != null )
{
XmlHelper.setTextContent( documentation, this.getDocumentation() );
resource.appendChild( documentation );
}
if ( this.getSource() != null )
{
XmlHelper.setTextContent( source, this.getSource() );
resource.appendChild( source );
}
if ( this.getLicense() != null )
{
XmlHelper.setTextContent( license, this.getLicense() );
resource.appendChild( license );
}
List list = ( ArrayList ) this.getNodeCategories( father );
for ( int i = 0; i < list.size(); i++ )
{
resource.appendChild( ( Node ) list.get( i ) );
}
list = ( ArrayList ) this.getNodeCapabilities( father );
for ( int i = 0; i < list.size(); i++ )
{
resource.appendChild( ( Node ) list.get( i ) );
}
list = ( ArrayList ) this.getNodeRequirement( father );
for ( int i = 0; i < list.size(); i++ )
{
resource.appendChild( ( Node ) list.get( i ) );
}
return resource;
}
/**
* this method gets information form pom.xml to complete missing data from those given by user.
* @param project project information given by maven
* @param ebi bundle information extracted from bindex
* @return true
*/
public boolean construct( MavenProject project, ExtractBindexInfo ebi )
{
if ( ebi.getPresentationName() != null )
{
this.setPresentationName( ebi.getPresentationName() );
if ( project.getName() != null )
{
m_logger.debug( "pom property override:<presentationname> " + project.getName() );
}
}
else
{
this.setPresentationName( project.getName() );
}
if ( ebi.getSymbolicName() != null )
{
this.setSymbolicName( ebi.getSymbolicName() );
if ( project.getArtifactId() != null )
{
m_logger.debug( "pom property override:<symbolicname> " + project.getArtifactId() );
}
}
else
{
this.setSymbolicName( project.getArtifactId() );
}
if ( ebi.getVersion() != null )
{
this.setVersion( ebi.getVersion() );
if ( project.getVersion() != null )
{
m_logger.debug( "pom property override:<version> " + project.getVersion() );
}
}
else
{
this.setVersion( project.getVersion() );
}
if ( ebi.getId() != null )
{
this.setId( ebi.getId() );
}
if ( ebi.getDescription() != null )
{
this.setDescription( ebi.getDescription() );
if ( project.getDescription() != null )
{
m_logger.debug( "pom property override:<description> " + project.getDescription() );
}
}
else
{
this.setDescription( project.getDescription() );
}
if ( ebi.getDocumentation() != null )
{
this.setDocumentation( ebi.getDocumentation() );
if ( project.getUrl() != null )
{
m_logger.debug( "pom property override:<documentation> " + project.getUrl() );
}
}
else
{
this.setDocumentation( project.getUrl() );
}
if ( ebi.getSource() != null )
{
this.setSource( ebi.getSource() );
if ( project.getScm() != null )
{
m_logger.debug( "pom property override:<source> " + project.getScm() );
}
}
else
{
String src = null;
if ( project.getScm() != null )
{
src = project.getScm().getUrl();
}
this.setSource( src );
}
if ( ebi.getLicense() != null )
{
this.setLicense( ebi.getLicense() );
String lic = null;
List l = project.getLicenses();
Iterator it = l.iterator();
while ( it.hasNext() )
{
if ( it.next() != null )
{
m_logger.debug( "pom property override:<license> " + lic );
break;
}
}
}
else
{
String lic = null;
List l = project.getLicenses();
Iterator it = l.iterator();
while ( it.hasNext() )
{
lic = it.next() + ";";
}
this.setLicense( lic );
}
// create the first capability (ie : bundle)
Capability capability = new Capability();
capability.setName( "bundle" );
PElement p = new PElement();
p.setN( "manifestversion" );
p.setV( "2" );
capability.addP( p );
p = new PElement();
p.setN( "presentationname" );
p.setV( this.getPresentationName() );
capability.addP( p );
p = new PElement();
p.setN( "symbolicname" );
p.setV( this.getSymbolicName() );
capability.addP( p );
p = new PElement();
p.setN( "version" );
p.setT( "version" );
p.setV( this.getVersion() );
capability.addP( p );
this.addCapability( capability );
List capabilities = ( ArrayList ) ebi.getCapabilities();
for ( int i = 0; i < capabilities.size(); i++ )
{
this.addCapability( ( Capability ) capabilities.get( i ) );
}
List requirement = ( ArrayList ) ebi.getRequirement();
for ( int i = 0; i < requirement.size(); i++ )
{
this.addRequire( ( Require ) requirement.get( i ) );
}
// we also add the goupId
Category category = new Category();
category.setId( project.getGroupId() );
this.addCategory( category );
return true;
}
/**
* return if the bundle resource is complete.
* @return false if an information is missing, else true
*/
public boolean isValid()
{
// we must verify required properties are present
return this.getPresentationName() != null && this.getSymbolicName() != null && this.getVersion() != null
&& this.getUri() != null && this.getSize() != null;
}
/**
* test if this bundle has the same symbolicname, and version number.
* @param symbolicName symbolicName to compare with current bundle
* @param presentationName presentationName to compare with current bundlde
* @param version version to compare with current bundle
* @return true if the information are the same, else false
*/
public boolean isSameBundleResource( String symbolicName, String version )
{
if ( this.isValid() )
{
return ( symbolicName.compareTo( this.getSymbolicName() ) == 0 )
&& ( version.compareTo( this.getVersion() ) == 0 );
}
else
{
return false;
}
}
/**
* return a list of categories transformed to node.
* @param father father document to create node from same document
* @return List of Node
*/
private List getNodeCategories( Document father )
{
List listNode = new ArrayList();
List listCategory = ( ArrayList ) this.getCategory();
for ( int i = 0; i < listCategory.size(); i++ )
{
listNode.add( ( ( Category ) listCategory.get( i ) ).getNode( father ) );
}
return listNode;
}
/**
* return a list of capabilities transformed to node.
* @param father father document to create node from same document
* @return List of Node
*/
private List getNodeCapabilities( Document father )
{
List listNode = new ArrayList();
List listCapability = ( ArrayList ) this.getCapability();
for ( int i = 0; i < listCapability.size(); i++ )
{
listNode.add( ( ( Capability ) listCapability.get( i ) ).getNode( father ) );
}
return listNode;
}
/**
* return a list of requirement transformed to node.
* @param father father document to create node from same document
* @return List of Node.
*/
private List getNodeRequirement( Document father )
{
List listNode = new ArrayList();
List listRequirement = ( ArrayList ) this.getRequire();
for ( int i = 0; i < listRequirement.size(); i++ )
{
listNode.add( ( ( Require ) listRequirement.get( i ) ).getNode( father ) );
}
return listNode;
}
/**
* return the list of properties not define in this bundle resource.
* @return list of properties not define
*/
private String getInvalidProperties()
{
if ( this.isValid() )
{
if ( this.getId() == null )
{
return "id";
}
else
{
return "";
}
}
String result = "";
if ( this.getPresentationName() == null )
{
result = result + "presentationName;";
}
if ( this.getSymbolicName() == null )
{
result = result + "symbolicName;";
}
if ( this.getVersion() == null )
{
result = result + "version;";
}
if ( this.getUri() == null )
{
result = result + "Uri;";
}
if ( this.getSize() == null )
{
result = result + "Size";
}
return result;
}
}