| /******************************************************************************* |
| * Copyright (c) 2008, 2018 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.swt.tools.internal; |
| |
| import java.util.*; |
| |
| public abstract class AbstractItem implements JNIItem { |
| |
| HashMap<String, Object> params; |
| |
| static String[] split(String str, String separator) { |
| return JNIGenerator.split(str, separator); |
| } |
| |
| void checkParams() { |
| if (params != null) return; |
| parse(getMetaData()); |
| } |
| |
| public String flatten() { |
| checkParams(); |
| StringBuilder buffer = new StringBuilder(); |
| Set<String> set = params.keySet(); |
| String[] keys = set.toArray(new String[set.size()]); |
| Arrays.sort(keys); |
| for (String key : keys) { |
| Object value = params.get(key); |
| String valueStr = ""; |
| if (value instanceof String) { |
| valueStr = (String)value; |
| } else if (value instanceof String[]) { |
| valueStr = String.join(" ", (String[])value); |
| } else { |
| valueStr = value.toString(); |
| } |
| if (valueStr.length() > 0) { |
| if (buffer.length() != 0) buffer.append(","); |
| buffer.append(key); |
| buffer.append("="); |
| String quote = ""; |
| if (valueStr.indexOf(',') != -1) { |
| quote = valueStr.indexOf('"') != -1 ? "'" : "\""; |
| } |
| buffer.append(quote); |
| buffer.append(valueStr); |
| buffer.append(quote); |
| } |
| } |
| return buffer.toString(); |
| } |
| |
| @Override |
| public String[] getFlags() { |
| Object flags = getParam("flags"); |
| if (flags == null) return new String[0]; |
| if (flags instanceof String[]) return (String[])flags; |
| String[] result = split((String)flags, " "); |
| setParam("flags", result); |
| return result; |
| } |
| |
| @Override |
| public boolean getFlag(String flag) { |
| for (String f : getFlags()) { |
| if (f.equals(flag)) return true; |
| } |
| return false; |
| } |
| |
| public abstract String getMetaData(); |
| |
| @Override |
| public Object getParam(String key) { |
| checkParams(); |
| Object value = params.get(key); |
| return value == null ? "" : value; |
| } |
| |
| @Override |
| public boolean getGenerate() { |
| return !getFlag(FLAG_NO_GEN); |
| } |
| |
| @Override |
| public void setFlags(String[] flags) { |
| setParam("flags", flags); |
| } |
| |
| public void parse(String str) { |
| this.params = new HashMap<>(); |
| int length = str.length(); |
| if (length == 0) return; |
| int index = 0; |
| while (index < length) { |
| int equals = str.indexOf('=', index); |
| if (equals == -1) { |
| System.out.println("Error: " + str + " index=" + index + " length=" + length); |
| break; |
| } |
| String key = str.substring(index, equals).trim(); |
| equals++; |
| while (equals < length && Character.isWhitespace(str.charAt(equals))) equals++; |
| char c = str.charAt(equals), ending = ','; |
| switch (c) { |
| case '"': |
| case '\'': |
| equals++; |
| ending = c; |
| break; |
| } |
| int end = equals; |
| while (end < length && str.charAt(end) != ending) end++; |
| String value = str.substring(equals, end).trim(); |
| setParam(key, value); |
| if (ending != ',') { |
| while (end < length && str.charAt(end) != ',') end++; |
| } |
| index = end + 1; |
| } |
| } |
| |
| @Override |
| public void setFlag(String flag, boolean value) { |
| String[] flags = getFlags(); |
| HashSet<String> set = new HashSet<>(Arrays.asList(flags)); |
| if (value) { |
| set.add(flag); |
| } else { |
| set.remove(flag); |
| } |
| setFlags(set.toArray(new String[set.size()])); |
| } |
| |
| @Override |
| public void setGenerate(boolean value) { |
| setFlag(FLAG_NO_GEN, !value); |
| } |
| |
| public abstract void setMetaData(String value); |
| |
| @Override |
| public void setParam(String key, Object value) { |
| checkParams(); |
| params.put(key, value); |
| setMetaData(flatten()); |
| } |
| |
| } |