/* * Copyright 2008 biaoping.yin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.frameworkset.spi.assemble; import java.util.ArrayList; import java.util.List; import org.frameworkset.spi.assemble.RefID.Index; /** * <p>Title: RefIDUtil.java</p> * <p>Description: </p> * <p>bboss workgroup</p> * <p>Copyright (c) 2007</p> * @Date 2012-1-2 下午10:02:32 * @author biaoping.yin * @version 1.0 */ public class RefIDUtil { public static RefID parsedRefID(String refid) { char[] tokens = refid.toCharArray(); StringBuffer name = new StringBuffer(); StringBuffer index = new StringBuffer(); RefID ref = null; RefID header = null; List<Index> indexs = null; boolean indexstart = false; boolean namestart = true; int len = tokens.length-1; boolean isConstruction = false; for(int i = 0; i < tokens.length; i ++) { if(tokens[i] == '-' && i < len && tokens[i+1] == '>') { i ++; if(ref == null) { ref = new RefID(); ref.setName(name.toString()); ref.setIndexs(indexs); // ref.setInconstruction(isConstruction); header = ref; } else { RefID ref_old = ref; ref = new RefID(); ref.setParent(ref_old); ref_old.setNext(ref); ref.setName(name.toString()); // ref.setInconstruction(isConstruction); ref.setIndexs(indexs); } namestart = true; indexstart = false; isConstruction = false; indexs = null; name.setLength(0); } else if(tokens[i] == '[') { i ++; namestart = false; indexstart = true; isConstruction = false; index.append(tokens[i]); } else if(tokens[i] == ']') { // i ++; if(indexs == null) indexs = new ArrayList<Index>(1); if(i < len && tokens[i+1] != '[') //如果后续字符还是[开头,则继续计算下一维索引标识, { // index.append(tokens[i]); String t = index.toString(); try { indexs.add(new Index(Integer.parseInt(t),isConstruction)); } catch (Throwable e) { indexs.add(new Index(t,isConstruction)); } namestart = true; indexstart = false; isConstruction = false; index.setLength(0); } else { i ++; String t = index.toString(); try { indexs.add(new Index(Integer.parseInt(t),isConstruction)); } catch (Throwable e) { indexs.add(new Index(t,isConstruction)); } index.setLength(0); } } else if(tokens[i] == '{') { i ++; namestart = false; indexstart = true; isConstruction = true; index.append(tokens[i]); } else if(tokens[i] == '}') { // i ++; if(indexs == null) indexs = new ArrayList<Index>(1); if(i < len && tokens[i+1] != '{') //如果后续字符还是[开头,则继续计算下一维索引标识, { // index.append(tokens[i]); String t = index.toString(); try { indexs.add(new Index(Integer.parseInt(t),isConstruction)); } catch (Throwable e) { indexs.add(new Index(t,isConstruction)); } namestart = true; indexstart = false; isConstruction = false; index.setLength(0); } else { i ++; String t = index.toString(); try { indexs.add(new Index(Integer.parseInt(t),isConstruction)); } catch (Throwable e) { indexs.add(new Index(t,isConstruction)); } index.setLength(0); } } else { if(namestart) name.append(tokens[i]); else index.append(tokens[i]); } } if(name.length() > 0) { if(index.length() > 0) { if(indexs == null) indexs = new ArrayList<Index>(1); String t = index.toString(); try { indexs.add(new Index(Integer.parseInt(t),isConstruction)); } catch (Throwable e) { indexs.add(new Index(t,isConstruction)); } index.setLength(0); } if(ref == null) { ref = new RefID(); ref.setName(name.toString()); ref.setIndexs(indexs); header = ref; } else { RefID ref_old = ref; ref = new RefID(); ref.setParent(ref_old); ref_old.setNext(ref); ref.setName(name.toString()); ref.setIndexs(indexs); } } return header; } }