001    /*
002     * This file is part of the Tuning Fork Visualization Platform
003     *  (http://sourceforge.net/projects/tuningforkvp)
004     *
005     * Copyright (c) 2005 - 2008 IBM Corporation.
006     * All rights reserved. This program and the accompanying materials
007     * are made available under the terms of the Eclipse Public License v1.0
008     * which accompanies this distribution, and is available at
009     * http://www.eclipse.org/legal/epl-v10.html
010     *
011     * Contributors:
012     *     IBM Corporation - initial API and implementation
013     */
014    
015    package com.ibm.tuningfork.tracegen.chunk;
016    
017    import org.vmmagic.pragma.Interruptible;
018    import org.vmmagic.pragma.Uninterruptible;
019    
020    @Uninterruptible
021    public class FeedletChunk extends Chunk {
022    
023        public static final int FEEDLET_TYPE_ID = 2;
024        public static final int FEEDLET_COUNT_OFFSET = Chunk.DATA_OFFSET;
025        public static final int FEEDLET_DATA_OFFSET = FEEDLET_COUNT_OFFSET + 4;
026        public static final int FEEDLET_ADD_OPERATION = 1;
027        public static final int FEEDLET_REMOVE_OPERATION = 2;
028        public static final int FEEDLET_DESCRIBE_OPERATION = 3;
029        public static final String NAME_PROPERTY = "name";
030        public static final String DECSRIPTION_PROPERTY = "description";
031    
032        private int feedletOperations = 0;
033    
034        public FeedletChunk() {
035            super(FEEDLET_TYPE_ID);
036            seek(FEEDLET_DATA_OFFSET);
037        }
038    
039        public boolean hasData() {
040            return feedletOperations > 0;
041        }
042    
043        @Interruptible
044        public boolean add(int feedletIndex, String name, String description) {
045          int savedPosition = getPosition();
046          int savedOperationCount = feedletOperations;
047          boolean success = false;
048          try {
049            if (!addInt(FEEDLET_ADD_OPERATION)) return false;
050            if (!addInt(feedletIndex)) return false;
051            feedletOperations++;
052            if (!addProperty(feedletIndex, NAME_PROPERTY, name)) return false;
053            if (!addProperty(feedletIndex, DECSRIPTION_PROPERTY, description)) return false;
054            success = true;
055            return true;
056          } finally {
057            if (!success) {
058              seek(savedPosition);
059              feedletOperations = savedOperationCount;
060            }
061          }
062        }
063    
064        public boolean remove(int feedletIndex) {
065          if (!hasRoom(ENCODING_SPACE_INT*2)) return false;
066          addIntUnchecked(FEEDLET_REMOVE_OPERATION);
067          addIntUnchecked(feedletIndex);
068          feedletOperations++;
069          return true;
070        }
071    
072        @Interruptible
073        public boolean addProperty(int feedletIndex, String key, String val) {
074          int savedPosition = getPosition();
075          int savedOperationCount = feedletOperations;
076          boolean success = false;
077          try {
078            if (!addInt(FEEDLET_DESCRIBE_OPERATION)) return false;
079            if (!addInt(feedletIndex)) return false;
080            if (!addStringInternal(getChars(key))) return false;
081            if (!addStringInternal(getChars(val))) return false;
082            feedletOperations++;
083            success = true;
084            return true;
085          } finally {
086            if (!success) {
087              seek(savedPosition);
088              feedletOperations = savedOperationCount;
089            }
090          }
091        }
092    
093        @Override
094        public void close() {
095            putIntAt(FEEDLET_COUNT_OFFSET, feedletOperations);
096            feedletOperations = 0;
097            super.close();
098        }
099    
100        public void reset() {
101            resetImpl();
102            feedletOperations = 0;
103            seek(FEEDLET_DATA_OFFSET);
104        }
105    }