/*
* (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.io.IOException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openflexo.foundation.CodeType;
import org.openflexo.foundation.DataModification;
import org.openflexo.foundation.FlexoObservable;
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.CGRepositoryDisconnected;
import org.openflexo.foundation.rm.ProjectExternalRepository;
import org.openflexo.foundation.utils.FlexoModelObjectReference;
import org.openflexo.foundation.utils.FlexoModelObjectReference.ReferenceOwner;
import org.openflexo.foundation.utils.FlexoProgress;
import org.openflexo.foundation.utils.FlexoProjectFile;
import org.openflexo.foundation.xml.GeneratedCodeBuilder;
import org.openflexo.logging.FlexoLogger;
import org.openflexo.toolbox.FileUtils;
import org.openflexo.toolbox.ToolBox;
/**
* @author gpolet
*
*/
public class CGRepository extends GenerationRepository implements ReferenceOwner {
private static final Logger logger = FlexoLogger.getLogger(CGRepository.class.getPackage().getName());
private CodeType _targetType;
private String _superClassesGenerationSubPath;
private ProjectExternalRepository _warRepository;
private Format format;
private String warName;
private Date lastWarNameUpdate;
private Date lastLoginPasswordUpdate;
private String prototypeLogin;
private String prototypePassword;
private boolean includeReader = false;
private FlexoModelObjectReference<DGRepository> readerRepositoryReference;
/**
* Create a new GeneratedCodeRepository.
*/
public CGRepository(GeneratedCodeBuilder builder) {
this(builder.generatedCode);
initializeDeserialization(builder);
}
/**
* @throws DuplicateCodeRepositoryNameException
*
*/
public CGRepository(GeneratedCode generatedCode, String name, File directory) throws DuplicateCodeRepositoryNameException {
super(generatedCode, name, directory);
}
/**
* @param generatedCode
*/
public CGRepository(GeneratedOutput generatedCode) {
super(generatedCode);
}
@Override
public void delete(FlexoProgress progress, boolean deleteFiles) {
if (getReaderRepository() != null) {
getReaderRepository().removeFromRepositoriedUsingAsReader(this);
}
super.delete(progress, deleteFiles);
}
@Override
public CodeType getTarget() {
return getTargetType();
}
public CodeType getTargetType() {
if (_targetType == null) {
_targetType = CodeType.PROTOTYPE;
}
return _targetType;
}
public void setTargetType(CodeType targetType) {
CodeType old = this._targetType;
_targetType = targetType;
setChanged();
notifyObservers(new DataModification("targetType", old, targetType));
}
@Override
public boolean isEnabled() {
return super.isEnabled() && (!includeReader() || getReaderRepository().isEnabled());
}
@Override
public boolean connect() {
if (getReaderRepository() != null) {
return getReaderRepository().connect() && super.connect();
} else {
return super.connect();
}
}
public ProjectExternalRepository getWarRepository() {
if (_warRepository == null) {
_warRepository = getProject().getExternalRepositoryWithKey(getName() + "WAR");
}
if (_warRepository == null) {
try {
_warRepository = getProject().setDirectoryForRepositoryName(getName() + "WAR", getDefaultWARDirectory());
} catch (IOException e) {
e.printStackTrace();
}
}
return _warRepository;
}
private File getDefaultWARDirectory() throws IOException {
return getDirectory() != null ? getDirectory().getParentFile() : FileUtils.createTempDirectory(getProject().getProjectName()
+ "Application", ".war");
}
public File getWarDirectory() {
if (getWarRepository() != null) {
return getWarRepository().getDirectory();
}
return null;
}
public void setWarDirectory(File aDirectory) {
if (getWarRepository() != null) {
File oldValue = getWarRepository().getDirectory();
getWarRepository().setDirectory(aDirectory);
setChanged();
notifyObservers(new CGDataModification("warDirectory", oldValue, aDirectory));
}
}
public String getWarName() {
return warName;
}
public void setWarName(String warName) throws DuplicateCodeRepositoryNameException {
String oldName = this.warName;
if (oldName == null) {
if (warName == null) {
return;
}
} else {
if (oldName.equals(warName)) {
return;
}
}
this.warName = warName;
lastWarNameUpdate = new Date();
setChanged();
if (warName != null && !warName.matches(ToolBox.WAR_NAME_ACCEPTABLE_CHARS)) {
this.warName = ToolBox.getWarName(warName);
notifyObserversAsReentrantModification(new DataModification("warName", oldName, warName));
} else {
notifyObservers(new DataModification("warName", oldName, warName));
}
}
public String getSuperClassesGenerationSubPath() {
if (_superClassesGenerationSubPath == null) {
_superClassesGenerationSubPath = "/src/main/java/WebObjects/Core";
}
return _superClassesGenerationSubPath;
}
public void setSuperClassesGenerationSubPath(String subPath) {
_superClassesGenerationSubPath = subPath;
}
/**
* Overrides getClassNameKey
*
* @see org.openflexo.foundation.FlexoModelObject#getClassNameKey()
*/
@Override
public String getClassNameKey() {
return "generated_code_repository";
}
@Override
public String getInspectorName() {
return Inspectors.CG.CG_REPOSITORY_INSPECTOR;
}
public CGSymbolicDirectory getJavaSymbolicDirectory() {
return getSymbolicDirectoryNamed(CGSymbolicDirectory.JAVA);
}
public CGSymbolicDirectory getResourcesSymbolicDirectory() {
return getSymbolicDirectoryNamed(CGSymbolicDirectory.RESOURCES);
}
public CGSymbolicDirectory getWebResourcesSymbolicDirectory() {
CGSymbolicDirectory reply = getSymbolicDirectoryNamed(CGSymbolicDirectory.WEBRESOURCES);
if (reply == null) {
FlexoProjectFile webSymbDir = new FlexoProjectFile(getProject(), getSourceCodeRepository(), "/src/main/webresources");
webSymbDir.getFile().mkdirs();
setSymbolicDirectoryForKey(new CGSymbolicDirectory(this, CGSymbolicDirectory.WEBRESOURCES, webSymbDir),
CGSymbolicDirectory.WEBRESOURCES);
}
return getSymbolicDirectoryNamed(CGSymbolicDirectory.WEBRESOURCES);
}
public CGSymbolicDirectory getLibSymbolicDirectory() {
CGSymbolicDirectory reply = getSymbolicDirectoryNamed(CGSymbolicDirectory.LIB);
if (reply == null) {
FlexoProjectFile libSymbDir = new FlexoProjectFile(getProject(), getSourceCodeRepository(), "/lib");
libSymbDir.getFile().mkdirs();
setSymbolicDirectoryForKey(new CGSymbolicDirectory(this, CGSymbolicDirectory.LIB, libSymbDir), CGSymbolicDirectory.LIB);
}
return getSymbolicDirectoryNamed(CGSymbolicDirectory.LIB);
}
public CGSymbolicDirectory getComponentsSymbolicDirectory() {
return getSymbolicDirectoryNamed(CGSymbolicDirectory.COMPONENTS);
}
public CGSymbolicDirectory getProjectSymbolicDirectory() {
return getSymbolicDirectoryNamed(CGSymbolicDirectory.PROJECT);
}
public CGSymbolicDirectory getReaderSymbolicDirectory() {
return getSymbolicDirectoryNamed(CGSymbolicDirectory.READER);
}
@Override
protected void deleteExternalRepositories() {
if (getWarRepository() != null) {
getProject().removeFromExternalRepositories(getWarRepository());
}
super.deleteExternalRepositories();
}
public void clearAllJavaParsingData() {
for (CGFile file : getFiles()) {
file.clearParsingData();
}
getProject().getDataModel().getClassLibrary().clearLibrary();
}
public String getPrototypeLogin() {
return prototypeLogin;
}
public void setPrototypeLogin(String prototypeLogin) {
String old = this.prototypeLogin;
this.prototypeLogin = prototypeLogin;
lastLoginPasswordUpdate = new Date();
setChanged();
notifyObservers(new CGDataModification("prototypeLogin", old, prototypeLogin));
}
public String getPrototypePassword() {
return prototypePassword;
}
public void setPrototypePassword(String prototypePassword) {
String old = this.prototypePassword;
this.prototypePassword = prototypePassword;
lastLoginPasswordUpdate = new Date();
setChanged();
notifyObservers(new CGDataModification("prototypePassword", old, prototypePassword));
}
/**
* This date is use to perform fine tuning resource dependancies computing
*
* @return
*/
public Date getLastWarNameUpdate() {
if (lastWarNameUpdate == null) {
lastWarNameUpdate = super.getLastUpdate();
}
return lastWarNameUpdate;
}
public void setLastWarNameUpdate(Date lastUpdate) {
lastWarNameUpdate = lastUpdate;
}
/**
* This date is use to perform fine tuning resource dependancies computing
*
* @return
*/
public Date getLastLoginPasswordUpdate() {
if (lastLoginPasswordUpdate == null) {
lastLoginPasswordUpdate = super.getLastUpdate();
}
return lastLoginPasswordUpdate;
}
public void setLastLoginPasswordUpdate(Date lastUpdate) {
lastLoginPasswordUpdate = lastUpdate;
}
@Override
public Format getFormat() {
if (format == null) {
return Format.WEBOBJECTS;
}
return format;
}
@Override
public void setFormat(Format format) {
this.format = format;
}
public boolean includeReader() {
if (includeReader && getReaderRepository() == null) {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Repository '" + getName() + "' should include reader but has no reader repository!");
}
}
return includeReader && getReaderRepository() != null;
}
public void setIncludeReader(boolean includeReader) {
this.includeReader = includeReader;
}
public DGRepository getReaderRepository() {
if (getReaderRepositoryReference() != null) {
return getReaderRepositoryReference().getObject(true);
}
return null;
}
public void setReaderRepository(DGRepository readerRepository) {
readerRepository.addToRepositoriedUsingAsReader(this);
readerRepository.addObserver(this);
if (readerRepositoryReference == null) {
setReaderRepositoryReference(new FlexoModelObjectReference<DGRepository>(readerRepository));
}
}
@Override
public void update(FlexoObservable observable, DataModification obj) {
if (observable == getReaderRepository() && (obj instanceof CGRepositoryConnected || obj instanceof CGRepositoryDisconnected)) {
setChanged();
notifyObservers(obj);
}
super.update(observable, obj);
}
public FlexoModelObjectReference<DGRepository> getReaderRepositoryReference() {
return readerRepositoryReference;
}
public void setReaderRepositoryReference(FlexoModelObjectReference<DGRepository> readerRepositoryReference) {
if (this.readerRepositoryReference != null) {
this.readerRepositoryReference.delete();
}
this.readerRepositoryReference = readerRepositoryReference;
this.readerRepositoryReference.setOwner(this);
}
@Override
public void notifyObjectLoaded(FlexoModelObjectReference reference) {
if (reference.getObject() instanceof DGRepository) {
setReaderRepository((DGRepository) reference.getObject());
}
}
@Override
public void objectCantBeFound(FlexoModelObjectReference reference) {
}
@Override
public void objectDeleted(FlexoModelObjectReference reference) {
}
@Override
public void objectSerializationIdChanged(FlexoModelObjectReference reference) {
setChanged();
}
}