ingo@219: /*
ingo@219:  * Copyright (c) 2010, 2011 by Intevation GmbH
ingo@219:  *
ingo@219:  * This program is free software under the LGPL (>=v2.1)
ingo@219:  * Read the file LGPL.txt coming with the software for details
ingo@219:  * or visit http://www.gnu.org/licenses/ if it does not exist.
ingo@219:  */
ingo@219: package de.intevation.artifactdatabase;
ingo@219: 
ingo@331: import java.util.LinkedList;
ingo@331: 
ingo@219: import org.apache.log4j.Logger;
ingo@219: 
ingo@219: import de.intevation.artifacts.CallMeta;
ingo@331: import de.intevation.artifacts.Message;
ingo@219: 
ingo@219: import de.intevation.artifactdatabase.Backend.PersistentArtifact;
ingo@219: 
ingo@219: 
ingo@219: /**
ingo@219:  * Class that implements the call context handed to the methods calls
ingo@219:  * describe(), feed(), etc. of the artifact.
ingo@219:  *
ingo@219:  * @author <a href="mailto:sascha.teichmann@intevation.de">Sascha L. Teichmann</a>
ingo@219:  */
ingo@219: public class ArtifactCallContext extends AbstractCallContext {
ingo@219: 
ingo@219:     private static Logger logger = Logger.getLogger(ArtifactCallContext.class);
ingo@219: 
ingo@219: 
ingo@219:     /**
ingo@219:      * Error message issued if an artifact wants to translate itself
ingo@219:      * into a none valid persistent state.
ingo@219:      */
ingo@219:     public static final String INVALID_CALL_STATE = "Invalid after call state";
ingo@219: 
ingo@219:     /**
ingo@219:      * Error message issued if one tries to remove a requested artifact
ingo@219:      * from the list of artifacts running in background which is
ingo@219:      * not in this list.
ingo@219:      */
ingo@219:     public static final String NOT_IN_BACKGROUND = "Not in background";
ingo@219: 
ingo@219: 
ingo@219:     /**
ingo@219:      * The persistence wrapper around the living artifact
ingo@219:      */
ingo@219:     protected PersistentArtifact artifact;
ingo@219: 
ingo@219: 
ingo@219:     public ArtifactCallContext(
ingo@219:         ArtifactDatabaseImpl artifactDatabase,
ingo@219:         int                  action,
ingo@219:         CallMeta             callMeta,
ingo@219:         PersistentArtifact   artifact)
ingo@219:     {
sascha@246:         super(artifactDatabase, action, callMeta);
ingo@219: 
ingo@219:         this.artifact = artifact;
ingo@219:     }
ingo@219: 
ingo@219: 
ingo@219:     public void afterCall(int action) {
ingo@219:         this.action = action;
ingo@219:         if (action == BACKGROUND) {
ingo@219:             database.addIdToBackground(artifact.getId());
ingo@219:         }
ingo@219:     }
ingo@219: 
ingo@219: 
ingo@219:     public void afterBackground(int action) {
ingo@219:         if (this.action != BACKGROUND) {
ingo@219:             throw new IllegalStateException(NOT_IN_BACKGROUND);
ingo@219:         }
ingo@219:         database.fromBackground(artifact, action);
ingo@219:     }
ingo@219: 
ingo@219: 
ingo@330:     public boolean isInBackground() {
ingo@330:         return database.getLockedIds().contains(artifact.getId());
ingo@330:     }
ingo@330: 
ingo@330: 
ingo@331:     public void addBackgroundMessage(Message msg) {
ingo@331:         database.addBackgroundMessage(artifact.getArtifact().identifier(), msg);
ingo@331:     }
ingo@331: 
ingo@331: 
ingo@331:     public LinkedList<Message> getBackgroundMessages() {
ingo@331:         return database.getBackgroundMessages(
ingo@331:             artifact.getArtifact().identifier());
ingo@331:     }
ingo@331: 
ingo@331: 
ingo@219:     public Long getTimeToLive() {
ingo@219:         return artifact.getTTL();
ingo@219:     }
ingo@219: 
ingo@219: 
ingo@219:     /**
ingo@219:      * Dispatches and executes the persistence action after
ingo@219:      * the return of the concrete artifact call.
ingo@219:      */
ingo@219:     public void postCall() {
sascha@246:         try {
sascha@246:             switch (action) {
sascha@246:                 case NOTHING:
sascha@246:                     break;
sascha@246:                 case TOUCH:
sascha@246:                     artifact.touch();
sascha@246:                     break;
sascha@246:                 case STORE:
sascha@246:                     artifact.store();
sascha@246:                     break;
sascha@246:                 case BACKGROUND:
sascha@246:                     logger.warn(
sascha@246:                         "BACKGROUND processing is not fully implemented, yet!");
sascha@246:                     artifact.store();
sascha@246:                     break;
sascha@246:                 default:
sascha@246:                     logger.error(INVALID_CALL_STATE + ": " + action);
sascha@246:                     throw new IllegalStateException(INVALID_CALL_STATE);
sascha@246:             }
sascha@246:         }
sascha@246:         finally {
sascha@246:             super.postCall();
ingo@219:         }
ingo@219:     }
ingo@219: }
ingo@219: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :