/* * (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.dkv; import java.io.File; import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; import org.openflexo.foundation.dkv.dm.DomainAdded; import org.openflexo.foundation.dkv.dm.DomainRemoved; import org.openflexo.foundation.dkv.dm.LanguageAdded; import org.openflexo.foundation.dkv.dm.LanguageRemoved; import org.openflexo.foundation.rm.FlexoDKVResource; import org.openflexo.foundation.rm.FlexoProject; import org.openflexo.foundation.rm.FlexoResource; import org.openflexo.foundation.rm.FlexoXMLStorageResource; import org.openflexo.foundation.rm.InvalidFileNameException; import org.openflexo.foundation.rm.ProjectRestructuration; import org.openflexo.foundation.rm.SaveResourceException; import org.openflexo.foundation.rm.XMLStorageResourceData; import org.openflexo.foundation.utils.FlexoProjectFile; import org.openflexo.foundation.xml.FlexoDKVModelBuilder; import org.openflexo.localization.FlexoLocalization; import org.openflexo.logging.FlexoLogger; import org.openflexo.toolbox.FileUtils; import org.openflexo.xmlcode.XMLMapping; /** * @author gpolet * */ public class DKVModel extends DKVObject implements XMLStorageResourceData { private FlexoDKVResource resource; public static final Logger logger = FlexoLogger.getLogger(DKVModel.class.getPackage().getName()); public static DKVModel createNewDKVModel(FlexoProject project) { DKVModel dl = new DKVModel(project); File dkvFile = ProjectRestructuration.getExpectedDKVModelFile(project, project.getProjectName()); FlexoProjectFile dkvModelFile = new FlexoProjectFile(dkvFile, project); FlexoDKVResource dkvRes; try { dkvRes = new FlexoDKVResource(project, dl, dkvModelFile); } catch (InvalidFileNameException e) { dkvModelFile = new FlexoProjectFile(FileUtils.getValidFileName(dkvModelFile.getRelativePath())); dkvModelFile.setProject(project); try { dkvRes = new FlexoDKVResource(project, dl, dkvModelFile); } catch (InvalidFileNameException e1) { if (logger.isLoggable(Level.SEVERE)) { logger.severe("Could not create DKV resource. Name: " + dkvModelFile.getRelativePath() + " is not valid. This should never happen."); } return null; } } Language lg = new Language(dl, FlexoLocalization.localizedForKey("english"), true); lg.setIsoCode("EN"); dl.addToLanguages(lg); try { dkvRes.saveResourceData(); project.registerResource(dkvRes); } catch (Exception e1) { // Warns about the exception if (logger.isLoggable(Level.WARNING)) { logger.warning("Exception raised: " + e1.getClass().getName() + ". See console for details."); } e1.printStackTrace(); } return dl; } private DomainList domainList = new DomainList(this); private LanguageList languageList = new LanguageList(this); public DKVModel(FlexoDKVModelBuilder builder) { this(builder.getProject()); builder.dkvModel = this; resource = builder.resource; initializeDeserialization(builder); } /** * */ public DKVModel(FlexoProject project) { super(project); dkvModel = this; domainList = new DomainList(this); languageList = new LanguageList(this); } /** * Overrides getXMLMapping * * @see org.openflexo.foundation.dkv.DKVObject#getXMLMapping() */ @Override public XMLMapping getXMLMapping() { return getProject().getXmlMappings().getDKVMapping(); } /** * Overrides getFullyQualifiedName * * @see org.openflexo.foundation.FlexoModelObject#getFullyQualifiedName() */ @Override public String getFullyQualifiedName() { return "DOMAINLIST" + getProject().getProjectName(); } /** * Overrides getFlexoXMLFileResource * * @see org.openflexo.foundation.rm.XMLStorageResourceData#getFlexoXMLFileResource() */ @Override public FlexoXMLStorageResource getFlexoXMLFileResource() { return getFlexoResource(); } public boolean isDomainNameLegal(String domainName) throws DuplicateDKVObjectException, EmptyStringException { if (domainName == null) { throw new NullPointerException(); } if (domainName.trim().length() == 0) { throw new EmptyStringException(); } Enumeration<Domain> en = getDomains().elements(); while (en.hasMoreElements()) { Domain dom = en.nextElement(); if (dom.getName().equals(domainName)) { throw new DuplicateDKVObjectException(dom); } } return true; } public Domain addDomainNamed(String domainName) throws DuplicateDKVObjectException, EmptyStringException { if (domainName == null) { throw new NullPointerException(); } if (domainName.trim().length() == 0) { throw new EmptyStringException(); } Enumeration<Domain> en = getDomains().elements(); while (en.hasMoreElements()) { Domain dom = en.nextElement(); if (dom.getName().equals(domainName)) { throw new DuplicateDKVObjectException(dom); } } Domain dom = new Domain(this); dom.setName(domainName); addToDomains(dom); addObserver(dom); return dom; } public boolean isLanguageNameLegal(String lgName) throws DuplicateDKVObjectException, EmptyStringException { if (lgName == null) { throw new NullPointerException(); } if (lgName.trim().length() == 0) { throw new EmptyStringException(); } Enumeration<Language> en = getLanguages().elements(); while (en.hasMoreElements()) { Language lg = en.nextElement(); if (lg.getName().equals(lgName)) { throw new DuplicateDKVObjectException(lg); } } return true; } public Language addLanguageNamed(String lgName) throws DuplicateDKVObjectException, EmptyStringException { if (lgName == null) { throw new NullPointerException(); } if (lgName.trim().length() == 0) { throw new EmptyStringException(); } Enumeration en = getLanguages().elements(); while (en.hasMoreElements()) { Language lg = (Language) en.nextElement(); if (lg.getName().equals(lgName)) { throw new DuplicateDKVObjectException(lg); } } Language lg = new Language(this); lg.setName(lgName); addToLanguages(lg); return lg; } public void addToDomains(Domain dom) { DomainAdded da = getDomainList().addToDomains(dom); sortedDomains = null; setChanged(); notifyObservers(da); } public void removeFromDomains(Domain dom) { DomainRemoved dr = getDomainList().removeFromDomains(dom); sortedDomains = null; setChanged(); notifyObservers(dr); } public void addToLanguages(Language lg) { LanguageAdded la = getLanguageList().addToLanguages(lg); setChanged(); notifyObservers(la); } public void removeFromLanguage(Language lg) { LanguageRemoved lr = getLanguageList().removeFromLanguage(lg); setChanged(); notifyObservers(lr); } public Vector<Domain> getDomains() { return getDomainList().getDomains(); } @Override public void setName(String name) throws DuplicateDKVObjectException { if (areSameValue(name, this.name)) { return; } sortedDomains = null; super.setName(name); } private Vector<Domain> sortedDomains; public Vector<Domain> getSortedDomains() { if (sortedDomains == null) { sortedDomains = (Vector<Domain>) getDomains().clone(); Collections.sort(sortedDomains, new Comparator<Domain>() { @Override public int compare(Domain o1, Domain o2) { return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase()); } }); } return sortedDomains; } public void setDomains(Vector<Domain> domains) { getDomainList().setDomains(domains); } public Vector<Language> getLanguages() { return getLanguageList().getLanguages(); } public void setLanguages(Vector<Language> languages) { getLanguageList().setLanguages(languages); } public Language getMainLanguage() { for (Language l : getLanguages()) { if (l.getIsMain()) { return l; } } getLanguages().firstElement().setIsMain(true); return getLanguages().firstElement(); } public class DomainList extends DKVObject { protected Vector<Domain> domains; /** * @param dl */ public DomainList(DKVModel dl) { super(dl); domains = new Vector<Domain>(); } public Vector<Domain> getDomains() { return domains; } public void setDomains(Vector<Domain> someDomains) { domains = someDomains; } /** * Overrides getFullyQualifiedName * * @see org.openflexo.foundation.FlexoModelObject#getFullyQualifiedName() */ @Override public String getFullyQualifiedName() { return "DOMAIN_LIST"; } /** * Overrides getClassNameKey * * @see org.openflexo.foundation.FlexoModelObject#getClassNameKey() */ @Override public String getClassNameKey() { return "domain_list"; } /** * Overrides isDeleteAble * * @see org.openflexo.foundation.dkv.DKVObject#isDeleteAble() */ @Override public boolean isDeleteAble() { return false; } @Override public void undelete() { // nothing to do since it can not be deleted :-) } public DomainAdded addToDomains(Domain dom) { if (domains.contains(dom)) { if (logger.isLoggable(Level.WARNING)) { logger.warning("Attempt to insert twice the same domain."); } return null; } domains.add(dom); DomainAdded da = new DomainAdded(dom); getDomainList().setChanged(); getDomainList().notifyObservers(da); return da; } public DomainRemoved removeFromDomains(Domain dom) { domains.remove(dom); DomainRemoved dr = new DomainRemoved(dom); getDomainList().setChanged(); getDomainList().notifyObservers(dr); return dr; } @Override public Vector getAllEmbeddedValidableObjects() { Vector reply = new Vector(); reply.addAll(getDomains()); return reply; } } public class LanguageList extends DKVObject { protected Vector<Language> languages; /** * @param dl */ public LanguageList(DKVModel dl) { super(dl); languages = new Vector<Language>(); } public Vector<Language> getLanguages() { return languages; } public void setLanguages(Vector<Language> someLanguages) { languages = someLanguages; } /** * Overrides getFullyQualifiedName * * @see org.openflexo.foundation.FlexoModelObject#getFullyQualifiedName() */ @Override public String getFullyQualifiedName() { return "LANGUAGE_LIST"; } /** * Overrides getClassNameKey * * @see org.openflexo.foundation.FlexoModelObject#getClassNameKey() */ @Override public String getClassNameKey() { return "language_list"; } /** * Overrides isDeleteAble * * @see org.openflexo.foundation.dkv.DKVObject#isDeleteAble() */ @Override public boolean isDeleteAble() { return false; } @Override public void undelete() { // nothing to do since it can not be deleted :-) } public LanguageAdded addToLanguages(Language lg) { if (languages.contains(lg)) { if (logger.isLoggable(Level.WARNING)) { logger.warning("Attempt to insert twice the same language."); } return null; } languages.add(lg); LanguageAdded la = new LanguageAdded(lg); getLanguageList().setChanged(); getLanguageList().notifyObservers(la); return la; } public LanguageRemoved removeFromLanguage(Language lg) { if (!languages.contains(lg)) { if (logger.isLoggable(Level.WARNING)) { logger.warning("Attempt to remove a language that can not be found: " + lg.getName()); } return null; } languages.remove(lg); LanguageRemoved lr = new LanguageRemoved(lg); getLanguageList().setChanged(); getLanguageList().notifyObservers(lr); return lr; } @Override public Vector getAllEmbeddedValidableObjects() { Vector reply = new Vector(); reply.addAll(getLanguages()); return reply; } } public static Logger getLogger() { return logger; } public DomainList getDomainList() { return domainList; } public LanguageList getLanguageList() { return languageList; } public Domain getDomainNamed(String name) { Enumeration<Domain> en = getDomains().elements(); while (en.hasMoreElements()) { Domain dom = en.nextElement(); if (dom.getName().equals(name)) { return dom; } } if (logger.isLoggable(Level.WARNING)) { logger.warning("Domain " + name + " could not be found."); } return null; } public String getNextDomainName() { int i = 0; while (true) { if (getDomainNamed("Domain-" + i) == null) { return "Domain-" + i; } i++; } } public Language getLanguageNamed(String lg_name) { Enumeration<Language> en = getLanguages().elements(); while (en.hasMoreElements()) { Language lg = en.nextElement(); if (lg.getName().equals(lg_name)) { return lg; } } if (logger.isLoggable(Level.WARNING)) { logger.warning("Language " + lg_name + " could not be found."); } return null; } @Override public FlexoDKVResource getFlexoResource() { return resource; } @Override public void setFlexoResource(FlexoResource resource) { this.resource = (FlexoDKVResource) resource; } /** * Overrides save * * @see org.openflexo.foundation.rm.FlexoResourceData#save() */ @Override public void save() throws SaveResourceException { resource.saveResourceData(); } /** * Overrides getClassNameKey * * @see org.openflexo.foundation.FlexoModelObject#getClassNameKey() */ @Override public String getClassNameKey() { return "dkv_model"; } /** * Overrides isDeleteAble * * @see org.openflexo.foundation.dkv.DKVObject#isDeleteAble() */ @Override public boolean isDeleteAble() { return false; } @Override public void undelete() { // nothing to do since it can not be deleted :-) } @Override public Vector getAllEmbeddedValidableObjects() { Vector answer = new Vector(); answer.addAll(getDomains()); answer.addAll(getLanguages()); return answer; } }