diff options
Diffstat (limited to 'jetty-webapp/src/main/java/org/eclipse/jetty/webapp/AbsoluteOrdering.java')
-rw-r--r-- | jetty-webapp/src/main/java/org/eclipse/jetty/webapp/AbsoluteOrdering.java | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/AbsoluteOrdering.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/AbsoluteOrdering.java new file mode 100644 index 0000000000..be1e13d9f1 --- /dev/null +++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/AbsoluteOrdering.java @@ -0,0 +1,95 @@ +// +// ======================================================================== +// Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.webapp; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.jetty.util.resource.Resource; + +/** + * AbsoluteOrdering + * + */ +public class AbsoluteOrdering implements Ordering +{ + public static final String OTHER = "@@-OTHER-@@"; + protected List<String> _order = new ArrayList<String>(); + protected boolean _hasOther = false; + protected MetaData _metaData; + + public AbsoluteOrdering (MetaData metaData) + { + _metaData = metaData; + } + + @Override + public List<Resource> order(List<Resource> jars) + { + List<Resource> orderedList = new ArrayList<Resource>(); + List<Resource> tmp = new ArrayList<Resource>(jars); + + //1. put everything into the list of named others, and take the named ones out of there, + //assuming we will want to use the <other> clause + Map<String,FragmentDescriptor> others = new HashMap<String,FragmentDescriptor>(_metaData.getNamedFragments()); + + //2. for each name, take out of the list of others, add to tail of list + int index = -1; + for (String item:_order) + { + if (!item.equals(OTHER)) + { + FragmentDescriptor f = others.remove(item); + if (f != null) + { + Resource jar = _metaData.getJarForFragment(item); + orderedList.add(jar); //take from others and put into final list in order, ignoring duplicate names + //remove resource from list for resource matching name of descriptor + tmp.remove(jar); + } + } + else + index = orderedList.size(); //remember the index at which we want to add in all the others + } + + //3. if <other> was specified, insert rest of the fragments + if (_hasOther) + { + orderedList.addAll((index < 0? 0: index), tmp); + } + + return orderedList; + } + + public void add (String name) + { + _order.add(name); + } + + public void addOthers () + { + if (_hasOther) + throw new IllegalStateException ("Duplicate <other> element in absolute ordering"); + + _hasOther = true; + _order.add(OTHER); + } +}
\ No newline at end of file |