KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > core > internal > resources > MarkerReader_2


1 /*******************************************************************************
2  * Copyright (c) 2000, 2005 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.core.internal.resources;
12
13 import java.io.*;
14 import java.util.*;
15 import org.eclipse.core.internal.utils.Messages;
16 import org.eclipse.core.resources.IResourceDelta;
17 import org.eclipse.core.resources.IResourceStatus;
18 import org.eclipse.core.runtime.*;
19
20 /**
21  * This class is used to read markers from disk. This is for version 2. Here
22  * is the file format:
23  */

24 public class MarkerReader_2 extends MarkerReader {
25
26     // type constants
27
public static final byte INDEX = 1;
28     public static final byte QNAME = 2;
29
30     // marker attribute types
31
public static final byte ATTRIBUTE_NULL = 0;
32     public static final byte ATTRIBUTE_BOOLEAN = 1;
33     public static final byte ATTRIBUTE_INTEGER = 2;
34     public static final byte ATTRIBUTE_STRING = 3;
35
36     public MarkerReader_2(Workspace workspace) {
37         super(workspace);
38     }
39
40     /**
41      * SAVE_FILE -> VERSION_ID RESOURCE+
42      * VERSION_ID -> int
43      * RESOURCE -> RESOURCE_PATH MARKERS_SIZE MARKER+
44      * RESOURCE_PATH -> String
45      * MARKERS_SIZE -> int
46      * MARKER -> MARKER_ID TYPE ATTRIBUTES_SIZE ATTRIBUTE*
47      * MARKER_ID -> long
48      * TYPE -> INDEX | QNAME
49      * INDEX -> byte int
50      * QNAME -> byte String
51      * ATTRIBUTES_SIZE -> short
52      * ATTRIBUTE -> ATTRIBUTE_KEY ATTRIBUTE_VALUE
53      * ATTRIBUTE_KEY -> String
54      * ATTRIBUTE_VALUE -> INTEGER_VALUE | BOOLEAN_VALUE | STRING_VALUE | NULL_VALUE
55      * INTEGER_VALUE -> byte int
56      * BOOLEAN_VALUE -> byte boolean
57      * STRING_VALUE -> byte String
58      * NULL_VALUE -> byte
59      */

60     public void read(DataInputStream input, boolean generateDeltas) throws IOException, CoreException {
61         try {
62             List readTypes = new ArrayList(5);
63             while (true) {
64                 IPath path = new Path(input.readUTF());
65                 int markersSize = input.readInt();
66                 MarkerSet markers = new MarkerSet(markersSize);
67                 for (int i = 0; i < markersSize; i++)
68                     markers.add(readMarkerInfo(input, readTypes));
69                 // if the resource doesn't exist then return. ensure we do this after
70
// reading the markers from the file so we don't get into an
71
// inconsistent state.
72
ResourceInfo info = workspace.getResourceInfo(path, false, false);
73                 if (info == null)
74                     continue;
75                 info.setMarkers(markers);
76                 if (generateDeltas) {
77                     // Iterate over all elements and add not null ones. This saves us from copying
78
// and shrinking the array.
79
Resource resource = workspace.newResource(path, info.getType());
80                     IMarkerSetElement[] infos = markers.elements;
81                     ArrayList deltas = new ArrayList(infos.length);
82                     for (int i = 0; i < infos.length; i++)
83                         if (infos[i] != null)
84                             deltas.add(new MarkerDelta(IResourceDelta.ADDED, resource, (MarkerInfo) infos[i]));
85                     workspace.getMarkerManager().changedMarkers(resource, (IMarkerSetElement[]) deltas.toArray(new IMarkerSetElement[deltas.size()]));
86                 }
87             }
88         } catch (EOFException e) {
89             // ignore end of file
90
}
91     }
92
93     private Map readAttributes(DataInputStream input) throws IOException {
94         int attributesSize = input.readShort();
95         if (attributesSize == 0)
96             return null;
97         Map result = new MarkerAttributeMap(attributesSize);
98         for (int j = 0; j < attributesSize; j++) {
99             String JavaDoc key = input.readUTF();
100             byte type = input.readByte();
101             Object JavaDoc value = null;
102             switch (type) {
103                 case ATTRIBUTE_INTEGER :
104                     value = new Integer JavaDoc(input.readInt());
105                     break;
106                 case ATTRIBUTE_BOOLEAN :
107                     value = input.readBoolean() ? Boolean.TRUE : Boolean.FALSE;
108                     break;
109                 case ATTRIBUTE_STRING :
110                     value = input.readUTF();
111                     break;
112                 case ATTRIBUTE_NULL :
113                     // do nothing
114
break;
115             }
116             if (value != null)
117                 result.put(key, value);
118         }
119         return result.isEmpty() ? null : result;
120     }
121
122     private MarkerInfo readMarkerInfo(DataInputStream input, List readTypes) throws IOException, CoreException {
123         MarkerInfo info = new MarkerInfo();
124         info.setId(input.readLong());
125         byte constant = input.readByte();
126         switch (constant) {
127             case QNAME :
128                 String JavaDoc type = input.readUTF();
129                 info.setType(type);
130                 readTypes.add(type);
131                 break;
132             case INDEX :
133                 info.setType((String JavaDoc) readTypes.get(input.readInt()));
134                 break;
135             default :
136                 //if we get here the marker file is corrupt
137
String JavaDoc msg = Messages.resources_readMarkers;
138                 throw new ResourceException(IResourceStatus.FAILED_READ_METADATA, null, msg, null);
139         }
140         info.internalSetAttributes(readAttributes(input));
141         return info;
142     }
143 }
144
Popular Tags