/* * Copyright 2013 * Ubiquitous Knowledge Processing (UKP) Lab * Technische Universität Darmstadt * * 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 de.tudarmstadt.ukp.dkpro.core.api.resources; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map.Entry; import java.util.Properties; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.cas.CAS; import org.apache.uima.cas.CASException; import org.apache.uima.fit.util.FSCollectionFactory; import org.apache.uima.jcas.JCas; import de.tudarmstadt.ukp.dkpro.core.api.metadata.AggregateTagset; import de.tudarmstadt.ukp.dkpro.core.api.metadata.Tagset; import de.tudarmstadt.ukp.dkpro.core.api.metadata.TagsetMetaData; import de.tudarmstadt.ukp.dkpro.core.api.metadata.type.TagDescription; import de.tudarmstadt.ukp.dkpro.core.api.metadata.type.TagsetDescription; import de.tudarmstadt.ukp.dkpro.core.api.parameter.ComponentParameters; public class ModelProviderBase<M> extends CasConfigurableStreamProviderBase<M> implements HasTagsets { private AggregateTagset tagsets = new AggregateTagset(); private Set<String> inputTagsetDescriptions = new HashSet<String>(); public ModelProviderBase() { // Nothing to do } public ModelProviderBase(Object aObject, String aType) { this(aObject, StringUtils.substringAfterLast(aObject.getClass().getPackage().getName(), "."), aType); } // tag::model-provider-convenience[] public ModelProviderBase(Object aObject, String aShortName, String aType) { setContextObject(aObject); setDefault(ARTIFACT_ID, "${groupId}." + aShortName + "-model-" + aType + "-${language}-${variant}"); setDefault(LOCATION, "classpath:/${package}/lib/"+aType+"-${language}-${variant}.properties"); setDefaultVariantsLocation("${package}/lib/"+aType+"-default-variants.map"); setDefault(VARIANT, "default"); addAutoOverride(ComponentParameters.PARAM_MODEL_LOCATION, LOCATION); addAutoOverride(ComponentParameters.PARAM_VARIANT, VARIANT); addAutoOverride(ComponentParameters.PARAM_LANGUAGE, LANGUAGE); applyAutoOverrides(aObject); } // end::model-provider-convenience[] @Override public void configure(CAS aCas) throws AnalysisEngineProcessException { super.configure(aCas); try { recordTagsets(aCas); } catch (CASException e) { throw new AnalysisEngineProcessException(e); } } @Override protected M produceResource(InputStream aStream) throws Exception { return null; } @Override public Tagset getTagset() { return tagsets; } protected void addTagset(Tagset aProvider) { addTagset(aProvider, true); } protected void addTagset(Tagset aProvider, boolean aOutput) { tagsets.add(aProvider); if (!aOutput) { inputTagsetDescriptions.addAll(aProvider.getLayers().keySet()); } } protected void recordTagsets(CAS aCas) throws CASException { JCas jcas = aCas.getJCas(); if (this instanceof HasTagsets) { Tagset provider = ((HasTagsets) this).getTagset(); for (Entry<String, String> e : provider.getLayers().entrySet()) { TagsetDescription tsd = new TagsetDescription(jcas, 0, aCas.getDocumentText() .length()); tsd.setLayer(e.getKey()); tsd.setName(e.getValue()); TagsetMetaData meta = provider.getMetaData(e.getKey(), e.getValue()); if (meta == null) { meta = new TagsetMetaData(); } if (inputTagsetDescriptions.contains(e.getKey())) { meta.setInput(true); } if (getContextClass() != null) { meta.setComponentName(getContextClass().getName()); } // Initialize with information from the aggregated properties try { Properties props = getAggregatedProperties(); meta.setModelVariant(props.getProperty(VARIANT)); meta.setModelLanguage(props.getProperty(LANGUAGE)); meta.setModelVersion(props.getProperty(VERSION)); } catch (IOException ex) { throw new CASException(ex); } // Override with metadata properties if available Properties md = getResourceMetaData(); if (md != null) { meta.setModelVariant(md.getProperty(VARIANT)); meta.setModelLanguage(md.getProperty(LANGUAGE)); meta.setModelVersion(md.getProperty(VERSION)); } meta.setModelLocation(getLastModelLocation()); tsd.setComponentName(meta.getComponentName()); tsd.setModelLocation(meta.getModelLocation()); tsd.setModelLanguage(meta.getModelLanguage()); tsd.setModelVariant(meta.getModelVariant()); tsd.setModelVersion(meta.getModelVersion()); tsd.setInput(meta.isInput()); List<TagDescription> tags = new ArrayList<TagDescription>(); for (String tag : provider.listTags(e.getKey(), e.getValue())) { TagDescription td = new TagDescription(jcas); td.setName(tag); tags.add(td); } tsd.setTags(FSCollectionFactory.createFSArray(jcas, tags)); tsd.addToIndexes(); } } } }