/* * (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.rm.cg; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import org.openflexo.foundation.DataModification; import org.openflexo.foundation.FlexoException; import org.openflexo.foundation.FlexoObservable; import org.openflexo.foundation.FlexoObserver; import org.openflexo.foundation.cg.CGFile; import org.openflexo.foundation.cg.CGFile.FileContentEditor; import org.openflexo.foundation.cg.GenerationRepository; import org.openflexo.foundation.cg.generator.IFlexoResourceGenerator; import org.openflexo.foundation.rm.FlexoFileResource; import org.openflexo.foundation.rm.FlexoProject; import org.openflexo.foundation.rm.FlexoProjectBuilder; import org.openflexo.foundation.rm.GeneratedResourceData; import org.openflexo.foundation.rm.ResourceRemoved; import org.openflexo.foundation.rm.ResourceType; import org.openflexo.foundation.rm.SaveResourceException; import org.openflexo.toolbox.FileFormat; public class CopyOfFlexoResource<G extends IFlexoResourceGenerator, F extends CGFile> extends CGRepositoryFileResource<GeneratedResourceData, G, F> implements FlexoObserver { private static final Logger logger = Logger.getLogger(CopyOfFlexoResource.class.getPackage().getName()); private FlexoFileResource resourceToCopy; /** * @param aProject */ public CopyOfFlexoResource(FlexoProject aProject, FlexoFileResource resourceToCopy) { this(aProject); setResourceToCopy(resourceToCopy); } private CopyOfFlexoResource(FlexoProject aProject) { super(aProject); } /** * */ public CopyOfFlexoResource(FlexoProjectBuilder builder) { this(builder.project); } @Override public synchronized void delete(boolean deleteFile) { if (getCGFile() != null && !getCGFile().isMarkedForDeletion()) { getCGFile().setMarkedForDeletion(true); getCGFile().delete(deleteFile); } super.delete(deleteFile); } @Override public boolean checkIntegrity() { if (isDeleted()) { return false; } if (!isDeleted() && !project.isDeserializing() && getProject() != null && getProject().getResourceManagerInstance() != null && !getProject().getResourceManagerInstance().isLoadingAProject()) { if (resourceToCopy == null) { if (logger.isLoggable(Level.INFO)) { logger.info("This copied resource is no more acceptable because resourceToCopy is null"); } return false; } else if (!resourceToCopy.checkIntegrity()) { if (logger.isLoggable(Level.INFO)) { logger.info("This copied resource is no more acceptable because resourceToCopy " + resourceToCopy.getFullyQualifiedName() + " does not pass integrity check"); } return false; } else if (getProject() == null) { if (logger.isLoggable(Level.INFO)) { logger.info("This copied resource is no more acceptable because project is null"); } return false; } else if (getProject().resourceForKey(resourceToCopy.getFullyQualifiedName()) == null) { if (logger.isLoggable(Level.INFO)) { logger.info("This copied resource is no more acceptable because resourceToCopy is not in project anymore"); } return false; } } return super.checkIntegrity(); } /** * Overrides isGeneratedResourceDataReadable * * @see org.openflexo.foundation.rm.FlexoGeneratedResource#isGeneratedResourceDataReadable() */ @Override public boolean isGeneratedResourceDataReadable() { return true; } /** * Overrides getResourceType * * @see org.openflexo.foundation.rm.FlexoResource#getResourceType() */ @Override public ResourceType getResourceType() { return ResourceType.COPIED_FILE; } private Date _lastGenerationDate; @Override public Date getLastGenerationDate() { if (_lastGenerationDate == null) { _lastGenerationDate = getDiskLastModifiedDate(); } return _lastGenerationDate; } @Override public void setLastGenerationDate(Date aDate) { _lastGenerationDate = aDate; } /** * Overrides getLastAcceptingDate * * @see org.openflexo.foundation.rm.cg.CGRepositoryFileResource#getLastAcceptingDate() */ @Override public Date getLastAcceptingDate() { // Copied resource cannot update from disk-->lastAcceptingDate is always diskLastModified return getDiskLastModifiedDate(); } /** * Overrides saveEditedVersion * * @see org.openflexo.foundation.rm.cg.CGRepositoryFileResource#saveEditedVersion(org.openflexo.foundation.cg.CGFile.FileContentEditor) */ @Override public void saveEditedVersion(FileContentEditor editor) throws SaveResourceException { } @Override protected GeneratedResourceData createGeneratedResourceData() { return null; } @Override public GeneratedResourceData readGeneratedResourceData() throws FlexoException { return createGeneratedResourceData(); } @Override public void rebuildDependancies() { super.rebuildDependancies(); if (getResourceToCopy() != null) { resourceToCopy.rebuildDependancies(); addToDependentResources(resourceToCopy); } } public FlexoFileResource getResourceToCopy() { if (resourceToCopy != null && resourceToCopy.isDeleted()) { return null; } return resourceToCopy; } public void setResourceToCopy(FlexoFileResource res) { resourceToCopy = res; if (resourceToCopy != null) { resourceToCopy.getProject().addObserver(this); } } public static String nameForRepositoryAndResource(GenerationRepository repository, FlexoFileResource resourceToCopy) { return repository.getName() + ".COPY_OF." + resourceToCopy.getFullyQualifiedName(); } @Override public void update(FlexoObservable observable, DataModification dataModification) { if (dataModification instanceof ResourceRemoved && ((ResourceRemoved) dataModification).getRemovedResource() == resourceToCopy) { if (getCGFile() == null) { this.delete(); } else { getCGFile().setMarkedForDeletion(true); } } } @Override public FileFormat getResourceFormat() { if (resourceToCopy != null) { return resourceToCopy.getResourceFormat(); } return super.getResourceFormat(); } }