001 // This file is part of AceWiki.
002 // Copyright 2008-2012, AceWiki developers.
003 //
004 // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
005 // Lesser General Public License as published by the Free Software Foundation, either version 3 of
006 // the License, or (at your option) any later version.
007 //
008 // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
009 // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
010 // Lesser General Public License for more details.
011 //
012 // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
013 // not, see http://www.gnu.org/licenses/.
014
015 package ch.uzh.ifi.attempto.acewiki.core;
016
017 import java.util.ArrayList;
018 import java.util.List;
019 import java.util.Vector;
020
021 /**
022 * This class represents a wiki article.
023 *
024 * @author Tobias Kuhn
025 */
026 public class Article {
027
028 private Vector<Statement> statements = new Vector<Statement>();
029 private final OntologyElement element;
030 private final Ontology ontology;
031
032 /**
033 * Creates a new article for the given ontology element.
034 *
035 * @param element The ontology element.
036 */
037 protected Article(OntologyElement element) {
038 this.element = element;
039 this.ontology = element.getOntology();
040 }
041
042 void initStatements(List<Statement> statements) {
043 this.statements = new Vector<Statement>(statements);
044 }
045
046 /**
047 * Returns the ontology element of this article.
048 *
049 * @return The ontology element.
050 */
051 public OntologyElement getOntologyElement() {
052 return element;
053 }
054
055 /**
056 * Returns the ontology object.
057 *
058 * @return The ontoloy.
059 */
060 public Ontology getOntology() {
061 return ontology;
062 }
063
064 /**
065 * Returns the article text as a list of statements.
066 *
067 * @return The statements.
068 */
069 public List<Statement> getStatements() {
070 return new ArrayList<Statement>(statements);
071 }
072
073 /**
074 * Returns the ACE sentences of the article text.
075 *
076 * @return The ACE sentences.
077 */
078 public List<Sentence> getSentences() {
079 List<Sentence> sentences = new ArrayList<Sentence>();
080 for (Statement s : statements) {
081 if (s instanceof Sentence) {
082 sentences.add((Sentence) s);
083 }
084 }
085 return sentences;
086 }
087
088 /**
089 * Edits a statement of the article. The old statement is replaced by the new statement.
090 *
091 * @param oldStatement The statement that should be edited.
092 * @param newStatement The new statement.
093 */
094 public void edit(Statement oldStatement, Statement newStatement) {
095 List<Statement> newStatements = new ArrayList<Statement>();
096 newStatements.add(newStatement);
097 edit(oldStatement, newStatements);
098 }
099
100 /**
101 * Edits a statement of the article. The old statement is replaced by the new statements.
102 *
103 * @param oldStatement The statement that should be edited.
104 * @param newStatements The new statements.
105 */
106 public void edit(Statement oldStatement, List<Statement> newStatements) {
107 log("edit statement of " + element.getWord() + ": " +
108 oldStatement.getText(getDefaultLanguage()) + " > " +
109 getStatementsString(newStatements));
110
111 synchronized (ontology) {
112 if (statements.contains(oldStatement)) {
113 int i = statements.indexOf(oldStatement);
114 statements.remove(i);
115 statements.addAll(i, newStatements);
116 } else {
117 log("error: statement is not around anymore");
118 statements.addAll(0, newStatements);
119 }
120 if (ontology != null) {
121 if (oldStatement instanceof Sentence) {
122 ontology.retractSentence((Sentence) oldStatement);
123 }
124 for (Statement s : newStatements) {
125 if (s instanceof Sentence) {
126 ontology.commitSentence((Sentence) s);
127 }
128 }
129 ontology.getStorage().save(element);
130 }
131 }
132 }
133
134 /**
135 * Adds one new statement to the article. One has to specify in front of which
136 * statement the new statement should be added.
137 *
138 * @param followingStatement The statement in front of which the new statement should be added,
139 * or null if the statement should be added to the end of the article.
140 * @param newStatement The new statement to be added.
141 */
142 public void add(Statement followingStatement, Statement newStatement) {
143 List<Statement> newStatements = new ArrayList<Statement>();
144 newStatements.add(newStatement);
145 add(followingStatement, newStatements);
146 }
147
148 /**
149 * Adds one or more new statements to the article. It has to be specified in front of which
150 * statement the new statement should be added.
151 *
152 * @param followingStatement The statement in front of which the new statements should be
153 * added, or null if the statements should be added to the end of the article.
154 * @param newStatements The new statements to be added.
155 */
156 public void add(Statement followingStatement, List<Statement> newStatements) {
157 log("add statements of " + element.getWord() + ": " + getStatementsString(newStatements));
158
159 synchronized (ontology) {
160 if (statements.contains(followingStatement)) {
161 statements.addAll(statements.indexOf(followingStatement), newStatements);
162 } else {
163 if (followingStatement != null) {
164 log("error: statement is not around anymore");
165 }
166 statements.addAll(newStatements);
167 }
168 if (ontology != null) {
169 for (Statement s : newStatements) {
170 if (s instanceof Sentence) {
171 ontology.commitSentence((Sentence) s);
172 }
173 }
174 ontology.getStorage().save(element);
175 }
176 }
177 }
178
179 private String getStatementsString(List<Statement> statements) {
180 String result = "";
181 for (Statement s : statements) {
182 result += s.getText(getDefaultLanguage()) + " ";
183 }
184 return result;
185 }
186
187 /**
188 * Removes the given statement from the article.
189 *
190 * @param statement The statement to be removed.
191 */
192 public void remove(Statement statement) {
193 synchronized (ontology) {
194 if (statements.contains(statement)) {
195 log("remove statement: " + statement.getText(getDefaultLanguage()));
196 statements.remove(statement);
197 }
198 if (ontology != null) {
199 if (statement instanceof Sentence) {
200 ontology.retractSentence((Sentence) statement);
201 }
202 ontology.getStorage().save(element);
203 }
204 }
205 }
206
207 /**
208 * Writes the text to the log file.
209 *
210 * @param text The text to be written to the log file.
211 */
212 protected void log(String text) {
213 if (ontology != null) {
214 ontology.log(text);
215 }
216 }
217
218 private String getDefaultLanguage() {
219 return getOntology().getEngine().getLanguages()[0];
220 }
221
222 }