001: /*******************************************************************************
002: * Copyright (c) 2000, 2007 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.pde.internal.core.text.bundle;
011:
012: import java.util.Iterator;
013: import java.util.Map;
014:
015: import org.eclipse.jface.text.BadLocationException;
016: import org.eclipse.jface.text.IDocument;
017: import org.eclipse.jface.text.IRegion;
018: import org.eclipse.pde.internal.core.ibundle.IBundle;
019: import org.eclipse.pde.internal.core.ibundle.IBundleModel;
020: import org.eclipse.pde.internal.core.ibundle.IManifestHeader;
021: import org.eclipse.pde.internal.core.text.IDocumentKey;
022: import org.eclipse.pde.internal.core.util.HeaderMap;
023: import org.osgi.framework.Constants;
024:
025: public class Bundle implements IBundle {
026:
027: private BundleModel fModel;
028: private Map fDocumentHeaders = new HeaderMap();
029:
030: public Bundle(BundleModel model) {
031: fModel = model;
032: }
033:
034: public void clearHeaders() {
035: fDocumentHeaders.clear();
036: }
037:
038: public void load(Map headers) {
039: Iterator iter = headers.keySet().iterator();
040: while (iter.hasNext()) {
041: String key = iter.next().toString();
042: if (key.equals(Constants.BUNDLE_MANIFESTVERSION)) {
043: String value = headers.get(key).toString();
044: IManifestHeader header = fModel.getFactory()
045: .createHeader(key.toString(), value);
046: fDocumentHeaders.put(key.toString(), header);
047: break;
048: }
049: }
050:
051: iter = headers.keySet().iterator();
052: while (iter.hasNext()) {
053: String key = iter.next().toString();
054: if (key.equals(Constants.BUNDLE_MANIFESTVERSION))
055: continue;
056: String value = headers.get(key).toString();
057: IManifestHeader header = fModel.getFactory().createHeader(
058: key.toString(), value);
059: fDocumentHeaders.put(key.toString(), header);
060: }
061: adjustOffsets(fModel.getDocument());
062: }
063:
064: public void clearOffsets() {
065: Iterator iter = fDocumentHeaders.values().iterator();
066: while (iter.hasNext()) {
067: ManifestHeader header = (ManifestHeader) iter.next();
068: header.setOffset(-1);
069: header.setLength(-1);
070: }
071: }
072:
073: protected void adjustOffsets(IDocument document) {
074: int lines = document.getNumberOfLines();
075: try {
076: IDocumentKey currentKey = null;
077: for (int i = 0; i < lines; i++) {
078: int offset = document.getLineOffset(i);
079: int length = document.getLineLength(i);
080: String line = document.get(offset, length);
081:
082: if (currentKey != null) {
083: int lineNumber = line.startsWith(" ") ? i : i - 1; //$NON-NLS-1$
084: IRegion region = document
085: .getLineInformation(lineNumber);
086: String delimiter = document
087: .getLineDelimiter(lineNumber);
088: int keyLength = region.getOffset()
089: + region.getLength()
090: - currentKey.getOffset();
091: currentKey.setLength(delimiter != null ? keyLength
092: + delimiter.length() : keyLength);
093: if (!line.startsWith(" ")) { //$NON-NLS-1$
094: currentKey = null;
095: }
096: }
097:
098: if (currentKey == null) {
099: int index = line.indexOf(':');
100: String name = (index != -1) ? line.substring(0,
101: index) : line;
102: currentKey = (IDocumentKey) fDocumentHeaders
103: .get(name);
104: if (currentKey != null) {
105: IRegion region = document.getLineInformation(i);
106: currentKey.setOffset(region.getOffset());
107: String delimiter = document.getLineDelimiter(i);
108: currentKey.setLength(delimiter != null ? region
109: .getLength()
110: + delimiter.length() : region
111: .getLength());
112: }
113: }
114: }
115: } catch (BadLocationException e) {
116: }
117: }
118:
119: /* (non-Javadoc)
120: * @see org.eclipse.pde.internal.core.ibundle.IBundle#setHeader(java.lang.String, java.lang.String)
121: */
122: public void setHeader(String key, String value) {
123: IManifestHeader header = (ManifestHeader) fDocumentHeaders
124: .get(key);
125: String old = null;
126: if (header == null) {
127: header = getModel().getFactory().createHeader(key, value);
128: fDocumentHeaders.put(key, header);
129: fModel.fireModelObjectChanged(header, key, old, value);
130: } else {
131: old = header.getValue();
132: header.setValue(value);
133: }
134: }
135:
136: /* (non-Javadoc)
137: * @see org.eclipse.pde.internal.core.ibundle.IBundle#getHeader(java.lang.String)
138: */
139: public String getHeader(String key) {
140: ManifestHeader header = (ManifestHeader) fDocumentHeaders
141: .get(key);
142: return (header != null) ? header.getValue() : null;
143: }
144:
145: public IManifestHeader getManifestHeader(String key) {
146: return (ManifestHeader) fDocumentHeaders.get(key);
147: }
148:
149: public Map getHeaders() {
150: return fDocumentHeaders;
151: }
152:
153: public IBundleModel getModel() {
154: return fModel;
155: }
156:
157: public String getLocalization() {
158: return getHeader(Constants.BUNDLE_LOCALIZATION);
159: }
160:
161: public void setLocalization(String localization) {
162: setHeader(Constants.BUNDLE_LOCALIZATION, localization);
163: }
164:
165: public void renameHeader(String key, String newKey) {
166: ManifestHeader header = (ManifestHeader) getManifestHeader(key);
167: if (header != null) {
168: header.setName(newKey);
169: fDocumentHeaders.put(newKey, fDocumentHeaders.remove(key));
170: }
171: fModel.fireModelObjectChanged(header, newKey, key, newKey);
172: }
173: }
|