001: /*
002: * Copyright 2004 Outerthought bvba and Schaubroeck nv
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.outerj.daisy.doctaskrunner.commonimpl;
017:
018: import org.outerj.daisy.doctaskrunner.SimpleActionsTaskSpecification;
019: import org.outerj.daisy.doctaskrunner.TaskException;
020: import org.outerj.daisy.repository.Repository;
021: import org.outerj.daisy.repository.RepositoryException;
022: import org.outerj.daisy.repository.variant.VariantManager;
023: import org.outerx.daisy.x10Doctaskrunner.TaskDescriptionDocument;
024: import org.apache.xmlbeans.XmlObject;
025: import org.apache.xmlbeans.QNameSet;
026:
027: import java.util.List;
028: import java.util.ArrayList;
029: import java.util.Iterator;
030:
031: public class SimpleActionsTaskSpecificationImpl implements
032: SimpleActionsTaskSpecification {
033: private String description;
034: private boolean stopOnFirstError;
035: private Repository repository;
036: private boolean validateOnSave;
037: private List actions = new ArrayList();
038:
039: public SimpleActionsTaskSpecificationImpl(String description,
040: boolean stopOnFirstError, Repository repository) {
041: if (description == null)
042: throw new IllegalArgumentException(
043: "description parameter is null");
044:
045: this .description = description;
046: this .stopOnFirstError = stopOnFirstError;
047: this .repository = repository;
048: }
049:
050: public void setValidateOnSave(boolean validateOnSave) {
051: this .validateOnSave = validateOnSave;
052: }
053:
054: public void addCreateVariant(String startVersion, String newBranch,
055: String newLanguage) {
056: actions.add(new CreateVariantAction(startVersion, newBranch,
057: newLanguage));
058: }
059:
060: public void addDeleteVariant() {
061: actions.add(new DeleteVariantAction());
062: }
063:
064: public void addAddToCollection(String collection) {
065: actions.add(new AddToCollectionAction(collection));
066: }
067:
068: public void addRemoveFromCollection(String collection) {
069: actions.add(new RemoveFromCollectionAction(collection));
070: }
071:
072: public String getDescription() {
073: return description;
074: }
075:
076: public String getScript() throws RepositoryException {
077: StringBuilder buffer = new StringBuilder();
078: buffer.append("var document = null;\n");
079: Iterator actionsIt = actions.iterator();
080: while (actionsIt.hasNext()) {
081: SimpleAction action = (SimpleAction) actionsIt.next();
082: action.addScriptCode(buffer);
083: }
084: buffer.append("\n\nif (document != null)\n document.save(")
085: .append(validateOnSave).append(");");
086: return buffer.toString();
087: }
088:
089: public String getScriptLanguage() {
090: return "javascript";
091: }
092:
093: public boolean stopOnFirstError() {
094: return stopOnFirstError;
095: }
096:
097: public void addXml(
098: TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml) {
099: simpleActionsXml.setValidateOnSave(validateOnSave);
100: Iterator actionsIt = actions.iterator();
101: while (actionsIt.hasNext()) {
102: SimpleAction action = (SimpleAction) actionsIt.next();
103: action.addXml(simpleActionsXml);
104: }
105: }
106:
107: public void fromXml(
108: TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml) {
109: this .validateOnSave = simpleActionsXml.getValidateOnSave();
110: XmlObject[] actionsXml = simpleActionsXml
111: .selectChildren(QNameSet.ALL);
112: for (int i = 0; i < actionsXml.length; i++) {
113: XmlObject actionXml = actionsXml[i];
114: if (actionXml instanceof TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.CreateVariant) {
115: TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.CreateVariant createVariantXml = (TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.CreateVariant) actionXml;
116: addCreateVariant(createVariantXml.getStartVersion(),
117: createVariantXml.getNewBranch(),
118: createVariantXml.getNewLanguage());
119: } else if (actionXml instanceof TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.DeleteVariant) {
120: addDeleteVariant();
121: } else if (actionXml instanceof TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.AddToCollection) {
122: TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.AddToCollection addToCollectionXml = (TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.AddToCollection) actionXml;
123: addAddToCollection(addToCollectionXml.getCollection());
124: } else if (actionXml instanceof TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.RemoveFromCollection) {
125: TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.RemoveFromCollection removeFromCollectionXml = (TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.RemoveFromCollection) actionXml;
126: addRemoveFromCollection(removeFromCollectionXml
127: .getCollection());
128: } else {
129: throw new RuntimeException(
130: "Unrecognized simple action: " + actionXml);
131: }
132: }
133: }
134:
135: interface SimpleAction {
136: void addScriptCode(StringBuilder buffer)
137: throws RepositoryException;
138:
139: void addXml(
140: TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml);
141: }
142:
143: class CreateVariantAction implements SimpleAction {
144: private String startVersion;
145: private String newBranch;
146: private String newLanguage;
147:
148: public CreateVariantAction(String startVersion,
149: String newBranch, String newLanguage) {
150: this .startVersion = startVersion;
151: this .newBranch = newBranch;
152: this .newLanguage = newLanguage;
153: }
154:
155: public void addScriptCode(StringBuilder buffer)
156: throws RepositoryException {
157: VariantManager variantManager = repository
158: .getVariantManager();
159: long branchId = variantManager.getBranch(newBranch, false)
160: .getId();
161: long languageId = variantManager.getLanguage(newLanguage,
162: false).getId();
163: long startVersionId;
164: if (startVersion.equalsIgnoreCase("live")) {
165: startVersionId = -2;
166: } else if (startVersion.equalsIgnoreCase("last")) {
167: startVersionId = -1;
168: } else {
169: try {
170: startVersionId = Long.parseLong(startVersion);
171: } catch (NumberFormatException e) {
172: throw new TaskException("Invalid version: "
173: + startVersion);
174: }
175: }
176:
177: buffer.append("\n");
178: buffer
179: .append("repository.createVariant(variantKey.getDocumentId(), variantKey.getBranchId(), variantKey.getLanguageId(), ");
180: buffer.append(startVersionId);
181: buffer.append(", ");
182: buffer.append(branchId);
183: buffer.append(", ");
184: buffer.append(languageId);
185: buffer.append(", true);\n");
186: }
187:
188: public void addXml(
189: TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml) {
190: TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.CreateVariant createVariant = simpleActionsXml
191: .addNewCreateVariant();
192: createVariant.setStartVersion(startVersion);
193: createVariant.setNewBranch(newBranch);
194: createVariant.setNewLanguage(newLanguage);
195: }
196: }
197:
198: class DeleteVariantAction implements SimpleAction {
199: public void addScriptCode(StringBuilder buffer)
200: throws RepositoryException {
201: buffer.append("\nrepository.deleteVariant(variantKey);\n");
202: }
203:
204: public void addXml(
205: TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml) {
206: simpleActionsXml.addNewDeleteVariant();
207: }
208: }
209:
210: class AddToCollectionAction implements SimpleAction {
211: private final String collection;
212:
213: public AddToCollectionAction(String collection) {
214: this .collection = collection;
215: }
216:
217: public void addScriptCode(StringBuilder buffer)
218: throws RepositoryException {
219: long collectionId = repository.getCollectionManager()
220: .getCollection(collection, false).getId();
221: buffer.append("\n");
222: buffer.append(LAZY_LOAD_DOCUMENT);
223: buffer
224: .append(
225: "\nvar collection = repository.getCollectionManager().getCollection(")
226: .append(collectionId).append(", false);");
227: buffer.append("\ndocument.addToCollection(collection);");
228: buffer.append("\n");
229: }
230:
231: public void addXml(
232: TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml) {
233: TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.AddToCollection addToCollectionXml = simpleActionsXml
234: .addNewAddToCollection();
235: addToCollectionXml.setCollection(collection);
236: }
237: }
238:
239: class RemoveFromCollectionAction implements SimpleAction {
240: private final String collection;
241:
242: public RemoveFromCollectionAction(String collection) {
243: this .collection = collection;
244: }
245:
246: public void addScriptCode(StringBuilder buffer)
247: throws RepositoryException {
248: long collectionId = repository.getCollectionManager()
249: .getCollection(collection, false).getId();
250: buffer.append("\n");
251: buffer.append(LAZY_LOAD_DOCUMENT);
252: buffer
253: .append(
254: "\nvar collection = repository.getCollectionManager().getCollection(")
255: .append(collectionId).append(", false);\n");
256: buffer
257: .append("\ndocument.removeFromCollection(collection);\n");
258: buffer.append("\n");
259: }
260:
261: public void addXml(
262: TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml) {
263: TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.RemoveFromCollection removeFromCollectionXml = simpleActionsXml
264: .addNewRemoveFromCollection();
265: removeFromCollectionXml.setCollection(collection);
266: }
267: }
268:
269: private static final String LAZY_LOAD_DOCUMENT = "if (document == null)\n document = repository.getDocument(variantKey, true);\n";
270: }
|