org.spdx.rdfparser.license.License.java Source code

Java tutorial

Introduction

Here is the source code for org.spdx.rdfparser.license.License.java

Source

/**
 * Copyright (c) 2011 Source Auditor Inc.
 *
 *   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.spdx.rdfparser.license;

import java.util.List;

import org.apache.commons.lang3.StringEscapeUtils;
import org.spdx.compare.LicenseCompareHelper;
import org.spdx.licenseTemplate.SpdxLicenseTemplateHelper;
import org.spdx.rdfparser.IModelContainer;
import org.spdx.rdfparser.InvalidSPDXAnalysisException;
import org.spdx.rdfparser.SpdxRdfConstants;
import org.spdx.rdfparser.model.IRdfModel;

import com.google.common.collect.Lists;
import org.apache.jena.graph.Node;

/**
 * Describes a license
 * 
 * All licenses have an ID.  
 * Subclasses should extend this class to add additional properties.
 * 
 * @author Gary O'Neall
 *
 */
public abstract class License extends SimpleLicensingInfo {

    static final String XML_LITERAL = "^^http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral";

    /**
     * True if the text in the RDF model uses HTML tags.  If this flag is true, the text will
     * be converted on import from the model.
     */
    private boolean textInHtml = true;
    /**
     * True if the template in the RDF model uses HTML tags.  If this flag is true, the text will
     * be converted on import from the model.
     */
    private boolean templateInHtml = false;
    protected String standardLicenseHeader;
    protected String standardLicenseTemplate;
    protected String licenseText;
    protected boolean osiApproved;
    protected Boolean fsfLibre = null;
    protected boolean deprecated;

    private String standardLicenseHeaderTemplate;

    /**
     * @param name License name
     * @param id License ID
     * @param text License text
     * @param sourceUrl Optional URLs that reference this license
     * @param comments Optional comments
     * @param standardLicenseHeader Optional license header
     * @param template Optional template
     * @param osiApproved True if this is an OSI Approvied license
     * @throws InvalidSPDXAnalysisException
     */
    public License(String name, String id, String text, String[] sourceUrl, String comments,
            String standardLicenseHeader, String template, boolean osiApproved)
            throws InvalidSPDXAnalysisException {
        this(name, id, text, sourceUrl, comments, standardLicenseHeader, template, osiApproved, null);
    }

    /**
     * @param name License name
     * @param id License ID
     * @param text License text
     * @param sourceUrl Optional URLs that reference this license
     * @param comments Optional comments
     * @param standardLicenseHeader Optional license header
     * @param template Optional template
     * @param standardLicenseHeaderTemplate optional template for the standard license header
     * @param osiApproved True if this is an OSI Approvied license
     * @param fsfLibre true if FSF describes the license as free / libre, false if FSF describes the license as not free / libre, null if FSF does not reference the license
     * @throws InvalidSPDXAnalysisException
     */
    public License(String name, String id, String text, String[] sourceUrl, String comments,
            String standardLicenseHeader, String template, String standardLicenseHeaderTemplate,
            boolean osiApproved, Boolean fsfLibre) throws InvalidSPDXAnalysisException {
        super(name, id, comments, sourceUrl);
        this.standardLicenseHeader = standardLicenseHeader;
        this.standardLicenseTemplate = template;

        this.osiApproved = osiApproved;
        this.fsfLibre = fsfLibre;
        this.licenseText = text;
        this.deprecated = false;
        this.standardLicenseHeaderTemplate = standardLicenseHeaderTemplate;
    }

    /**
     * @param name License name
     * @param id License ID
     * @param text License text
     * @param sourceUrl Optional URLs that reference this license
     * @param comments Optional comments
     * @param standardLicenseHeader Optional license header
     * @param template Optional template
     * @param osiApproved True if this is an OSI Approvied license
     * @param fsfLibre True if the license is listed by the Free Software Foundation as free / libre
     * @throws InvalidSPDXAnalysisException
     */
    public License(String name, String id, String text, String[] sourceUrl, String comments,
            String standardLicenseHeader, String template, boolean osiApproved, Boolean fsfLibre)
            throws InvalidSPDXAnalysisException {
        this(name, id, text, sourceUrl, comments, standardLicenseHeader, template, standardLicenseHeader,
                osiApproved, fsfLibre);
    }

    /**
     * Constructs an SPDX License from the licenseNode
     * @param modelContainer container which includes the license
     * @param licenseNode RDF graph node representing the SPDX License
     * @throws InvalidSPDXAnalysisException 
     */
    public License(IModelContainer modelContainer, Node licenseNode) throws InvalidSPDXAnalysisException {
        super(modelContainer, licenseNode);
        getPropertiesFromModel();
    }

    /* (non-Javadoc)
     * @see org.spdx.rdfparser.model.RdfModelObject#getPropertiesFromModel()
     */
    @Override
    public void getPropertiesFromModel() throws InvalidSPDXAnalysisException {
        super.getPropertiesFromModel();
        // text
        licenseText = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_LICENSE_TEXT);
        if (licenseText != null && licenseText.endsWith(XML_LITERAL)) {
            this.licenseText = this.licenseText.substring(0, this.licenseText.length() - XML_LITERAL.length());
        }
        if (licenseText != null && this.textInHtml) {
            this.licenseText = SpdxLicenseTemplateHelper.htmlToText(this.licenseText);
        }
        // standardLicenseHeader
        standardLicenseHeader = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                SpdxRdfConstants.PROP_STD_LICENSE_NOTICE);
        if (standardLicenseHeader == null) {
            standardLicenseHeader = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                    SpdxRdfConstants.PROP_STD_LICENSE_HEADER_VERSION_1);
        }
        if (standardLicenseHeader != null) {
            standardLicenseHeader = StringEscapeUtils.unescapeHtml4(standardLicenseHeader);
        }
        standardLicenseHeaderTemplate = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                SpdxRdfConstants.PROP_STD_LICENSE_HEADER_TEMPLATE);
        if (standardLicenseHeaderTemplate != null) {
            standardLicenseHeaderTemplate = StringEscapeUtils.unescapeHtml4(standardLicenseHeaderTemplate);
        }
        // template
        this.standardLicenseTemplate = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                SpdxRdfConstants.PROP_STD_LICENSE_TEMPLATE);
        if (this.standardLicenseTemplate == null) {
            // try version 1
            this.standardLicenseTemplate = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                    SpdxRdfConstants.PROP_STD_LICENSE_TEMPLATE_VERSION_1);
        }
        if (standardLicenseTemplate != null && standardLicenseTemplate.endsWith(XML_LITERAL)) {
            this.standardLicenseTemplate = this.standardLicenseTemplate.substring(0,
                    this.standardLicenseTemplate.length() - XML_LITERAL.length());
        }
        if (standardLicenseTemplate != null && this.templateInHtml) {
            this.standardLicenseTemplate = SpdxLicenseTemplateHelper.htmlToText(this.standardLicenseTemplate);
        }
        // OSI Approved
        String osiTextValue = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                SpdxRdfConstants.PROP_STD_LICENSE_OSI_APPROVED);
        if (osiTextValue == null) {
            // for compatibility, check the version 1 property name
            osiTextValue = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                    SpdxRdfConstants.PROP_STD_LICENSE_OSI_APPROVED_VERSION_1);
        }
        if (osiTextValue != null) {
            osiTextValue = osiTextValue.trim();
            if (osiTextValue.equals("true") || osiTextValue.equals("1")) {
                this.osiApproved = true;
            } else if (osiTextValue.equals("false") || osiTextValue.equals("0")) {
                this.osiApproved = false;
            } else {
                throw (new InvalidSPDXAnalysisException(
                        "Invalid value for OSI Approved - must be {true, false, 0, 1}"));
            }
        } else {
            this.osiApproved = false;
        }
        String fsfTextValue = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                SpdxRdfConstants.PROP_STD_LICENSE_FSF_LIBRE);
        if (fsfTextValue != null) {
            fsfTextValue = fsfTextValue.trim();
            if (fsfTextValue.equals("true") || fsfTextValue.equals("1")) {
                this.fsfLibre = true;
            } else if (fsfTextValue.equals("false") || fsfTextValue.equals("0")) {
                this.fsfLibre = false;
            } else {
                throw (new InvalidSPDXAnalysisException(
                        "Invalid value for FSF Free - must be {true, false, 0, 1}"));
            }
        } else {
            fsfLibre = null;
        }
        // Deprecated
        String deprecatedValue = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                SpdxRdfConstants.PROP_LIC_ID_DEPRECATED);
        if (deprecatedValue != null) {
            deprecatedValue = deprecatedValue.trim();
            if (deprecatedValue.equals("true") || deprecatedValue.equals("1")) {
                this.deprecated = true;
            } else if (deprecatedValue.equals("false") || deprecatedValue.equals("0")) {
                this.deprecated = false;
            } else {
                throw (new InvalidSPDXAnalysisException(
                        "Invalid value for license deprecated - must be {true, false, 0, 1}"));
            }
        }
    }

    /* (non-Javadoc)
     * @see org.spdx.rdfparser.model.RdfModelObject#populateModel()
     */
    @Override
    public void populateModel() throws InvalidSPDXAnalysisException {
        super.populateModel();
        // LicenseText
        setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_LICENSE_TEXT, this.licenseText);
        this.textInHtml = false; // we stored it in the clear
        // OSI Approved
        removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                SpdxRdfConstants.PROP_STD_LICENSE_OSI_APPROVED_VERSION_1);
        if (osiApproved) {
            setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_OSI_APPROVED,
                    "true");
        } else {
            removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_OSI_APPROVED);
        }
        // FSF Libre
        removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_FSF_LIBRE);
        if (this.fsfLibre != null) {
            if (this.fsfLibre) {
                setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_FSF_LIBRE,
                        "true");
            } else {
                setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_FSF_LIBRE,
                        "false");
            }
        } else {
            removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_FSF_LIBRE);
        }
        // Headers
        removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_HEADER_VERSION_1);
        setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_NOTICE,
                standardLicenseHeader);
        // header template
        removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_HEADER_TEMPLATE);
        if (this.standardLicenseHeaderTemplate != null) {
            setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_HEADER_TEMPLATE,
                    standardLicenseHeaderTemplate);
        }
        // Template
        removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_TEMPLATE_VERSION_1);
        setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_TEMPLATE,
                this.standardLicenseTemplate);
        this.templateInHtml = false; // stored in the clear
        if (this.deprecated) {
            setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_LIC_ID_DEPRECATED, "true");
        } else {
            removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_LIC_ID_DEPRECATED);
        }
    }

    /**
     * @return the text of the license
     */
    public String getLicenseText() {
        if (this.resource != null && this.refreshOnGet) {
            this.licenseText = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                    SpdxRdfConstants.PROP_LICENSE_TEXT);
            if (this.licenseText != null && this.licenseText.endsWith(XML_LITERAL)) {
                this.licenseText = this.licenseText.substring(0, this.licenseText.length() - XML_LITERAL.length());
            }
            if (this.licenseText != null && this.textInHtml) {
                this.licenseText = SpdxLicenseTemplateHelper.htmlToText(this.licenseText);
            }
        }
        return this.licenseText;
    }

    /**
     * @param text the license text to set
     */
    public void setLicenseText(String text) {
        this.licenseText = text;
        setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_LICENSE_TEXT, text);
        this.textInHtml = false; // stored in the clear
    }

    @Deprecated
    /**
     * Replaced by <code>getComment()</code>
     * @return comments
     */
    public String getNotes() {
        return getComment();
    }

    @Deprecated
    /**
     * Replaced by <code>setComment(String comment)</code>
     * @param notes Comment to set
     */
    public void setNotes(String notes) {
        setComment(notes);
    }

    /**
     * @return the standardLicenseHeader
     */
    public String getStandardLicenseHeader() {
        if (this.resource != null && this.refreshOnGet) {
            this.standardLicenseHeader = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                    SpdxRdfConstants.PROP_STD_LICENSE_NOTICE);
            if (this.standardLicenseHeader == null) {
                this.standardLicenseHeader = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                        SpdxRdfConstants.PROP_STD_LICENSE_HEADER_VERSION_1);
            }
            if (this.standardLicenseHeader != null) {
                this.standardLicenseHeader = StringEscapeUtils.unescapeHtml4(this.standardLicenseHeader);
            }
        }
        return standardLicenseHeader;
    }

    /**
     * @return standard license header template
     */
    public String getStandardLicenseHeaderTemplate() {
        if (this.resource != null && this.refreshOnGet) {
            standardLicenseHeaderTemplate = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                    SpdxRdfConstants.PROP_STD_LICENSE_HEADER_TEMPLATE);
            if (standardLicenseHeaderTemplate != null) {
                standardLicenseHeaderTemplate = StringEscapeUtils.unescapeHtml4(standardLicenseHeaderTemplate);
            }
        }
        return standardLicenseHeaderTemplate;
    }

    /**
     * @param standardLicenseHeaderTemplate
     */
    public void setStandardLicenseHeaderTemplate(String standardLicenseHeaderTemplate) {
        this.standardLicenseHeaderTemplate = standardLicenseHeaderTemplate;
        removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_HEADER_TEMPLATE);
        if (standardLicenseHeaderTemplate != null) {
            setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_HEADER_TEMPLATE,
                    standardLicenseHeaderTemplate);
        }
    }

    /**
     * @param standardLicenseHeader the standardLicenseHeader to set
     */
    public void setStandardLicenseHeader(String standardLicenseHeader) {
        this.standardLicenseHeader = standardLicenseHeader;
        removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_HEADER_VERSION_1);
        setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_NOTICE,
                standardLicenseHeader);
    }

    /**
     * @return the template
     */
    public String getStandardLicenseTemplate() {
        if (this.resource != null && this.refreshOnGet) {
            this.standardLicenseTemplate = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                    SpdxRdfConstants.PROP_STD_LICENSE_TEMPLATE);
            if (this.standardLicenseTemplate == null) {
                // try version 1
                this.standardLicenseTemplate = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                        SpdxRdfConstants.PROP_STD_LICENSE_TEMPLATE_VERSION_1);
            }
            if (standardLicenseTemplate != null && standardLicenseTemplate.endsWith(XML_LITERAL)) {
                this.standardLicenseTemplate = this.standardLicenseTemplate.substring(0,
                        this.standardLicenseTemplate.length() - XML_LITERAL.length());
            }
            if (standardLicenseTemplate != null && this.templateInHtml) {
                this.standardLicenseTemplate = SpdxLicenseTemplateHelper.htmlToText(this.standardLicenseTemplate);
            }
        }
        return standardLicenseTemplate;
    }

    /**
     * @param template the template to set
     */
    public void setStandardLicenseTemplate(String template) {
        this.standardLicenseTemplate = template;
        removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_TEMPLATE_VERSION_1);
        setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_TEMPLATE, template);
        this.templateInHtml = false; // stored in the clear
    }

    @Override
    public String toString() {
        // must be only the ID if we want to reuse the 
        // toString for creating parseable license info strings
        return this.licenseId;
    }

    @Override
    public int hashCode() {
        if (this.getLicenseId() != null) {
            return this.getLicenseId().toLowerCase().hashCode();
        } else {
            return 0;
        }
    }

    /* (non-Javadoc)
     * @see org.spdx.rdfparser.license.AnyLicenseInfo#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        }
        if (!(o instanceof License)) {
            // covers o == null, as null is not an instance of anything
            return false;
        }
        License comp = (License) o;
        if (this.licenseId == null) {
            return (comp.getLicenseId() == null);
        } else {
            return (this.licenseId.equalsIgnoreCase(comp.getLicenseId()));
        }
    }

    /* (non-Javadoc)
     * @see org.spdx.rdfparser.license.AnyLicenseInfo#verify()
     */
    @Override
    public List<String> verify() {
        List<String> retval = Lists.newArrayList();
        String id = this.getLicenseId();
        if (id == null || id.isEmpty()) {
            retval.add("Missing required license ID");
        }
        String name = this.getName();
        if (name == null || name.isEmpty()) {
            retval.add("Missing required license name");
        }
        this.getComment();
        this.getSeeAlso();
        this.getStandardLicenseHeader();
        this.getStandardLicenseTemplate();
        //TODO Add test for template
        this.getStandardLicenseHeaderTemplate();
        //TODO add test for license header template
        String licenseText = this.getLicenseText();
        if (licenseText == null || licenseText.isEmpty()) {
            retval.add("Missing required license text for " + id);
        }
        return retval;
    }

    /**
     * @return true if FSF describes the license as free / libre, false if FSF describes the license as not free / libre or if FSF does not reference the license
     * @throws InvalidSPDXAnalysisException
     */
    public boolean isFsfLibre() {
        if (this.resource != null && this.refreshOnGet) {
            String fsfTextValue = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                    SpdxRdfConstants.PROP_STD_LICENSE_FSF_LIBRE);
            if (fsfTextValue != null) {
                fsfTextValue = fsfTextValue.trim();
                if (fsfTextValue.equals("true") || fsfTextValue.equals("1")) {
                    this.fsfLibre = true;
                } else if (fsfTextValue.equals("false") || fsfTextValue.equals("0")) {
                    this.fsfLibre = false;
                }
            } else {
                fsfLibre = null;
            }
        }
        return this.fsfLibre != null && this.fsfLibre;
    }

    /**
     * @return true if FSF specified this license as not free/libre, false if it has been specified by the FSF as free / libre or if it has not been specified
     */
    public boolean isNotFsfLibre() {
        if (this.resource != null && this.refreshOnGet) {
            String fsfTextValue = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                    SpdxRdfConstants.PROP_STD_LICENSE_FSF_LIBRE);
            if (fsfTextValue != null) {
                fsfTextValue = fsfTextValue.trim();
                if (fsfTextValue.equals("true") || fsfTextValue.equals("1")) {
                    this.fsfLibre = true;
                } else if (fsfTextValue.equals("false") || fsfTextValue.equals("0")) {
                    this.fsfLibre = false;
                }
            } else {
                fsfLibre = null;
            }
        }
        return this.fsfLibre != null && !this.fsfLibre;
    }

    /**
     * @return true if FSF describes the license as free / libre, false if FSF describes the license as not free / libre, null if FSF does not reference the license
     */
    public Boolean getFsfLibre() {
        if (this.resource != null && this.refreshOnGet) {
            String fsfTextValue = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                    SpdxRdfConstants.PROP_STD_LICENSE_FSF_LIBRE);
            if (fsfTextValue != null) {
                fsfTextValue = fsfTextValue.trim();
                if (fsfTextValue.equals("true") || fsfTextValue.equals("1")) {
                    this.fsfLibre = true;
                } else if (fsfTextValue.equals("false") || fsfTextValue.equals("0")) {
                    this.fsfLibre = false;
                }
            } else {
                fsfLibre = null;
            }
        }
        return this.fsfLibre;
    }

    /**
     * @return true if the license is listed as an approved license on the OSI website
     */
    public boolean isOsiApproved() {
        if (this.resource != null && this.refreshOnGet) {
            String osiTextValue = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                    SpdxRdfConstants.PROP_STD_LICENSE_OSI_APPROVED);
            if (osiTextValue == null) {
                // for compatibility, check the version 1 property name
                osiTextValue = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                        SpdxRdfConstants.PROP_STD_LICENSE_OSI_APPROVED_VERSION_1);
            }
            if (osiTextValue != null) {
                osiTextValue = osiTextValue.trim();
                if (osiTextValue.equals("true") || osiTextValue.equals("1")) {
                    this.osiApproved = true;
                } else if (osiTextValue.equals("false") || osiTextValue.equals("0")) {
                    this.osiApproved = false;
                } else {
                    this.osiApproved = false;
                }
            } else {
                this.osiApproved = false;
            }
        }
        return this.osiApproved;
    }

    /**
     * @return true if this license is marked as being deprecated
     */
    public boolean isDeprecated() {
        if (this.resource != null && this.refreshOnGet) {
            String deprecatedValue = findSinglePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                    SpdxRdfConstants.PROP_LIC_ID_DEPRECATED);
            if (deprecatedValue != null) {
                deprecatedValue = deprecatedValue.trim();
                if (deprecatedValue.equals("true") || deprecatedValue.equals("1")) {
                    this.deprecated = true;
                } else if (deprecatedValue.equals("false") || deprecatedValue.equals("0")) {
                    this.deprecated = false;
                } else {
                    this.deprecated = false;
                }
            } else {
                this.deprecated = false;
            }
        }
        return this.deprecated;
    }

    public void setOsiApproved(boolean osiApproved) {
        this.osiApproved = osiApproved;
        removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE,
                SpdxRdfConstants.PROP_STD_LICENSE_OSI_APPROVED_VERSION_1);
        if (osiApproved) {
            setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_OSI_APPROVED,
                    "true");
        } else {
            removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_OSI_APPROVED);
        }
    }

    /**
     * @param fsfLibre true if FSF describes the license as free / libre, false if FSF describes the license as not free / libre, null if FSF does not reference the license
     */
    public void setFsfLibre(Boolean fsfLibre) {
        this.fsfLibre = fsfLibre;
        if (fsfLibre != null) {
            if (fsfLibre) {
                setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_FSF_LIBRE,
                        "true");
            } else {
                setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_FSF_LIBRE,
                        "false");
            }
        } else {
            removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_STD_LICENSE_FSF_LIBRE);
        }
    }

    public void setDeprecated(boolean deprecated) {
        this.deprecated = deprecated;
        removePropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_LIC_ID_DEPRECATED);

        if (this.deprecated) {
            setPropertyValue(SpdxRdfConstants.SPDX_NAMESPACE, SpdxRdfConstants.PROP_LIC_ID_DEPRECATED, "true");
        }
    }

    /* (non-Javadoc)
     * @see org.spdx.rdfparser.license.AnyLicenseInfo#clone()
     */
    @Override
    public AnyLicenseInfo clone() {
        try {
            SpdxListedLicense retval = new SpdxListedLicense(this.getName(), this.getLicenseId(),
                    this.getLicenseText(), this.getSeeAlso(), this.getComment(), this.getStandardLicenseHeader(),
                    this.getStandardLicenseTemplate(), this.getStandardLicenseHeaderTemplate(),
                    this.isOsiApproved(), this.getFsfLibre());
            retval.setDeprecated(this.isDeprecated());
            return retval;
        } catch (InvalidSPDXAnalysisException e) {
            throw new AssertionError("Clone should never cause an Invalid SPDX Exception", e);
        }
    }

    /**
     * Copy all of the parameters from another license
     * @param license
     */
    public void copyFrom(License license) {
        this.setComment(license.getComment());
        this.setLicenseId(license.getLicenseId());
        this.setLicenseText(license.getLicenseText());
        this.setName(license.getName());
        this.setOsiApproved(license.isOsiApproved());
        this.setSeeAlso(license.getSeeAlso());
        this.setStandardLicenseHeader(license.getStandardLicenseHeader());
        this.setStandardLicenseTemplate(this.getStandardLicenseTemplate());
        this.setStandardLicenseHeaderTemplate(license.getStandardLicenseHeaderTemplate());
        this.setFsfLibre(license.getFsfLibre());
        this.setDeprecated(license.isDeprecated());
    }

    /**
     * @param compare
     * @return
     */
    @Override
    public boolean equivalent(IRdfModel compare) {
        if (!(compare instanceof License)) {
            return false;
        }
        // only test the text - other fields do not apply - if the license text is equivalent, then the license is considered equivalent
        License lCompare = (License) compare;
        return LicenseCompareHelper.isLicenseTextEquivalent(this.licenseText, lCompare.getLicenseText());

    }

}