/* * Copyright 2004-2012 the Seasar Foundation and the Others. * * 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.seasar.mayaa.impl; import java.io.IOException; import java.lang.reflect.Constructor; import java.net.URL; import java.util.Enumeration; import java.util.Iterator; import java.util.LinkedHashSet; import org.seasar.mayaa.PositionAware; import org.seasar.mayaa.impl.source.ClassLoaderSourceDescriptor; import org.seasar.mayaa.impl.source.URLSourceDescriptor; import org.seasar.mayaa.impl.util.ObjectUtil; import org.seasar.mayaa.impl.util.StringUtil; import org.seasar.mayaa.impl.util.collection.LIFOIterator; import org.seasar.mayaa.source.SourceDescriptor; /** * @author Masataka Kurihara (Gluegent, Inc.) */ public class MarshallUtil { private MarshallUtil() { // no instantiate. } protected static void setPosition( Object obj, String systemID, int lineNumber) { if (obj == null || StringUtil.isEmpty(systemID) || lineNumber < 0) { throw new IllegalArgumentException(); } if (obj instanceof PositionAware) { PositionAware positionAware = (PositionAware) obj; positionAware.setSystemID(systemID); positionAware.setLineNumber(lineNumber); } } public static Object marshall(Class instanceClass, Class interfaceClass, Object beforeObject, String systemID, int lineNumber) { if (instanceClass == null) { if (beforeObject == null) { throw new IllegalArgumentException(); } return beforeObject; } if (beforeObject != null) { Constructor constructor = ObjectUtil.getConstructor( instanceClass, new Class[] { interfaceClass }); if (constructor != null) { Object obj = ObjectUtil.newInstance( constructor, new Object[] { beforeObject }); setPosition(obj, systemID, lineNumber); return obj; } } Object obj = ObjectUtil.newInstance(instanceClass); setPosition(obj, systemID, lineNumber); return obj; } public static SourceDescriptor getDefaultSource( String systemID, Class neighborClass) { if (StringUtil.isEmpty(systemID) || neighborClass == null) { throw new IllegalArgumentException(); } ClassLoaderSourceDescriptor defaultSource = new ClassLoaderSourceDescriptor(); defaultSource.setSystemID(systemID); defaultSource.setNeighborClass(neighborClass); return defaultSource; } public static Iterator iterateMetaInfSources(String systemID) { if (StringUtil.isEmpty(systemID)) { throw new IllegalArgumentException(); } if (systemID.startsWith("META-INF/") == false) { systemID = "META-INF" + StringUtil.preparePath(systemID); } ClassLoader loader = Thread.currentThread().getContextClassLoader(); try { Enumeration resources = loader.getResources(systemID); return new URLSourceIterator( new LIFOIterator(resources), systemID); } catch (IOException e) { throw new RuntimeException(e); } } // support class ------------------------------------------------ protected static class URLSourceIterator implements Iterator { private Iterator _it; private String _systemID; public URLSourceIterator(Iterator it, String systemID) { if (it == null || StringUtil.isEmpty(systemID)) { throw new IllegalArgumentException(); } LinkedHashSet urlSet = new LinkedHashSet(); while (it.hasNext()) { URL next = (URL) it.next(); urlSet.add(next); } _it = urlSet.iterator(); _systemID = systemID; } public boolean hasNext() { return _it.hasNext(); } public Object next() { URL url = (URL) _it.next(); URLSourceDescriptor urlSource = new URLSourceDescriptor(); urlSource.setURL(url); urlSource.setSystemID(_systemID); return urlSource; } public void remove() { throw new UnsupportedOperationException(); } } }