/**
* JHOVE2 - Next-generation architecture for format-aware characterization
*
* Copyright (c) 2009 by The Regents of the University of California,
* Ithaka Harbors, Inc., and The Board of Trustees of the Leland Stanford
* Junior University.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* o Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* o Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* o Neither the name of the University of California/California Digital
* Library, Ithaka Harbors/Portico, or Stanford University, nor the names of
* its contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package org.jhove2.module;
import static com.sleepycat.persist.model.DeleteAction.NULLIFY;
import static com.sleepycat.persist.model.Relationship.MANY_TO_ONE;
import java.util.ArrayList;
import java.util.List;
import org.jhove2.core.Agent;
import org.jhove2.core.JHOVE2Exception;
import org.jhove2.core.TimerInfo;
import org.jhove2.core.WrappedProduct;
import org.jhove2.core.reportable.AbstractReportable;
import org.jhove2.core.source.AbstractSource;
import org.jhove2.core.source.Source;
import org.jhove2.persist.ModuleAccessor;
import com.sleepycat.persist.model.Entity;
import com.sleepycat.persist.model.PrimaryKey;
import com.sleepycat.persist.model.SecondaryKey;
/**
* An abstract {@link Module}.
*
* @author mstrong, slabrams, smorrissey
*/
@Entity
public abstract class AbstractModule
extends AbstractReportable
implements Module
{
@PrimaryKey(sequence="MODULE_ID")
protected Long moduleId;
@SecondaryKey(relate=MANY_TO_ONE, relatedEntity=AbstractSource.class,
onRelatedEntityDelete=NULLIFY)
protected Long moduleParentSourceId;
protected ModuleAccessor moduleAccessor;
/** Product developers. */
protected List<Agent> developers;
/** Product name, based on the simple class name. */
protected String name;
/** Product informative note. */
protected String note;
/** Product release date in ISO 8601 form: "YYYY-MM-DD". */
protected String releaseDate;
/** Product rights statement. */
protected String rights;
/** Module scope: generic or specific. */
protected Scope scope;
/** Product version identifier in three-part form: "M.N.P". */
protected String version;
/**
* Module wrapped product. This field should be defined if the module does
* not directly perform its own processing, but rather invokes an external
* tool.
*/
protected WrappedProduct wrappedProduct;
/** Timer info used to track elapsed time for running of this module. */
protected TimerInfo timerInfo;
/**
* Instantiate a new <code>AbstractModule</code>.
*
* @param version
* Module version identifier in three-part form: "M.N.P"
* @param release
* Module release date in ISO 8601 format: "YYYY-MM-DD"
* @param rights
* Module rights statement
* @param scope
* Module scope: generic or specific
* @param moduleAccessor
* Module persistence manager
*/
public AbstractModule(String version, String release, String rights,
Scope scope, ModuleAccessor moduleAccessor)
{
super();
this.version = version;
this.releaseDate = release;
this.rights = rights;
this.scope = scope;
this.developers = new ArrayList<Agent>();
this.timerInfo = new TimerInfo();
this.name = this.getClass().getSimpleName();
this.moduleAccessor = moduleAccessor;
}
/**
* Instantiate a new <code>AbstractModule</code>.
* @param moduleAccessor
* Module persistence manager
*/
public AbstractModule(ModuleAccessor moduleAccessor){
this (null, null, null, Scope.Specific, moduleAccessor);
}
/**
* Instantiate a new <code>AbstractModule</code>.
*/
public AbstractModule(){
this(null);
}
/**
* Get module developers.
*
* @return Product developers
*/
@Override
public List<Agent> getDevelopers() {
return this.developers;
}
/**
* Get module informative note.
*
* @return Product informative note
*/
@Override
public String getNote() {
return this.note;
}
/**
* Get module release date.
*
* @return Product release date
*/
@Override
public String getReleaseDate() {
return this.releaseDate;
}
/**
* Get module rights statement.
*
* @return Product rights statement
*/
@Override
public String getRightsStatement() {
return this.rights;
}
/** Get module scope: generic or specific (to a source unit).
* @return Module scope
*/
@Override
public Scope getScope() {
return this.scope;
}
/**
* Get module version.
*
* @return Product version
*/
@Override
public String getVersion() {
return this.version;
}
/**
* Get wrapped external product.
*
* @return Wrapped external product
*/
@Override
public WrappedProduct getWrappedProduct() {
return this.wrappedProduct;
}
/**
* Set module developers.
*
* @param developers
* Product developers
*/
@Override
public void setDevelopers(List<Agent> developers) {
this.developers = developers;
}
/**
* Set module informative note.
*
* @param note
* Product informative note
*/
@Override
public void setNote(String note) {
this.note = note;
}
/** Set module release date.
* @param release Module release date
*/
@Override
public void setReleaseDate(String release) {
this.releaseDate = release;
}
/** Set module rights statement.
* @param rights Module rights statement
*/
@Override
public void setRights(String rights) {
this.rights = rights;
}
/** Set module scope.
* @param scope Module scope
*/
@Override
public void setScope(Scope scope) {
this.scope = scope;
}
@Override
public void setTimerInfo(TimerInfo timer){
this.timerInfo = timer;
}
/** Get module timer information.
* @return Module timer information
*/
@Override
public TimerInfo getTimerInfo() {
return timerInfo;
}
/** Set module version.
* @param version Module version
*/
@Override
public void setVersion(String version) {
this.version = version;
}
/**
* Set wrapped product.
*
* @param product
* Wrapped product
*/
@Override
public void setWrappedProduct(WrappedProduct product) {
this.wrappedProduct = product;
}
@Override
public Long getModuleId() {
return moduleId;
}
@Override
public Long getParentSourceId() {
return moduleParentSourceId;
}
@Override
public Source getParentSource()throws JHOVE2Exception{
return this.getModuleAccessor().getParentSource(this);
}
@Override
public void setParentSourceId(Long parentSourceId) throws JHOVE2Exception {
Long oldId = this.moduleParentSourceId;
this.moduleParentSourceId = parentSourceId;
this.getModuleAccessor().verifyNewParentSourceId(this, oldId, parentSourceId);
}
@Override
public ModuleAccessor getModuleAccessor() {
return moduleAccessor;
}
@Override
public void setModuleAccessor(ModuleAccessor moduleAccessor) {
this.moduleAccessor = moduleAccessor;
}
}