/* * (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.action; import java.io.File; import java.util.Vector; import java.util.logging.Logger; import org.openflexo.foundation.CodeType; import org.openflexo.foundation.DocType; import org.openflexo.foundation.FlexoEditor; import org.openflexo.foundation.FlexoModelObject; import org.openflexo.foundation.Format; import org.openflexo.foundation.action.FlexoActionType; import org.openflexo.foundation.cg.CGObject; import org.openflexo.foundation.cg.CGRepository; import org.openflexo.foundation.cg.CGSymbolicDirectory; import org.openflexo.foundation.cg.DGRepository; import org.openflexo.foundation.cg.DuplicateCodeRepositoryNameException; import org.openflexo.foundation.cg.GeneratedCode; import org.openflexo.foundation.cg.GeneratedDoc; import org.openflexo.foundation.cg.GeneratedOutput; import org.openflexo.foundation.cg.GenerationRepository; import org.openflexo.foundation.cg.InvalidReaderRepositoryException; import org.openflexo.foundation.cg.MissingReaderRepositoryException; import org.openflexo.foundation.rm.FlexoProject; import org.openflexo.foundation.toc.TOCRepository; import org.openflexo.foundation.utils.FlexoProjectFile; public class AddGeneratedCodeRepository extends AbstractGCAction<AddGeneratedCodeRepository, CGObject> { private static final Logger logger = Logger.getLogger(AddGeneratedCodeRepository.class.getPackage().getName()); public static FlexoActionType<AddGeneratedCodeRepository, CGObject, CGObject> actionType = new FlexoActionType<AddGeneratedCodeRepository, CGObject, CGObject>( "add_repository", FlexoActionType.newMenu, FlexoActionType.defaultGroup, FlexoActionType.ADD_ACTION_TYPE) { /** * Factory method */ @Override public AddGeneratedCodeRepository makeNewAction(CGObject focusedObject, Vector<CGObject> globalSelection, FlexoEditor editor) { return new AddGeneratedCodeRepository(focusedObject, globalSelection, editor); } @Override public boolean isVisibleForSelection(CGObject object, Vector<CGObject> globalSelection) { return true; } @Override public boolean isEnabledForSelection(CGObject object, Vector<CGObject> globalSelection) { return object != null && object.getGeneratedCode() != null; } }; static { FlexoModelObject.addActionForClass(actionType, GeneratedOutput.class); FlexoModelObject.addActionForClass(actionType, GenerationRepository.class); } private GenerationRepository _newGeneratedCodeRepository; private String _newGeneratedCodeRepositoryName; private CodeType _newTargetType; private DocType _newDocType; private File _newGeneratedCodeRepositoryDirectory; private TOCRepository tocRepository; private Format format; private boolean includeReader = true; private DGRepository readerRepository; AddGeneratedCodeRepository(CGObject focusedObject, Vector<CGObject> globalSelection, FlexoEditor editor) { super(actionType, focusedObject, globalSelection, editor); } @Override protected void doAction(Object context) throws DuplicateCodeRepositoryNameException, MissingReaderRepositoryException, InvalidReaderRepositoryException { logger.info("Add GeneratedCodeRepository " + getFocusedObject()); if (getFocusedObject().getGeneratedCode() != null) { FlexoProject project = getFocusedObject().getProject(); GeneratedOutput gc = getFocusedObject().getGeneratedCode(); if (gc instanceof GeneratedCode) { if (includeReader && readerRepository == null) { throw new MissingReaderRepositoryException(); } if (includeReader && readerRepository.getFormat() != Format.HTML) { throw new InvalidReaderRepositoryException(); } _newGeneratedCodeRepository = new CGRepository((GeneratedCode) gc, getNewGeneratedCodeRepositoryName(), getNewGeneratedCodeRepositoryDirectory()); ((CGRepository) _newGeneratedCodeRepository).setTargetType(getNewTargetType()); if (getNewTargetType() != CodeType.BPEL) { ((CGRepository) _newGeneratedCodeRepository).setWarName(getNewGeneratedCodeRepositoryName() + "WAR"); } getFocusedObject().getGeneratedCode().addToGeneratedRepositories(_newGeneratedCodeRepository); FlexoProjectFile resourcesSymbDir = new FlexoProjectFile(project, _newGeneratedCodeRepository.getSourceCodeRepository(), "/src/main/resources"); _newGeneratedCodeRepository.setSymbolicDirectoryForKey(new CGSymbolicDirectory(_newGeneratedCodeRepository, CGSymbolicDirectory.RESOURCES, resourcesSymbDir), CGSymbolicDirectory.RESOURCES); resourcesSymbDir.getFile().mkdirs(); if (getNewTargetType() != CodeType.BPEL) { FlexoProjectFile javaSymbDir = new FlexoProjectFile(project, _newGeneratedCodeRepository.getSourceCodeRepository(), "/src/main/java"); FlexoProjectFile woSymbDir = new FlexoProjectFile(project, _newGeneratedCodeRepository.getSourceCodeRepository(), "/src/main/components"); FlexoProjectFile webSymbDir = new FlexoProjectFile(project, _newGeneratedCodeRepository.getSourceCodeRepository(), "/src/main/webresources"); FlexoProjectFile libSymbDir = new FlexoProjectFile(project, _newGeneratedCodeRepository.getSourceCodeRepository(), "/lib"); FlexoProjectFile projectSymbDir = new FlexoProjectFile(project, _newGeneratedCodeRepository.getSourceCodeRepository(), "/."); _newGeneratedCodeRepository.setSymbolicDirectoryForKey(new CGSymbolicDirectory(_newGeneratedCodeRepository, CGSymbolicDirectory.JAVA, javaSymbDir), CGSymbolicDirectory.JAVA); _newGeneratedCodeRepository.setSymbolicDirectoryForKey(new CGSymbolicDirectory(_newGeneratedCodeRepository, CGSymbolicDirectory.COMPONENTS, woSymbDir), CGSymbolicDirectory.COMPONENTS); _newGeneratedCodeRepository.setSymbolicDirectoryForKey(new CGSymbolicDirectory(_newGeneratedCodeRepository, CGSymbolicDirectory.PROJECT, projectSymbDir), CGSymbolicDirectory.PROJECT); _newGeneratedCodeRepository.setSymbolicDirectoryForKey(new CGSymbolicDirectory(_newGeneratedCodeRepository, CGSymbolicDirectory.WEBRESOURCES, webSymbDir), CGSymbolicDirectory.WEBRESOURCES); if (includeReader) { FlexoProjectFile readerSymbDir = new FlexoProjectFile(project, _newGeneratedCodeRepository.getSourceCodeRepository(), "/src/main/resources/reader"); _newGeneratedCodeRepository.setSymbolicDirectoryForKey(new CGSymbolicDirectory(_newGeneratedCodeRepository, CGSymbolicDirectory.READER, readerSymbDir), CGSymbolicDirectory.READER); } _newGeneratedCodeRepository.setSymbolicDirectoryForKey(new CGSymbolicDirectory(_newGeneratedCodeRepository, CGSymbolicDirectory.LIB, libSymbDir), CGSymbolicDirectory.LIB); ((CGRepository) _newGeneratedCodeRepository).setIncludeReader(includeReader); if (includeReader) { ((CGRepository) _newGeneratedCodeRepository).setReaderRepository(getReaderRepository()); } // NOW we force the creation of all those directories // because if one of them is empty : it will never be created // and task that build the war may fail if any of those directory doesn't exist. projectSymbDir.getFile().mkdirs(); woSymbDir.getFile().mkdirs(); webSymbDir.getFile().mkdirs(); libSymbDir.getFile().mkdirs(); new File(projectSymbDir.getFile(), "docs").mkdirs(); } } else if (gc instanceof GeneratedDoc) { _newGeneratedCodeRepository = new DGRepository((GeneratedDoc) gc, getNewGeneratedCodeRepositoryName(), getNewDocType(), getFormat(), getNewGeneratedCodeRepositoryDirectory()); ((DGRepository) _newGeneratedCodeRepository).setPostProductName(getNewGeneratedCodeRepositoryName()); if (tocRepository != null) { ((DGRepository) _newGeneratedCodeRepository).setTocRepository(tocRepository); } getFocusedObject().getGeneratedCode().addToGeneratedRepositories(_newGeneratedCodeRepository); String srcSymbDirType = null; switch (getFormat()) { case HTML: srcSymbDirType = CGSymbolicDirectory.HTML; createResourcesSymbolicDir(project, srcSymbDirType); createJavascriptSymbolicDir(project, srcSymbDirType); createFiguresSymbolicDir(project); break; /*case LATEX: srcSymbDirType = CGSymbolicDirectory.LATEX; createFiguresSymbolicDir(project); break;*/ case DOCX: srcSymbDirType = CGSymbolicDirectory.DOCX; createFiguresSymbolicDir(project, "/./word/media/figures/"); createResourcesSymbolicDir(project, srcSymbDirType, "/./word/media"); break; } if (srcSymbDirType != null) { FlexoProjectFile srcSymbDir = new FlexoProjectFile(project, _newGeneratedCodeRepository.getSourceCodeRepository(), "/."); _newGeneratedCodeRepository.setSymbolicDirectoryForKey(new CGSymbolicDirectory(_newGeneratedCodeRepository, srcSymbDirType, srcSymbDir), srcSymbDirType); } } } } private void createFiguresSymbolicDir(FlexoProject project) { createFiguresSymbolicDir(project, null); } private void createFiguresSymbolicDir(FlexoProject project, String figuresPath) { if (figuresPath == null) { figuresPath = "/./Figures"; } FlexoProjectFile figSymbDir = new FlexoProjectFile(project, _newGeneratedCodeRepository.getSourceCodeRepository(), figuresPath); _newGeneratedCodeRepository.setSymbolicDirectoryForKey(new CGSymbolicDirectory(_newGeneratedCodeRepository, CGSymbolicDirectory.FIGURES, figSymbDir), CGSymbolicDirectory.FIGURES); } /** * @param project * @param srcSymbDirType */ private void createJavascriptSymbolicDir(FlexoProject project, String srcSymbDirType) { FlexoProjectFile jsProcessSymbDir = new FlexoProjectFile(project, _newGeneratedCodeRepository.getSourceCodeRepository(), "/./processes"); _newGeneratedCodeRepository.setSymbolicDirectoryForKey(new CGSymbolicDirectory(_newGeneratedCodeRepository, srcSymbDirType, jsProcessSymbDir), CGSymbolicDirectory.JS_PROCESSES); } private void createResourcesSymbolicDir(FlexoProject project, String srcSymbDirType) { createResourcesSymbolicDir(project, srcSymbDirType, null); } private void createResourcesSymbolicDir(FlexoProject project, String srcSymbDirType, String resourcesPath) { if (resourcesPath == null) { resourcesPath = "/./resources"; } FlexoProjectFile resourcesSymbDir = new FlexoProjectFile(project, _newGeneratedCodeRepository.getSourceCodeRepository(), resourcesPath); _newGeneratedCodeRepository.setSymbolicDirectoryForKey(new CGSymbolicDirectory(_newGeneratedCodeRepository, srcSymbDirType, resourcesSymbDir), CGSymbolicDirectory.RESOURCES); } public String getNewGeneratedCodeRepositoryName() { return _newGeneratedCodeRepositoryName; } public void setNewGeneratedCodeRepositoryName(String newGeneratedCodeRepositoryName) { _newGeneratedCodeRepositoryName = newGeneratedCodeRepositoryName; } public GenerationRepository getNewGeneratedCodeRepository() { return _newGeneratedCodeRepository; } public File getNewGeneratedCodeRepositoryDirectory() { return _newGeneratedCodeRepositoryDirectory; } public void setNewGeneratedCodeRepositoryDirectory(File newGeneratedCodeRepositoryDirectory) { _newGeneratedCodeRepositoryDirectory = newGeneratedCodeRepositoryDirectory; } public CodeType getNewTargetType() { if (_newTargetType == null) { return CodeType.PROTOTYPE; } return _newTargetType; } public void setNewTargetType(CodeType newTargetType) { _newTargetType = newTargetType; } public DocType getNewDocType() { if (_newDocType == null && getFocusedObject().getProject().getDocTypes().size() > 0) { return getFocusedObject().getProject().getDocTypes().get(0); } return _newDocType; } public void setNewDocType(DocType type) { _newDocType = type; } public void setTocRepository(TOCRepository value) { this.tocRepository = value; } public Format getFormat() { if (format == null) { format = Format.HTML; } return format; } public void setFormat(Format format) { this.format = format; } public boolean isIncludeReader() { return includeReader; } public void setIncludeReader(boolean includeReader) { this.includeReader = includeReader; } public DGRepository getReaderRepository() { return readerRepository; } public void setReaderRepository(DGRepository readerRepository) { this.readerRepository = readerRepository; } }