/*
* Copyright 2004 Outerthought bvba and Schaubroeck nv
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.outerj.daisy.doctaskrunner.commonimpl;
import org.outerj.daisy.doctaskrunner.SimpleActionsTaskSpecification;
import org.outerj.daisy.doctaskrunner.TaskException;
import org.outerj.daisy.repository.Repository;
import org.outerj.daisy.repository.RepositoryException;
import org.outerj.daisy.repository.variant.VariantManager;
import org.outerx.daisy.x10Doctaskrunner.TaskDescriptionDocument;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.QNameSet;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class SimpleActionsTaskSpecificationImpl implements SimpleActionsTaskSpecification {
private String description;
private boolean stopOnFirstError;
private Repository repository;
private boolean validateOnSave;
private List actions = new ArrayList();
public SimpleActionsTaskSpecificationImpl(String description, boolean stopOnFirstError, Repository repository) {
if (description == null)
throw new IllegalArgumentException("description parameter is null");
this.description = description;
this.stopOnFirstError = stopOnFirstError;
this.repository = repository;
}
public void setValidateOnSave(boolean validateOnSave) {
this.validateOnSave = validateOnSave;
}
public void addCreateVariant(String startVersion, String newBranch, String newLanguage) {
actions.add(new CreateVariantAction(startVersion, newBranch, newLanguage));
}
public void addDeleteVariant() {
actions.add(new DeleteVariantAction());
}
public void addAddToCollection(String collection) {
actions.add(new AddToCollectionAction(collection));
}
public void addRemoveFromCollection(String collection) {
actions.add(new RemoveFromCollectionAction(collection));
}
public String getDescription() {
return description;
}
public String getScript() throws RepositoryException {
StringBuilder buffer = new StringBuilder();
buffer.append("var document = null;\n");
Iterator actionsIt = actions.iterator();
while (actionsIt.hasNext()) {
SimpleAction action = (SimpleAction)actionsIt.next();
action.addScriptCode(buffer);
}
buffer.append("\n\nif (document != null)\n document.save(").append(validateOnSave).append(");");
return buffer.toString();
}
public String getScriptLanguage() {
return "javascript";
}
public boolean stopOnFirstError() {
return stopOnFirstError;
}
public void addXml(TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml) {
simpleActionsXml.setValidateOnSave(validateOnSave);
Iterator actionsIt = actions.iterator();
while (actionsIt.hasNext()) {
SimpleAction action = (SimpleAction)actionsIt.next();
action.addXml(simpleActionsXml);
}
}
public void fromXml(TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml) {
this.validateOnSave = simpleActionsXml.getValidateOnSave();
XmlObject[] actionsXml = simpleActionsXml.selectChildren(QNameSet.ALL);
for (int i = 0; i < actionsXml.length; i++) {
XmlObject actionXml = actionsXml[i];
if (actionXml instanceof TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.CreateVariant) {
TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.CreateVariant createVariantXml = (TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.CreateVariant)actionXml;
addCreateVariant(createVariantXml.getStartVersion(), createVariantXml.getNewBranch(), createVariantXml.getNewLanguage());
} else if (actionXml instanceof TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.DeleteVariant) {
addDeleteVariant();
} else if (actionXml instanceof TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.AddToCollection) {
TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.AddToCollection addToCollectionXml = (TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.AddToCollection)actionXml;
addAddToCollection(addToCollectionXml.getCollection());
} else if (actionXml instanceof TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.RemoveFromCollection) {
TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.RemoveFromCollection removeFromCollectionXml = (TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.RemoveFromCollection)actionXml;
addRemoveFromCollection(removeFromCollectionXml.getCollection());
} else {
throw new RuntimeException("Unrecognized simple action: " + actionXml);
}
}
}
interface SimpleAction {
void addScriptCode(StringBuilder buffer) throws RepositoryException ;
void addXml(TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml);
}
class CreateVariantAction implements SimpleAction {
private String startVersion;
private String newBranch;
private String newLanguage;
public CreateVariantAction(String startVersion, String newBranch, String newLanguage) {
this.startVersion = startVersion;
this.newBranch = newBranch;
this.newLanguage = newLanguage;
}
public void addScriptCode(StringBuilder buffer) throws RepositoryException {
VariantManager variantManager = repository.getVariantManager();
long branchId = variantManager.getBranch(newBranch, false).getId();
long languageId = variantManager.getLanguage(newLanguage, false).getId();
long startVersionId;
if (startVersion.equalsIgnoreCase("live")) {
startVersionId = -2;
} else if (startVersion.equalsIgnoreCase("last")) {
startVersionId = -1;
} else {
try {
startVersionId = Long.parseLong(startVersion);
} catch (NumberFormatException e) {
throw new TaskException("Invalid version: " + startVersion);
}
}
buffer.append("\n");
buffer.append("repository.createVariant(variantKey.getDocumentId(), variantKey.getBranchId(), variantKey.getLanguageId(), ");
buffer.append(startVersionId);
buffer.append(", ");
buffer.append(branchId);
buffer.append(", ");
buffer.append(languageId);
buffer.append(", true);\n");
}
public void addXml(TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml) {
TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.CreateVariant createVariant = simpleActionsXml.addNewCreateVariant();
createVariant.setStartVersion(startVersion);
createVariant.setNewBranch(newBranch);
createVariant.setNewLanguage(newLanguage);
}
}
class DeleteVariantAction implements SimpleAction {
public void addScriptCode(StringBuilder buffer) throws RepositoryException {
buffer.append("\nrepository.deleteVariant(variantKey);\n");
}
public void addXml(TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml) {
simpleActionsXml.addNewDeleteVariant();
}
}
class AddToCollectionAction implements SimpleAction {
private final String collection;
public AddToCollectionAction(String collection) {
this.collection = collection;
}
public void addScriptCode(StringBuilder buffer) throws RepositoryException {
long collectionId = repository.getCollectionManager().getCollection(collection, false).getId();
buffer.append("\n");
buffer.append(LAZY_LOAD_DOCUMENT);
buffer.append("\nvar collection = repository.getCollectionManager().getCollection(").append(collectionId).append(", false);");
buffer.append("\ndocument.addToCollection(collection);");
buffer.append("\n");
}
public void addXml(TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml) {
TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.AddToCollection addToCollectionXml = simpleActionsXml.addNewAddToCollection();
addToCollectionXml.setCollection(collection);
}
}
class RemoveFromCollectionAction implements SimpleAction {
private final String collection;
public RemoveFromCollectionAction(String collection) {
this.collection = collection;
}
public void addScriptCode(StringBuilder buffer) throws RepositoryException {
long collectionId = repository.getCollectionManager().getCollection(collection, false).getId();
buffer.append("\n");
buffer.append(LAZY_LOAD_DOCUMENT);
buffer.append("\nvar collection = repository.getCollectionManager().getCollection(").append(collectionId).append(", false);\n");
buffer.append("\ndocument.removeFromCollection(collection);\n");
buffer.append("\n");
}
public void addXml(TaskDescriptionDocument.TaskDescription.Specification.SimpleActions simpleActionsXml) {
TaskDescriptionDocument.TaskDescription.Specification.SimpleActions.RemoveFromCollection removeFromCollectionXml = simpleActionsXml.addNewRemoveFromCollection();
removeFromCollectionXml.setCollection(collection);
}
}
private static final String LAZY_LOAD_DOCUMENT = "if (document == null)\n document = repository.getDocument(variantKey, true);\n";
}
|