/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.foundation.cg;
import java.io.File;
import java.util.Date;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openflexo.foundation.DocType;
import org.openflexo.foundation.FlexoModelObject;
import org.openflexo.foundation.Format;
import org.openflexo.foundation.Inspectors;
import org.openflexo.foundation.cg.dm.CGDataModification;
import org.openflexo.foundation.cg.dm.CGRepositoryConnected;
import org.openflexo.foundation.cg.dm.PostBuildStart;
import org.openflexo.foundation.cg.dm.PostBuildStop;
import org.openflexo.foundation.rm.FlexoProject.ImageFile;
import org.openflexo.foundation.rm.ProjectExternalRepository;
import org.openflexo.foundation.toc.PredefinedSection;
import org.openflexo.foundation.toc.TOCEntry;
import org.openflexo.foundation.toc.TOCModification;
import org.openflexo.foundation.toc.TOCRepository;
import org.openflexo.foundation.utils.FlexoModelObjectReference;
import org.openflexo.foundation.xml.GeneratedCodeBuilder;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.logging.FlexoLogger;
/**
* @author gpolet
*
*/
public class DGRepository extends GenerationRepository {
private static final Logger logger = FlexoLogger.getLogger(DGRepository.class.getPackage().getName());
private DocType docType;
private String postProductName;
private String docTitle;
private String customer;
private String version;
private String author;
private String reviewer;
private String systemName;
private String systemVersion;
private Date lastUpdateDate;
private ProjectExternalRepository postBuildRepository;
private TOCRepository tocRepository;
private Format format;
private FlexoModelObjectReference<TOCRepository> tocRepositoryRef;
private Vector<CGRepository> repositoriedUsingAsReader;
/**
* Create a new GeneratedCodeRepository.
*/
public DGRepository(GeneratedCodeBuilder builder) {
this(builder.generatedCode);
initializeDeserialization(builder);
}
/**
* Creates a new repository
*
* @throws DuplicateCodeRepositoryNameException
*
*/
public DGRepository(GeneratedDoc generatedDoc, String name, DocType docType, Format format, File directory)
throws DuplicateCodeRepositoryNameException {
super(generatedDoc, name, directory);
this.repositoriedUsingAsReader = new Vector<CGRepository>();
this.docType = docType;
this.format = format;
}
/**
* @param generatedCode
*/
public DGRepository(GeneratedOutput generatedCode) {
super(generatedCode);
this.repositoriedUsingAsReader = new Vector<CGRepository>();
}
@Override
public void delete() {
if (getTocRepositoryRef() != null) {
getTocRepositoryRef().delete();
}
super.delete();
}
@Override
protected void deleteExternalRepositories() {
if (getPostBuildRepository() != null) {
getProject().removeFromExternalRepositories(getPostBuildRepository());
}
super.deleteExternalRepositories();
}
@Override
public boolean isEnabled() {
return super.isEnabled() && (getFormat() == Format.HTML || getTocRepository() != null);
}
/**
* Overrides getGeneratedCode
*
* @see org.openflexo.foundation.cg.CGObject#getGeneratedCode()
*/
public GeneratedDoc getGeneratedDoc() {
return (GeneratedDoc) super.getGeneratedCode();
}
/**
* Overrides getClassNameKey
*
* @see org.openflexo.foundation.FlexoModelObject#getClassNameKey()
*/
@Override
public String getClassNameKey() {
return "generated_doc_repository";
}
/**
* Overrides getInspectorName
*
* @see org.openflexo.inspector.InspectableObject#getInspectorName()
*/
@Override
public String getInspectorName() {
switch (getFormat()) {
case HTML:
return Inspectors.DG.DG_REPOSITORY_HTML_INSPECTOR;
/*case LATEX:
return Inspectors.DG.DG_REPOSITORY_LATEX_INSPECTOR;*/
case DOCX:
return Inspectors.DG.DG_REPOSITORY_DOCX_INSPECTOR;
default:
return Inspectors.DG.DG_REPOSITORY_INSPECTOR;
}
}
public CGSymbolicDirectory getLatexSymbolicDirectory() {
return getSymbolicDirectoryNamed(CGSymbolicDirectory.LATEX);
}
public CGSymbolicDirectory getHTMLSymbolicDirectory() {
return getSymbolicDirectoryNamed(CGSymbolicDirectory.HTML);
}
public CGSymbolicDirectory getDocxSymbolicDirectory() {
return getSymbolicDirectoryNamed(CGSymbolicDirectory.DOCX);
}
public CGSymbolicDirectory getJSSymbolicDirectory() {
return getSymbolicDirectoryNamed(CGSymbolicDirectory.JS_PROCESSES);
}
public CGSymbolicDirectory getSymbolicDirectory() {
return getSymbolicDirectoryNamed(CGSymbolicDirectory.JS_PROCESSES);
}
public CGSymbolicDirectory getFiguresSymbolicDirectory() {
return getSymbolicDirectoryNamed(CGSymbolicDirectory.FIGURES);
}
public CGSymbolicDirectory getSrcSymbolicDirectory() {
/*if (getFormat() == Format.LATEX) {
return getLatexSymbolicDirectory();
}*/
return getHTMLSymbolicDirectory();
}
public CGSymbolicDirectory getResourcesSymbolicDirectory() {
/*if (getFormat() == Format.LATEX) {
return getFiguresSymbolicDirectory();
}*/
return getSymbolicDirectoryNamed(CGSymbolicDirectory.RESOURCES);
}
public ProjectExternalRepository getPostBuildRepository() {
if (postBuildRepository == null) {
postBuildRepository = getProject().getExternalRepositoryWithKey(getName() + getFormat().getPostBuildKey());
if (postBuildRepository == null) {
postBuildRepository = getProject().setDirectoryForRepositoryName(getName() + getFormat().getPostBuildKey(),
getDefaultPostBuildDirectory());
}
if (postBuildRepository.getDirectory() == null) {
postBuildRepository.setDirectory(getDefaultPostBuildDirectory());
}
}
return postBuildRepository;
}
public File getDefaultPostBuildDirectory() {
return getDirectory() != null ? getDirectory().getParentFile() : new File(System.getProperty("user.home") + "/"
+ getFormat().getPostBuildKey() + "/" + getName());
}
private String docTypeAsString;
public Date getLastUpdateDate() {
if (lastUpdateDate == null) {
lastUpdateDate = getLastUpdate();
}
return lastUpdateDate;
}
public void setLastUpdateDate(Date lastUpdateDate) {
this.lastUpdateDate = lastUpdateDate;
}
@Override
public DocType getTarget() {
return getDocType();
}
public DocType getDocType() {
if (docType == null && getProject().getDocTypes().size() > 0) {
docType = getProject().getDocTypes().get(0);
}
if (docTypeAsString != null) {
DocType dt = getProject().getDocTypeNamed(docTypeAsString);
if (dt != null) {
docType = dt;
docTypeAsString = null;
}
}
return docType;
}
public void setDocType(DocType docType) {
if (docType != null) {
this.docType = docType;
setChanged();
notifyObservers(new CGDataModification("docType", null, docType));
}
}
public String getDocTypeAsString() {
if (getDocType() != null) {
return getDocType().getName();
} else {
return null;
}
}
public void setDocTypeAsString(String docType) {
this.docTypeAsString = docType;
}
/**
* @return
*/
public File getPostBuildDirectory() {
return getPostBuildRepository().getDirectory();
}
/**
* @param selectedFile
*/
public void setPostBuildDirectory(File selectedFile) {
if (getPostBuildRepository() != null) {
File old = getPostBuildRepository().getDirectory();
getPostBuildRepository().setDirectory(selectedFile);
setChanged();
notifyObservers(new CGDataModification("pdfDirectory", old, selectedFile));
} else if (logger.isLoggable(Level.WARNING)) {
logger.warning("pdf repository is null");
}
}
public String getPostProductName() {
if (postProductName == null) {
postProductName = getName() + getFormat().getPostBuildFileExtension();
}
return postProductName;
}
public void setPostProductName(String pdfName) {
this.postProductName = pdfName;
setChanged();
notifyObservers(new CGDataModification("pdfName", null, pdfName));
}
public String getAuthor() {
if (getTocRepository() != null) {
return getTocRepository().getAuthor();
}
return author;
}
public void setAuthor(String author) {
this.author = author;
lastUpdateDate = new Date();
setChanged();
notifyObservers(new CGDataModification("author", null, author));
}
public String getCustomer() {
if (getTocRepository() != null) {
return getTocRepository().getCustomer();
}
return customer;
}
public void setCustomer(String customer) {
this.customer = customer;
lastUpdateDate = new Date();
setChanged();
notifyObservers(new CGDataModification("customer", null, customer));
}
public String getDocTitle() {
if (getTocRepository() != null) {
return getTocRepository().getDocTitle();
}
return docTitle;
}
public void setDocTitle(String docTitle) {
this.docTitle = docTitle;
lastUpdateDate = new Date();
setChanged();
notifyObservers(new CGDataModification("docTitle", null, docTitle));
}
public String getReviewer() {
if (getTocRepository() != null) {
return getTocRepository().getReviewer();
}
return reviewer;
}
public void setReviewer(String reviewer) {
String old = this.reviewer;
this.reviewer = reviewer;
lastUpdateDate = new Date();
setChanged();
notifyObservers(new CGDataModification("reviewer", old, reviewer));
}
public String getVersion() {
if (getTocRepository() != null) {
return getTocRepository().getVersion();
}
return version;
}
public void setVersion(String version) {
String old = this.version;
this.version = version;
lastUpdateDate = new Date();
setChanged();
notifyObservers(new CGDataModification("version", old, version));
}
public String getSystemName() {
if (getTocRepository() != null) {
return getTocRepository().getSystemName();
}
return systemName;
}
public void setSystemName(String systemName) {
this.systemName = systemName;
lastUpdateDate = new Date();
setChanged();
notifyObservers(new CGDataModification("systemName", null, systemName));
}
public String getSystemVersion() {
if (getTocRepository() != null) {
return getTocRepository().getSystemVersion();
}
return systemVersion;
}
public void setSystemVersion(String systemVersion) {
this.systemVersion = systemVersion;
lastUpdateDate = new Date();
setChanged();
notifyObservers(new CGDataModification("systemVersion", null, systemVersion));
}
public ImageFile getLogo() {
if (getTocRepository() != null) {
return getTocRepository().getLogo();
}
return null;
}
public File getPostBuildFile() {
if (!getPostProductName().endsWith(getFormat().getPostBuildFileExtension())) {
setPostProductName(getPostProductName() + getFormat().getPostBuildFileExtension());
}
return new File(getPostBuildDirectory(), getPostProductName());
}
public TOCEntry getTOCEntryWithID(PredefinedSection.PredefinedSectionType id) {
if (getTocRepository() != null) {
return getTocRepository().getTOCEntryWithID(id);
} else {
return null;
}
}
public TOCEntry getTOCEntryForObject(FlexoModelObject object) {
if (getTocRepository() != null) {
return getTocRepository().getTOCEntryForObject(object);
} else {
return null;
}
}
/**
*
*/
public void notifyPostBuildStop() {
setChanged(false);
notifyObservers(new PostBuildStop());
}
/**
*
*/
public void notifyPostBuildStart() {
setChanged(false);
notifyObservers(new PostBuildStart());
}
public String getLocalizedPdfInfoString() {
return FlexoLocalization.localizedForKey("pdf_info_string");
}
public TOCRepository getTocRepository() {
if (tocRepository == null && tocRepositoryRef != null) {
tocRepository = tocRepositoryRef.getObject(true);
if (tocRepository != null && !isSerializing()) {
setChanged();
notifyObservers(new CGRepositoryConnected(this));
}
}
return tocRepository;
}
public void setTocRepository(TOCRepository tocRepository) {
if (tocRepository == this.tocRepository) {
return;
}
this.tocRepository = tocRepository;
if (tocRepositoryRef != null) {
tocRepositoryRef.delete(false);
tocRepositoryRef = null;
}
if (tocRepository != null) {
tocRepositoryRef = new FlexoModelObjectReference<TOCRepository>(tocRepository);
} else {
tocRepositoryRef = null;
}
setChanged();
notifyObservers(new TOCModification(null, tocRepository));
if (tocRepository != null) {
setChanged();
notifyObservers(new CGRepositoryConnected(this));
}
}
public FlexoModelObjectReference getTocRepositoryRef() {
return tocRepositoryRef;
}
public void setTocRepositoryRef(FlexoModelObjectReference<TOCRepository> tocRepositoryRef) {
this.tocRepositoryRef = tocRepositoryRef;
}
@Override
public Format getFormat() {
if (format == null) {
format = Format.DOCX; // For compatibility reason
}
return format;
}
@Override
public void setFormat(Format format) {
this.format = format;
}
public Vector<CGRepository> getRepositoriedUsingAsReader() {
return repositoriedUsingAsReader;
}
public void addToRepositoriedUsingAsReader(CGRepository repository) {
if (!repositoriedUsingAsReader.contains(repository)) {
repositoriedUsingAsReader.add(repository);
}
}
public void removeFromRepositoriedUsingAsReader(CGRepository repository) {
repositoriedUsingAsReader.remove(repository);
}
}